13 template<arithmetic_c T>
16 template<
class char_t>
17 static constexpr
auto get_suffixes() noexcept;
19 static constexpr
bool is_si(data eData) noexcept;
22 template<qx::arithmetic_c T>
31 namespace qx::units::details
35 constexpr i64 to_bits(data eFrom, T value) noexcept;
38 constexpr T from_bits(i64 bits, data eTo) noexcept;
44 return eData > data::_first_si;
47 template<qx::arithmetic_c T>
50 const i64 nBits = details::to_bits(unit.type, unit.value);
51 const f64 fAbsBits =
static_cast<f64
>(
abs(nBits));
53 data eTo = data::pebibytes;
54 if (fAbsBits <=
pow(2, 3))
58 else if (fAbsBits <=
pow(2, 13))
62 else if (fAbsBits <=
pow(2, 23))
64 eTo = data::kibibytes;
66 else if (fAbsBits <=
pow(2, 33))
68 eTo = data::mebibytes;
70 else if (fAbsBits <=
pow(2, 43))
72 eTo = data::gibibytes;
74 else if (fAbsBits <=
pow(2, 53))
76 eTo = data::tebibytes;
79 return convert(unit).to(eTo);
82 template<
class char_t>
85 using pair_type = std::pair<data, basic_string_view<char_t>>;
86 return std::array { pair_type { data::bits,
QX_STR_PREFIX(char_t,
"b") },
103 constexpr i64 qx::units::details::to_bits(data eFrom, T value) noexcept
105 if (traits<data>::is_si(eFrom))
107 return static_cast<i64
>(
108 8.f *
static_cast<double>(value) *
pow(10,
static_cast<int>(eFrom) -
static_cast<int>(data::_first_si)));
112 return static_cast<i64
>(
static_cast<double>(value) *
pow(2,
static_cast<int>(eFrom)));
117 constexpr T qx::units::details::from_bits(i64 bits, data eTo) noexcept
119 if (traits<data>::is_si(eTo))
121 return static_cast<T
>(
122 static_cast<double>(bits) /
pow(10,
static_cast<int>(eTo) -
static_cast<int>(data::_first_si)) / 8.f);
126 return static_cast<T
>(
static_cast<double>(bits) /
pow(2,
static_cast<int>(eTo)));
130 template<qx::arithmetic_c T>
133 if (this->m_From.type == eTo)
134 return { this->m_From.value, eTo };
136 const i64 bits = units::details::to_bits(this->m_From.type, this->m_From.value);
137 return { units::details::from_bits<T>(bits, eTo), eTo };
140 template<
class char_t>
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.