1#ifndef BENCHMARK_REGISTER_H
2#define BENCHMARK_REGISTER_H
17typename std::vector<T>::iterator AddPowers(std::vector<T>* dst, T lo, T hi,
23 const size_t start_offset = dst->size();
25 static const T kmax = std::numeric_limits<T>::max();
28 for (T i =
static_cast<T
>(1); i <= hi; i = static_cast<T>(i * mult)) {
34 if (i > kmax / mult)
break;
37 return dst->begin() +
static_cast<int>(start_offset);
41void AddNegatedPowers(std::vector<T>* dst, T lo, T hi,
int mult) {
43 BM_CHECK_GT(lo, std::numeric_limits<T>::min());
44 BM_CHECK_GT(hi, std::numeric_limits<T>::min());
51 const auto lo_complement =
static_cast<T
>(-lo);
52 const auto hi_complement =
static_cast<T
>(-hi);
54 const auto it = AddPowers(dst, hi_complement, lo_complement, mult);
56 std::for_each(it, dst->end(), [](T& t) { t = static_cast<T>(t * -1); });
57 std::reverse(it, dst->end());
61void AddRange(std::vector<T>* dst, T lo, T hi,
int mult) {
62 static_assert(std::is_integral<T>::value && std::is_signed<T>::value,
63 "Args type must be a signed integer");
83 const auto lo_inner =
static_cast<T
>(lo + 1);
84 const auto hi_inner =
static_cast<T
>(hi - 1);
88 AddNegatedPowers(dst, lo_inner, std::min(hi_inner, T{-1}), mult);
92 if (lo < 0 && hi >= 0) {
98 AddPowers(dst, std::max(lo_inner, T{1}), hi_inner, mult);
102 if (hi != dst->back()) {