lcdd/src
diff -u -r1.23 -r1.24
--- IdFactory.cc 19 Jul 2005 23:04:41 -0000 1.23
+++ IdFactory.cc 22 Jul 2005 01:08:09 -0000 1.24
@@ -1,4 +1,4 @@
-// $Header: /cvs/lcd/lcdd/src/IdFactory.cc,v 1.23 2005/07/19 23:04:41 jeremy Exp $
+// $Header: /cvs/lcd/lcdd/src/IdFactory.cc,v 1.24 2005/07/22 01:08:09 jeremy Exp $
// set for verbose output from this class
//#define ID_DEBUG 1
@@ -100,6 +100,8 @@
field_start -= 32;
}
+ Bits field_mask = makeBitMask(field_bit_len);
+
#ifdef ID_DEBUG
G4cout << "idspec_idx: " << dec << idspec_idx << G4endl;
G4cout << "shifting left: " << dec << field_bit_len << G4endl;
@@ -109,25 +111,21 @@
G4cout << "field_val (dec): " << dec << field_val << G4endl;
G4cout << "field_val (hex): " << hex << field_val << G4endl;
G4cout << "field_bit_len: " << dec << field_bit_len << G4endl;
+ G4cout << "field_mask: " << hex << field_mask << G4endl;
#endif
- Bits field_mask = makeBitMask(field_bit_len);
-
/* For positive values, check that this value doesn't overflow the assigned length. */
- /*
- if ( field_val > 0 ) {
- if ( checkOverflow(field_val, field_mask) != 0 ) {
- G4cerr << "Value <" << field_val
- << "> is too big for the field <"
- << id_field->getLabel() << ">, len <"
- << field_bit_len << "> !?" << G4endl;
- //G4Exception("FATAL ERROR: Id value too large for field.");
- }
+ // if ( field_val > 0 ) {
+ if ( checkOverflow(field_val, field_mask) != 0 ) {
+ G4cerr << "Value <" << field_val
+ << "> is too big for the field <"
+ << id_field->getLabel() << ">, len <"
+ << field_bit_len << ">." << G4endl;
+ G4Exception("FATAL ERROR: Id value too large for field.");
}
- else {
-
- }
-*/
+ // }
+ // else {
+ // }
#ifdef ID_DEBUG
G4cout << "field_mask: " << hex << field_mask << G4endl;
@@ -175,20 +173,24 @@
{
Bits xbits = 0x0;
- if ( val >= 0 ) {
- Bits posMask = (mask ^ MASK_ON);
+ /* get flipped mask of all 1's in positions that should be masked off for this val */
+ Bits flipMask = mask ^ MASK_ON;
-#ifdef ID_DEBUG
- G4cout << "posMsk: " << posMask << G4endl;
-#endif
+ /* mask off all the valid bits, leaving overflow bits */
+ Id64bit::ElementType overflow = (val & flipMask);
- xbits = (Bits)((mask ^ MASK_ON) & val);
+ /* for pos vals, check that no bits past max bit are = 1 */
+ if ( val >= 0 ) {
+ xbits = (Bits) ((flipMask) & overflow);
}
+ /* for neg vals, check that no bits past max bit are = 0 */
else {
- xbits = (Bits)((mask ^ MASK_ON) ^ val);
+ xbits = (Bits) ((flipMask) ^ overflow);
}
#ifdef ID_DEBUG
+ G4cout << "flipMask: " << hex << flipMask << G4endl;
+ G4cout << "overflow: " << hex << overflow << G4endl;
G4cout << "overflow bits (hex): " << hex << xbits << G4endl;
#endif