14namespace rtype::protocol {
26template <std::
unsigned_
integral T>
constexpr T byteswap(T value) {
27 if constexpr (
sizeof(T) == 1) {
29 }
else if constexpr (
sizeof(T) == 2) {
30 return __builtin_bswap16(value);
31 }
else if constexpr (
sizeof(T) == 4) {
32 return __builtin_bswap32(value);
34 return __builtin_bswap64(value);
38template <std::
unsigned_
integral T>
constexpr T hostToBig(T value) {
39 if constexpr (std::endian::native == std::endian::little)
40 return byteswap(value);
56template <std::
unsigned_
integral T>
struct BigEndian {
57 std::array<std::uint8_t,
sizeof(T)>
bytes{};
69 :
bytes(std::bit_cast<std::array<std::uint8_t, sizeof(T)>>(
70 detail::hostToBig(value))) {}
76 constexpr T
get()
const {
return detail::hostToBig(std::bit_cast<T>(
bytes)); }
81 constexpr operator T()
const {
return get(); }
Unsigned integer stored as big-endian bytes, with an alignment of 1.
Definition BigEndian.hpp:56
constexpr T get() const
Returns the value in host byte order.
Definition BigEndian.hpp:76
constexpr BigEndian(T value)
Stores a host value in big-endian order.
Definition BigEndian.hpp:68
std::array< std::uint8_t, sizeof(T)> bytes
Value in big-endian order.
Definition BigEndian.hpp:57
constexpr BigEndian()=default
Creates a zero value.