diff options
author | Jun Bum Lim <junbuml@codeaurora.org> | 2016-03-25 19:28:08 +0000 |
---|---|---|
committer | Jun Bum Lim <junbuml@codeaurora.org> | 2016-03-25 19:28:08 +0000 |
commit | 2544788e13b3c6f8651fea26ce204ecb2285dc83 (patch) | |
tree | 0dac2625d6d091b91aa9c7e3ec812eba02e04e6c | |
parent | 09ff326ca23ea631ba5707f17804eb70375196cc (diff) | |
download | bcm5719-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.h | 18 | ||||
-rw-r--r-- | llvm/unittests/ADT/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/unittests/ADT/SetVectorTest.cpp | 34 |
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())); +} + |