21 namespace seqan3::detail
51 template <std::
unsigned_
integral
unsigned_t>
52 constexpr unsigned_t floor_log2(unsigned_t
const n) noexcept
55 return most_significant_bit_set(n);
85 template <std::
unsigned_
integral
unsigned_t>
86 constexpr unsigned_t ceil_log2(unsigned_t
const n) noexcept
89 return (n == 1u) ? 0u : seqan3::detail::floor_log2(n - 1u) + 1u;
118 template <
typename base_t, std::
unsigned_
integral exp_t>
120 requires (std::same_as<base_t, uint64_t> || std::same_as<base_t, int64_t>)
122 base_t
pow(base_t base, exp_t exp)
129 for (exp_t i = 0; i < exp; ++i)
134 " will result in an " + (std::same_as<base_t, int64_t> ?
"int64_t" :
"uint64_t")};
143 for (; exp; exp >>= 1, base *= base)
144 result *= (exp & 1) ? base : 1;
151 template <std::
integral base_t, std::
unsigned_
integral exp_t>
152 requires (std::unsigned_integral<base_t> && !std::same_as<base_t, uint64_t>)
153 uint64_t
pow(base_t base, exp_t exp)
155 return pow(
static_cast<uint64_t
>(base), exp);
159 template <std::
integral base_t, std::
unsigned_
integral exp_t>
160 requires (!std::unsigned_integral<base_t> && !std::same_as<base_t, int64_t>)
161 int64_t
pow(base_t base, exp_t exp)
163 return pow(
static_cast<int64_t
>(base), exp);
167 template <
typename base_t,
typename exp_t>
168 requires (!(std::integral<base_t> && std::unsigned_integral<exp_t>))
169 auto pow(base_t base, exp_t exp)