minor cleanups. Add provisions for a new standard BLOCKINFO_BLOCK
[oota-llvm.git] / include / llvm / ADT / BitVector.h
index 94cbf0962140df93d1891dacacfc24eb5eba34d6..6418f7f66b4b1c1e2da1a8b19d2153e46cd451a7 100644 (file)
 #define LLVM_ADT_BITVECTOR_H
 
 #include "llvm/Support/MathExtras.h"
+#include <algorithm>
+#include <cstdlib>
+#include <cassert>
 
 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() {}
@@ -53,14 +56,6 @@ public:
       return *this;
     }
 
-    reference& operator=(const reference& rhs) {
-      if (*rhs.WordRef & (1 << rhs.BitPos))
-        *WordRef |= 1L << BitPos;
-      else
-        *WordRef &= ~(1L << BitPos);
-      return *this;
-    }
-
     operator bool() const {
       return (*WordRef) & (1L << BitPos);
     }
@@ -72,29 +67,32 @@ public:
     Bits = NULL;
   }
 
-  /// BitVector ctor - Creates a bitvector of specified number of bits. All
-  /// bits are initialized to false;
-  BitVector(unsigned s) : Size(s) {
-    Capacity = NumBitWords(s);
-    Bits = new BitWord[Capacity];
-    init_words(Bits, Capacity, false);
-  }
-
   /// BitVector ctor - Creates a bitvector of specified number of bits. All
   /// bits are initialized to the specified value.
-  BitVector(unsigned s, bool t) : Size(s) {
+  explicit BitVector(unsigned s, bool t = false) : Size(s) {
     Capacity = NumBitWords(s);
     Bits = new BitWord[Capacity];
     init_words(Bits, Capacity, t);
-    clear_unused_bits();
+    if (t)
+      clear_unused_bits();
   }
 
   /// BitVector copy ctor.
   BitVector(const BitVector &RHS) : Size(RHS.size()) {
+    if (Size == 0) {
+      Bits = NULL;
+      Capacity = 0;
+      return;
+    }
+
     Capacity = NumBitWords(RHS.size());
     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; }
@@ -103,7 +101,12 @@ public:
   unsigned count() const {
     unsigned NumBits = 0;
     for (unsigned i = 0; i < NumBitWords(size()); ++i)
-      NumBits = CountPopulation_32(Bits[i]);
+      if (sizeof(BitWord) == 4)
+        NumBits += CountPopulation_32(Bits[i]);
+      else if (sizeof(BitWord) == 8)
+        NumBits += CountPopulation_64(Bits[i]);
+      else
+        assert(0 && "Unsupported!");
     return NumBits;
   }
 
@@ -124,8 +127,14 @@ public:
   /// of the bits are set.
   int find_first() const {
     for (unsigned i = 0; i < NumBitWords(size()); ++i)
-      if (Bits[i] != 0)
-        return i * BITS_PER_WORD + CountTrailingZeros_32(Bits[i]);
+      if (Bits[i] != 0) {
+        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;
   }
 
@@ -136,43 +145,42 @@ 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 &= ~0 << BitPos;
+    Copy &= ~0L << BitPos;
 
-    if (Copy != 0)
-      return WordPos * BITS_PER_WORD + CountTrailingZeros_32(Copy);
+    if (Copy != 0) {
+      if (sizeof(BitWord) == 4)
+        return WordPos * BITWORD_SIZE + CountTrailingZeros_32(Copy);
+      else if (sizeof(BitWord) == 8)
+        return WordPos * BITWORD_SIZE + CountTrailingZeros_64(Copy);
+      else
+        assert(0 && "Unsupported!");
+    }
 
     // Check subsequent words.
     for (unsigned i = WordPos+1; i < NumBitWords(size()); ++i)
-      if (Bits[i] != 0)
-        return i * BITS_PER_WORD + CountTrailingZeros_32(Bits[i]);
+      if (Bits[i] != 0) {
+        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;
   }
 
   /// clear - Clear all bits.
   void clear() {
-    if (Capacity > 0) {
-      delete[] Bits;
-      Bits = NULL;
-      Size = Capacity = 0;
-    }
+    Size = 0;
   }
 
   /// resize - Grow or shrink the bitvector.
-  void resize(unsigned N) {
-    if (N > Capacity * BITS_PER_WORD) {
-      unsigned OldCapacity = Capacity;
-      grow(N);
-      init_words(&Bits[OldCapacity], (Capacity-OldCapacity), false);
-    }
-    Size = N;
-  }
-
-  void resize(unsigned N, bool t) {
-    if (N > Capacity * BITS_PER_WORD) {
+  void resize(unsigned N, bool t = false) {
+    if (N > Capacity * BITWORD_SIZE) {
       unsigned OldCapacity = Capacity;
       grow(N);
       init_words(&Bits[OldCapacity], (Capacity-OldCapacity), t);
@@ -182,32 +190,29 @@ public:
   }
 
   void reserve(unsigned N) {
-    if (N > Capacity * BITS_PER_WORD)
+    if (N > Capacity * BITWORD_SIZE)
       grow(N);
   }
 
   // Set, reset, flip
   BitVector &set() {
-    if (Bits) {
-      init_words(Bits, Capacity, true);
-      clear_unused_bits();
-    }
+    init_words(Bits, Capacity, true);
+    clear_unused_bits();
     return *this;
   }
 
   BitVector &set(unsigned Idx) {
-    Bits[Idx / BITS_PER_WORD] |= 1L << (Idx % BITS_PER_WORD);
+    Bits[Idx / BITWORD_SIZE] |= 1L << (Idx % BITWORD_SIZE);
     return *this;
   }
 
   BitVector &reset() {
-    if (Bits)
-      init_words(Bits, Capacity, false);
+    init_words(Bits, Capacity, false);
     return *this;
   }
 
   BitVector &reset(unsigned Idx) {
-    Bits[Idx / BITS_PER_WORD] &= ~(1L << (Idx % BITS_PER_WORD));
+    Bits[Idx / BITWORD_SIZE] &= ~(1L << (Idx % BITWORD_SIZE));
     return *this;
   }
 
@@ -219,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;
   }
 
@@ -234,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 {
@@ -244,7 +249,9 @@ public:
 
   // Comparison operators.
   bool operator==(const BitVector &RHS) const {
-    assert(Size == RHS.Size && "Illegal operation!");
+    if (Size != RHS.Size)
+      return false;
+
     for (unsigned i = 0; i < NumBitWords(size()); ++i)
       if (Bits[i] != RHS.Bits[i])
         return false;
@@ -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,15 @@ 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() {
-    if (Size) {
-      unsigned ExtraBits = Size % BITS_PER_WORD;
-      Bits[Size / BITS_PER_WORD] &= ~(~0 << ExtraBits);
+    unsigned ExtraBits = Size % BITWORD_SIZE;
+    if (ExtraBits) {
+      unsigned index = Size / BITWORD_SIZE;
+      Bits[index] &= ~(~0L << ExtraBits);
     }
   }
 
@@ -324,14 +332,12 @@ private:
       std::copy(Bits, &Bits[OldCapacity], NewBits);
 
     // Destroy the old bits.
-    if (Bits)
-      delete[] Bits;
+    delete[] Bits;
     Bits = NewBits;
   }
 
   void init_words(BitWord *B, unsigned NumWords, bool t) {
-    if (B)
-      memset(B, 0 - (int)t, NumWords*sizeof(BitWord));
+    memset(B, 0 - (int)t, NumWords*sizeof(BitWord));
   } 
 };