1#ifndef BENCHMARK_REGISTER_H
2#define BENCHMARK_REGISTER_H
16typename 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();
27 for (T i =
static_cast<T
>(1); i <= hi; i = static_cast<T>(i * mult)) {
33 if (i > kmax / mult)
break;
36 return dst->begin() +
static_cast<int>(start_offset);
40void AddNegatedPowers(std::vector<T>* dst, T lo, T hi,
int mult) {
42 BM_CHECK_GT(lo, std::numeric_limits<T>::min());
43 BM_CHECK_GT(hi, std::numeric_limits<T>::min());
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 = static_cast<T>(t * -1); });
56 std::reverse(it, dst->end());
60void 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");
82 const auto lo_inner =
static_cast<T
>(lo + 1);
83 const auto hi_inner =
static_cast<T
>(hi - 1);
87 AddNegatedPowers(dst, lo_inner, std::min(hi_inner, T{-1}), mult);
91 if (lo < 0 && hi >= 0) {
97 AddPowers(dst, std::max(lo_inner, T{1}), hi_inner, mult);
101 if (hi != dst->back()) {