17#ifndef TOOLBOX_UTIL_UTILITY_HPP
18#define TOOLBOX_UTIL_UTILITY_HPP
29inline namespace util {
34template <
typename ValueT>
42 return c >=
'0' &&
c <=
'9';
50template <
typename ValueT>
51 requires std::unsigned_integral<ValueT>
69 int digits = ((std::bit_width(
v) * 1233) >> 12);
80template <
typename ValueT>
81 requires std::signed_integral<ValueT>
87 if (
v == std::numeric_limits<std::int64_t>::min()) [[
unlikely]] {
90 std::int64_t
abs_v = (
v < 0) ? -
v :
v;
101template <
typename UIntegerT>
102 requires std::unsigned_integral<UIntegerT>
105 constexpr auto Bits =
sizeof(
i) * 8;
106 return 1 + ((
Bits - std::countl_zero(
i | 1) - 1) >> 2);
111static_assert(
hex_digits(std::uint64_t{0xffffffffffff}) == 12);
116template <
typename ValueT>
117 requires std::integral<ValueT> || std::same_as<ValueT, double>
120 if constexpr (std::is_same_v<ValueT, double>) {
122 }
else if constexpr (std::is_integral_v<ValueT>) {
123 auto it =
sv.begin(), end =
sv.end();
128 if constexpr (std::is_signed_v<ValueT>) {
150static_assert(
ston<int>(std::string_view{
"-123"}) == -123);
156 return std::hash<std::string_view>{}(
txt);
160 return std::hash<std::string_view>{}(
txt);
164 return std::hash<std::string>{}(
txt);
170 return b ?
"true" :
"false";