26#ifndef QB_SYSTEM_ENDIAN_H
27#define QB_SYSTEM_ENDIAN_H
33#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \
34 defined(__ORDER_BIG_ENDIAN__)
35#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
36#define ENDIAN_NATIVE_LITTLE
37#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
38#define ENDIAN_NATIVE_BIG
63#if defined(ENDIAN_NATIVE_LITTLE)
65#elif defined(ENDIAN_NATIVE_BIG)
87#if defined(ENDIAN_NATIVE_LITTLE)
89#elif defined(ENDIAN_NATIVE_BIG)
120 static_assert(std::is_arithmetic<T>::value || std::is_enum<T>::value,
121 "byteswap only supports arithmetic or enum types");
122 static_assert(std::is_trivially_copyable<T>::value,
"T must be trivially copyable");
125 const uint8_t *src =
reinterpret_cast<const uint8_t *
>(&value);
126 uint8_t *dst =
reinterpret_cast<uint8_t *
>(&result);
128 for (
size_t i = 0; i <
sizeof(T); ++i)
129 dst[i] = src[
sizeof(T) - 1 - i];
constexpr bool is_big_endian()
Checks if the system is big-endian.
Definition endian.h:102
constexpr bool is_little_endian()
Checks if the system is little-endian at compile time when possible.
Definition endian.h:86
T to_little_endian(T value)
Converts a value from native endianness to little-endian.
Definition endian.h:169
T from_little_endian(T value)
Converts a value from little-endian to native endianness.
Definition endian.h:182
constexpr order native_order()
Determines the system's native byte order at runtime.
Definition endian.h:62
order
Enumeration of byte order types.
Definition endian.h:47
@ little
Little-endian (least significant byte first)
Definition endian.h:48
@ unknown
Unknown endianness.
Definition endian.h:50
@ big
Big-endian (most significant byte first)
Definition endian.h:49
T from_big_endian(T value)
Converts a value from big-endian to native endianness.
Definition endian.h:156
T byteswap(T value)
Swaps the byte order of a value.
Definition endian.h:119
T to_big_endian(T value)
Converts a value from native endianness to big-endian.
Definition endian.h:143