SWC-DB  v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
BitFieldInt.h
Go to the documentation of this file.
1 /*
2  * SWC-DB© Copyright since 2019 Alex Kashirin <kashirin.alex@gmail.com>
3  * License details at <https://github.com/kashirin-alex/swc-db/#license>
4  */
5 
6 #ifndef swcdb_core_BitFieldInt_h
7 #define swcdb_core_BitFieldInt_h
8 
9 namespace SWC { namespace Core {
10 
11 
12 //#pragma pack(push, 1)
13 template <class T, uint8_t SZ>
14 struct BitFieldInt final {
15 
16  T data : SZ;
17 
18  constexpr SWC_CAN_INLINE
19  BitFieldInt() noexcept: data() { }
20 
21  template<typename FROM_T>
22  constexpr SWC_CAN_INLINE
23  BitFieldInt(const FROM_T& v) noexcept : data(v) { }
24 
25  constexpr SWC_CAN_INLINE
26  operator bool() const noexcept {
27  return data;
28  }
29 
30  constexpr SWC_CAN_INLINE
32  ++data;
33  return *this;
34  }
35  constexpr SWC_CAN_INLINE
38  ++data;
39  return tmp;
40  }
41  constexpr SWC_CAN_INLINE
43  --data;
44  return *this;
45  }
46  constexpr SWC_CAN_INLINE
49  --data;
50  return tmp;
51  }
52 
53 
54  constexpr SWC_CAN_INLINE
55  BitFieldInt<T, SZ>& operator+=(const BitFieldInt<T, SZ>& v) noexcept {
56  data += v.data;
57  return *this;
58  }
59  constexpr SWC_CAN_INLINE
60  BitFieldInt<T, SZ>& operator-=(const BitFieldInt<T, SZ>& v) noexcept {
61  data -= v.data;
62  return *this;
63  }
64  constexpr SWC_CAN_INLINE
66  data /= v.data;
67  return *this;
68  }
69  constexpr SWC_CAN_INLINE
70  BitFieldInt<T, SZ>& operator*=(const BitFieldInt<T, SZ>& v) noexcept {
71  data *= v.data;
72  return *this;
73  }
74  constexpr SWC_CAN_INLINE
76  data >>= v.data;
77  return *this;
78  }
79  constexpr SWC_CAN_INLINE
81  data <<= v.data;
82  return *this;
83  }
84  constexpr SWC_CAN_INLINE
86  data |= v.data;
87  return *this;
88  }
89 
90 
91  template<typename IN_T>
92  constexpr SWC_CAN_INLINE
93  BitFieldInt<T, SZ>& operator+=(const IN_T& v) noexcept {
94  data += v;
95  return *this;
96  }
97  template<typename IN_T>
98  constexpr SWC_CAN_INLINE
99  BitFieldInt<T, SZ>& operator-=(const IN_T& v) noexcept {
100  data -= v;
101  return *this;
102  }
103  template<typename IN_T>
104  constexpr SWC_CAN_INLINE
105  BitFieldInt<T, SZ>& operator/=(const IN_T& v) noexcept {
106  data /= v;
107  return *this;
108  }
109  template<typename IN_T>
110  constexpr SWC_CAN_INLINE
111  BitFieldInt<T, SZ>& operator*=(const IN_T& v) noexcept {
112  data *= v;
113  return *this;
114  }
115  template<typename IN_T>
116  constexpr SWC_CAN_INLINE
117  BitFieldInt<T, SZ>& operator<<=(const IN_T& v) noexcept {
118  data <<= v;
119  return *this;
120  }
121  template<typename IN_T>
122  constexpr SWC_CAN_INLINE
123  BitFieldInt<T, SZ>& operator>>=(const IN_T& v) noexcept {
124  data >>= v;
125  return *this;
126  }
127  template<typename IN_T>
128  constexpr SWC_CAN_INLINE
129  BitFieldInt<T, SZ>& operator|=(const IN_T& v) noexcept {
130  data |= v;
131  return *this;
132  }
133  template<typename IN_T>
134  constexpr SWC_CAN_INLINE
135  BitFieldInt<T, SZ>& operator&=(const IN_T& v) noexcept {
136  data &= v;
137  return *this;
138  }
139  template<typename IN_T>
140  constexpr SWC_CAN_INLINE
141  BitFieldInt<T, SZ>& operator^=(const IN_T& v) noexcept {
142  data ^= v;
143  return *this;
144  }
145 
146  template<typename TO_T>
147  constexpr SWC_CAN_INLINE
148  operator TO_T() const noexcept {
149  return data;
150  }
151  template<class T2, uint8_t SZ2>
152  constexpr SWC_CAN_INLINE
153  operator BitFieldInt<T2, SZ2>() const noexcept {
154  return BitFieldInt<T2, SZ2>(data);
155  }
156 
157  /*
158  BitFieldInt<T, SZ> operator+(const BitFieldInt<T, SZ>& v) const {
159  return BitFieldInt<T, SZ>(data) += v.data;
160  }
161  BitFieldInt<T, SZ> operator-(const BitFieldInt<T, SZ>& v) const {
162  return BitFieldInt<T, SZ>(data) -= v.data;
163  }
164  BitFieldInt<T, SZ> operator/(const BitFieldInt<T, SZ>& v) const {
165  return BitFieldInt<T, SZ>(data) /= v.data;
166  }
167  BitFieldInt<T, SZ> operator*(const BitFieldInt<T, SZ>& v) const {
168  return BitFieldInt<T, SZ>(data) *= v.data;
169  }
170  BitFieldInt<T, SZ> operator>>(const BitFieldInt<T, SZ>& v) const {
171  return BitFieldInt<T, SZ>(data) >>= v.data;
172  }
173  BitFieldInt<T, SZ> operator<<(const BitFieldInt<T, SZ>& v) const {
174  return BitFieldInt<T, SZ>(data) <<= v.data;
175  }
176 
177 
178  template<typename IN_T>
179  BitFieldInt<T, SZ> operator+(const IN_T& v) const {
180  return BitFieldInt<T, SZ>(data) += v;
181  }
182  template<typename IN_T>
183  BitFieldInt<T, SZ> operator-(const IN_T& v) const {
184  return BitFieldInt<T, SZ>(data) -= v;
185  }
186  template<typename IN_T>
187  BitFieldInt<T, SZ> operator/(const IN_T& v) const {
188  return BitFieldInt<T, SZ>(data) /= v;
189  }
190  template<typename IN_T>
191  BitFieldInt<T, SZ> operator*(const IN_T& v) const {
192  return BitFieldInt<T, SZ>(data) *= v;
193  }
194  template<typename IN_T>
195  BitFieldInt<T, SZ> operator<<(const IN_T& v) const {
196  return BitFieldInt<T, SZ>(data) <<= v;
197  }
198  template<typename IN_T>
199  BitFieldInt<T, SZ> operator>>(const IN_T& v) const {
200  return BitFieldInt<T, SZ>(data) >>= v;
201  }
202 
203 
204  bool operator <=(const BitFieldInt<T, SZ>& v) const {
205  return data <= v.data;
206  }
207  bool operator >=(const BitFieldInt<T, SZ>& v) const {
208  return data >= v.data;
209  }
210  bool operator <(const BitFieldInt<T, SZ>& v) const {
211  return data < v.data;
212  }
213  bool operator >(const BitFieldInt<T, SZ>& v) const {
214  return data > v.data;
215  }
216  bool operator ==(const BitFieldInt<T, SZ>& v) const {
217  return data == v.data;
218  }
219  bool operator !=(const BitFieldInt<T, SZ>& v) const {
220  return data != v.data;
221  }
222 
223 
224  template<typename IN_T>
225  bool operator <=(const IN_T& v) const {
226  return data <= v;
227  }
228  template<typename IN_T>
229  bool operator >=(const IN_T& v) const {
230  return data >= v;
231  }
232  template<typename IN_T>
233  bool operator <(const IN_T& v) const {
234  return data < v;
235  }
236  template<typename IN_T>
237  bool operator >(const IN_T& v) const {
238  return data > v;
239  }
240  template<typename IN_T>
241  bool operator ==(const IN_T& v) const {
242  return data == v;
243  }
244  template<typename IN_T>
245  bool operator !=(const IN_T& v) const {
246  return data != v;
247  }
248  */
249 
250 } __attribute__((packed));
251 //#pragma pack(pop)
252 
253 
254 template<typename T, uint8_t SZ>
255 extern SWC_CAN_INLINE
256 std::ostream& operator<<(std::ostream& out, const BitFieldInt<T, SZ>& v) {
257  out << v.data;
258  return out;
259 }
260 
261 template<class T, uint8_t SZ>
262 extern SWC_CAN_INLINE
263 std::string to_string(const BitFieldInt<T, SZ>& v) {
264  return std::to_string(v.data);
265 }
266 
267 
268 /* BitFieldInt<T, SZ> = BitFieldInt<T, SZ> op IN_T */
269 #define SWC_BITFIELD_op_T(_op_) \
270 template<class T, uint8_t SZ, typename IN_T> \
271 extern constexpr SWC_CAN_INLINE \
272 BitFieldInt<T, SZ> \
273 operator _op_ (const BitFieldInt<T, SZ>& v1, \
274  const IN_T& v2) noexcept { \
275  return BitFieldInt<T, SZ>(v1.data _op_ v2);\
276 }
286 
287 /* IN_T = IN_T op BitFieldInt<T, SZ>*/
288 #define SWC_T_op_BITFIELD(_op_) \
289 template<typename IN_T, class T, uint8_t SZ> \
290 extern constexpr SWC_CAN_INLINE \
291 BitFieldInt<T, SZ> \
292 operator _op_ (const IN_T& v1, \
293  const BitFieldInt<T, SZ>& v2) noexcept { \
294  return v1 _op_ v2.data;\
295 }
305 
306 
307 
308 /* BitFieldInt<T, SZ> = BitFieldInt<T1, SZ1> op BitFieldInt<T2, SZ2> */
309 #define SWC_BITFIELD1_op_BITFIELD2(_op_) \
310 template<class T1, uint8_t SZ1, class T2, uint8_t SZ2> \
311 extern constexpr SWC_CAN_INLINE \
312 BitFieldInt<T1, SZ1> \
313 operator _op_ (const BitFieldInt<T1, SZ1>& v1, \
314  const BitFieldInt<T2, SZ2>& v2) noexcept { \
315  return BitFieldInt<T1, SZ1>(v1.data _op_ v2.data); \
316 }
326 
327 
328 
329 /* bool IN_T vs BitFieldInt<T, SZ> */
330 #define SWC_T_vs_BITFIELD(_vs_) \
331 template<typename IN_T, class T, uint8_t SZ> \
332 extern constexpr SWC_CAN_INLINE \
333 bool operator _vs_ (const IN_T& v1, const BitFieldInt<T, SZ>& v2) noexcept { \
334  return v1 _vs_ v2.data; \
335 }
342 
343 
344 
345 /* bool BitFieldInt<T, SZ> vs IN_T */
346 #define SWC_BITFIELD_vs_T(_vs_) \
347 template<class T, uint8_t SZ, typename IN_T> \
348 extern constexpr SWC_CAN_INLINE \
349 bool operator _vs_ (const BitFieldInt<T, SZ>& v1, const IN_T& v2) noexcept { \
350  return v1.data _vs_ v2; \
351 }
358 
359 
360 
361 /* bool BitFieldInt<T1, SZ1> vs BitFieldInt<T2, SZ2> */
362 #define SWC_BITFIELD1_vs_BITFIELD2(_vs_) \
363 template<class T1, uint8_t SZ1, class T2, uint8_t SZ2> \
364 extern constexpr SWC_CAN_INLINE \
365 bool operator _vs_ (const BitFieldInt<T1, SZ1>& v1, \
366  const BitFieldInt<T2, SZ2>& v2) noexcept { \
367  return v1.data _vs_ v2.data; \
368 }
375 
376 
377 
378 
379 typedef BitFieldInt<uint32_t, 24> uint24_t;
380 typedef BitFieldInt<int32_t, 24> int24_t;
381 
382 typedef BitFieldInt<uint64_t, 40> uint40_t;
383 typedef BitFieldInt<int64_t, 40> int40_t;
384 
385 typedef BitFieldInt<uint64_t, 48> uint48_t;
386 typedef BitFieldInt<int64_t, 48> int48_t;
387 
388 typedef BitFieldInt<uint64_t, 56> uint56_t;
389 typedef BitFieldInt<int64_t, 56> int56_t;
390 
391 
392 } // namespace Core
393 
394 
395 
401 typedef Core::uint24_t uint24_t;
402 typedef Core::int24_t int24_t;
403 constexpr const uint24_t UINT24_MAX = uint24_t(UINT32_MAX >> 8); // 16777215
404 constexpr const uint24_t UINT24_MIN = UINT24_MAX + 1; // 0
405 constexpr const int24_t INT24_MAX = int24_t(UINT24_MAX / 2); // 8388607
406 constexpr const int24_t INT24_MIN = INT24_MAX + 1; // -8388608
407 
408 
409 typedef Core::uint40_t uint40_t;
410 typedef Core::int40_t int40_t;
411 constexpr const uint40_t UINT40_MAX = uint40_t(UINT64_MAX >> 24); // 1099511627775
412 constexpr const uint40_t UINT40_MIN = UINT40_MAX + 1; // 0
413 constexpr const int40_t INT40_MAX = int40_t(UINT40_MAX / 2); // 549755813887
414 constexpr const int40_t INT40_MIN = INT40_MAX + 1; // -549755813888
415 
416 
417 typedef Core::uint48_t uint48_t;
418 typedef Core::int48_t int48_t;
419 constexpr const uint48_t UINT48_MAX = uint48_t(UINT64_MAX >> 16); // 281474976710655
420 constexpr const uint48_t UINT48_MIN = UINT48_MAX + 1; // 0
421 constexpr const int48_t INT48_MAX = int48_t(UINT48_MAX / 2); // 140737488355327
422 constexpr const int48_t INT48_MIN = INT48_MAX + 1; // -140737488355328
423 
424 
425 typedef Core::uint56_t uint56_t;
426 typedef Core::int56_t int56_t;
427 constexpr const uint56_t UINT56_MAX = uint56_t(UINT64_MAX >> 8); // 72057594037927935
428 constexpr const uint56_t UINT56_MIN = UINT56_MAX + 1; // 0
429 constexpr const int56_t INT56_MAX = int56_t(UINT56_MAX / 2); // 36028797018963967
430 constexpr const int56_t INT56_MIN = INT56_MAX + 1; // -36028797018963968
431 
432 
436 } // namespace SWC
437 
438 #endif // swcdb_core_BitFieldInt_h
SWC::Core::BitFieldInt::operator|=
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator|=(const BitFieldInt< T, SZ > &v) noexcept
Definition: BitFieldInt.h:85
SWC::Core::BitFieldInt::operator--
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator--() noexcept
Definition: BitFieldInt.h:42
SWC::INT40_MAX
constexpr const int40_t INT40_MAX
Definition: BitFieldInt.h:413
SWC::UINT56_MIN
constexpr const uint56_t UINT56_MIN
Definition: BitFieldInt.h:428
SWC::INT56_MAX
constexpr const int56_t INT56_MAX
Definition: BitFieldInt.h:429
SWC::Core::BitFieldInt::operator|=
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator|=(const IN_T &v) noexcept
Definition: BitFieldInt.h:129
SWC::Core::BitFieldInt::BitFieldInt
constexpr SWC_CAN_INLINE BitFieldInt(const FROM_T &v) noexcept
Definition: BitFieldInt.h:23
SWC::INT56_MIN
constexpr const int56_t INT56_MIN
Definition: BitFieldInt.h:430
SWC::Core::BitFieldInt::operator--
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > operator--(int) noexcept
Definition: BitFieldInt.h:47
SWC::UINT56_MAX
constexpr const uint56_t UINT56_MAX
Definition: BitFieldInt.h:427
SWC_BITFIELD1_vs_BITFIELD2
#define SWC_BITFIELD1_vs_BITFIELD2(_vs_)
SWC::UINT24_MAX
constexpr const uint24_t UINT24_MAX
Definition: BitFieldInt.h:403
SWC::Core::BitFieldInt::operator-=
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator-=(const IN_T &v) noexcept
Definition: BitFieldInt.h:99
SWC::Core::BitFieldInt::operator^=
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator^=(const IN_T &v) noexcept
Definition: BitFieldInt.h:141
SWC::UINT40_MAX
constexpr const uint40_t UINT40_MAX
Definition: BitFieldInt.h:411
SWC::Core::BitFieldInt::operator+=
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator+=(const BitFieldInt< T, SZ > &v) noexcept
Definition: BitFieldInt.h:55
SWC::UINT48_MIN
constexpr const uint48_t UINT48_MIN
Definition: BitFieldInt.h:420
SWC::Core::BitFieldInt
Definition: BitFieldInt.h:14
SWC::Core::BitFieldInt::operator+=
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator+=(const IN_T &v) noexcept
Definition: BitFieldInt.h:93
SWC::UINT48_MAX
constexpr const uint48_t UINT48_MAX
Definition: BitFieldInt.h:419
SWC::Core::BitFieldInt::operator<<=
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator<<=(const BitFieldInt< T, SZ > &v) noexcept
Definition: BitFieldInt.h:80
SWC_CAN_INLINE
#define SWC_CAN_INLINE
Definition: Compat.h:102
SWC::INT48_MAX
constexpr const int48_t INT48_MAX
Definition: BitFieldInt.h:421
SWC
The SWC-DB C++ namespace 'SWC'.
Definition: main.cc:12
SWC::Core::BitFieldInt::operator&=
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator&=(const IN_T &v) noexcept
Definition: BitFieldInt.h:135
SWC::INT40_MIN
constexpr const int40_t INT40_MIN
Definition: BitFieldInt.h:414
SWC::Core::BitFieldInt::operator-=
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator-=(const BitFieldInt< T, SZ > &v) noexcept
Definition: BitFieldInt.h:60
SWC::Core::BitFieldInt::operator/=
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator/=(const IN_T &v) noexcept
Definition: BitFieldInt.h:105
SWC::Core::operator<<
SWC_CAN_INLINE std::ostream & operator<<(std::ostream &out, const AtomicBase< T, OrderT > &v)
Definition: Atomic.h:198
SWC::Core::BitFieldInt::data
T data
Definition: BitFieldInt.h:16
SWC::Core::BitFieldInt::operator++
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > operator++(int) noexcept
Definition: BitFieldInt.h:36
SWC_BITFIELD_vs_T
#define SWC_BITFIELD_vs_T(_vs_)
SWC::Core::BitFieldInt::operator/=
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator/=(const BitFieldInt< T, SZ > &v) noexcept
Definition: BitFieldInt.h:65
SWC_T_op_BITFIELD
#define SWC_T_op_BITFIELD(_op_)
SWC::uint24_t
Core::uint24_t uint24_t
Definition: BitFieldInt.h:401
SWC::Config::T
const uint64_t T
Definition: Property.h:27
SWC::Core::BitFieldInt::operator++
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator++() noexcept
Definition: BitFieldInt.h:31
SWC::UINT24_MIN
constexpr const uint24_t UINT24_MIN
Definition: BitFieldInt.h:404
SWC::Core::BitFieldInt::BitFieldInt
constexpr SWC_CAN_INLINE BitFieldInt() noexcept
Definition: BitFieldInt.h:19
SWC::UINT40_MIN
constexpr const uint40_t UINT40_MIN
Definition: BitFieldInt.h:412
SWC::INT48_MIN
constexpr const int48_t INT48_MIN
Definition: BitFieldInt.h:422
SWC::Core::BitFieldInt::operator>>=
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator>>=(const BitFieldInt< T, SZ > &v) noexcept
Definition: BitFieldInt.h:75
SWC::INT24_MIN
constexpr const int24_t INT24_MIN
Definition: BitFieldInt.h:406
SWC_T_vs_BITFIELD
#define SWC_T_vs_BITFIELD(_vs_)
SWC::Core::__attribute__
struct SWC::Core::BitFieldInt __attribute__((packed))
SWC::Core::BitFieldInt::operator*=
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator*=(const BitFieldInt< T, SZ > &v) noexcept
Definition: BitFieldInt.h:70
SWC::Core::BitFieldInt::operator>>=
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator>>=(const IN_T &v) noexcept
Definition: BitFieldInt.h:123
SWC_BITFIELD1_op_BITFIELD2
#define SWC_BITFIELD1_op_BITFIELD2(_op_)
SWC::Core::to_string
SWC_CAN_INLINE std::string to_string(const BitFieldInt< T, SZ > &v)
Definition: BitFieldInt.h:263
SWC::INT24_MAX
constexpr const int24_t INT24_MAX
Definition: BitFieldInt.h:405
SWC::Core::SWC_BITFIELD_op_T
SWC_BITFIELD_op_T(+) SWC_BITFIELD_op_T(-) SWC_BITFIELD_op_T(/) SWC_BITFIELD_op_T(*) SWC_BITFIELD_op_T(<<) SWC_BITFIELD_op_T(>>) SWC_BITFIELD_op_T(&) SWC_BITFIELD_op_T(|) SWC_BITFIELD_op_T(^) SWC_T_op_BITFIELD(+) SWC_T_op_BITFIELD(-) SWC_T_op_BITFIELD(/) SWC_T_op_BITFIELD(*) SWC_T_op_BITFIELD(<<) SWC_T_op_BITFIELD(>>) SWC_T_op_BITFIELD(&) SWC_T_op_BITFIELD(|) SWC_T_op_BITFIELD(^) SWC_BITFIELD1_op_BITFIELD2(+) SWC_BITFIELD1_op_BITFIELD2(-) SWC_BITFIELD1_op_BITFIELD2(/) SWC_BITFIELD1_op_BITFIELD2(*) SWC_BITFIELD1_op_BITFIELD2(<<) SWC_BITFIELD1_op_BITFIELD2(>>) SWC_BITFIELD1_op_BITFIELD2(&) SWC_BITFIELD1_op_BITFIELD2(|) SWC_BITFIELD1_op_BITFIELD2(^) SWC_T_vs_BITFIELD(
SWC::Core::BitFieldInt::operator*=
constexpr SWC_CAN_INLINE BitFieldInt< T, SZ > & operator*=(const IN_T &v) noexcept
Definition: BitFieldInt.h:111