99// UNSUPPORTED: c++03, c++11, c++14, c++17
1010
1111#include < algorithm>
12- #include < cassert>
1312#include < cstddef>
1413#include < deque>
1514#include < iterator>
16- #include < limits>
1715#include < list>
1816#include < string>
17+ #include < type_traits>
1918#include < vector>
2019
2120#include < benchmark/benchmark.h>
@@ -30,15 +29,11 @@ int main(int argc, char** argv) {
3029 [fold](auto & st) {
3130 std::size_t const size = st.range (0 );
3231 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" );
3734
3835 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 (); });
4237 ValueType init = c.back ();
4338 c.pop_back ();
4439
@@ -61,14 +56,14 @@ int main(int argc, char** argv) {
6156 ->Arg (8192 )
6257 ->Arg (1 << 20 );
6358 };
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);
6762
6863 // 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);
7267 }
7368
7469 benchmark::Initialize (&argc, argv);
0 commit comments