38template <EndianConvertible T>
40 if constexpr (
sizeof(T) <= 1) {
42 }
else if constexpr (std::is_integral_v<T>) {
43 return std::byteswap(value);
44 }
else if constexpr (std::is_floating_point_v<T>) {
45 if constexpr (
sizeof(T) ==
sizeof(uint16_t)) {
46 return std::bit_cast<T>(std::byteswap(std::bit_cast<uint16_t>(value)));
47 }
else if constexpr (
sizeof(T) ==
sizeof(uint32_t)) {
48 return std::bit_cast<T>(std::byteswap(std::bit_cast<uint32_t>(value)));
49 }
else if constexpr (
sizeof(T) ==
sizeof(uint64_t)) {
50 return std::bit_cast<T>(std::byteswap(std::bit_cast<uint64_t>(value)));
52 static_assert(
sizeof(T) == 0,
53 "Unsupported floating-point size for endian conversion.");
59template <EndianConvertible T>
61 if constexpr (std::endian::native == std::endian::little) {
69template <EndianConvertible T>
71 if constexpr (std::endian::native == std::endian::little) {
79template <EndianConvertible T>
81 if constexpr (std::endian::native == std::endian::big) {
89template <EndianConvertible T>
91 if constexpr (std::endian::native == std::endian::big) {
100template <EndianConvertible T>
101void WriteLittleEndian(T value,
void* output) {
103 std::memcpy(output, &le,
sizeof(le));
108template <EndianConvertible T>
109T ReadLittleEndian(
const void* input) {
111 std::memcpy(&value, input,
sizeof(value));
Concept for values that can be converted to/from another endian format.
Definition endian.h:34
constexpr T ToLittleEndian(T value)
Convert a value to little-endian format.
Definition endian.h:60
constexpr T FromLittleEndian(T value)
Convert a value from little-endian format.
Definition endian.h:70
constexpr T ByteSwap(T value)
Byte-swap a value. For floating-point types, only support 32-bit and 64-bit floats.
Definition endian.h:39
constexpr T ToBigEndian(T value)
Convert a value to big-endian format.
Definition endian.h:80
constexpr T FromBigEndian(T value)
Convert a value from big-endian format.
Definition endian.h:90