#pragma once #include #ifdef __clang__ #define _byte_swap16(value) __builtin_bswap16(static_cast(value)) #define _byte_swap32(value) __builtin_bswap32(static_cast(value)) #define _byte_swap64(value) __builtin_bswap64(static_cast(value)) #elif defined(_MSC_VER) #define _byte_swap16(value) _byteswap_ushort(static_cast(value)) #define _byte_swap32(value) _byteswap_ulong(static_cast(value)) #define _byte_swap64(value) _byteswap_uint64(static_cast(value)) #endif template T ByteSwap(T value) { if constexpr (sizeof(T) == 1) return value; if constexpr (sizeof(T) == 2) return static_cast(_byte_swap16(value)); if constexpr (sizeof(T) == 4) return static_cast(_byte_swap32(value)); if constexpr (sizeof(T) == 8) return static_cast(_byte_swap64(value)); assert(false && "Unexpected byte size."); } template void ByteSwapInplace(T& value) { value = ByteSwap(value); }