qxLib
data.inl
Go to the documentation of this file.
1 /**
2 
3  @file data.inl
4  @author Khrapov
5  @date 13.08.2025
6  @copyright © Nick Khrapov, 2025. All right reserved.
7 
8 **/
9 
10 template<>
11 struct qx::units::traits<qx::units::data>
12 {
13  template<arithmetic_c T>
14  static constexpr unit<T, data> normalize(unit<T, data> unit) noexcept;
15 
16  template<class char_t>
17  static constexpr auto get_suffixes() noexcept;
18 
19  static constexpr bool is_si(data eData) noexcept;
20 };
21 
22 template<qx::arithmetic_c T>
23 class qx::convert<T, qx::units::data> : public units::details::base_converter<T, units::data>
24 {
25 public:
27 
28  constexpr unit<T, units::data> to(units::data eTo) const noexcept;
29 };
30 
31 namespace qx::units::details
32 {
33 
34 template<class T>
35 constexpr i64 to_bits(data eFrom, T value) noexcept;
36 
37 template<class T>
38 constexpr T from_bits(i64 bits, data eTo) noexcept;
39 
40 } // namespace qx::units::details
41 
42 constexpr bool qx::units::traits<qx::units::data>::is_si(data eData) noexcept
43 {
44  return eData > data::_first_si;
45 }
46 
47 template<qx::arithmetic_c T>
49 {
50  const i64 nBits = details::to_bits(unit.type, unit.value);
51  const f64 fAbsBits = static_cast<f64>(abs(nBits));
52 
53  data eTo = data::pebibytes;
54  if (fAbsBits <= pow(2, 3))
55  {
56  eTo = data::bits;
57  }
58  else if (fAbsBits <= pow(2, 13))
59  {
60  eTo = data::bytes;
61  }
62  else if (fAbsBits <= pow(2, 23))
63  {
64  eTo = data::kibibytes;
65  }
66  else if (fAbsBits <= pow(2, 33))
67  {
68  eTo = data::mebibytes;
69  }
70  else if (fAbsBits <= pow(2, 43))
71  {
72  eTo = data::gibibytes;
73  }
74  else if (fAbsBits <= pow(2, 53))
75  {
76  eTo = data::tebibytes;
77  }
78 
79  return convert(unit).to(eTo);
80 }
81 
82 template<class char_t>
84 {
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") },
87  pair_type { data::nibbles, QX_STR_PREFIX(char_t, "nib") },
88  pair_type { data::bytes, QX_STR_PREFIX(char_t, "B") },
89  pair_type { data::kibibytes, QX_STR_PREFIX(char_t, "KiB") },
90  pair_type { data::mebibytes, QX_STR_PREFIX(char_t, "MiB") },
91  pair_type { data::gibibytes, QX_STR_PREFIX(char_t, "GiB") },
92  pair_type { data::tebibytes, QX_STR_PREFIX(char_t, "TiB") },
93  pair_type { data::pebibytes, QX_STR_PREFIX(char_t, "PiB") },
94 
95  pair_type { data::kilobytes, QX_STR_PREFIX(char_t, "kB") },
96  pair_type { data::megabytes, QX_STR_PREFIX(char_t, "MB") },
97  pair_type { data::gigabytes, QX_STR_PREFIX(char_t, "GB") },
98  pair_type { data::terabytes, QX_STR_PREFIX(char_t, "TB") },
99  pair_type { data::petabytes, QX_STR_PREFIX(char_t, "PB") } };
100 }
101 
102 template<class T>
103 constexpr i64 qx::units::details::to_bits(data eFrom, T value) noexcept
104 {
105  if (traits<data>::is_si(eFrom))
106  {
107  return static_cast<i64>(
108  8.f * static_cast<double>(value) * pow(10, static_cast<int>(eFrom) - static_cast<int>(data::_first_si)));
109  }
110  else
111  {
112  return static_cast<i64>(static_cast<double>(value) * pow(2, static_cast<int>(eFrom)));
113  }
114 }
115 
116 template<class T>
117 constexpr T qx::units::details::from_bits(i64 bits, data eTo) noexcept
118 {
119  if (traits<data>::is_si(eTo))
120  {
121  return static_cast<T>(
122  static_cast<double>(bits) / pow(10, static_cast<int>(eTo) - static_cast<int>(data::_first_si)) / 8.f);
123  }
124  else
125  {
126  return static_cast<T>(static_cast<double>(bits) / pow(2, static_cast<int>(eTo)));
127  }
128 }
129 
130 template<qx::arithmetic_c T>
131 constexpr qx::unit<T, qx::units::data> qx::convert<T, qx::units::data>::to(units::data eTo) const noexcept
132 {
133  if (this->m_From.type == eTo)
134  return { this->m_From.value, eTo };
135 
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 };
138 }
139 
140 template<class char_t>
141 struct std::formatter<qx::units::data, char_t> : qx::units::details::unit_formatter<qx::units::data, char_t>
142 {
143 };
A conversion class.
Definition: base.h:77
constexpr T abs(T value)
Constexpr absolute value.
Definition: common.inl:14
constexpr double pow(T number, int nPower)
Power function for integer power.
Definition: common.inl:58
#define QX_STR_PREFIX(value_t, str)
Chose witch of prefixes add to string : L or none.
Definition: string_utils.h:253
Definition: base.h:52