[ADT] Clean up SparseBitVector copying and make it moveable
authorBenjamin Kramer <benny.kra@googlemail.com>
Thu, 1 Nov 2018 13:55:59 +0000 (13:55 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Thu, 1 Nov 2018 13:55:59 +0000 (13:55 +0000)
llvm-svn: 345829

llvm/include/llvm/ADT/SparseBitVector.h
llvm/unittests/ADT/SparseBitVectorTest.cpp

index 09a91b6..84e73bc 100644 (file)
@@ -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;
   }
 
index 097f4a0..7675dda 100644 (file)
@@ -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) {