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
106 if (traits<data>::is_si(eFrom))
108 fBits = 8.f *
static_cast<double>(value) *
pow(10,
static_cast<int>(eFrom) -
static_cast<int>(data::_first_si));
112 fBits =
static_cast<double>(value) *
pow(2,
static_cast<int>(eFrom));
120 constexpr
double fLimit = 0x1p63;
122 return std::numeric_limits<i64>::max();
123 if (fBits <= -fLimit)
124 return std::numeric_limits<i64>::min();
126 return static_cast<i64
>(fBits);
130 constexpr T qx::units::details::from_bits(i64 bits, data eTo) noexcept
132 if (traits<data>::is_si(eTo))
134 return static_cast<T
>(
135 static_cast<double>(bits) /
pow(10,
static_cast<int>(eTo) -
static_cast<int>(data::_first_si)) / 8.f);
139 return static_cast<T
>(
static_cast<double>(bits) /
pow(2,
static_cast<int>(eTo)));
143 template<qx::arithmetic_c T>
146 if (this->m_From.type == eTo)
147 return { this->m_From.value, eTo };
149 const i64 bits = units::details::to_bits(this->m_From.type, this->m_From.value);
150 return { units::details::from_bits<T>(bits, eTo), eTo };
153 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.