diff options
| author | Benjamin Kramer <benny.kra@googlemail.com> | 2018-11-01 13:55:59 +0000 |
|---|---|---|
| committer | Benjamin Kramer <benny.kra@googlemail.com> | 2018-11-01 13:55:59 +0000 |
| commit | 5223624e818b6c519b2262d60f6368bc75d7da52 (patch) | |
| tree | 63f02fd508a89585a0bd2c834c38a2bd6c172189 | |
| parent | a94ecc619b3eb82144af0ac049676728b84caa77 (diff) | |
| download | bcm5719-llvm-5223624e818b6c519b2262d60f6368bc75d7da52.tar.gz bcm5719-llvm-5223624e818b6c519b2262d60f6368bc75d7da52.zip | |
[ADT] Clean up SparseBitVector copying and make it moveable
llvm-svn: 345829
| -rw-r--r-- | llvm/include/llvm/ADT/SparseBitVector.h | 39 | ||||
| -rw-r--r-- | llvm/unittests/ADT/SparseBitVectorTest.cpp | 16 |
2 files changed, 29 insertions, 26 deletions
diff --git a/llvm/include/llvm/ADT/SparseBitVector.h b/llvm/include/llvm/ADT/SparseBitVector.h index 09a91b6614e..84e73bcbace 100644 --- a/llvm/include/llvm/ADT/SparseBitVector.h +++ b/llvm/include/llvm/ADT/SparseBitVector.h @@ -261,11 +261,11 @@ class SparseBitVector { BITWORD_SIZE = SparseBitVectorElement<ElementSize>::BITWORD_SIZE }; + ElementList Elements; // Pointer to our current Element. This has no visible effect on the external // state of a SparseBitVector, it's just used to improve performance in the // common case of testing/modifying bits with similar indices. mutable ElementListIter CurrElementIter; - ElementList Elements; // This is like std::lower_bound, except we do linear searching from the // current position. @@ -441,22 +441,12 @@ class SparseBitVector { public: using iterator = SparseBitVectorIterator; - SparseBitVector() { - CurrElementIter = Elements.begin(); - } + SparseBitVector() : Elements(), CurrElementIter(Elements.begin()) {} - // SparseBitVector copy ctor. - SparseBitVector(const SparseBitVector &RHS) { - ElementListConstIter ElementIter = RHS.Elements.begin(); - while (ElementIter != RHS.Elements.end()) { - Elements.push_back(SparseBitVectorElement<ElementSize>(*ElementIter)); - ++ElementIter; - } - - CurrElementIter = Elements.begin (); - } - - ~SparseBitVector() = default; + SparseBitVector(const SparseBitVector &RHS) + : Elements(RHS.Elements), CurrElementIter(Elements.begin()) {} + SparseBitVector(SparseBitVector &&RHS) + : Elements(std::move(RHS.Elements)), CurrElementIter(Elements.begin()) {} // Clear. void clear() { @@ -468,16 +458,13 @@ public: if (this == &RHS) return *this; - Elements.clear(); - - ElementListConstIter ElementIter = RHS.Elements.begin(); - while (ElementIter != RHS.Elements.end()) { - Elements.push_back(SparseBitVectorElement<ElementSize>(*ElementIter)); - ++ElementIter; - } - - CurrElementIter = Elements.begin (); - + Elements = RHS.Elements; + CurrElementIter = Elements.begin(); + return *this; + } + SparseBitVector &operator=(SparseBitVector &&RHS) { + Elements = std::move(RHS.Elements); + CurrElementIter = Elements.begin(); return *this; } diff --git a/llvm/unittests/ADT/SparseBitVectorTest.cpp b/llvm/unittests/ADT/SparseBitVectorTest.cpp index 097f4a0b737..7675ddac14b 100644 --- a/llvm/unittests/ADT/SparseBitVectorTest.cpp +++ b/llvm/unittests/ADT/SparseBitVectorTest.cpp @@ -36,6 +36,22 @@ TEST(SparseBitVectorTest, TrivialOperation) { const SparseBitVector<> ConstVec = Vec; EXPECT_TRUE(ConstVec.test(5)); EXPECT_FALSE(ConstVec.test(17)); + + Vec.set(1337); + EXPECT_TRUE(Vec.test(1337)); + Vec = ConstVec; + EXPECT_FALSE(Vec.test(1337)); + + Vec.set(1337); + EXPECT_FALSE(Vec.empty()); + SparseBitVector<> MovedVec(std::move(Vec)); + EXPECT_TRUE(Vec.empty()); + EXPECT_TRUE(MovedVec.test(5)); + EXPECT_TRUE(MovedVec.test(1337)); + + Vec = std::move(MovedVec); + EXPECT_TRUE(MovedVec.empty()); + EXPECT_FALSE(Vec.empty()); } TEST(SparseBitVectorTest, IntersectWith) { |

