Mercurial > hg4j
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) {