#pragma once #include #if defined(_MSC_VER) // MSVC #include #define BSWAP16(x) _byteswap_ushort(x) #define BSWAP32(x) _byteswap_ulong(x) #define BSWAP64(x) _byteswap_uint64(x) #elif defined(__GNUC__) || defined(__clang__) // GCC or Clang #define BSWAP16(x) __builtin_bswap16(x) #define BSWAP32(x) __builtin_bswap32(x) #define BSWAP64(x) __builtin_bswap64(x) #else #error "Unsupported compiler" #endif template inline T ByteSwap(T value) { if constexpr (sizeof(T) == 1) return value; else if constexpr (sizeof(T) == 2) return static_cast(BSWAP16(static_cast(value))); else if constexpr (sizeof(T) == 4) return static_cast(BSWAP32(static_cast(value))); else if constexpr (sizeof(T) == 8) return static_cast(BSWAP64(static_cast(value))); assert(false && "Unexpected byte size."); return value; } template inline void ByteSwapInplace(T& value) { value = ByteSwap(value); }