diff options
author | Chris Aniszczyk <caniszczyk@gmail.com> | 2010-11-10 18:00:36 -0500 |
---|---|---|
committer | Code Review <codereview-daemon@eclipse.org> | 2010-11-10 18:00:36 -0500 |
commit | 9e28cf2fa394887447ed4fa308c80aabbeddbaa5 (patch) | |
tree | 3bbf06e6a4240c43d1aeb998f767f737f69fafad | |
parent | 453b620e62bc6af590c220f6ec11d7a695098a49 (diff) | |
parent | b22a4e84886e7388d509376be9afce31833de054 (diff) | |
download | jgit-9e28cf2fa394887447ed4fa308c80aabbeddbaa5.tar.gz jgit-9e28cf2fa394887447ed4fa308c80aabbeddbaa5.zip |
Merge "Add ObjectId getByte for random access"
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectIdTest.java (renamed from org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/T0001_ObjectId.java) | 16 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java | 50 |
2 files changed, 63 insertions, 3 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/T0001_ObjectId.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectIdTest.java index 03176cb8fd..2eb1e6b9e1 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/T0001_ObjectId.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectIdTest.java @@ -47,7 +47,7 @@ package org.eclipse.jgit.lib; import junit.framework.TestCase; -public class T0001_ObjectId extends TestCase { +public class ObjectIdTest extends TestCase { public void test001_toString() { final String x = "def4c620bc3713bb1bb26b808ec9312548e73946"; final ObjectId oid = ObjectId.fromString(x); @@ -108,4 +108,18 @@ public class T0001_ObjectId extends TestCase { final ObjectId oid = ObjectId.fromString(x); assertEquals(x.toLowerCase(), oid.name()); } + + public void testGetByte() { + byte[] raw = new byte[20]; + for (int i = 0; i < 20; i++) + raw[i] = (byte) (0xa0 + i); + ObjectId id = ObjectId.fromRaw(raw); + + assertEquals(raw[0] & 0xff, id.getFirstByte()); + assertEquals(raw[0] & 0xff, id.getByte(0)); + assertEquals(raw[1] & 0xff, id.getByte(1)); + + for (int i = 2; i < 20; i++) + assertEquals("index " + i, raw[i] & 0xff, id.getByte(i)); + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java index 7b30cec46f..61cc15dec0 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java @@ -97,15 +97,61 @@ public abstract class AnyObjectId implements Comparable { int w5; /** - * For ObjectIdMap + * Get the first 8 bits of the ObjectId. * - * @return a discriminator usable for a fan-out style map + * This is a faster version of {@code getByte(0)}. + * + * @return a discriminator usable for a fan-out style map. Returned values + * are unsigned and thus are in the range [0,255] rather than the + * signed byte range of [-128, 127]. */ public final int getFirstByte() { return w1 >>> 24; } /** + * Get any byte from the ObjectId. + * + * Callers hard-coding {@code getByte(0)} should instead use the much faster + * special case variant {@link #getFirstByte()}. + * + * @param index + * index of the byte to obtain from the raw form of the ObjectId. + * Must be in range [0, {@link Constants#OBJECT_ID_LENGTH}). + * @return the value of the requested byte at {@code index}. Returned values + * are unsigned and thus are in the range [0,255] rather than the + * signed byte range of [-128, 127]. + * @throws ArrayIndexOutOfBoundsException + * {@code index} is less than 0, equal to + * {@link Constants#OBJECT_ID_LENGTH}, or greater than + * {@link Constants#OBJECT_ID_LENGTH}. + */ + public final int getByte(int index) { + int w; + switch (index >> 2) { + case 0: + w = w1; + break; + case 1: + w = w2; + break; + case 2: + w = w3; + break; + case 3: + w = w4; + break; + case 4: + w = w5; + break; + default: + throw new ArrayIndexOutOfBoundsException(index); + } + + return (w >>> (8 * (3 - (index & 3)))) & 0xff; + } + + /** * Compare this ObjectId to another and obtain a sort ordering. * * @param other |