summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJun Bum Lim <junbuml@codeaurora.org>2016-03-25 19:28:08 +0000
committerJun Bum Lim <junbuml@codeaurora.org>2016-03-25 19:28:08 +0000
commit2544788e13b3c6f8651fea26ce204ecb2285dc83 (patch)
tree0dac2625d6d091b91aa9c7e3ec812eba02e04e6c
parent09ff326ca23ea631ba5707f17804eb70375196cc (diff)
downloadbcm5719-llvm-2544788e13b3c6f8651fea26ce204ecb2285dc83.tar.gz
bcm5719-llvm-2544788e13b3c6f8651fea26ce204ecb2285dc83.zip
[SetVector] Add erase() method
This is a recommit of r264414 after fixing the buildbot failure caused by incompatible use of std::vector.erase(). The original message: 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 llvm-svn: 264450
-rw-r--r--llvm/include/llvm/ADT/SetVector.h18
-rw-r--r--llvm/unittests/ADT/CMakeLists.txt1
-rw-r--r--llvm/unittests/ADT/SetVectorTest.cpp34
3 files changed, 53 insertions, 0 deletions
diff --git a/llvm/include/llvm/ADT/SetVector.h b/llvm/include/llvm/ADT/SetVector.h
index bc563570c20..f17c56d8133 100644
--- a/llvm/include/llvm/ADT/SetVector.h
+++ b/llvm/include/llvm/ADT/SetVector.h
@@ -151,6 +151,24 @@ 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);
+
+ // FIXME: No need to use the non-const iterator when built with
+ // std:vector.erase(const_iterator) as defined in C++11. This is for
+ // compatibility with non-standard libstdc++ up to 4.8 (fixed in 4.9).
+ auto NI = vector_.begin();
+ std::advance(NI, std::distance<iterator>(NI, I));
+
+ return vector_.erase(NI);
+ }
+
/// \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
diff --git a/llvm/unittests/ADT/CMakeLists.txt b/llvm/unittests/ADT/CMakeLists.txt
index bce1bf93a33..49ea73c7757 100644
--- a/llvm/unittests/ADT/CMakeLists.txt
+++ b/llvm/unittests/ADT/CMakeLists.txt
@@ -32,6 +32,7 @@ set(ADTSources
PostOrderIteratorTest.cpp
RangeAdapterTest.cpp
SCCIteratorTest.cpp
+ SetVectorTest.cpp
SmallPtrSetTest.cpp
SmallStringTest.cpp
SmallVectorTest.cpp
diff --git a/llvm/unittests/ADT/SetVectorTest.cpp b/llvm/unittests/ADT/SetVectorTest.cpp
new file mode 100644
index 00000000000..b8cac0dc311
--- /dev/null
+++ b/llvm/unittests/ADT/SetVectorTest.cpp
@@ -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()));
+}
+
OpenPOWER on IntegriCloud