@@ -23,8 +23,20 @@ int main(int argc, char** argv) {
2323 auto std_remove_copy = [](auto first, auto last, auto out, auto const & value) {
2424 return std::remove_copy (first, last, out, value);
2525 };
26+ auto std_remove_copy_if = [](auto first, auto last, auto out, auto const & value) {
27+ return std::remove_copy_if (first, last, out, [&](auto element) {
28+ benchmark::DoNotOptimize (element);
29+ return element == value;
30+ });
31+ };
32+ auto ranges_remove_copy_if = [](auto first, auto last, auto out, auto const & value) {
33+ return std::ranges::remove_copy_if (first, last, out, [&](auto element) {
34+ benchmark::DoNotOptimize (element);
35+ return element == value;
36+ });
37+ };
2638
27- // Benchmark {std,ranges}::remove_copy on a sequence of the form xxxxxxxxxxyyyyyyyyyy
39+ // Benchmark {std,ranges}::{ remove_copy,remove_copy_if} on a sequence of the form xxxxxxxxxxyyyyyyyyyy
2840 // where we remove the prefix of x's from the sequence.
2941 {
3042 auto bm = []<class Container >(std::string name, auto remove_copy) {
@@ -53,15 +65,24 @@ int main(int argc, char** argv) {
5365 ->Arg (1024 )
5466 ->Arg (8192 );
5567 };
68+ // {std,ranges}::remove_copy
5669 bm.operator ()<std::vector<int >>(" std::remove_copy(vector<int>) (prefix)" , std_remove_copy);
5770 bm.operator ()<std::deque<int >>(" std::remove_copy(deque<int>) (prefix)" , std_remove_copy);
5871 bm.operator ()<std::list<int >>(" std::remove_copy(list<int>) (prefix)" , std_remove_copy);
5972 bm.operator ()<std::vector<int >>(" rng::remove_copy(vector<int>) (prefix)" , std::ranges::remove_copy);
6073 bm.operator ()<std::deque<int >>(" rng::remove_copy(deque<int>) (prefix)" , std::ranges::remove_copy);
6174 bm.operator ()<std::list<int >>(" rng::remove_copy(list<int>) (prefix)" , std::ranges::remove_copy);
75+
76+ // {std,ranges}::remove_copy_if
77+ bm.operator ()<std::vector<int >>(" std::remove_copy_if(vector<int>) (prefix)" , std_remove_copy_if);
78+ bm.operator ()<std::deque<int >>(" std::remove_copy_if(deque<int>) (prefix)" , std_remove_copy_if);
79+ bm.operator ()<std::list<int >>(" std::remove_copy_if(list<int>) (prefix)" , std_remove_copy_if);
80+ bm.operator ()<std::vector<int >>(" rng::remove_copy_if(vector<int>) (prefix)" , ranges_remove_copy_if);
81+ bm.operator ()<std::deque<int >>(" rng::remove_copy_if(deque<int>) (prefix)" , ranges_remove_copy_if);
82+ bm.operator ()<std::list<int >>(" rng::remove_copy_if(list<int>) (prefix)" , ranges_remove_copy_if);
6283 }
6384
64- // Benchmark {std,ranges}::remove_copy on a sequence of the form xyxyxyxyxyxyxyxyxyxy
85+ // Benchmark {std,ranges}::{ remove_copy,remove_copy_if} on a sequence of the form xyxyxyxyxyxyxyxyxyxy
6586 // where we remove the x's from the sequence.
6687 {
6788 auto bm = []<class Container >(std::string name, auto remove_copy) {
@@ -91,12 +112,21 @@ int main(int argc, char** argv) {
91112 ->Arg (1024 )
92113 ->Arg (8192 );
93114 };
115+ // {std,ranges}::remove_copy
94116 bm.operator ()<std::vector<int >>(" std::remove_copy(vector<int>) (sprinkled)" , std_remove_copy);
95117 bm.operator ()<std::deque<int >>(" std::remove_copy(deque<int>) (sprinkled)" , std_remove_copy);
96118 bm.operator ()<std::list<int >>(" std::remove_copy(list<int>) (sprinkled)" , std_remove_copy);
97119 bm.operator ()<std::vector<int >>(" rng::remove_copy(vector<int>) (sprinkled)" , std::ranges::remove_copy);
98120 bm.operator ()<std::deque<int >>(" rng::remove_copy(deque<int>) (sprinkled)" , std::ranges::remove_copy);
99121 bm.operator ()<std::list<int >>(" rng::remove_copy(list<int>) (sprinkled)" , std::ranges::remove_copy);
122+
123+ // {std,ranges}::remove_copy_if
124+ bm.operator ()<std::vector<int >>(" std::remove_copy_if(vector<int>) (sprinkled)" , std_remove_copy_if);
125+ bm.operator ()<std::deque<int >>(" std::remove_copy_if(deque<int>) (sprinkled)" , std_remove_copy_if);
126+ bm.operator ()<std::list<int >>(" std::remove_copy_if(list<int>) (sprinkled)" , std_remove_copy_if);
127+ bm.operator ()<std::vector<int >>(" rng::remove_copy_if(vector<int>) (sprinkled)" , ranges_remove_copy_if);
128+ bm.operator ()<std::deque<int >>(" rng::remove_copy_if(deque<int>) (sprinkled)" , ranges_remove_copy_if);
129+ bm.operator ()<std::list<int >>(" rng::remove_copy_if(list<int>) (sprinkled)" , ranges_remove_copy_if);
100130 }
101131
102132 benchmark::Initialize (&argc, argv);
0 commit comments