Index: llvm/trunk/include/llvm/ADT/STLExtras.h =================================================================== --- llvm/trunk/include/llvm/ADT/STLExtras.h +++ llvm/trunk/include/llvm/ADT/STLExtras.h @@ -815,6 +815,18 @@ return std::partition(std::begin(Range), std::end(Range), P); } +/// Provide a container algorithm similar to C++ Library Fundamentals v2's +/// `erase_if` which is equivalent to: +/// +/// C.erase(remove_if(C, pred), C.end()); +/// +/// This version works for any container with an erase method call accepting +/// two iterators. +template +void erase_if(Container &C, UnaryPredicate P) { + C.erase(remove_if(C, P), C.end()); +} + //===----------------------------------------------------------------------===// // Extra additions to //===----------------------------------------------------------------------===// Index: llvm/trunk/unittests/ADT/STLExtrasTest.cpp =================================================================== --- llvm/trunk/unittests/ADT/STLExtrasTest.cpp +++ llvm/trunk/unittests/ADT/STLExtrasTest.cpp @@ -297,4 +297,15 @@ EXPECT_EQ(7, V[7]); } +TEST(STLExtrasTest, EraseIf) { + std::vector V = {1, 2, 3, 4, 5, 6, 7, 8}; + + erase_if(V, [](int i) { return i % 2 == 0; }); + EXPECT_EQ(4u, V.size()); + EXPECT_EQ(1, V[0]); + EXPECT_EQ(3, V[1]); + EXPECT_EQ(5, V[2]); + EXPECT_EQ(7, V[3]); +} + }