Implement IntervalMap::clear().
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 19 Nov 2010 23:28:57 +0000 (23:28 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 19 Nov 2010 23:28:57 +0000 (23:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119872 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/IntervalMap.h
unittests/ADT/IntervalMapTest.cpp

index dd4eec3c63c892d6a414b2b92f8317cf6d7db703..96b5161da7fa2b723f946068cf81138963f1ccbb 100644 (file)
@@ -806,7 +806,7 @@ private:
   Leaf *allocLeaf()  {
     return new(allocator.template Allocate<Leaf>()) Leaf();
   }
-  void freeLeaf(Leaf *P) {
+  void deleteLeaf(Leaf *P) {
     P->~Leaf();
     allocator.Deallocate(P);
   }
@@ -814,7 +814,7 @@ private:
   Branch *allocBranch() {
     return new(allocator.template Allocate<Branch>()) Branch();
   }
-  void freeBranch(Branch *P) {
+  void deleteBranch(Branch *P) {
     P->~Branch();
     allocator.Deallocate(P);
   }
@@ -838,8 +838,8 @@ private:
   bool branched() const { return height > 0; }
 
   ValT treeSafeLookup(KeyT x, ValT NotFound) const;
-
   void visitNodes(void (IntervalMap::*f)(NodeRef, unsigned Level));
+  void deleteNode(NodeRef Node, unsigned Level);
 
 public:
   explicit IntervalMap(Allocator &a) : height(0), rootSize(0), allocator(a) {
@@ -881,6 +881,9 @@ public:
     find(a).insert(a, b, y);
   }
 
+  /// clear - Remove all entries.
+  void clear();
+
   class const_iterator;
   class iterator;
   friend class const_iterator;
@@ -1048,6 +1051,25 @@ visitNodes(void (IntervalMap::*f)(NodeRef, unsigned Height)) {
     (this->*f)(Refs[i], 0);
 }
 
+template <typename KeyT, typename ValT, unsigned N, typename Traits>
+void IntervalMap<KeyT, ValT, N, Traits>::
+deleteNode(NodeRef Node, unsigned Level) {
+  if (Level)
+    deleteBranch(&Node.branch());
+  else
+    deleteLeaf(&Node.leaf());
+}
+
+template <typename KeyT, typename ValT, unsigned N, typename Traits>
+void IntervalMap<KeyT, ValT, N, Traits>::
+clear() {
+  if (branched()) {
+    visitNodes(&IntervalMap::deleteNode);
+    switchRootToLeaf();
+  }
+  rootSize = 0;
+}
+
 #ifndef NDEBUG
 template <typename KeyT, typename ValT, unsigned N, typename Traits>
 void IntervalMap<KeyT, ValT, N, Traits>::
index c7def84340a69399821609a8d00424e68fb2e1c1..d4b2f52b50c4ff23abfd77d6a2ae55137c3414de 100644 (file)
@@ -315,6 +315,11 @@ TEST(IntervalMapTest, RootMultiCoalescing) {
   EXPECT_EQ(320u, I.stop());
   ++I;
   EXPECT_FALSE(I.valid());
+
+  // Test clear() on non-branched map.
+  map.clear();
+  EXPECT_TRUE(map.empty());
+  EXPECT_TRUE(map.begin() == map.end());
 }
 
 // Branched, non-coalescing tests.
@@ -362,6 +367,10 @@ TEST(IntervalMapTest, Branched) {
   }
   EXPECT_TRUE(I == map.begin());
 
+  // Test clear() on branched map.
+  map.clear();
+  EXPECT_TRUE(map.empty());
+  EXPECT_TRUE(map.begin() == map.end());
 }
 
 } // namespace