GeomConverter/src/org/lcsim/detector/identifier
diff -N IdentifierUtil.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ IdentifierUtil.java 2 May 2007 23:44:57 -0000 1.1
@@ -0,0 +1,59 @@
+package org.lcsim.detector.identifier;
+
+/**
+ * Identifier utility methods.
+ *
+ * @author Jeremy McCormick
+ * @version $Id: IdentifierUtil.java,v 1.1 2007/05/02 23:44:57 jeremy Exp $
+ */
+
+public final class IdentifierUtil
+{
+ private IdentifierUtil()
+ {}
+
+ public static IIdentifier pack( IExpandedIdentifier id, IIdentifierDictionary iddict )
+ {
+ long result = 0;
+ int idx = 0;
+ for ( int value : id.getValues() )
+ {
+ IIdentifierField field = iddict.getField(idx);
+
+ int start = field.getOffset();
+ int length = field.getNumberOfBits();
+ long mask = ((1L<<length) - 1) << start;
+ result &= ~mask;
+ result |= (((long) value)<<start) & mask;
+
+ ++idx;
+ }
+
+ return new Identifier( result );
+ }
+
+ public static IExpandedIdentifier unpack( IIdentifier compact, IIdentifierDictionary iddict )
+ {
+ ExpandedIdentifier buffer = new ExpandedIdentifier();
+
+ long id = compact.getValue();
+
+ for ( IIdentifierField field : iddict.getFields().values() )
+ {
+ int start = field.getOffset();
+ int length = field.getNumberOfBits();
+ int mask = (1<<length) - 1;
+
+ int result = (int) ((id >> start) & mask);
+ if (field.isSigned())
+ {
+ int signBit = 1<<(length-1);
+ if ((result & signBit) != 0) result -= (1<<length);
+ }
+
+ buffer.addValue(result);
+ }
+
+ return buffer;
+ }
+}
\ No newline at end of file