Skip to content

Commit 9fede1f

Browse files
committed
Implement review comments from the std::copy code review
1 parent b86aa95 commit 9fede1f

25 files changed

+1438
-1439
lines changed

libcxx/test/benchmarks/algorithms/modifying/fill.bench.cpp

Lines changed: 54 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -20,64 +20,66 @@
2020
#include "../../GenerateInput.h"
2121
#include "test_macros.h"
2222

23-
template <class Container, class Operation>
24-
void bm(std::string operation_name, Operation fill) {
25-
auto bench = [fill](auto& st) {
26-
std::size_t const size = st.range(0);
27-
using ValueType = typename Container::value_type;
28-
ValueType x = Generate<ValueType>::random();
29-
ValueType y = Generate<ValueType>::random();
30-
Container c(size, y);
31-
32-
for ([[maybe_unused]] auto _ : st) {
33-
fill(c.begin(), c.end(), x);
34-
std::swap(x, y);
35-
benchmark::DoNotOptimize(c);
36-
benchmark::DoNotOptimize(x);
37-
benchmark::DoNotOptimize(y);
38-
benchmark::ClobberMemory();
39-
}
40-
};
41-
benchmark::RegisterBenchmark(operation_name, bench)->Arg(32)->Arg(1024)->Arg(8192);
42-
}
43-
44-
template <class Operation>
45-
void bm_vector_bool(std::string operation_name, Operation fill) {
46-
auto bench = [fill](auto& st) {
47-
std::size_t const size = st.range(0);
48-
bool x = true;
49-
bool y = false;
50-
std::vector<bool> c(size, y);
23+
int main(int argc, char** argv) {
24+
auto std_fill = [](auto first, auto last, auto const& value) { return std::fill(first, last, value); };
5125

52-
for ([[maybe_unused]] auto _ : st) {
53-
fill(c.begin(), c.end(), x);
54-
std::swap(x, y);
55-
benchmark::DoNotOptimize(c);
56-
benchmark::DoNotOptimize(x);
57-
benchmark::DoNotOptimize(y);
58-
benchmark::ClobberMemory();
59-
}
60-
};
61-
benchmark::RegisterBenchmark(operation_name, bench)->Arg(32)->Arg(1024)->Arg(8192);
62-
}
26+
// {std,ranges}::fill(normal container)
27+
{
28+
auto bm = []<class Container>(std::string name, auto fill) {
29+
benchmark::RegisterBenchmark(
30+
name,
31+
[fill](auto& st) {
32+
std::size_t const size = st.range(0);
33+
using ValueType = typename Container::value_type;
34+
ValueType x = Generate<ValueType>::random();
35+
ValueType y = Generate<ValueType>::random();
36+
Container c(size, y);
6337

64-
int main(int argc, char** argv) {
65-
auto std_fill = [](auto first, auto last, auto const& value) { return std::fill(first, last, value); };
66-
auto ranges_fill = [](auto first, auto last, auto const& value) { return std::ranges::fill(first, last, value); };
38+
for ([[maybe_unused]] auto _ : st) {
39+
fill(c.begin(), c.end(), x);
40+
std::swap(x, y);
41+
benchmark::DoNotOptimize(c);
42+
benchmark::DoNotOptimize(x);
43+
benchmark::DoNotOptimize(y);
44+
benchmark::ClobberMemory();
45+
}
46+
})
47+
->Arg(32)
48+
->Arg(1024)
49+
->Arg(8192);
50+
};
51+
bm.operator()<std::vector<int>>("std::fill(vector<int>)", std_fill);
52+
bm.operator()<std::deque<int>>("std::fill(deque<int>)", std_fill);
53+
bm.operator()<std::list<int>>("std::fill(list<int>)", std_fill);
54+
bm.operator()<std::vector<int>>("rng::fill(vector<int>)", std::ranges::fill);
55+
bm.operator()<std::deque<int>>("rng::fill(deque<int>)", std::ranges::fill);
56+
bm.operator()<std::list<int>>("rng::fill(list<int>)", std::ranges::fill);
57+
}
6758

68-
// std::fill
69-
bm<std::vector<int>>("std::fill(vector<int>)", std_fill);
70-
bm<std::deque<int>>("std::fill(deque<int>)", std_fill);
71-
bm<std::list<int>>("std::fill(list<int>)", std_fill);
72-
bm_vector_bool("std::fill(vector<bool>)", std_fill);
59+
// {std,ranges}::fill(vector<bool>)
60+
{
61+
auto bm = [](std::string name, auto fill) {
62+
benchmark::RegisterBenchmark(name, [fill](auto& st) {
63+
std::size_t const size = st.range(0);
64+
bool x = true;
65+
bool y = false;
66+
std::vector<bool> c(size, y);
7367

74-
// ranges::fill
75-
bm<std::vector<int>>("ranges::fill(vector<int>)", ranges_fill);
76-
bm<std::deque<int>>("ranges::fill(deque<int>)", ranges_fill);
77-
bm<std::list<int>>("ranges::fill(list<int>)", ranges_fill);
68+
for ([[maybe_unused]] auto _ : st) {
69+
fill(c.begin(), c.end(), x);
70+
std::swap(x, y);
71+
benchmark::DoNotOptimize(c);
72+
benchmark::DoNotOptimize(x);
73+
benchmark::DoNotOptimize(y);
74+
benchmark::ClobberMemory();
75+
}
76+
})->Range(64, 1 << 20);
77+
};
78+
bm("std::fill(vector<bool>)", std_fill);
7879
#if TEST_STD_VER >= 23 // vector<bool>::iterator is not an output_iterator before C++23
79-
bm_vector_bool("ranges::fill(vector<bool>)", ranges_fill);
80+
bm("rng::fill(vector<bool>)", std::ranges::fill);
8081
#endif
82+
}
8183

8284
benchmark::Initialize(&argc, argv);
8385
benchmark::RunSpecifiedBenchmarks();

libcxx/test/benchmarks/algorithms/modifying/fill_n.bench.cpp

Lines changed: 54 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -20,64 +20,66 @@
2020
#include "../../GenerateInput.h"
2121
#include "test_macros.h"
2222

23-
template <class Container, class Operation>
24-
void bm(std::string operation_name, Operation fill_n) {
25-
auto bench = [fill_n](auto& st) {
26-
std::size_t const size = st.range(0);
27-
using ValueType = typename Container::value_type;
28-
ValueType x = Generate<ValueType>::random();
29-
ValueType y = Generate<ValueType>::random();
30-
Container c(size, y);
31-
32-
for ([[maybe_unused]] auto _ : st) {
33-
fill_n(c.begin(), size, x);
34-
std::swap(x, y);
35-
benchmark::DoNotOptimize(c);
36-
benchmark::DoNotOptimize(x);
37-
benchmark::DoNotOptimize(y);
38-
benchmark::ClobberMemory();
39-
}
40-
};
41-
benchmark::RegisterBenchmark(operation_name, bench)->Arg(32)->Arg(1024)->Arg(8192);
42-
}
43-
44-
template <class Operation>
45-
void bm_vector_bool(std::string operation_name, Operation fill_n) {
46-
auto bench = [fill_n](auto& st) {
47-
std::size_t const size = st.range(0);
48-
bool x = true;
49-
bool y = false;
50-
std::vector<bool> c(size, y);
23+
int main(int argc, char** argv) {
24+
auto std_fill_n = [](auto out, auto n, auto const& value) { return std::fill_n(out, n, value); };
5125

52-
for ([[maybe_unused]] auto _ : st) {
53-
fill_n(c.begin(), size, x);
54-
std::swap(x, y);
55-
benchmark::DoNotOptimize(c);
56-
benchmark::DoNotOptimize(x);
57-
benchmark::DoNotOptimize(y);
58-
benchmark::ClobberMemory();
59-
}
60-
};
61-
benchmark::RegisterBenchmark(operation_name, bench)->Arg(32)->Arg(1024)->Arg(8192);
62-
}
26+
// {std,ranges}::fill_n(normal container)
27+
{
28+
auto bm = []<class Container>(std::string name, auto fill_n) {
29+
benchmark::RegisterBenchmark(
30+
name,
31+
[fill_n](auto& st) {
32+
std::size_t const size = st.range(0);
33+
using ValueType = typename Container::value_type;
34+
ValueType x = Generate<ValueType>::random();
35+
ValueType y = Generate<ValueType>::random();
36+
Container c(size, y);
6337

64-
int main(int argc, char** argv) {
65-
auto std_fill_n = [](auto out, auto n, auto const& value) { return std::fill_n(out, n, value); };
66-
auto ranges_fill_n = [](auto out, auto n, auto const& value) { return std::ranges::fill_n(out, n, value); };
38+
for ([[maybe_unused]] auto _ : st) {
39+
fill_n(c.begin(), size, x);
40+
std::swap(x, y);
41+
benchmark::DoNotOptimize(c);
42+
benchmark::DoNotOptimize(x);
43+
benchmark::DoNotOptimize(y);
44+
benchmark::ClobberMemory();
45+
}
46+
})
47+
->Arg(32)
48+
->Arg(1024)
49+
->Arg(8192);
50+
};
51+
bm.operator()<std::vector<int>>("std::fill_n(vector<int>)", std_fill_n);
52+
bm.operator()<std::deque<int>>("std::fill_n(deque<int>)", std_fill_n);
53+
bm.operator()<std::list<int>>("std::fill_n(list<int>)", std_fill_n);
54+
bm.operator()<std::vector<int>>("rng::fill_n(vector<int>)", std::ranges::fill_n);
55+
bm.operator()<std::deque<int>>("rng::fill_n(deque<int>)", std::ranges::fill_n);
56+
bm.operator()<std::list<int>>("rng::fill_n(list<int>)", std::ranges::fill_n);
57+
}
6758

68-
// std::fill_n
69-
bm<std::vector<int>>("std::fill_n(vector<int>)", std_fill_n);
70-
bm<std::deque<int>>("std::fill_n(deque<int>)", std_fill_n);
71-
bm<std::list<int>>("std::fill_n(list<int>)", std_fill_n);
72-
bm_vector_bool("std::fill_n(vector<bool>)", std_fill_n);
59+
// {std,ranges}::fill_n(vector<bool>)
60+
{
61+
auto bm = [](std::string name, auto fill_n) {
62+
benchmark::RegisterBenchmark(name, [fill_n](auto& st) {
63+
std::size_t const size = st.range(0);
64+
bool x = true;
65+
bool y = false;
66+
std::vector<bool> c(size, y);
7367

74-
// ranges::fill_n
75-
bm<std::vector<int>>("ranges::fill_n(vector<int>)", ranges_fill_n);
76-
bm<std::deque<int>>("ranges::fill_n(deque<int>)", ranges_fill_n);
77-
bm<std::list<int>>("ranges::fill_n(list<int>)", ranges_fill_n);
68+
for ([[maybe_unused]] auto _ : st) {
69+
fill_n(c.begin(), size, x);
70+
std::swap(x, y);
71+
benchmark::DoNotOptimize(c);
72+
benchmark::DoNotOptimize(x);
73+
benchmark::DoNotOptimize(y);
74+
benchmark::ClobberMemory();
75+
}
76+
})->Range(64, 1 << 20);
77+
};
78+
bm("std::fill_n(vector<bool>)", std_fill_n);
7879
#if TEST_STD_VER >= 23 // vector<bool>::iterator is not an output_iterator before C++23
79-
bm_vector_bool("ranges::fill_n(vector<bool>)", ranges_fill_n);
80+
bm("rng::fill_n(vector<bool>)", std::ranges::fill_n);
8081
#endif
82+
}
8183

8284
benchmark::Initialize(&argc, argv);
8385
benchmark::RunSpecifiedBenchmarks();

libcxx/test/benchmarks/algorithms/modifying/generate.bench.cpp

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,38 +19,39 @@
1919
#include "benchmark/benchmark.h"
2020
#include "../../GenerateInput.h"
2121

22-
template <class Container, class Operation>
23-
void bm(std::string operation_name, Operation generate) {
24-
auto bench = [generate](auto& st) {
25-
std::size_t const size = st.range(0);
26-
Container c(size);
27-
using ValueType = typename Container::value_type;
28-
ValueType x = Generate<ValueType>::random();
29-
30-
for ([[maybe_unused]] auto _ : st) {
31-
auto f = [&x] { return x; };
32-
generate(c.begin(), c.end(), f);
33-
benchmark::DoNotOptimize(c);
34-
benchmark::DoNotOptimize(x);
35-
benchmark::ClobberMemory();
36-
}
37-
};
38-
benchmark::RegisterBenchmark(operation_name, bench)->Arg(32)->Arg(1024)->Arg(8192);
39-
}
40-
4122
int main(int argc, char** argv) {
42-
auto std_generate = [](auto first, auto last, auto f) { return std::generate(first, last, f); };
43-
auto ranges_generate = [](auto first, auto last, auto f) { return std::ranges::generate(first, last, f); };
44-
45-
// std::generate
46-
bm<std::vector<int>>("std::generate(vector<int>)", std_generate);
47-
bm<std::deque<int>>("std::generate(deque<int>)", std_generate);
48-
bm<std::list<int>>("std::generate(list<int>)", std_generate);
49-
50-
// ranges::generate
51-
bm<std::vector<int>>("ranges::generate(vector<int>)", ranges_generate);
52-
bm<std::deque<int>>("ranges::generate(deque<int>)", ranges_generate);
53-
bm<std::list<int>>("ranges::generate(list<int>)", ranges_generate);
23+
auto std_generate = [](auto first, auto last, auto f) { return std::generate(first, last, f); };
24+
25+
// {std,ranges}::generate
26+
{
27+
auto bm = []<class Container>(std::string name, auto generate) {
28+
benchmark::RegisterBenchmark(
29+
name,
30+
[generate](auto& st) {
31+
std::size_t const size = st.range(0);
32+
Container c(size);
33+
using ValueType = typename Container::value_type;
34+
ValueType x = Generate<ValueType>::random();
35+
36+
for ([[maybe_unused]] auto _ : st) {
37+
auto f = [&x] { return x; };
38+
generate(c.begin(), c.end(), f);
39+
benchmark::DoNotOptimize(c);
40+
benchmark::DoNotOptimize(x);
41+
benchmark::ClobberMemory();
42+
}
43+
})
44+
->Arg(32)
45+
->Arg(1024)
46+
->Arg(8192);
47+
};
48+
bm.operator()<std::vector<int>>("std::generate(vector<int>)", std_generate);
49+
bm.operator()<std::deque<int>>("std::generate(deque<int>)", std_generate);
50+
bm.operator()<std::list<int>>("std::generate(list<int>)", std_generate);
51+
bm.operator()<std::vector<int>>("rng::generate(vector<int>)", std::ranges::generate);
52+
bm.operator()<std::deque<int>>("rng::generate(deque<int>)", std::ranges::generate);
53+
bm.operator()<std::list<int>>("rng::generate(list<int>)", std::ranges::generate);
54+
}
5455

5556
benchmark::Initialize(&argc, argv);
5657
benchmark::RunSpecifiedBenchmarks();

libcxx/test/benchmarks/algorithms/modifying/generate_n.bench.cpp

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,38 +19,39 @@
1919
#include "benchmark/benchmark.h"
2020
#include "../../GenerateInput.h"
2121

22-
template <class Container, class Operation>
23-
void bm(std::string operation_name, Operation generate_n) {
24-
auto bench = [generate_n](auto& st) {
25-
std::size_t const size = st.range(0);
26-
Container c(size);
27-
using ValueType = typename Container::value_type;
28-
ValueType x = Generate<ValueType>::random();
29-
30-
for ([[maybe_unused]] auto _ : st) {
31-
auto f = [&x] { return x; };
32-
generate_n(c.begin(), size, f);
33-
benchmark::DoNotOptimize(c);
34-
benchmark::DoNotOptimize(x);
35-
benchmark::ClobberMemory();
36-
}
37-
};
38-
benchmark::RegisterBenchmark(operation_name, bench)->Arg(32)->Arg(1024)->Arg(8192);
39-
}
40-
4122
int main(int argc, char** argv) {
42-
auto std_generate_n = [](auto out, auto n, auto f) { return std::generate_n(out, n, f); };
43-
auto ranges_generate_n = [](auto out, auto n, auto f) { return std::ranges::generate_n(out, n, f); };
44-
45-
// std::generate_n
46-
bm<std::vector<int>>("std::generate_n(vector<int>)", std_generate_n);
47-
bm<std::deque<int>>("std::generate_n(deque<int>)", std_generate_n);
48-
bm<std::list<int>>("std::generate_n(list<int>)", std_generate_n);
49-
50-
// ranges::generate_n
51-
bm<std::vector<int>>("ranges::generate_n(vector<int>)", ranges_generate_n);
52-
bm<std::deque<int>>("ranges::generate_n(deque<int>)", ranges_generate_n);
53-
bm<std::list<int>>("ranges::generate_n(list<int>)", ranges_generate_n);
23+
auto std_generate_n = [](auto out, auto n, auto f) { return std::generate_n(out, n, f); };
24+
25+
// {std,ranges}::generate_n
26+
{
27+
auto bm = []<class Container>(std::string name, auto generate_n) {
28+
benchmark::RegisterBenchmark(
29+
name,
30+
[generate_n](auto& st) {
31+
std::size_t const size = st.range(0);
32+
Container c(size);
33+
using ValueType = typename Container::value_type;
34+
ValueType x = Generate<ValueType>::random();
35+
36+
for ([[maybe_unused]] auto _ : st) {
37+
auto f = [&x] { return x; };
38+
generate_n(c.begin(), size, f);
39+
benchmark::DoNotOptimize(c);
40+
benchmark::DoNotOptimize(x);
41+
benchmark::ClobberMemory();
42+
}
43+
})
44+
->Arg(32)
45+
->Arg(1024)
46+
->Arg(8192);
47+
};
48+
bm.operator()<std::vector<int>>("std::generate_n(vector<int>)", std_generate_n);
49+
bm.operator()<std::deque<int>>("std::generate_n(deque<int>)", std_generate_n);
50+
bm.operator()<std::list<int>>("std::generate_n(list<int>)", std_generate_n);
51+
bm.operator()<std::vector<int>>("rng::generate_n(vector<int>)", std::ranges::generate_n);
52+
bm.operator()<std::deque<int>>("rng::generate_n(deque<int>)", std::ranges::generate_n);
53+
bm.operator()<std::list<int>>("rng::generate_n(list<int>)", std::ranges::generate_n);
54+
}
5455

5556
benchmark::Initialize(&argc, argv);
5657
benchmark::RunSpecifiedBenchmarks();

0 commit comments

Comments
 (0)