#pragma once #include #include namespace detail { template constexpr Integer intlog2_impl(Integer integer) { auto degree = Integer{0}; while ((integer >>= 1) > 0) { ++degree; } return degree; } } // namespace detail template constexpr Integer intlog2(Integer integer) { static_assert(std::is_integral_v, "Input type must be an integral type."); return integer > 0 ? detail::intlog2_impl(integer) : throw std::domain_error("The binary logarithm is not defined on non-positive numbers."); }