]> source.dussan.org Git - jgit.git/commitdiff
PackIndex: Simplify Iterator/MutableEntry interaction 03/1200703/29
authorjackdt@google.com <jackdt@google.com>
Wed, 4 Sep 2024 23:07:23 +0000 (16:07 -0700)
committerIvan Frade <ifrade@google.com>
Fri, 13 Sep 2024 20:43:15 +0000 (20:43 +0000)
The iterator keeps the current position in the index and the MutableEntry reads data from there on-demand, but the iterator needs to know about the entry and this creates a complicated interaction.

Make MutableEntry a simple data object and let the iterator iterate and populate it before returning it. Code is clearer and implementors only needs to worry about the iterator.

This fixes also MutableEntry visibility, that was preventing subclassing from out of the package.

Change-Id: I35010d1f80237e421dd51b8d3d61a8ecb03e0d01

org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndex.java
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV1.java
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV2.java

index c0540d5a4c14a162859e399455749b1b99d2d61b..95050d472eda6fd36d5ae9c7e2908469f6ed390d 100644 (file)
@@ -302,8 +302,9 @@ public interface PackIndex
         *
         */
        class MutableEntry {
+               /** Buffer of the ObjectId visited by the EntriesIterator. */
                final MutableObjectId idBuffer = new MutableObjectId();
-
+               /** Offset into the packfile of the current object. */
                long offset;
 
                /**
@@ -321,7 +322,6 @@ public interface PackIndex
                 * @return hex string describing the object id of this entry.
                 */
                public String name() {
-                       ensureId();
                        return idBuffer.name();
                }
 
@@ -331,7 +331,6 @@ public interface PackIndex
                 * @return a copy of the object id.
                 */
                public ObjectId toObjectId() {
-                       ensureId();
                        return idBuffer.toObjectId();
                }
 
@@ -342,32 +341,32 @@ public interface PackIndex
                 */
                public MutableEntry cloneEntry() {
                        final MutableEntry r = new MutableEntry();
-                       ensureId();
                        r.idBuffer.fromObjectId(idBuffer);
                        r.offset = offset;
                        return r;
                }
-
-               void ensureId() {
-                       // Override in implementations.
-               }
        }
 
        /**
         * Base implementation of the iterator over index entries.
         */
        abstract class EntriesIterator implements Iterator<MutableEntry> {
-               protected final MutableEntry entry = initEntry();
-
                private final long objectCount;
 
+               private final MutableEntry entry = new MutableEntry();
+
+               /** Counts number of entries accessed so far. */
+               private long returnedNumber = 0;
+
+               /**
+               * Default constructor.
+               *
+               * @param objectCount the number of objects in the PackFile.
+               */
                protected EntriesIterator(long objectCount) {
                        this.objectCount = objectCount;
                }
 
-               protected long returnedNumber = 0;
-
-               protected abstract MutableEntry initEntry();
 
                @Override
                public boolean hasNext() {
@@ -379,7 +378,18 @@ public interface PackIndex
                 * element.
                 */
                @Override
-               public abstract MutableEntry next();
+               public MutableEntry next() {
+                       readNext(entry);
+                       returnedNumber++;
+                       return entry;
+               }
+
+               /**
+                * Used by subclasses to load the next entry into the MutableEntry.
+                *
+                * @param entry the container of the next Iterator entry.
+                */
+               protected abstract void readNext(MutableEntry entry);
 
                @Override
                public void remove() {
index d7c83785d802a1c7fe05acd4421d17b95bb9d5cb..99f331581118a89284d0852b0033b7aeb6015c70 100644 (file)
@@ -203,7 +203,7 @@ class PackIndexV1 implements PackIndex {
 
        @Override
        public Iterator<MutableEntry> iterator() {
-               return new IndexV1Iterator(objectCnt);
+               return new EntriesIteratorV1(this);
        }
 
        @Override
@@ -246,36 +246,30 @@ class PackIndexV1 implements PackIndex {
                return packChecksum;
        }
 
-       private class IndexV1Iterator extends EntriesIterator {
-               int levelOne;
+       private static class EntriesIteratorV1 extends EntriesIterator {
+               private int levelOne;
 
-               int levelTwo;
+               private int levelTwo;
 
-               IndexV1Iterator(long objectCount) {
-                       super(objectCount);
-               }
+               private final PackIndexV1 packIndex;
 
-               @Override
-               protected MutableEntry initEntry() {
-                       return new MutableEntry() {
-                               @Override
-                               protected void ensureId() {
-                                       idBuffer.fromRaw(idxdata[levelOne], levelTwo
-                                                       - Constants.OBJECT_ID_LENGTH);
-                               }
-                       };
+               private EntriesIteratorV1(PackIndexV1 packIndex) {
+                       super(packIndex.objectCnt);
+                       this.packIndex = packIndex;
                }
 
                @Override
-               public MutableEntry next() {
-                       for (; levelOne < idxdata.length; levelOne++) {
-                               if (idxdata[levelOne] == null)
+               protected void readNext(MutableEntry entry) {
+                       for (; levelOne < packIndex.idxdata.length; levelOne++) {
+                               if (packIndex.idxdata[levelOne] == null)
                                        continue;
-                               if (levelTwo < idxdata[levelOne].length) {
-                                       entry.offset = NB.decodeUInt32(idxdata[levelOne], levelTwo);
-                                       levelTwo += Constants.OBJECT_ID_LENGTH + 4;
-                                       returnedNumber++;
-                                       return entry;
+                               if (levelTwo < packIndex.idxdata[levelOne].length) {
+                                       entry.offset = NB.decodeUInt32(packIndex.idxdata[levelOne],
+                                                       levelTwo);
+                                       this.levelTwo += Constants.OBJECT_ID_LENGTH + 4;
+                                       entry.idBuffer.fromRaw(packIndex.idxdata[levelOne],
+                                                       levelTwo - Constants.OBJECT_ID_LENGTH);
+                                       return;
                                }
                                levelTwo = 0;
                        }
index caf8b711806f989f89d484f879a6534dc55b2dd5..f23380dd6bf3607b15c429bbb3c50a1446898284 100644 (file)
@@ -224,7 +224,7 @@ class PackIndexV2 implements PackIndex {
 
        @Override
        public Iterator<MutableEntry> iterator() {
-               return new EntriesIteratorV2(objectCnt);
+               return new EntriesIteratorV2(this);
        }
 
        @Override
@@ -289,41 +289,34 @@ class PackIndexV2 implements PackIndex {
                return packChecksum;
        }
 
-       private class EntriesIteratorV2 extends EntriesIterator {
-               int levelOne;
+       private static class EntriesIteratorV2 extends EntriesIterator {
+               private int levelOne = 0;
 
-               int levelTwo;
+               private int levelTwo = 0;
 
-               EntriesIteratorV2(long objectCount){
-                       super(objectCount);
-               }
+               private final PackIndexV2 packIndex;
 
-               @Override
-               protected MutableEntry initEntry() {
-                       return new MutableEntry() {
-                               @Override
-                               protected void ensureId() {
-                                       idBuffer.fromRaw(names[levelOne], levelTwo
-                                                       - Constants.OBJECT_ID_LENGTH / 4);
-                               }
-                       };
+               private EntriesIteratorV2(PackIndexV2 packIndex) {
+                       super(packIndex.objectCnt);
+                       this.packIndex = packIndex;
                }
 
                @Override
-               public MutableEntry next() {
-                       for (; levelOne < names.length; levelOne++) {
-                               if (levelTwo < names[levelOne].length) {
+               protected void readNext(MutableEntry entry) {
+                       for (; levelOne < packIndex.names.length; levelOne++) {
+                               if (levelTwo < packIndex.names[levelOne].length) {
                                        int idx = levelTwo / (Constants.OBJECT_ID_LENGTH / 4) * 4;
-                                       long offset = NB.decodeUInt32(offset32[levelOne], idx);
+                                       long offset = NB.decodeUInt32(packIndex.offset32[levelOne],
+                                                       idx);
                                        if ((offset & IS_O64) != 0) {
                                                idx = (8 * (int) (offset & ~IS_O64));
-                                               offset = NB.decodeUInt64(offset64, idx);
+                                               offset = NB.decodeUInt64(packIndex.offset64, idx);
                                        }
                                        entry.offset = offset;
-
-                                       levelTwo += Constants.OBJECT_ID_LENGTH / 4;
-                                       returnedNumber++;
-                                       return entry;
+                                       this.levelTwo += Constants.OBJECT_ID_LENGTH / 4;
+                                       entry.idBuffer.fromRaw(packIndex.names[levelOne],
+                                                       levelTwo - Constants.OBJECT_ID_LENGTH / 4);
+                                       return;
                                }
                                levelTwo = 0;
                        }