Mercurial > hg4j
comparison src/org/tmatesoft/hg/repo/Revlog.java @ 307:2f2ab5c27f41
Collect sort reverse indexes along with array sorting
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Sat, 24 Sep 2011 04:06:27 +0200 |
| parents | 74e7493a042a |
| children | 3f40262153a4 |
comparison
equal
deleted
inserted
replaced
| 306:971baa95fb07 | 307:2f2ab5c27f41 |
|---|---|
| 28 import java.util.List; | 28 import java.util.List; |
| 29 | 29 |
| 30 import org.tmatesoft.hg.core.HgBadStateException; | 30 import org.tmatesoft.hg.core.HgBadStateException; |
| 31 import org.tmatesoft.hg.core.HgException; | 31 import org.tmatesoft.hg.core.HgException; |
| 32 import org.tmatesoft.hg.core.Nodeid; | 32 import org.tmatesoft.hg.core.Nodeid; |
| 33 import org.tmatesoft.hg.internal.ArrayHelper; | |
| 33 import org.tmatesoft.hg.internal.DataAccess; | 34 import org.tmatesoft.hg.internal.DataAccess; |
| 34 import org.tmatesoft.hg.internal.RevlogStream; | 35 import org.tmatesoft.hg.internal.RevlogStream; |
| 35 import org.tmatesoft.hg.util.ByteChannel; | 36 import org.tmatesoft.hg.util.ByteChannel; |
| 36 import org.tmatesoft.hg.util.CancelSupport; | 37 import org.tmatesoft.hg.util.CancelSupport; |
| 37 import org.tmatesoft.hg.util.CancelledException; | 38 import org.tmatesoft.hg.util.CancelledException; |
| 414 public RevisionMap init(/*XXX Pool<Nodeid> to reuse nodeids, if possible. */) { | 415 public RevisionMap init(/*XXX Pool<Nodeid> to reuse nodeids, if possible. */) { |
| 415 // XXX HgRepository.register((RepoChangeListener) this); // listen to changes in repo, re-init if needed? | 416 // XXX HgRepository.register((RepoChangeListener) this); // listen to changes in repo, re-init if needed? |
| 416 final int revisionCount = Revlog.this.content.revisionCount(); | 417 final int revisionCount = Revlog.this.content.revisionCount(); |
| 417 sequential = new Nodeid[revisionCount]; | 418 sequential = new Nodeid[revisionCount]; |
| 418 sorted = new Nodeid[revisionCount]; | 419 sorted = new Nodeid[revisionCount]; |
| 419 sorted2natural = new int[revisionCount]; | |
| 420 RevlogStream.Inspector insp = new RevlogStream.Inspector() { | 420 RevlogStream.Inspector insp = new RevlogStream.Inspector() { |
| 421 | 421 |
| 422 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess data) { | 422 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess data) { |
| 423 final Nodeid nid = new Nodeid(nodeid, true); | 423 final Nodeid nid = new Nodeid(nodeid, true); |
| 424 sequential[revisionNumber] = sorted[revisionNumber] = nid; | 424 sequential[revisionNumber] = sorted[revisionNumber] = nid; |
| 425 } | 425 } |
| 426 }; | 426 }; |
| 427 Revlog.this.content.iterate(0, TIP, false, insp); | 427 Revlog.this.content.iterate(0, TIP, false, insp); |
| 428 Arrays.sort(sorted); | 428 // next is alternative to Arrays.sort(sorted), and build sorted2natural looking up each element of sequential in sorted. |
| 429 for (int i = 0; i < revisionCount; i++) { | 429 // the way sorted2natural was build is O(n*log n). |
| 430 Nodeid n = sequential[i]; | 430 final ArrayHelper ah = new ArrayHelper(); |
| 431 int x = Arrays.binarySearch(sorted, n); | 431 ah.sort(sorted); |
| 432 sorted2natural[x] = i; | 432 // note, values in ArrayHelper#getReversed are 1-based indexes, not 0-based |
| 433 } | 433 sorted2natural = ah.getReverse(); |
| 434 return this; | 434 return this; |
| 435 } | 435 } |
| 436 | 436 |
| 437 public Nodeid revision(int localRevision) { | 437 public Nodeid revision(int localRevision) { |
| 438 return sequential[localRevision]; | 438 return sequential[localRevision]; |
| 443 } | 443 } |
| 444 int x = Arrays.binarySearch(sorted, revision); | 444 int x = Arrays.binarySearch(sorted, revision); |
| 445 if (x < 0) { | 445 if (x < 0) { |
| 446 return BAD_REVISION; | 446 return BAD_REVISION; |
| 447 } | 447 } |
| 448 return sorted2natural[x]; | 448 return sorted2natural[x]-1; |
| 449 } | 449 } |
| 450 } | 450 } |
| 451 | 451 |
| 452 protected abstract static class ErrorHandlingInspector implements RevlogStream.Inspector, CancelSupport { | 452 protected abstract static class ErrorHandlingInspector implements RevlogStream.Inspector, CancelSupport { |
| 453 private Exception failure; | 453 private Exception failure; |
