diff --git a/XenonUtils/byteswap.h b/XenonUtils/byteswap.h index 33e959f..3b7ebe4 100644 --- a/XenonUtils/byteswap.h +++ b/XenonUtils/byteswap.h @@ -2,17 +2,30 @@ #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(__builtin_bswap16(static_cast(value))); + return static_cast(BSWAP16(static_cast(value))); else if constexpr (sizeof(T) == 4) - return static_cast(__builtin_bswap32(static_cast(value))); + return static_cast(BSWAP32(static_cast(value))); else if constexpr (sizeof(T) == 8) - return static_cast(__builtin_bswap64(static_cast(value))); + return static_cast(BSWAP64(static_cast(value))); assert(false && "Unexpected byte size."); return value;