9
9
// UNSUPPORTED: c++03, c++11, c++14, c++17
10
10
11
11
#include < algorithm>
12
- #include < cassert>
13
12
#include < cstddef>
14
13
#include < deque>
15
14
#include < iterator>
16
- #include < limits>
17
15
#include < list>
18
16
#include < string>
17
+ #include < type_traits>
19
18
#include < vector>
20
19
21
20
#include < benchmark/benchmark.h>
@@ -30,15 +29,11 @@ int main(int argc, char** argv) {
30
29
[fold](auto & st) {
31
30
std::size_t const size = st.range (0 );
32
31
using ValueType = typename Container::value_type;
33
- ValueType const limit = 1000 ; // ensure we never overflow in the addition
34
- assert (static_cast <ValueType>(size) <= std::numeric_limits<ValueType>::max ());
35
- assert (std::numeric_limits<ValueType>::max () > static_cast <ValueType>(size) * limit);
36
- assert (std::numeric_limits<ValueType>::min () < static_cast <ValueType>(size) * limit * -1 );
32
+ static_assert (std::is_unsigned_v<ValueType>,
33
+ " We could encounter UB if signed arithmetic overflows in this benchmark" );
37
34
38
35
Container c;
39
- std::generate_n (std::back_inserter (c), size, [&] {
40
- return std::clamp (Generate<ValueType>::random (), -1 * limit, limit);
41
- });
36
+ std::generate_n (std::back_inserter (c), size, [&] { return Generate<ValueType>::random (); });
42
37
ValueType init = c.back ();
43
38
c.pop_back ();
44
39
@@ -61,14 +56,14 @@ int main(int argc, char** argv) {
61
56
->Arg (8192 )
62
57
->Arg (1 << 20 );
63
58
};
64
- bm.operator ()<std::vector<int >>(" rng::fold_left(vector<int>)" , std::ranges::fold_left);
65
- bm.operator ()<std::deque<int >>(" rng::fold_left(deque<int>)" , std::ranges::fold_left);
66
- bm.operator ()<std::list<int >>(" rng::fold_left(list<int>)" , std::ranges::fold_left);
59
+ bm.operator ()<std::vector<unsigned int >>(" rng::fold_left(vector<int>)" , std::ranges::fold_left);
60
+ bm.operator ()<std::deque<unsigned int >>(" rng::fold_left(deque<int>)" , std::ranges::fold_left);
61
+ bm.operator ()<std::list<unsigned int >>(" rng::fold_left(list<int>)" , std::ranges::fold_left);
67
62
68
63
// TODO: fold_right not implemented yet
69
- // bm.operator()<std::vector<int>>("rng::fold_right(vector<int>)", std::ranges::fold_right);
70
- // bm.operator()<std::deque<int>>("rng::fold_right(deque<int>)", std::ranges::fold_right);
71
- // bm.operator()<std::list<int>>("rng::fold_right(list<int>)", std::ranges::fold_right);
64
+ // bm.operator()<std::vector<unsigned int>>("rng::fold_right(vector<int>)", std::ranges::fold_right);
65
+ // bm.operator()<std::deque<unsigned int>>("rng::fold_right(deque<int>)", std::ranges::fold_right);
66
+ // bm.operator()<std::list<unsigned int>>("rng::fold_right(list<int>)", std::ranges::fold_right);
72
67
}
73
68
74
69
benchmark::Initialize (&argc, argv);
0 commit comments