XenonRecomp/XenonUtils/byteswap.h
2025-03-05 09:10:24 +02:00

34 lines
1.1 KiB
C++

#pragma once
#include <cassert>
// https://github.com/hedge-dev/XenonRecomp/pull/35
#ifdef __clang__
#define _byte_swap16(value) __builtin_bswap16(static_cast<uint16_t>(value))
#define _byte_swap32(value) __builtin_bswap32(static_cast<uint32_t>(value))
#define _byte_swap64(value) __builtin_bswap64(static_cast<uint64_t>(value))
#elif defined(_MSC_VER)
#define _byte_swap16(value) _byteswap_ushort(static_cast<uint16_t>(value))
#define _byte_swap32(value) _byteswap_ulong(static_cast<uint32_t>(value))
#define _byte_swap64(value) _byteswap_uint64(static_cast<uint64_t>(value))
#endif
template<typename T> T ByteSwap(T value)
{
if constexpr (sizeof(T) == 1)
return value;
if constexpr (sizeof(T) == 2)
return static_cast<T>(_byte_swap16(value));
if constexpr (sizeof(T) == 4)
return static_cast<T>(_byte_swap32(value));
if constexpr (sizeof(T) == 8)
return static_cast<T>(_byte_swap64(value));
assert(false && "Unexpected byte size.");
}
template<typename T> void ByteSwapInplace(T& value)
{
value = ByteSwap(value);
}