35 template <std::
unsigned_
integral T>
36 constexpr T ceil_power_of_two(T number)
noexcept {
37 if constexpr (
sizeof(T) <=
sizeof(std::uint32_t)) {
38 return number == 1U ? 1U
39 :
static_cast<T
>(1U << (std::numeric_limits<std::uint32_t>::digits
40 - _lzcnt_u32(
static_cast<std::uint32_t
>(number) - 1)));
42 return number == 1U ? 1ULL
43 :
static_cast<T
>(1ULL << (std::numeric_limits<std::uint64_t>::digits
44 - _lzcnt_u64(
static_cast<std::uint64_t
>(number) - 1)));
48 template <std::
unsigned_
integral T>
49 constexpr T ceil_power_of_two(T number)
noexcept {
50 if constexpr (
sizeof(T) <=
sizeof(std::uint32_t)) {
51 return number == 1U ? 1U
52 :
static_cast<T
>(1U << (std::numeric_limits<std::uint32_t>::digits
53 - __builtin_clz(
static_cast<std::uint32_t
>(number) - 1)));
55 return number == 1U ? 1ULL
56 :
static_cast<T
>(1ULL << (std::numeric_limits<std::uint64_t>::digits
57 - __builtin_clzll(
static_cast<std::uint64_t
>(number) - 1)));