From 6e1b70611dac4ef9ce07f1e7573ca7ff7e26849e Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Mon, 26 Dec 2016 23:10:40 +0000 Subject: [PATCH] [ADT] Add a boring std::partition wrapper similar to our std::remove_if wrapper. llvm-svn: 290553 --- include/llvm/ADT/STLExtras.h | 7 +++++++ unittests/ADT/STLExtrasTest.cpp | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/include/llvm/ADT/STLExtras.h b/include/llvm/ADT/STLExtras.h index 09483823f4b..43cfaa28770 100644 --- a/include/llvm/ADT/STLExtras.h +++ b/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 +auto partition(R &&Range, UnaryPredicate P) -> decltype(std::begin(Range)) { + return std::partition(std::begin(Range), std::end(Range), P); +} + //===----------------------------------------------------------------------===// // Extra additions to //===----------------------------------------------------------------------===// diff --git a/unittests/ADT/STLExtrasTest.cpp b/unittests/ADT/STLExtrasTest.cpp index d3bef6a2e05..28e0ebb53f6 100644 --- a/unittests/ADT/STLExtrasTest.cpp +++ b/unittests/ADT/STLExtrasTest.cpp @@ -276,4 +276,25 @@ TEST(STLExtrasTest, ConcatRange) { Test.push_back(i); EXPECT_EQ(Expected, Test); } + +TEST(STLExtrasTest, PartitionAdaptor) { + std::vector 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]); +} + }