From: Simon Pilgrim Date: Wed, 19 Sep 2018 11:08:54 +0000 (+0000) Subject: [ADT][BitVector] Add push_back() X-Git-Tag: llvmorg-8.0.0-rc1~8428 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=07a5fcd87d717beeaa60049883686b94b1277017;p=platform%2Fupstream%2Fllvm.git [ADT][BitVector] Add push_back() Add a higher performance alternative to calling resize() every time which performs a lot of clearing to zero - when we're adding a single bit most of the time this will be completely unnecessary. Differential Revision: https://reviews.llvm.org/D52236 llvm-svn: 342535 --- diff --git a/llvm/include/llvm/ADT/BitVector.h b/llvm/include/llvm/ADT/BitVector.h index 438c7d8..9ab1da7 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 b639174..f86bebd 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 d6a2075..701cdf7 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