GeomConverter/src/org/lcsim/detector/identifier
diff -u -r1.5 -r1.6
--- IIdentifierField.java 25 May 2007 20:16:26 -0000 1.5
+++ IIdentifierField.java 1 Nov 2007 00:49:07 -0000 1.6
@@ -6,7 +6,7 @@
* an ordered collection of these fields.
*
* @author Jeremy McCormick
- * @version $Id: IIdentifierField.java,v 1.5 2007/05/25 20:16:26 jeremy Exp $
+ * @version $Id: IIdentifierField.java,v 1.6 2007/11/01 00:49:07 jeremy Exp $
*/
public interface IIdentifierField
{
@@ -29,20 +29,17 @@
public int getOffset();
/**
- * Get a bit mask for this field with all other bits set to 0.
- *
- * @return The on mask for this field.
+ * Get mask on as long value.
+ * @return The on mask as a long.
*/
- public long getMaskOn();
+ public long getLongMask();
/**
- * Get a zeroing bit mask for this field, with this fields bits
- * set to 0, and all other bits set to 1.
- *
- * @return The off bit mask.
+ * Get mask on as int value.
+ * @return The on mask on an int.
*/
- public long getMaskOff();
-
+ public int getIntegerMask();
+
/**
* True if field is capable of holding signed values.
* @return True if field is signed.
GeomConverter/src/org/lcsim/detector/identifier
diff -u -r1.4 -r1.5
--- IdentifierField.java 19 May 2007 00:39:51 -0000 1.4
+++ IdentifierField.java 1 Nov 2007 00:49:07 -0000 1.5
@@ -4,7 +4,7 @@
* Implementation of {@link IIdentifierField}.
*
* @author Jeremy McCormick
- * @version $Id: IdentifierField.java,v 1.4 2007/05/19 00:39:51 jeremy Exp $
+ * @version $Id: IdentifierField.java,v 1.5 2007/11/01 00:49:07 jeremy Exp $
*/
public class IdentifierField implements IIdentifierField
@@ -14,14 +14,13 @@
private boolean isSigned;
private String label;
private int order;
- long maskOn;
- long maskOff;
+ long longMask;
+ int intMask;
private static final int MAX_OFFSET=64;
private static final int MIN_OFFSET=0;
private static final int MAX_BITS=32;
private static final int MIN_BITS=1;
- private static final long BITS32 = 0xFFFFFFFF;
public IdentifierField(String label, int numberOfBits, int offset, boolean isSigned, int order)
{
@@ -49,16 +48,17 @@
throw new IllegalArgumentException(label + " - offset + numberOfBits <" + (offset + numberOfBits) + "> is greater than " + MAX_OFFSET);
}
+ if (isSigned && numberOfBits < 2)
+ {
+ throw new IllegalArgumentException("The signed field " + label + " needs at least 2 bits.");
+ }
+
this.offset = offset;
- this.isSigned = isSigned;
-
+ this.isSigned = isSigned;
this.order = order;
- // Compute the mask.
- this.maskOn = ((1L<<numberOfBits) - 1) << offset;
-
- // Compute the zeroing mask.
- this.maskOff = (maskOn) ^ BITS32;
+ this.intMask = (1 << numberOfBits) - 1;
+ this.longMask = ((1L<<numberOfBits) - 1);
}
public String getLabel()
@@ -66,16 +66,6 @@
return label;
}
- public long getMaskOn()
- {
- return maskOn;
- }
-
- public long getMaskOff()
- {
- return maskOff;
- }
-
public int getNumberOfBits()
{
return numberOfBits;
@@ -101,53 +91,50 @@
return getOrder() + ":" + getLabel() + ":" + getOffset() + ":" + getNumberOfBits() + ":" + isSigned() + "\n";
}
+ // FIXME: Move to IdentifierUtil.
public int unpack( long value )
- {
+ {
+ int start = getOffset();
int length = getNumberOfBits();
- long mask = getMaskOn();
-
- int result = (int) ((value) & mask) >> offset;
+ int mask = getIntegerMask();
- if ( isSigned() )
+ int result = (int) ((value >> start) & mask);
+ if (isSigned())
{
int signBit = 1<<(length-1);
if ((result & signBit) != 0) result -= (1<<length);
}
+
return result;
}
+ // FIXME: Move to IdentifierUtil.
public int unpack( IIdentifier compact )
{
return unpack( compact.getValue());
}
+ // FIXME: Move to IdentifierUtil.
public IIdentifier pack( int value )
{
- long result=0;
- int offset = getOffset();
- long mask = getMaskOn();
- result &= ~mask;
- result |= (((long) value )<<offset) & mask;
- return new Identifier( result );
+ long result = 0;
+ int start = getOffset();
+ long mask = getLongMask();
+ result |= (mask & value) << start;
+ return new Identifier(result);
}
+ // FIXME: Move to IdentifierUtil.
public void pack( int value, IIdentifier id )
{
long result = id.getValue();
- int offset = getOffset();
- long mask = getMaskOn();
- result &= ~mask;
- long shifted_val = ((long)value) << offset;
- long masked_val = shifted_val & mask;
- result |= masked_val;
+ int start = getOffset();
+ long mask = getLongMask();
+ result |= (mask & value) << start;
id.setValue(result);
-
- //System.out.println("shifted="+Long.toHexString(shifted_val));
- //System.out.println("masked="+Long.toHexString(masked_val));
- //System.out.println("result="+Long.toHexString(result));
- //System.out.println();
}
+ // FIXME: Move to IdentifierUtil.
public int getFieldValue( IExpandedIdentifier id )
{
if ( !id.isValidIndex(order))
@@ -156,4 +143,14 @@
}
return id.getValue(order);
}
+
+ public int getIntegerMask()
+ {
+ return this.intMask;
+ }
+
+ public long getLongMask()
+ {
+ return this.longMask;
+ }
}
\ No newline at end of file
GeomConverter/src/org/lcsim/detector/identifier
diff -u -r1.6 -r1.7
--- IdentifierUtil.java 28 Aug 2007 22:25:46 -0000 1.6
+++ IdentifierUtil.java 1 Nov 2007 00:49:07 -0000 1.7
@@ -18,7 +18,7 @@
* @see IExpandedIdentifier
*
* @author Jeremy McCormick
- * @version $Id: IdentifierUtil.java,v 1.6 2007/08/28 22:25:46 jeremy Exp $
+ * @version $Id: IdentifierUtil.java,v 1.7 2007/11/01 00:49:07 jeremy Exp $
*/
public final class IdentifierUtil
{
@@ -67,7 +67,7 @@
throw new IllegalArgumentException("Start index <" + startIndex + "> is bigger than end index <" + endIndex + ">.");
}
}
-
+
for ( int i=0; i<iddict.getNumberOfFields(); i++)
{
if ( i >= startIndex && i <= endIndex )
@@ -76,10 +76,9 @@
int start = field.getOffset();
int length = field.getNumberOfBits();
- long mask = field.getMaskOn();
+ int mask = field.getIntegerMask();
- int result = (int) (( id ) & mask) >> start;
-
+ int result = (int) ((id >> start) & mask);
if (field.isSigned())
{
int signBit = 1<<(length-1);
@@ -142,16 +141,15 @@
{
throw new IllegalArgumentException("Start index <" + startIndex + "> is bigger than end index <" + endIndex + ">.");
}
- }
-
+ }
+
for ( int i=startIndex; i<=endIndex; i++ )
{
IIdentifierField field = iddict.getField(i);
- int offset = field.getOffset();
- long mask = field.getMaskOn();
- result &= ~mask;
- result |= (((long) id.getValue(i))<<offset) & mask;
+ int start = field.getOffset();
+ long mask = field.getLongMask();
+ result |= (mask & id.getValue(i)) << start;
}
return new Identifier( result );