summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2018-11-01 13:55:59 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2018-11-01 13:55:59 +0000
commit5223624e818b6c519b2262d60f6368bc75d7da52 (patch)
tree63f02fd508a89585a0bd2c834c38a2bd6c172189
parenta94ecc619b3eb82144af0ac049676728b84caa77 (diff)
downloadbcm5719-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.h39
-rw-r--r--llvm/unittests/ADT/SparseBitVectorTest.cpp16
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) {
OpenPOWER on IntegriCloud