10 template<qx::arithmetic_c T>
22 template<
class format_context_type_t>
23 constexpr
auto format(qx::units::data eData, format_context_type_t& ctx)
const noexcept;
26 namespace qx::units::details
29 constexpr
bool is_binary(data eDataSize) noexcept
31 return eDataSize < data::_last_binary;
35 constexpr i64 to_bits(data eFrom, T value) noexcept
39 return static_cast<i64
>(
static_cast<double>(value) * pow(2,
static_cast<int>(eFrom)));
43 return static_cast<i64
>(
44 8.f *
static_cast<double>(value) *
pow(10,
static_cast<int>(eFrom) -
static_cast<int>(data::_last_binary)));
49 constexpr T from_bits(i64 bits, data eTo) noexcept
53 return static_cast<T
>(
static_cast<double>(bits) /
pow(2,
static_cast<int>(eTo)));
57 return static_cast<T
>(
58 static_cast<double>(bits) /
pow(10,
static_cast<int>(eTo) -
static_cast<int>(data::_last_binary)) / 8.f);
62 template<arithmetic_c T>
68 template<
class char_t>
71 static constexpr
auto get() noexcept
73 using pair_type = std::pair<data, basic_string_view<char_t>>;
74 return std::array { pair_type { data::bits,
QX_STR_PREFIX(char_t,
"b") },
92 template<qx::arithmetic_c T>
95 if (this->m_From.type == eTo)
96 return { this->m_From.value, eTo };
98 const i64 bits = units::details::to_bits(this->m_From.type, this->m_From.value);
99 return { units::details::from_bits<T>(bits, eTo), eTo };
102 template<
class format_context_type_t>
103 constexpr
auto std::formatter<qx::units::data, qx::char_type>::format(qx::units::data eData, format_context_type_t& ctx)
106 auto out = ctx.out();
110 auto itName = std::ranges::find_if(
112 [eData](
const std::pair<qx::units::data, qx::string_view>& pair)
114 return pair.first == eData;
116 if (itName != suffixes.end())
117 out = std::format_to(out, QX_TEXT(
"{}"), itName->second);
122 template<qx::arithmetic_c T>
124 unit<T, data> unit) noexcept
126 const i64 nBits = details::to_bits(unit.type, unit.value);
127 const f64 fAbsBits =
static_cast<f64
>(
abs(nBits));
129 data eTo = data::pebibytes;
130 if (fAbsBits <=
pow(2, 3))
134 else if (fAbsBits <=
pow(2, 13))
138 else if (fAbsBits <=
pow(2, 23))
140 eTo = data::kibibytes;
142 else if (fAbsBits <=
pow(2, 33))
144 eTo = data::mebibytes;
146 else if (fAbsBits <=
pow(2, 43))
148 eTo = data::gibibytes;
150 else if (fAbsBits <=
pow(2, 53))
152 eTo = data::tebibytes;
155 return convert(unit).to(eTo);
constexpr T abs(T value)
Constexpr absolute value.
constexpr double pow(T number, int nPower)
Power function for integer power.
#define QX_STR_PREFIX(value_t, str)
Chose witch of prefixes add to string : L or none.