summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/ADT/BitVector.h17
-rw-r--r--llvm/include/llvm/ADT/SmallBitVector.h5
-rw-r--r--llvm/unittests/ADT/BitVectorTest.cpp31
3 files changed, 53 insertions, 0 deletions
diff --git a/llvm/include/llvm/ADT/BitVector.h b/llvm/include/llvm/ADT/BitVector.h
index 438c7d84c58..9ab1da7c691 100644
--- a/llvm/include/llvm/ADT/BitVector.h
+++ b/llvm/include/llvm/ADT/BitVector.h
@@ -503,6 +503,23 @@ public:
return (*this)[Idx];
}
+ // Push single bit to end of vector.
+ void push_back(bool Val) {
+ unsigned OldSize = Size;
+ unsigned NewSize = Size + 1;
+
+ // Resize, which will insert zeros.
+ // If we already fit then the unused bits will be already zero.
+ if (NewSize > getBitCapacity())
+ resize(NewSize, false);
+ else
+ Size = NewSize;
+
+ // If true, set single bit.
+ if (Val)
+ set(OldSize);
+ }
+
/// Test if any common bits are set.
bool anyCommon(const BitVector &RHS) const {
unsigned ThisWords = NumBitWords(size());
diff --git a/llvm/include/llvm/ADT/SmallBitVector.h b/llvm/include/llvm/ADT/SmallBitVector.h
index b6391746639..f86bebd14cc 100644
--- a/llvm/include/llvm/ADT/SmallBitVector.h
+++ b/llvm/include/llvm/ADT/SmallBitVector.h
@@ -465,6 +465,11 @@ public:
return (*this)[Idx];
}
+ // Push single bit to end of vector.
+ void push_back(bool Val) {
+ resize(size() + 1, Val);
+ }
+
/// Test if any common bits are set.
bool anyCommon(const SmallBitVector &RHS) const {
if (isSmall() && RHS.isSmall())
diff --git a/llvm/unittests/ADT/BitVectorTest.cpp b/llvm/unittests/ADT/BitVectorTest.cpp
index d6a2075ca60..701cdf7d913 100644
--- a/llvm/unittests/ADT/BitVectorTest.cpp
+++ b/llvm/unittests/ADT/BitVectorTest.cpp
@@ -836,5 +836,36 @@ TYPED_TEST(BitVectorTest, Iterators) {
for (unsigned Bit : ToFill.set_bits())
EXPECT_EQ(List[i++], Bit);
}
+
+TYPED_TEST(BitVectorTest, PushBack) {
+ TypeParam Vec(10, false);
+ EXPECT_EQ(-1, Vec.find_first());
+ EXPECT_EQ(10, Vec.size());
+ EXPECT_EQ(0, Vec.count());
+
+ Vec.push_back(true);
+ EXPECT_EQ(10, Vec.find_first());
+ EXPECT_EQ(11, Vec.size());
+ EXPECT_EQ(1, Vec.count());
+
+ Vec.push_back(false);
+ EXPECT_EQ(10, Vec.find_first());
+ EXPECT_EQ(12, Vec.size());
+ EXPECT_EQ(1, Vec.count());
+
+ Vec.push_back(true);
+ EXPECT_EQ(10, Vec.find_first());
+ EXPECT_EQ(13, Vec.size());
+ EXPECT_EQ(2, Vec.count());
+
+ // Add a lot of values to cause reallocation.
+ for (int i = 0; i != 100; ++i) {
+ Vec.push_back(true);
+ Vec.push_back(false);
+ }
+ EXPECT_EQ(10, Vec.find_first());
+ EXPECT_EQ(213, Vec.size());
+ EXPECT_EQ(102, Vec.count());
+}
}
#endif
OpenPOWER on IntegriCloud