1 #ifndef BENCHMARK_REGISTER_H
2 #define BENCHMARK_REGISTER_H
13 // Append the powers of 'mult' in the closed interval [lo, hi].
14 // Returns iterator to the start of the inserted range.
16 typename
std::vector
<T
>::iterator
AddPowers(std::vector
<T
>* dst
, T lo
, T hi
,
22 const size_t start_offset
= dst
->size();
24 static const T kmax
= std::numeric_limits
<T
>::max();
26 // Space out the values in multiples of "mult"
27 for (T i
= static_cast<T
>(1); i
<= hi
; i
*= static_cast<T
>(mult
)) {
31 // Break the loop here since multiplying by
32 // 'mult' would move outside of the range of T
33 if (i
> kmax
/ mult
) break;
36 return dst
->begin() + static_cast<int>(start_offset
);
40 void AddNegatedPowers(std::vector
<T
>* dst
, T lo
, T hi
, int mult
) {
41 // We negate lo and hi so we require that they cannot be equal to 'min'.
42 BM_CHECK_GT(lo
, std::numeric_limits
<T
>::min());
43 BM_CHECK_GT(hi
, std::numeric_limits
<T
>::min());
47 // Add positive powers, then negate and reverse.
48 // Casts necessary since small integers get promoted
49 // to 'int' when negating.
50 const auto lo_complement
= static_cast<T
>(-lo
);
51 const auto hi_complement
= static_cast<T
>(-hi
);
53 const auto it
= AddPowers(dst
, hi_complement
, lo_complement
, mult
);
55 std::for_each(it
, dst
->end(), [](T
& t
) { t
*= -1; });
56 std::reverse(it
, dst
->end());
60 void AddRange(std::vector
<T
>* dst
, T lo
, T hi
, int mult
) {
61 static_assert(std::is_integral
<T
>::value
&& std::is_signed
<T
>::value
,
62 "Args type must be a signed integer");
70 // Handle lo == hi as a special case, so we then know
71 // lo < hi and so it is safe to add 1 to lo and subtract 1
72 // from hi without falling outside of the range of T.
75 // Ensure that lo_inner <= hi_inner below.
81 // Add all powers of 'mult' in the range [lo+1, hi-1] (inclusive).
82 const auto lo_inner
= static_cast<T
>(lo
+ 1);
83 const auto hi_inner
= static_cast<T
>(hi
- 1);
85 // Insert negative values
87 AddNegatedPowers(dst
, lo_inner
, std::min(hi_inner
, T
{-1}), mult
);
90 // Treat 0 as a special case (see discussion on #762).
91 if (lo
< 0 && hi
>= 0) {
95 // Insert positive values
97 AddPowers(dst
, std::max(lo_inner
, T
{1}), hi_inner
, mult
);
100 // Add "hi" (if different from last value).
101 if (hi
!= dst
->back()) {
106 } // namespace internal
107 } // namespace benchmark
109 #endif // BENCHMARK_REGISTER_H