M5Utility 0.0.2 git rev:5c1a751
Loading...
Searching...
No Matches
types.hpp
Go to the documentation of this file.
1/*
2 * Spdx-Filecopyrighttext: 2024 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UTILITY_TYPES_HPP
11#define M5_UTILITY_TYPES_HPP
12
13#include <cstdint>
14#include <cstddef>
15#include <utility>
16#include <tuple>
17#include "stl/endianness.hpp"
18
19namespace m5 {
20namespace types {
21
27template <bool DELittle>
28union U16 {
31
32 constexpr U16() : u16{0}
33 {
34 }
36#if 0
37 template <bool PELittle = m5::endian::little>
38 constexpr explicit U16(const uint16_t v) : u8{
39 static_cast<uint8_t>(
40 DELittle == PELittle ? (v & 0XFF) : (v >> 8)),
41 u8[1] = static_cast<uint8_t>(
42 DELittle == PELittle ? (v >> 8) : (v & 0xFF)) } {}
43#else
44 template <bool PELittle = m5::endian::little>
45 explicit U16(const uint16_t v)
46 {
48 }
49
50#endif
52 constexpr U16(const uint8_t high, const uint8_t low) : u8{high, low}
53 {
54 }
55
56 constexpr U16(const U16&) = default;
57
58 constexpr U16(U16&& o) noexcept = default;
60
63 U16& operator=(const U16&) = default;
64
65 U16& operator=(U16&&) noexcept = default;
66
67 template <bool PELittle = m5::endian::little>
68 U16& operator=(const uint16_t v)
69 {
71 return *this;
72 }
73 template <typename H, typename L>
74 U16& operator=(const std::pair<H, L>& o)
75 {
76 static_assert(std::is_integral<H>::value && std::is_integral<L>::value, "HIGH & LOW Must be integral");
77 u8[0] = static_cast<uint8_t>(o.first);
78 u8[1] = static_cast<uint8_t>(o.second);
79 return *this;
80 }
82
85
86 inline explicit operator bool() const
87 {
88 return u16;
89 }
91 inline explicit operator const uint8_t*() const
92 {
93 return data();
94 }
96 inline explicit operator uint8_t*() const
97 {
98 return data();
99 }
101 inline explicit operator uint16_t() const
102 {
103 return get();
104 }
106
111 template <bool PELittle = m5::endian::little>
112 inline void set(const uint16_t v)
113 {
114 if (DELittle == PELittle) {
115 u16 = v;
116 } else {
117 u8[0] = static_cast<uint8_t>(v >> 8);
118 u8[1] = static_cast<uint8_t>(v & 0xFF);
119 }
120 }
125 template <bool PELittle = m5::endian::little>
126 inline uint16_t get() const
127 {
128 uint16_t r{u16};
129 if (DELittle != PELittle) {
130 r = U16<DELittle>{u8[1], u8[0]}.u16;
131 }
132 return r;
133 };
135 inline uint8_t high() const
136 {
137 return u8[0];
138 }
140 inline uint8_t low() const
141 {
142 return u8[1];
143 }
145 inline const uint8_t* data() const
146 {
147 return u8;
148 }
150 inline uint8_t* data()
151 {
152 return u8;
153 }
155 inline size_t size() const
156 {
157 return 2;
158 }
159
160 uint16_t u16{};
161 uint8_t u8[2];
162};
163
166
170// ==
171inline bool operator==(const big_uint16_t& a, const big_uint16_t& b)
172{
173 return a.u16 == b.u16;
174}
175inline bool operator==(const big_uint16_t& a, const little_uint16_t& b)
176{
177 return std::tie(a.u8[0], a.u8[1]) == std::tie(b.u8[1], b.u8[0]);
178}
179inline bool operator==(const little_uint16_t& a, const big_uint16_t& b)
180{
181 return std::tie(a.u8[1], a.u8[0]) == std::tie(b.u8[0], b.u8[1]);
182}
183inline bool operator==(const little_uint16_t& a, const little_uint16_t& b)
184{
185 return a.u16 == b.u16;
186}
187// !=
188inline bool operator!=(const big_uint16_t& a, const big_uint16_t& b)
189{
190 return !(a == b);
191}
192inline bool operator!=(const big_uint16_t& a, const little_uint16_t& b)
193{
194 return !(a == b);
195}
196inline bool operator!=(const little_uint16_t& a, const big_uint16_t& b)
197{
198 return !(a == b);
199}
200inline bool operator!=(const little_uint16_t& a, const little_uint16_t& b)
201{
202 return !(a == b);
203}
204// <
205inline bool operator<(const big_uint16_t& a, const big_uint16_t& b)
206{
207 return a.u16 < b.u16;
208}
209inline bool operator<(const big_uint16_t& a, const little_uint16_t& b)
210{
211 return std::tie(a.u8[0], a.u8[1]) < std::tie(b.u8[1], b.u8[0]);
212}
213inline bool operator<(const little_uint16_t& a, const big_uint16_t& b)
214{
215 return std::tie(a.u8[1], a.u8[0]) < std::tie(b.u8[0], b.u8[1]);
216}
217inline bool operator<(const little_uint16_t& a, const little_uint16_t& b)
218{
219 return a.u16 < b.u16;
220}
221// >
222inline bool operator>(const big_uint16_t& a, const big_uint16_t& b)
223{
224 return b < a;
225}
226inline bool operator>(const big_uint16_t& a, const little_uint16_t& b)
227{
228 return b < a;
229}
230inline bool operator>(const little_uint16_t& a, const big_uint16_t& b)
231{
232 return b < a;
233}
234inline bool operator>(const little_uint16_t& a, const little_uint16_t& b)
235{
236 return b < a;
237}
238// <=
239inline bool operator<=(const big_uint16_t& a, const big_uint16_t& b)
240{
241 return !(a > b);
242}
243inline bool operator<=(const big_uint16_t& a, const little_uint16_t& b)
244{
245 return !(a > b);
246}
247inline bool operator<=(const little_uint16_t& a, const big_uint16_t& b)
248{
249 return !(a > b);
250}
251inline bool operator<=(const little_uint16_t& a, const little_uint16_t& b)
252{
253 return !(a > b);
254}
255// >=
256inline bool operator>=(const big_uint16_t& a, const big_uint16_t& b)
257{
258 return !(a < b);
259}
260inline bool operator>=(const big_uint16_t& a, const little_uint16_t& b)
261{
262 return !(a < b);
263}
264inline bool operator>=(const little_uint16_t& a, const big_uint16_t& b)
265{
266 return !(a < b);
267}
268inline bool operator>=(const little_uint16_t& a, const little_uint16_t& b)
269{
270 return !(a < b);
271}
273
274} // namespace types
275} // namespace m5
276#endif
Compile-time endian identification.
Top level namespace of M5.
Definition bit_segment.hpp:17
Endian-compliant uint16.
Definition types.hpp:28
uint16_t get() const
Gets value with specified endianness.
Definition types.hpp:126
U16(const uint16_t v)
from uint16_t
Definition types.hpp:45
uint16_t u16
Raw value.
Definition types.hpp:160
constexpr U16(U16 &&o) noexcept=default
default constructor
const uint8_t * data() const
Gets the const pointer.
Definition types.hpp:145
constexpr U16(const U16 &)=default
default constructor
uint8_t * data()
Gets the pointer.
Definition types.hpp:150
constexpr U16(const uint8_t high, const uint8_t low)
Stored in order of high and low.
Definition types.hpp:52
uint8_t low() const
Gets the low byte.
Definition types.hpp:140
constexpr U16()
default constructor
Definition types.hpp:32
size_t size() const
Gets size in uint8_t units.
Definition types.hpp:155
uint8_t u8[2]
Raw value according to uint8_t.
Definition types.hpp:161
void set(const uint16_t v)
Set value with specified endianness.
Definition types.hpp:112
uint8_t high() const
Gets the high byte.
Definition types.hpp:135