1#ifndef OE_UTIL_ENDIAN_H
2#define OE_UTIL_ENDIAN_H
11namespace oe::util::endian
16 [[nodiscard]]
constexpr bool isLittleEndianHost() noexcept
18 return std::endian::native == std::endian::little;
24 [[nodiscard]]
constexpr bool isBigEndianHost() noexcept
26 return std::endian::native == std::endian::big;
30 concept NumericType = std::integral<T> || std::floating_point<T>;
35 template <std::
integral T>
36 [[nodiscard]]
constexpr T swapEndianess(
const T& input)
noexcept
38 #if defined(__cpp_lib_byteswap) && __cpp_lib_byteswap >= 202110L
40 return std::byteswap(input);
44 std::span input_bytes = {
reinterpret_cast<const std::byte*
>(&input),
sizeof(T)};
45 std::span result_bytes = {
reinterpret_cast<std::byte*
>(&result),
sizeof(T)};
47 std::ranges::reverse_copy(input_bytes, result_bytes.begin());
56 template <std::
floating_po
int T>
57 [[nodiscard]]
constexpr T swapEndianess(
const T& input)
noexcept
61 std::span input_bytes = {
reinterpret_cast<const std::byte*
>(&input),
sizeof(T)};
62 std::span result_bytes = {
reinterpret_cast<std::byte*
>(&result),
sizeof(T)};
64 std::ranges::reverse_copy(input_bytes, result_bytes.begin());
74 template <NumericType T>
75 [[nodiscard]]
constexpr T convertLittleEndianToHost(
const T& data)
noexcept
77 if (isBigEndianHost())
79 return swapEndianess(data);
90 template <NumericType T>
91 [[nodiscard]]
constexpr T convertBigEndianToHost(
const T& data)
noexcept
93 if (isLittleEndianHost())
95 return swapEndianess(data);
106 template <NumericType T>
107 [[nodiscard]]
constexpr T convertHostToLittleEndian(
const T& data)
noexcept
109 if (isBigEndianHost())
111 return swapEndianess(data);
122 template <NumericType T>
123 [[nodiscard]]
constexpr T convertHostToBigEndian(
const T& data)
noexcept
125 if (isLittleEndianHost())
127 return swapEndianess(data);