summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/ADT/STLExtras.h7
-rw-r--r--llvm/unittests/ADT/STLExtrasTest.cpp21
2 files changed, 28 insertions, 0 deletions
diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h
index 09483823f4b..43cfaa28770 100644
--- a/llvm/include/llvm/ADT/STLExtras.h
+++ b/llvm/include/llvm/ADT/STLExtras.h
@@ -808,6 +808,13 @@ OutputIt transform(R &&Range, OutputIt d_first, UnaryPredicate P) {
return std::transform(std::begin(Range), std::end(Range), d_first, P);
}
+/// Provide wrappers to std::partition which take ranges instead of having to
+/// pass begin/end explicitly.
+template <typename R, typename UnaryPredicate>
+auto partition(R &&Range, UnaryPredicate P) -> decltype(std::begin(Range)) {
+ return std::partition(std::begin(Range), std::end(Range), P);
+}
+
//===----------------------------------------------------------------------===//
// Extra additions to <memory>
//===----------------------------------------------------------------------===//
diff --git a/llvm/unittests/ADT/STLExtrasTest.cpp b/llvm/unittests/ADT/STLExtrasTest.cpp
index d3bef6a2e05..28e0ebb53f6 100644
--- a/llvm/unittests/ADT/STLExtrasTest.cpp
+++ b/llvm/unittests/ADT/STLExtrasTest.cpp
@@ -276,4 +276,25 @@ TEST(STLExtrasTest, ConcatRange) {
Test.push_back(i);
EXPECT_EQ(Expected, Test);
}
+
+TEST(STLExtrasTest, PartitionAdaptor) {
+ std::vector<int> V = {1, 2, 3, 4, 5, 6, 7, 8};
+
+ auto I = partition(V, [](int i) { return i % 2 == 0; });
+ ASSERT_EQ(V.begin() + 4, I);
+
+ // Sort the two halves as partition may have messed with the order.
+ std::sort(V.begin(), I);
+ std::sort(I, V.end());
+
+ EXPECT_EQ(2, V[0]);
+ EXPECT_EQ(4, V[1]);
+ EXPECT_EQ(6, V[2]);
+ EXPECT_EQ(8, V[3]);
+ EXPECT_EQ(1, V[4]);
+ EXPECT_EQ(3, V[5]);
+ EXPECT_EQ(5, V[6]);
+ EXPECT_EQ(7, V[7]);
+}
+
}
OpenPOWER on IntegriCloud