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>
70 int digits = ((std::bit_width(v) * 1233) >> 12);
81template <
typename ValueT>
82 requires std::signed_integral<ValueT>
89 if (v == std::numeric_limits<std::int64_t>::min()) [[
unlikely]] {
92 std::int64_t
abs_v = (v < 0) ? -v : v;
103template <
typename UIntegerT>
104 requires std::unsigned_integral<UIntegerT>
107 constexpr auto Bits =
sizeof(
i) * 8;
108 return 1 + ((
Bits - std::countl_zero(
i | 1) - 1) >> 2);
113static_assert(
hex_digits(std::uint64_t{0xffffffffffff}) == 12);
119template <
typename ValueT>
120 requires std::integral<ValueT> || std::same_as<ValueT, double>
123 if constexpr (std::is_same_v<ValueT, double>) {
125 }
else if constexpr (std::is_integral_v<ValueT>) {
126 auto it =
sv.begin(), end =
sv.end();
131 if constexpr (std::is_signed_v<ValueT>) {
153static_assert(
ston<int>(std::string_view{
"-123"}) == -123);
159 return std::hash<std::string_view>{}(
txt);
161 std::size_t
operator()(
const char*
txt)
const {
return std::hash<std::string_view>{}(
txt); }
162 std::size_t
operator()(
const std::string&
txt)
const {
return std::hash<std::string>{}(
txt); }
167 return b ?
"true" :
"false";