diff src/com/tmate/hgkit/ll/Nodeid.java @ 34:51bc56c0addd

Static Nodeid creation methods to reuse NULL id
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Thu, 13 Jan 2011 04:03:13 +0100
parents 346b66add79d
children 858d1b2458cb
line wrap: on
line diff
--- a/src/com/tmate/hgkit/ll/Nodeid.java	Thu Jan 13 03:42:14 2011 +0100
+++ b/src/com/tmate/hgkit/ll/Nodeid.java	Thu Jan 13 04:03:13 2011 +0100
@@ -55,12 +55,44 @@
 	
 	@Override
 	public String toString() {
+		// XXX may want to output just single 0 for the NULL id?
 		return toHexString(binaryData, 0, binaryData.length);
 	}
 
 	public String shortNotation() {
 		return toHexString(binaryData, 0, 6);
 	}
+	
+	public boolean isNull() {
+		if (this == NULL) {
+			return true;
+		}
+		for (int i = 0; i < 20; i++) {
+			if (this.binaryData[i] != 0) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	// primary difference with cons is handling of NULL id (this method returns constant)
+	// always makes a copy of an array passed
+	public static Nodeid fromBinary(byte[] binaryRepresentation, int offset) {
+		if (binaryRepresentation == null || binaryRepresentation.length - offset < 20) {
+			throw new IllegalArgumentException();
+		}
+		int i = 0;
+		while (i < 20 && binaryRepresentation[offset+i] == 0) i++;
+		if (i == 20) {
+			return NULL;
+		}
+		if (offset == 0 && binaryRepresentation.length == 20) {
+			return new Nodeid(binaryRepresentation, true);
+		}
+		byte[] b = new byte[20]; // create new instance if no other reasonable guesses possible
+		System.arraycopy(binaryRepresentation, offset, b, 0, 20);
+		return new Nodeid(b, false);
+	}
 
 	// binascii.unhexlify()
 	public static Nodeid fromAscii(byte[] asciiRepresentation, int offset, int length) {