[llvm] r264414 - [SetVector] Add erase() method

Jun Bum Lim via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 25 09:04:44 PDT 2016


Author: junbuml
Date: Fri Mar 25 11:04:43 2016
New Revision: 264414

URL: http://llvm.org/viewvc/llvm-project?rev=264414&view=rev
Log:
[SetVector] Add erase() method

Summary:
Add erase() which returns an iterator pointing to the next element after the
erased one. This makes it possible to erase selected elements while iterating
over the SetVector :
  while (I != E)
    if (test(*I))
      I = SetVector.erase(I);
    else
      ++I;

Reviewers: qcolombet, mcrosier, MatzeB, dblaikie

Subscribers: dberlin, dblaikie, mcrosier, llvm-commits

Differential Revision: http://reviews.llvm.org/D18281

Added:
    llvm/trunk/unittests/ADT/SetVectorTest.cpp
Modified:
    llvm/trunk/include/llvm/ADT/SetVector.h
    llvm/trunk/unittests/ADT/CMakeLists.txt

Modified: llvm/trunk/include/llvm/ADT/SetVector.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/SetVector.h?rev=264414&r1=264413&r2=264414&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/SetVector.h (original)
+++ llvm/trunk/include/llvm/ADT/SetVector.h Fri Mar 25 11:04:43 2016
@@ -151,6 +151,17 @@ public:
     return false;
   }
 
+  /// Erase a single element from the set vector.
+  /// \returns an iterator pointing to the next element that followed the
+  /// element erased. This is the end of the SetVector if the last element is
+  /// erased.
+  iterator erase(iterator I) {
+    const key_type &V = *I;
+    assert(set_.count(V) && "Corrupted SetVector instances!");
+    set_.erase(V);
+    return vector_.erase(I);
+  }
+
   /// \brief Remove items from the set vector based on a predicate function.
   ///
   /// This is intended to be equivalent to the following code, if we could

Modified: llvm/trunk/unittests/ADT/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/CMakeLists.txt?rev=264414&r1=264413&r2=264414&view=diff
==============================================================================
--- llvm/trunk/unittests/ADT/CMakeLists.txt (original)
+++ llvm/trunk/unittests/ADT/CMakeLists.txt Fri Mar 25 11:04:43 2016
@@ -32,6 +32,7 @@ set(ADTSources
   PostOrderIteratorTest.cpp
   RangeAdapterTest.cpp
   SCCIteratorTest.cpp
+  SetVectorTest.cpp
   SmallPtrSetTest.cpp
   SmallStringTest.cpp
   SmallVectorTest.cpp

Added: llvm/trunk/unittests/ADT/SetVectorTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/SetVectorTest.cpp?rev=264414&view=auto
==============================================================================
--- llvm/trunk/unittests/ADT/SetVectorTest.cpp (added)
+++ llvm/trunk/unittests/ADT/SetVectorTest.cpp Fri Mar 25 11:04:43 2016
@@ -0,0 +1,34 @@
+//===- llvm/unittest/ADT/SetVector.cpp ------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// SetVector unit tests.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ADT/SetVector.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+TEST(SetVector, EraseTest) {
+  SetVector<int> S;
+  S.insert(0);
+  S.insert(1);
+  S.insert(2);
+
+  auto I = S.erase(std::next(S.begin()));
+
+  // Test that the returned iterator is the expected one-after-erase
+  // and the size/contents is the expected sequence {0, 2}.
+  EXPECT_EQ(std::next(S.begin()), I);
+  EXPECT_EQ(2u, S.size());
+  EXPECT_EQ(0, *S.begin());
+  EXPECT_EQ(2, *std::next(S.begin()));
+}
+




More information about the llvm-commits mailing list