10#ifndef M5_UTILITY_TYPES_HPP
11#define M5_UTILITY_TYPES_HPP
27template <
bool DELittle>
37 template <
bool PELittle = m5::endian::little>
38 constexpr explicit U16(
const uint16_t v) :
u8{
40 DELittle == PELittle ? (v & 0XFF) : (v >> 8)),
41 u8[1] = static_cast<uint8_t>(
42 DELittle == PELittle ? (v >> 8) : (v & 0xFF)) } {}
44 template <
bool PELittle = m5::endian::little>
45 explicit U16(
const uint16_t v)
58 constexpr U16(
U16&& o)
noexcept =
default;
63 U16& operator=(
const U16&) =
default;
65 U16& operator=(
U16&&) noexcept = default;
67 template <
bool PELittle =
m5::endian::little>
68 U16& operator=(const uint16_t v)
73 template <
typename H,
typename L>
74 U16& operator=(
const std::pair<H, L>& o)
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);
86 inline explicit operator bool()
const
91 inline explicit operator const uint8_t*()
const
96 inline explicit operator uint8_t*()
const
101 inline explicit operator uint16_t()
const
111 template <
bool PELittle = m5::endian::little>
112 inline void set(
const uint16_t v)
114 if (DELittle == PELittle) {
117 u8[0] =
static_cast<uint8_t
>(v >> 8);
118 u8[1] =
static_cast<uint8_t
>(v & 0xFF);
125 template <
bool PELittle = m5::endian::little>
126 inline uint16_t
get()
const
129 if (DELittle != PELittle) {
140 inline uint8_t
low()
const
145 inline const uint8_t*
data()
const
175inline bool operator==(
const big_uint16_t& a,
const little_uint16_t& b)
177 return std::tie(a.u8[0], a.u8[1]) == std::tie(b.u8[1], b.u8[0]);
179inline bool operator==(
const little_uint16_t& a,
const big_uint16_t& b)
181 return std::tie(a.u8[1], a.u8[0]) == std::tie(b.u8[0], b.u8[1]);
183inline bool operator==(
const little_uint16_t& a,
const little_uint16_t& b)
185 return a.u16 == b.u16;
188inline bool operator!=(
const big_uint16_t& a,
const big_uint16_t& b)
192inline bool operator!=(
const big_uint16_t& a,
const little_uint16_t& b)
196inline bool operator!=(
const little_uint16_t& a,
const big_uint16_t& b)
200inline bool operator!=(
const little_uint16_t& a,
const little_uint16_t& b)
205inline bool operator<(
const big_uint16_t& a,
const big_uint16_t& b)
207 return a.u16 < b.u16;
209inline bool operator<(
const big_uint16_t& a,
const little_uint16_t& b)
211 return std::tie(a.u8[0], a.u8[1]) < std::tie(b.u8[1], b.u8[0]);
213inline bool operator<(
const little_uint16_t& a,
const big_uint16_t& b)
215 return std::tie(a.u8[1], a.u8[0]) < std::tie(b.u8[0], b.u8[1]);
217inline bool operator<(
const little_uint16_t& a,
const little_uint16_t& b)
219 return a.u16 < b.u16;
222inline bool operator>(
const big_uint16_t& a,
const big_uint16_t& b)
226inline bool operator>(
const big_uint16_t& a,
const little_uint16_t& b)
230inline bool operator>(
const little_uint16_t& a,
const big_uint16_t& b)
234inline bool operator>(
const little_uint16_t& a,
const little_uint16_t& b)
239inline bool operator<=(
const big_uint16_t& a,
const big_uint16_t& b)
243inline bool operator<=(
const big_uint16_t& a,
const little_uint16_t& b)
247inline bool operator<=(
const little_uint16_t& a,
const big_uint16_t& b)
251inline bool operator<=(
const little_uint16_t& a,
const little_uint16_t& b)
256inline bool operator>=(
const big_uint16_t& a,
const big_uint16_t& b)
260inline bool operator>=(
const big_uint16_t& a,
const little_uint16_t& b)
264inline bool operator>=(
const little_uint16_t& a,
const big_uint16_t& b)
268inline bool operator>=(
const little_uint16_t& a,
const little_uint16_t& b)
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