1*16467b97STreehugger RobotANTLR_BEGIN_NAMESPACE() 2*16467b97STreehugger Robot 3*16467b97STreehugger Robottemplate <class ImplTraits> 4*16467b97STreehugger RobotANTLR_INLINE BitsetList<ImplTraits>::BitsetList() 5*16467b97STreehugger Robot{ 6*16467b97STreehugger Robot m_bits = NULL; 7*16467b97STreehugger Robot m_length = 0; 8*16467b97STreehugger Robot} 9*16467b97STreehugger Robot 10*16467b97STreehugger Robottemplate <class ImplTraits> 11*16467b97STreehugger RobotANTLR_INLINE BitsetList<ImplTraits>::BitsetList( ANTLR_BITWORD* bits, ANTLR_UINT32 length ) 12*16467b97STreehugger Robot{ 13*16467b97STreehugger Robot m_bits = bits; 14*16467b97STreehugger Robot m_length = length; 15*16467b97STreehugger Robot} 16*16467b97STreehugger Robot 17*16467b97STreehugger Robottemplate <class ImplTraits> 18*16467b97STreehugger RobotANTLR_INLINE ANTLR_BITWORD* BitsetList<ImplTraits>::get_bits() const 19*16467b97STreehugger Robot{ 20*16467b97STreehugger Robot return m_bits; 21*16467b97STreehugger Robot} 22*16467b97STreehugger Robot 23*16467b97STreehugger Robottemplate <class ImplTraits> 24*16467b97STreehugger RobotANTLR_INLINE ANTLR_UINT32 BitsetList<ImplTraits>::get_length() const 25*16467b97STreehugger Robot{ 26*16467b97STreehugger Robot return m_length; 27*16467b97STreehugger Robot} 28*16467b97STreehugger Robot 29*16467b97STreehugger Robottemplate <class ImplTraits> 30*16467b97STreehugger RobotANTLR_INLINE void BitsetList<ImplTraits>::set_bits( ANTLR_BITWORD* bits ) 31*16467b97STreehugger Robot{ 32*16467b97STreehugger Robot m_bits = bits; 33*16467b97STreehugger Robot} 34*16467b97STreehugger Robot 35*16467b97STreehugger Robottemplate <class ImplTraits> 36*16467b97STreehugger RobotANTLR_INLINE void BitsetList<ImplTraits>::set_length( ANTLR_UINT32 length ) 37*16467b97STreehugger Robot{ 38*16467b97STreehugger Robot m_length = length; 39*16467b97STreehugger Robot} 40*16467b97STreehugger Robot 41*16467b97STreehugger Robottemplate <class ImplTraits> 42*16467b97STreehugger Robottypename BitsetList<ImplTraits>::BitsetType* BitsetList<ImplTraits>::bitsetLoad() 43*16467b97STreehugger Robot{ 44*16467b97STreehugger Robot // Allocate memory for the bitset structure itself 45*16467b97STreehugger Robot // the input parameter is the bit number (0 based) 46*16467b97STreehugger Robot // to include in the bitset, so we need at at least 47*16467b97STreehugger Robot // bit + 1 bits. If any arguments indicate a 48*16467b97STreehugger Robot // a bit higher than the default number of bits (0 means default size) 49*16467b97STreehugger Robot // then Add() will take care 50*16467b97STreehugger Robot // of it. 51*16467b97STreehugger Robot // 52*16467b97STreehugger Robot BitsetType* bitset = new BitsetType(); 53*16467b97STreehugger Robot 54*16467b97STreehugger Robot if (this != NULL) 55*16467b97STreehugger Robot { 56*16467b97STreehugger Robot // Now we can add the element bits into the set 57*16467b97STreehugger Robot // 58*16467b97STreehugger Robot ANTLR_UINT32 count=0; 59*16467b97STreehugger Robot while (count < m_length) 60*16467b97STreehugger Robot { 61*16467b97STreehugger Robot if( bitset->get_blist().get_length() <= count) 62*16467b97STreehugger Robot bitset->grow(count+1); 63*16467b97STreehugger Robot 64*16467b97STreehugger Robot typename ImplTraits::BitsetListType& blist = bitset->get_blist(); 65*16467b97STreehugger Robot blist.m_bits[count] = *(m_bits+count); 66*16467b97STreehugger Robot count++; 67*16467b97STreehugger Robot } 68*16467b97STreehugger Robot } 69*16467b97STreehugger Robot 70*16467b97STreehugger Robot // return the new bitset 71*16467b97STreehugger Robot // 72*16467b97STreehugger Robot return bitset; 73*16467b97STreehugger Robot} 74*16467b97STreehugger Robot 75*16467b97STreehugger Robottemplate <class ImplTraits> 76*16467b97STreehugger Robottypename BitsetList<ImplTraits>::BitsetType* BitsetList<ImplTraits>::bitsetCopy() 77*16467b97STreehugger Robot{ 78*16467b97STreehugger Robot BitsetType* bitset; 79*16467b97STreehugger Robot ANTLR_UINT32 numElements = m_length; 80*16467b97STreehugger Robot 81*16467b97STreehugger Robot // Avoid memory thrashing at the expense of a few more bytes 82*16467b97STreehugger Robot // 83*16467b97STreehugger Robot if (numElements < 8) 84*16467b97STreehugger Robot numElements = 8; 85*16467b97STreehugger Robot 86*16467b97STreehugger Robot // Allocate memory for the bitset structure itself 87*16467b97STreehugger Robot // 88*16467b97STreehugger Robot bitset = new Bitset<ImplTraits>(numElements); 89*16467b97STreehugger Robot memcpy(bitset->get_blist().get_bits(), m_bits, numElements * sizeof(ANTLR_BITWORD)); 90*16467b97STreehugger Robot 91*16467b97STreehugger Robot // All seems good 92*16467b97STreehugger Robot // 93*16467b97STreehugger Robot return bitset; 94*16467b97STreehugger Robot} 95*16467b97STreehugger Robot 96*16467b97STreehugger Robottemplate <class ImplTraits> 97*16467b97STreehugger RobotBitset<ImplTraits>::Bitset( ANTLR_UINT32 numBits ) 98*16467b97STreehugger Robot{ 99*16467b97STreehugger Robot // Avoid memory thrashing at the up front expense of a few bytes 100*16467b97STreehugger Robot if (numBits < (8 * ANTLR_BITSET_BITS)) 101*16467b97STreehugger Robot numBits = 8 * ANTLR_BITSET_BITS; 102*16467b97STreehugger Robot 103*16467b97STreehugger Robot // No we need to allocate the memory for the number of bits asked for 104*16467b97STreehugger Robot // in multiples of ANTLR3_UINT64. 105*16467b97STreehugger Robot // 106*16467b97STreehugger Robot ANTLR_UINT32 numelements = ((numBits -1) >> ANTLR_BITSET_LOG_BITS) + 1; 107*16467b97STreehugger Robot 108*16467b97STreehugger Robot m_blist.set_bits( (ANTLR_BITWORD*) AllocPolicyType::alloc0(numelements * sizeof(ANTLR_BITWORD))); 109*16467b97STreehugger Robot 110*16467b97STreehugger Robot m_blist.set_length( numelements ); 111*16467b97STreehugger Robot} 112*16467b97STreehugger Robot 113*16467b97STreehugger Robottemplate <class ImplTraits> 114*16467b97STreehugger RobotBitset<ImplTraits>::Bitset( const Bitset& bitset ) 115*16467b97STreehugger Robot :m_blist(bitset.m_blist) 116*16467b97STreehugger Robot{ 117*16467b97STreehugger Robot} 118*16467b97STreehugger Robot 119*16467b97STreehugger Robottemplate <class ImplTraits> 120*16467b97STreehugger RobotANTLR_INLINE Bitset<ImplTraits>* Bitset<ImplTraits>::clone() const 121*16467b97STreehugger Robot{ 122*16467b97STreehugger Robot Bitset* bitset; 123*16467b97STreehugger Robot 124*16467b97STreehugger Robot // Allocate memory for the bitset structure itself 125*16467b97STreehugger Robot // 126*16467b97STreehugger Robot bitset = new Bitset( ANTLR_BITSET_BITS * m_blist.get_length() ); 127*16467b97STreehugger Robot 128*16467b97STreehugger Robot // Install the actual bits in the source set 129*16467b97STreehugger Robot // 130*16467b97STreehugger Robot memcpy(bitset->m_blist.get_bits(), m_blist.get_bits(), 131*16467b97STreehugger Robot m_blist.get_length() * sizeof(ANTLR_BITWORD) ); 132*16467b97STreehugger Robot 133*16467b97STreehugger Robot // All seems good 134*16467b97STreehugger Robot // 135*16467b97STreehugger Robot return bitset; 136*16467b97STreehugger Robot} 137*16467b97STreehugger Robot 138*16467b97STreehugger Robottemplate <class ImplTraits> 139*16467b97STreehugger RobotBitset<ImplTraits>* Bitset<ImplTraits>::bor(Bitset* bitset2) 140*16467b97STreehugger Robot{ 141*16467b97STreehugger Robot Bitset* bitset; 142*16467b97STreehugger Robot 143*16467b97STreehugger Robot if (this == NULL) 144*16467b97STreehugger Robot return bitset2->clone(); 145*16467b97STreehugger Robot 146*16467b97STreehugger Robot if (bitset2 == NULL) 147*16467b97STreehugger Robot return this->clone(); 148*16467b97STreehugger Robot 149*16467b97STreehugger Robot // Allocate memory for the newly ordered bitset structure itself. 150*16467b97STreehugger Robot // 151*16467b97STreehugger Robot bitset = this->clone(); 152*16467b97STreehugger Robot bitset->bitsetORInPlace(bitset2); 153*16467b97STreehugger Robot return bitset; 154*16467b97STreehugger Robot} 155*16467b97STreehugger Robot 156*16467b97STreehugger Robottemplate <class ImplTraits> 157*16467b97STreehugger Robotvoid Bitset<ImplTraits>::borInPlace(Bitset* bitset2) 158*16467b97STreehugger Robot{ 159*16467b97STreehugger Robot ANTLR_UINT32 minimum; 160*16467b97STreehugger Robot 161*16467b97STreehugger Robot if (bitset2 == NULL) 162*16467b97STreehugger Robot return; 163*16467b97STreehugger Robot 164*16467b97STreehugger Robot // First make sure that the target bitset is big enough 165*16467b97STreehugger Robot // for the new bits to be ored in. 166*16467b97STreehugger Robot // 167*16467b97STreehugger Robot if ( m_blist.get_length() < bitset2->m_blist.get_length() ) 168*16467b97STreehugger Robot this->growToInclude( bitset2->m_blist.get_length() * sizeof(ANTLR_BITWORD) ); 169*16467b97STreehugger Robot 170*16467b97STreehugger Robot // Or the miniimum number of bits after any resizing went on 171*16467b97STreehugger Robot // 172*16467b97STreehugger Robot if ( m_blist.get_length() < bitset2->m_blist.get_length() ) 173*16467b97STreehugger Robot minimum = m_blist.get_length(); 174*16467b97STreehugger Robot else 175*16467b97STreehugger Robot minimum = bitset2->m_blist.get_length(); 176*16467b97STreehugger Robot 177*16467b97STreehugger Robot ANTLR_BITWORD* bits1 = m_blist.get_bits(); 178*16467b97STreehugger Robot ANTLR_BITWORD* bits2 = bitset2->m_blist.get_bits(); 179*16467b97STreehugger Robot for (ANTLR_UINT32 i = minimum; i > 0; i--) 180*16467b97STreehugger Robot bits1[i-1] |= bits2[i-1]; 181*16467b97STreehugger Robot} 182*16467b97STreehugger Robot 183*16467b97STreehugger Robottemplate <class ImplTraits> 184*16467b97STreehugger RobotANTLR_UINT32 Bitset<ImplTraits>::size() const 185*16467b97STreehugger Robot{ 186*16467b97STreehugger Robot ANTLR_UINT32 degree; 187*16467b97STreehugger Robot ANTLR_INT32 i; 188*16467b97STreehugger Robot ANTLR_INT8 bit; 189*16467b97STreehugger Robot 190*16467b97STreehugger Robot // TODO: Come back to this, it may be faster to & with 0x01 191*16467b97STreehugger Robot // then shift right a copy of the 4 bits, than shift left a constant of 1. 192*16467b97STreehugger Robot // But then again, the optimizer might just work this out 193*16467b97STreehugger Robot // anyway. 194*16467b97STreehugger Robot // 195*16467b97STreehugger Robot degree = 0; 196*16467b97STreehugger Robot ANTLR_BITWORD* bits = m_blist.get_bits(); 197*16467b97STreehugger Robot for (i = m_blist.get_length() - 1; i>= 0; i--) 198*16467b97STreehugger Robot { 199*16467b97STreehugger Robot if (bits[i] != 0) 200*16467b97STreehugger Robot { 201*16467b97STreehugger Robot for(bit = ANTLR_BITSET_BITS - 1; bit >= 0; bit--) 202*16467b97STreehugger Robot { 203*16467b97STreehugger Robot if((bits[i] & (((ANTLR_BITWORD)1) << bit)) != 0) 204*16467b97STreehugger Robot { 205*16467b97STreehugger Robot degree++; 206*16467b97STreehugger Robot } 207*16467b97STreehugger Robot } 208*16467b97STreehugger Robot } 209*16467b97STreehugger Robot } 210*16467b97STreehugger Robot return degree; 211*16467b97STreehugger Robot} 212*16467b97STreehugger Robot 213*16467b97STreehugger Robottemplate <class ImplTraits> 214*16467b97STreehugger RobotANTLR_INLINE void Bitset<ImplTraits>::add(ANTLR_INT32 bit) 215*16467b97STreehugger Robot{ 216*16467b97STreehugger Robot ANTLR_UINT32 word = Bitset::WordNumber(bit); 217*16467b97STreehugger Robot 218*16467b97STreehugger Robot if (word >= m_blist.get_length() ) 219*16467b97STreehugger Robot this->growToInclude(bit); 220*16467b97STreehugger Robot 221*16467b97STreehugger Robot ANTLR_BITWORD* bits = m_blist.get_bits(); 222*16467b97STreehugger Robot bits[word] |= Bitset::BitMask(bit); 223*16467b97STreehugger Robot} 224*16467b97STreehugger Robot 225*16467b97STreehugger Robottemplate <class ImplTraits> 226*16467b97STreehugger Robotvoid Bitset<ImplTraits>::grow(ANTLR_INT32 newSize) 227*16467b97STreehugger Robot{ 228*16467b97STreehugger Robot ANTLR_BITWORD* newBits; 229*16467b97STreehugger Robot 230*16467b97STreehugger Robot // Space for newly sized bitset - TODO: come back to this and use realloc?, it may 231*16467b97STreehugger Robot // be more efficient... 232*16467b97STreehugger Robot // 233*16467b97STreehugger Robot newBits = (ANTLR_BITWORD*) AllocPolicyType::alloc0(newSize * sizeof(ANTLR_BITWORD) ); 234*16467b97STreehugger Robot if ( m_blist.get_bits() != NULL) 235*16467b97STreehugger Robot { 236*16467b97STreehugger Robot // Copy existing bits 237*16467b97STreehugger Robot // 238*16467b97STreehugger Robot memcpy( newBits, m_blist.get_bits(), m_blist.get_length() * sizeof(ANTLR_BITWORD) ); 239*16467b97STreehugger Robot 240*16467b97STreehugger Robot // Out with the old bits... de de de derrr 241*16467b97STreehugger Robot // 242*16467b97STreehugger Robot AllocPolicyType::free( m_blist.get_bits() ); 243*16467b97STreehugger Robot } 244*16467b97STreehugger Robot 245*16467b97STreehugger Robot // In with the new bits... keerrrang. 246*16467b97STreehugger Robot // 247*16467b97STreehugger Robot m_blist.set_bits(newBits); 248*16467b97STreehugger Robot m_blist.set_length(newSize); 249*16467b97STreehugger Robot} 250*16467b97STreehugger Robot 251*16467b97STreehugger Robottemplate <class ImplTraits> 252*16467b97STreehugger Robotbool Bitset<ImplTraits>::equals(Bitset* bitset2) const 253*16467b97STreehugger Robot{ 254*16467b97STreehugger Robot ANTLR_UINT32 minimum; 255*16467b97STreehugger Robot ANTLR_UINT32 i; 256*16467b97STreehugger Robot 257*16467b97STreehugger Robot if (this == NULL || bitset2 == NULL) 258*16467b97STreehugger Robot return false; 259*16467b97STreehugger Robot 260*16467b97STreehugger Robot // Work out the minimum comparison set 261*16467b97STreehugger Robot // 262*16467b97STreehugger Robot if ( m_blist.get_length() < bitset2->m_blist.get_length() ) 263*16467b97STreehugger Robot minimum = m_blist.get_length(); 264*16467b97STreehugger Robot else 265*16467b97STreehugger Robot minimum = bitset2->m_blist.get_length(); 266*16467b97STreehugger Robot 267*16467b97STreehugger Robot // Make sure explict in common bits are equal 268*16467b97STreehugger Robot // 269*16467b97STreehugger Robot for (i = minimum - 1; i < minimum ; i--) 270*16467b97STreehugger Robot { 271*16467b97STreehugger Robot ANTLR_BITWORD* bits1 = m_blist.get_bits(); 272*16467b97STreehugger Robot ANTLR_BITWORD* bits2 = bitset2->m_blist.get_bits(); 273*16467b97STreehugger Robot if ( bits1[i] != bits2[i]) 274*16467b97STreehugger Robot return false; 275*16467b97STreehugger Robot } 276*16467b97STreehugger Robot 277*16467b97STreehugger Robot // Now make sure the bits of the larger set are all turned 278*16467b97STreehugger Robot // off. 279*16467b97STreehugger Robot // 280*16467b97STreehugger Robot if ( m_blist.get_length() > minimum) 281*16467b97STreehugger Robot { 282*16467b97STreehugger Robot for (i = minimum ; i < m_blist.get_length(); i++) 283*16467b97STreehugger Robot { 284*16467b97STreehugger Robot ANTLR_BITWORD* bits = m_blist.get_bits(); 285*16467b97STreehugger Robot if(bits[i] != 0) 286*16467b97STreehugger Robot return false; 287*16467b97STreehugger Robot } 288*16467b97STreehugger Robot } 289*16467b97STreehugger Robot else if (bitset2->m_blist.get_length() > minimum) 290*16467b97STreehugger Robot { 291*16467b97STreehugger Robot ANTLR_BITWORD* bits = m_blist.get_bits(); 292*16467b97STreehugger Robot for (i = minimum; i < bitset2->m_blist.get_length(); i++) 293*16467b97STreehugger Robot { 294*16467b97STreehugger Robot if ( bits[i] != 0 ) 295*16467b97STreehugger Robot return false; 296*16467b97STreehugger Robot } 297*16467b97STreehugger Robot } 298*16467b97STreehugger Robot 299*16467b97STreehugger Robot return true; 300*16467b97STreehugger Robot} 301*16467b97STreehugger Robot 302*16467b97STreehugger Robottemplate <class ImplTraits> 303*16467b97STreehugger Robotbool Bitset<ImplTraits>::isMember(ANTLR_UINT32 bit) const 304*16467b97STreehugger Robot{ 305*16467b97STreehugger Robot ANTLR_UINT32 wordNo = Bitset::WordNumber(bit); 306*16467b97STreehugger Robot 307*16467b97STreehugger Robot if (wordNo >= m_blist.get_length()) 308*16467b97STreehugger Robot return false; 309*16467b97STreehugger Robot 310*16467b97STreehugger Robot ANTLR_BITWORD* bits = m_blist.get_bits(); 311*16467b97STreehugger Robot if ( (bits[wordNo] & Bitset::BitMask(bit)) == 0) 312*16467b97STreehugger Robot return false; 313*16467b97STreehugger Robot else 314*16467b97STreehugger Robot return true; 315*16467b97STreehugger Robot} 316*16467b97STreehugger Robot 317*16467b97STreehugger Robottemplate <class ImplTraits> 318*16467b97STreehugger RobotANTLR_INLINE ANTLR_UINT32 Bitset<ImplTraits>::numBits() const 319*16467b97STreehugger Robot{ 320*16467b97STreehugger Robot return m_blist.get_length() << ANTLR_BITSET_LOG_BITS; 321*16467b97STreehugger Robot} 322*16467b97STreehugger Robot 323*16467b97STreehugger Robottemplate <class ImplTraits> 324*16467b97STreehugger RobotANTLR_INLINE typename ImplTraits::BitsetListType& Bitset<ImplTraits>::get_blist() 325*16467b97STreehugger Robot{ 326*16467b97STreehugger Robot return m_blist; 327*16467b97STreehugger Robot} 328*16467b97STreehugger Robot 329*16467b97STreehugger Robottemplate <class ImplTraits> 330*16467b97STreehugger RobotANTLR_INLINE void Bitset<ImplTraits>::remove(ANTLR_UINT32 bit) 331*16467b97STreehugger Robot{ 332*16467b97STreehugger Robot ANTLR_UINT32 wordNo = Bitset::WordNumber(bit); 333*16467b97STreehugger Robot 334*16467b97STreehugger Robot if (wordNo < m_blist.get_length()) 335*16467b97STreehugger Robot { 336*16467b97STreehugger Robot ANTLR_BITWORD* bits = m_blist.get_bits(); 337*16467b97STreehugger Robot bits[wordNo] &= ~(Bitset::BitMask(bit)); 338*16467b97STreehugger Robot } 339*16467b97STreehugger Robot} 340*16467b97STreehugger Robot 341*16467b97STreehugger Robottemplate <class ImplTraits> 342*16467b97STreehugger RobotANTLR_INLINE bool Bitset<ImplTraits>::isNilNode() const 343*16467b97STreehugger Robot{ 344*16467b97STreehugger Robot ANTLR_UINT32 i; 345*16467b97STreehugger Robot ANTLR_BITWORD* bits = m_blist.get_bits(); 346*16467b97STreehugger Robot for (i = m_blist.get_length() -1 ; i < m_blist.get_length(); i--) 347*16467b97STreehugger Robot { 348*16467b97STreehugger Robot if(bits[i] != 0) 349*16467b97STreehugger Robot return false; 350*16467b97STreehugger Robot } 351*16467b97STreehugger Robot return true; 352*16467b97STreehugger Robot} 353*16467b97STreehugger Robot 354*16467b97STreehugger Robottemplate <class ImplTraits> 355*16467b97STreehugger RobotANTLR_INT32* Bitset<ImplTraits>::toIntList() const 356*16467b97STreehugger Robot{ 357*16467b97STreehugger Robot ANTLR_UINT32 numInts; // How many integers we will need 358*16467b97STreehugger Robot ANTLR_UINT32 numBits; // How many bits are in the set 359*16467b97STreehugger Robot ANTLR_UINT32 i; 360*16467b97STreehugger Robot ANTLR_UINT32 index; 361*16467b97STreehugger Robot 362*16467b97STreehugger Robot ANTLR_INT32* intList; 363*16467b97STreehugger Robot 364*16467b97STreehugger Robot numInts = this->size() + 1; 365*16467b97STreehugger Robot numBits = this->numBits(); 366*16467b97STreehugger Robot 367*16467b97STreehugger Robot intList = (ANTLR_INT32*) AllocPolicyType::alloc(numInts * sizeof(ANTLR_INT32)); 368*16467b97STreehugger Robot 369*16467b97STreehugger Robot intList[0] = numInts; 370*16467b97STreehugger Robot 371*16467b97STreehugger Robot // Enumerate the bits that are turned on 372*16467b97STreehugger Robot // 373*16467b97STreehugger Robot for (i = 0, index = 1; i<numBits; i++) 374*16467b97STreehugger Robot { 375*16467b97STreehugger Robot if (this->isMember(i) == true) 376*16467b97STreehugger Robot intList[index++] = i; 377*16467b97STreehugger Robot } 378*16467b97STreehugger Robot 379*16467b97STreehugger Robot // Result set 380*16467b97STreehugger Robot // 381*16467b97STreehugger Robot return intList; 382*16467b97STreehugger Robot} 383*16467b97STreehugger Robot 384*16467b97STreehugger Robottemplate <class ImplTraits> 385*16467b97STreehugger RobotANTLR_INLINE Bitset<ImplTraits>::~Bitset() 386*16467b97STreehugger Robot{ 387*16467b97STreehugger Robot if (m_blist.get_bits() != NULL) 388*16467b97STreehugger Robot AllocPolicyType::free(m_blist.get_bits()); 389*16467b97STreehugger Robot return; 390*16467b97STreehugger Robot} 391*16467b97STreehugger Robot 392*16467b97STreehugger Robottemplate <class ImplTraits> 393*16467b97STreehugger Robotvoid Bitset<ImplTraits>::growToInclude(ANTLR_INT32 bit) 394*16467b97STreehugger Robot{ 395*16467b97STreehugger Robot ANTLR_UINT32 bl; 396*16467b97STreehugger Robot ANTLR_UINT32 nw; 397*16467b97STreehugger Robot 398*16467b97STreehugger Robot bl = (m_blist.get_length() << 1); 399*16467b97STreehugger Robot nw = Bitset::NumWordsToHold(bit); 400*16467b97STreehugger Robot 401*16467b97STreehugger Robot if (bl > nw) 402*16467b97STreehugger Robot this->grow(bl); 403*16467b97STreehugger Robot else 404*16467b97STreehugger Robot this->grow(nw); 405*16467b97STreehugger Robot} 406*16467b97STreehugger Robot 407*16467b97STreehugger Robottemplate <class ImplTraits> 408*16467b97STreehugger RobotANTLR_INLINE ANTLR_UINT64 Bitset<ImplTraits>::BitMask(ANTLR_UINT32 bitNumber) 409*16467b97STreehugger Robot{ 410*16467b97STreehugger Robot return ((ANTLR_UINT64)1) << (bitNumber & (ANTLR_BITSET_MOD_MASK)); 411*16467b97STreehugger Robot} 412*16467b97STreehugger Robot 413*16467b97STreehugger Robottemplate <class ImplTraits> 414*16467b97STreehugger RobotANTLR_INLINE ANTLR_UINT32 Bitset<ImplTraits>::NumWordsToHold(ANTLR_UINT32 bit) 415*16467b97STreehugger Robot{ 416*16467b97STreehugger Robot return (bit >> ANTLR_BITSET_LOG_BITS) + 1; 417*16467b97STreehugger Robot} 418*16467b97STreehugger Robot 419*16467b97STreehugger Robottemplate <class ImplTraits> 420*16467b97STreehugger RobotANTLR_INLINE ANTLR_UINT32 Bitset<ImplTraits>::WordNumber(ANTLR_UINT32 bit) 421*16467b97STreehugger Robot{ 422*16467b97STreehugger Robot return bit >> ANTLR_BITSET_LOG_BITS; 423*16467b97STreehugger Robot} 424*16467b97STreehugger Robot 425*16467b97STreehugger Robottemplate <class ImplTraits> 426*16467b97STreehugger Robotvoid Bitset<ImplTraits>::bitsetORInPlace(Bitset* bitset2) 427*16467b97STreehugger Robot{ 428*16467b97STreehugger Robot ANTLR_UINT32 minimum; 429*16467b97STreehugger Robot ANTLR_UINT32 i; 430*16467b97STreehugger Robot 431*16467b97STreehugger Robot if (bitset2 == NULL) 432*16467b97STreehugger Robot return; 433*16467b97STreehugger Robot 434*16467b97STreehugger Robot // First make sure that the target bitset is big enough 435*16467b97STreehugger Robot // for the new bits to be ored in. 436*16467b97STreehugger Robot // 437*16467b97STreehugger Robot if ( m_blist.get_length() < bitset2->m_blist.get_length() ) 438*16467b97STreehugger Robot this->growToInclude( bitset2->m_blist.get_length() * sizeof(ANTLR_BITWORD) ); 439*16467b97STreehugger Robot 440*16467b97STreehugger Robot // Or the miniimum number of bits after any resizing went on 441*16467b97STreehugger Robot // 442*16467b97STreehugger Robot if ( m_blist.get_length() < bitset2->m_blist.get_length() ) 443*16467b97STreehugger Robot minimum = m_blist.get_length(); 444*16467b97STreehugger Robot else 445*16467b97STreehugger Robot minimum = bitset2->m_blist.get_length(); 446*16467b97STreehugger Robot 447*16467b97STreehugger Robot ANTLR_BITWORD* bits1 = m_blist.get_bits(); 448*16467b97STreehugger Robot ANTLR_BITWORD* bits2 = bitset2->m_blist.get_bits(); 449*16467b97STreehugger Robot for (i = minimum; i > 0; i--) 450*16467b97STreehugger Robot bits1[i-1] |= bits2[i-1]; 451*16467b97STreehugger Robot} 452*16467b97STreehugger Robot 453*16467b97STreehugger Robottemplate <class ImplTraits> 454*16467b97STreehugger RobotBitset<ImplTraits>* Bitset<ImplTraits>::BitsetOf(ANTLR_INT32 bit) 455*16467b97STreehugger Robot{ 456*16467b97STreehugger Robot // Allocate memory for the bitset structure itself 457*16467b97STreehugger Robot // the input parameter is the bit number (0 based) 458*16467b97STreehugger Robot // to include in the bitset, so we need at at least 459*16467b97STreehugger Robot // bit + 1 bits. If any arguments indicate a 460*16467b97STreehugger Robot // a bit higher than the default number of bits (0 menas default size) 461*16467b97STreehugger Robot // then Add() will take care 462*16467b97STreehugger Robot // of it. 463*16467b97STreehugger Robot // 464*16467b97STreehugger Robot Bitset<ImplTraits>* bitset = new Bitset<ImplTraits>(0); 465*16467b97STreehugger Robot bitset->add(bit); 466*16467b97STreehugger Robot return bitset; 467*16467b97STreehugger Robot} 468*16467b97STreehugger Robot 469*16467b97STreehugger Robottemplate <class ImplTraits> 470*16467b97STreehugger RobotBitset<ImplTraits>* Bitset<ImplTraits>::BitsetOf(ANTLR_INT32 bit1, ANTLR_INT32 bit2) 471*16467b97STreehugger Robot{ 472*16467b97STreehugger Robot Bitset<ImplTraits>* bitset = Bitset<ImplTraits>::BitsetOf(bit1); 473*16467b97STreehugger Robot bitset->add(bit2); 474*16467b97STreehugger Robot return bitset; 475*16467b97STreehugger Robot} 476*16467b97STreehugger Robot 477*16467b97STreehugger Robot//static 478*16467b97STreehugger Robottemplate <class ImplTraits> 479*16467b97STreehugger RobotBitset<ImplTraits>* Bitset<ImplTraits>::BitsetFromList(const IntListType& list) 480*16467b97STreehugger Robot{ 481*16467b97STreehugger Robot // We have no idea what exactly is in the list 482*16467b97STreehugger Robot // so create a default bitset and then just add stuff 483*16467b97STreehugger Robot // as we enumerate. 484*16467b97STreehugger Robot // 485*16467b97STreehugger Robot Bitset<ImplTraits>* bitset = new Bitset<ImplTraits>(0); 486*16467b97STreehugger Robot for( int i = 0; i < list.size(); ++i ) 487*16467b97STreehugger Robot bitset->add( list[i] ); 488*16467b97STreehugger Robot 489*16467b97STreehugger Robot return bitset; 490*16467b97STreehugger Robot} 491*16467b97STreehugger Robot 492*16467b97STreehugger RobotANTLR_END_NAMESPACE() 493