1#ifndef BENCHMARK_REGISTER_H
2#define BENCHMARK_REGISTER_H
15typename std::vector<T>::iterator AddPowers(std::vector<T>* dst, T lo, T hi,
21 const size_t start_offset = dst->size();
23 static const T kmax = std::numeric_limits<T>::max();
26 for (T i =
static_cast<T
>(1); i <= hi; i *= mult) {
32 if (i > kmax / mult)
break;
35 return dst->begin() + start_offset;
39void AddNegatedPowers(std::vector<T>* dst, T lo, T hi,
int mult) {
41 BM_CHECK_GT(lo, std::numeric_limits<T>::min());
42 BM_CHECK_GT(hi, std::numeric_limits<T>::min());
49 const auto lo_complement =
static_cast<T
>(-lo);
50 const auto hi_complement =
static_cast<T
>(-hi);
52 const auto it = AddPowers(dst, hi_complement, lo_complement, mult);
54 std::for_each(it, dst->end(), [](T& t) { t *= -1; });
55 std::reverse(it, dst->end());
59void AddRange(std::vector<T>* dst, T lo, T hi,
int mult) {
60 static_assert(std::is_integral<T>::value && std::is_signed<T>::value,
61 "Args type must be a signed integer");
81 const auto lo_inner =
static_cast<T
>(lo + 1);
82 const auto hi_inner =
static_cast<T
>(hi - 1);
86 AddNegatedPowers(dst, lo_inner, std::min(hi_inner, T{-1}), mult);
90 if (lo < 0 && hi >= 0) {
96 AddPowers(dst, std::max(lo_inner, T{1}), hi_inner, mult);
100 if (hi != dst->back()) {