X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FADT%2FBitVector.h;h=6418f7f66b4b1c1e2da1a8b19d2153e46cd451a7;hb=a727d5502c8e23c090da658bf14c5ebc1169a070;hp=2b0e127265d96e9b66a65cb78daa0067f2e81379;hpb=0eca22af62c1e1500b1a937ccdec6d5ffe6ecd8a;p=oota-llvm.git diff --git a/include/llvm/ADT/BitVector.h b/include/llvm/ADT/BitVector.h index 2b0e127265d..6418f7f66b4 100644 --- a/include/llvm/ADT/BitVector.h +++ b/include/llvm/ADT/BitVector.h @@ -15,13 +15,16 @@ #define LLVM_ADT_BITVECTOR_H #include "llvm/Support/MathExtras.h" +#include +#include +#include namespace llvm { class BitVector { typedef unsigned long BitWord; - enum { BITS_PER_WORD = sizeof(BitWord) * 8 }; + enum { BITWORD_SIZE = sizeof(BitWord) * 8 }; BitWord *Bits; // Actual bits. unsigned Size; // Size of bitvector in bits. @@ -39,8 +42,8 @@ public: public: reference(BitVector &b, unsigned Idx) { - WordRef = &b.Bits[Idx / BITS_PER_WORD]; - BitPos = Idx % BITS_PER_WORD; + WordRef = &b.Bits[Idx / BITWORD_SIZE]; + BitPos = Idx % BITWORD_SIZE; } ~reference() {} @@ -86,6 +89,10 @@ public: Bits = new BitWord[Capacity]; std::copy(RHS.Bits, &RHS.Bits[Capacity], Bits); } + + ~BitVector() { + delete[] Bits; + } /// size - Returns the number of bits in this bitvector. unsigned size() const { return Size; } @@ -121,12 +128,12 @@ public: int find_first() const { for (unsigned i = 0; i < NumBitWords(size()); ++i) if (Bits[i] != 0) { - if (sizeof(BitWord) == 4) - return i * BITS_PER_WORD + CountTrailingZeros_32(Bits[i]); - else if (sizeof(BitWord) == 8) - return i * BITS_PER_WORD + CountTrailingZeros_64(Bits[i]); - else - assert(0 && "Unsupported!"); + if (sizeof(BitWord) == 4) + return i * BITWORD_SIZE + CountTrailingZeros_32(Bits[i]); + else if (sizeof(BitWord) == 8) + return i * BITWORD_SIZE + CountTrailingZeros_64(Bits[i]); + else + assert(0 && "Unsupported!"); } return -1; } @@ -138,30 +145,30 @@ public: if (Prev >= Size) return -1; - unsigned WordPos = Prev / BITS_PER_WORD; - unsigned BitPos = Prev % BITS_PER_WORD; + unsigned WordPos = Prev / BITWORD_SIZE; + unsigned BitPos = Prev % BITWORD_SIZE; BitWord Copy = Bits[WordPos]; // Mask off previous bits. Copy &= ~0L << BitPos; if (Copy != 0) { if (sizeof(BitWord) == 4) - return WordPos * BITS_PER_WORD + CountTrailingZeros_32(Copy); + return WordPos * BITWORD_SIZE + CountTrailingZeros_32(Copy); else if (sizeof(BitWord) == 8) - return WordPos * BITS_PER_WORD + CountTrailingZeros_64(Copy); + return WordPos * BITWORD_SIZE + CountTrailingZeros_64(Copy); else - assert(0 && "Unsupported!"); + assert(0 && "Unsupported!"); } // Check subsequent words. for (unsigned i = WordPos+1; i < NumBitWords(size()); ++i) if (Bits[i] != 0) { - if (sizeof(BitWord) == 4) - return i * BITS_PER_WORD + CountTrailingZeros_32(Bits[i]); - else if (sizeof(BitWord) == 8) - return i * BITS_PER_WORD + CountTrailingZeros_64(Bits[i]); - else - assert(0 && "Unsupported!"); + if (sizeof(BitWord) == 4) + return i * BITWORD_SIZE + CountTrailingZeros_32(Bits[i]); + else if (sizeof(BitWord) == 8) + return i * BITWORD_SIZE + CountTrailingZeros_64(Bits[i]); + else + assert(0 && "Unsupported!"); } return -1; } @@ -173,7 +180,7 @@ public: /// resize - Grow or shrink the bitvector. void resize(unsigned N, bool t = false) { - if (N > Capacity * BITS_PER_WORD) { + if (N > Capacity * BITWORD_SIZE) { unsigned OldCapacity = Capacity; grow(N); init_words(&Bits[OldCapacity], (Capacity-OldCapacity), t); @@ -183,7 +190,7 @@ public: } void reserve(unsigned N) { - if (N > Capacity * BITS_PER_WORD) + if (N > Capacity * BITWORD_SIZE) grow(N); } @@ -195,7 +202,7 @@ public: } BitVector &set(unsigned Idx) { - Bits[Idx / BITS_PER_WORD] |= 1L << (Idx % BITS_PER_WORD); + Bits[Idx / BITWORD_SIZE] |= 1L << (Idx % BITWORD_SIZE); return *this; } @@ -205,7 +212,7 @@ public: } BitVector &reset(unsigned Idx) { - Bits[Idx / BITS_PER_WORD] &= ~(1L << (Idx % BITS_PER_WORD)); + Bits[Idx / BITWORD_SIZE] &= ~(1L << (Idx % BITWORD_SIZE)); return *this; } @@ -217,7 +224,7 @@ public: } BitVector &flip(unsigned Idx) { - Bits[Idx / BITS_PER_WORD] ^= 1L << (Idx % BITS_PER_WORD); + Bits[Idx / BITWORD_SIZE] ^= 1L << (Idx % BITWORD_SIZE); return *this; } @@ -232,8 +239,8 @@ public: } bool operator[](unsigned Idx) const { - BitWord Mask = 1L << (Idx % BITS_PER_WORD); - return (Bits[Idx / BITS_PER_WORD] & Mask) != 0; + BitWord Mask = 1L << (Idx % BITWORD_SIZE); + return (Bits[Idx / BITWORD_SIZE] & Mask) != 0; } bool test(unsigned Idx) const { @@ -283,7 +290,7 @@ public: Size = RHS.size(); unsigned RHSWords = NumBitWords(Size); - if (Size <= Capacity * BITS_PER_WORD) { + if (Size <= Capacity * BITWORD_SIZE) { std::copy(RHS.Bits, &RHS.Bits[RHSWords], Bits); clear_unused_bits(); return *this; @@ -303,14 +310,14 @@ public: private: unsigned NumBitWords(unsigned S) const { - return (S + BITS_PER_WORD-1) / BITS_PER_WORD; + return (S + BITWORD_SIZE-1) / BITWORD_SIZE; } // Clear the unused top bits in the high word. void clear_unused_bits() { - unsigned ExtraBits = Size % BITS_PER_WORD; + unsigned ExtraBits = Size % BITWORD_SIZE; if (ExtraBits) { - unsigned index = Size / BITS_PER_WORD; + unsigned index = Size / BITWORD_SIZE; Bits[index] &= ~(~0L << ExtraBits); } }