Add isPositive for symmetry with isNegative.
[oota-llvm.git] / include / llvm / ADT / BitVector.h
index 6910be04e510ee913f79998ea9b3cf55199ec35a..2b0e127265d96e9b66a65cb78daa0067f2e81379 100644 (file)
@@ -53,14 +53,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);
     }
@@ -86,6 +78,7 @@ public:
   BitVector(const BitVector &RHS) : Size(RHS.size()) {
     if (Size == 0) {
       Bits = NULL;
+      Capacity = 0;
       return;
     }
 
@@ -106,7 +99,7 @@ public:
       else if (sizeof(BitWord) == 8)
         NumBits += CountPopulation_64(Bits[i]);
       else
-        assert(0 && "Unsupported!")
+        assert(0 && "Unsupported!");
     return NumBits;
   }
 
@@ -127,8 +120,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 * 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!");
+      }
     return -1;
   }
 
@@ -143,15 +142,27 @@ public:
     unsigned BitPos = Prev % BITS_PER_WORD;
     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 * BITS_PER_WORD + CountTrailingZeros_32(Copy);
+      else if (sizeof(BitWord) == 8)
+       return WordPos * BITS_PER_WORD + 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 * 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!");
+      }
     return -1;
   }
 
@@ -161,16 +172,7 @@ public:
   }
 
   /// 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) {
+  void resize(unsigned N, bool t = false) {
     if (N > Capacity * BITS_PER_WORD) {
       unsigned OldCapacity = Capacity;
       grow(N);
@@ -187,10 +189,8 @@ public:
 
   // 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;
   }
 
@@ -200,8 +200,7 @@ public:
   }
 
   BitVector &reset() {
-    if (Bits)
-      init_words(Bits, Capacity, false);
+    init_words(Bits, Capacity, false);
     return *this;
   }
 
@@ -243,7 +242,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;
@@ -307,9 +308,10 @@ private:
 
   // 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 % BITS_PER_WORD;
+    if (ExtraBits) {
+      unsigned index = Size / BITS_PER_WORD;
+      Bits[index] &= ~(~0L << ExtraBits);
     }
   }
 
@@ -323,14 +325,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));
   } 
 };