aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Aniszczyk <caniszczyk@gmail.com>2010-11-10 18:00:36 -0500
committerCode Review <codereview-daemon@eclipse.org>2010-11-10 18:00:36 -0500
commit9e28cf2fa394887447ed4fa308c80aabbeddbaa5 (patch)
tree3bbf06e6a4240c43d1aeb998f767f737f69fafad
parent453b620e62bc6af590c220f6ec11d7a695098a49 (diff)
parentb22a4e84886e7388d509376be9afce31833de054 (diff)
downloadjgit-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.java50
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