diff --git a/src/Utils/Utils/Endianness.cpp b/src/Utils/Utils/Endianness.cpp deleted file mode 100644 index 995e3203..00000000 --- a/src/Utils/Utils/Endianness.cpp +++ /dev/null @@ -1,204 +0,0 @@ -#include "Endianness.h" - -#if defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER) - -namespace endianness -{ - constexpr uint16_t byteswap16u(const uint16_t in) - { - return static_cast((in >> 8) | (in << 8)); - } - - constexpr int16_t byteswap16s(const int16_t in) - { - return static_cast(byteswap16u(static_cast(in))); - } - - constexpr uint32_t byteswap32u(const uint32_t in) - { - return static_cast((in >> 24) | ((in >> 8) & 0x0000FF00ui32) | ((in << 8) & 0x00FF0000ui32) | (in << 24)); - } - - constexpr int32_t byteswap32s(const int32_t in) - { - return static_cast(byteswap32u(static_cast(in))); - } - - constexpr uint64_t byteswap64u(const uint64_t in) - { - return static_cast((in >> 56) | ((in >> 40) & 0x000000000000FF00ui64) | ((in >> 24) & 0x0000000000FF0000ui64) - | ((in >> 8) & 0x00000000FF000000ui64) | ((in << 8) & 0x000000FF00000000ui64) | ((in << 24) & 0x0000FF0000000000ui64) - | ((in << 40) & 0x00FF000000000000ui64) | (in << 56)); - } - - constexpr int64_t byteswap64s(const int64_t in) - { - return static_cast(byteswap64u(static_cast(in))); - } -} // namespace endianness - -#else - -namespace endianness -{ - constexpr int16_t byteswap16s(const int16_t in) - { - return static_cast(__builtin_bswap16(static_cast(in))); - } - - constexpr uint16_t byteswap16u(const uint16_t in) - { - return __builtin_bswap16(in); - } - - constexpr int32_t byteswap32s(const int32_t in) - { - return static_cast(__builtin_bswap32(static_cast(in))); - } - - constexpr uint32_t byteswap32u(const uint32_t in) - { - return __builtin_bswap32(in); - } - - constexpr int64_t byteswap64s(const int64_t in) - { - return static_cast(__builtin_bswap64(static_cast(in))); - } - - constexpr uint64_t byteswap64u(const uint64_t in) - { - return __builtin_bswap64(in); - } -} // namespace endianness - -#endif - -namespace endianness -{ -#if HOST_ENDIANNESS == LITTLE_ENDIAN_ENDIANNESS - - int16_t ToBigEndian(const int16_t in) - { - return byteswap16s(in); - } - - uint16_t ToBigEndian(const uint16_t in) - { - return byteswap16u(in); - } - - int32_t ToBigEndian(const int32_t in) - { - return byteswap32s(in); - } - - uint32_t ToBigEndian(const uint32_t in) - { - return byteswap32u(in); - } - - int64_t ToBigEndian(const int64_t in) - { - return byteswap64s(in); - } - - uint64_t ToBigEndian(const uint64_t in) - { - return byteswap64u(in); - } - - int16_t FromBigEndian(const int16_t in) - { - return byteswap16s(in); - } - - uint16_t FromBigEndian(const uint16_t in) - { - return byteswap16u(in); - } - - int32_t FromBigEndian(const int32_t in) - { - return byteswap32s(in); - } - - uint32_t FromBigEndian(const uint32_t in) - { - return byteswap32u(in); - } - - int64_t FromBigEndian(const int64_t in) - { - return byteswap64s(in); - } - - uint64_t FromBigEndian(const uint64_t in) - { - return byteswap64u(in); - } - -#else - - int16_t ToLittleEndian(const int16_t in) - { - return byteswap16s(in); - } - - uint16_t ToLittleEndian(const uint16_t in) - { - return byteswap16u(in); - } - - int32_t ToLittleEndian(const int32_t in) - { - return byteswap32s(in); - } - - uint32_t ToLittleEndian(const uint32_t in) - { - return byteswap32u(in); - } - - int64_t ToLittleEndian(const int64_t in) - { - return byteswap64s(in); - } - - uint64_t ToLittleEndian(const uint64_t in) - { - return byteswap64u(in); - } - - int16_t FromLittleEndian(const int16_t in) - { - return byteswap16s(in); - } - - uint16_t FromLittleEndian(const uint16_t in) - { - return byteswap16u(in); - } - - int32_t FromLittleEndian(const int32_t in) - { - return byteswap32s(in); - } - - uint32_t FromLittleEndian(const uint32_t in) - { - return byteswap32u(in); - } - - int64_t FromLittleEndian(const int64_t in) - { - return byteswap64s(in); - } - - uint64_t FromLittleEndian(const uint64_t in) - { - return byteswap64u(in); - } - -#endif -} // namespace endianness diff --git a/src/Utils/Utils/Endianness.h b/src/Utils/Utils/Endianness.h index 0840e4ea..e94da986 100644 --- a/src/Utils/Utils/Endianness.h +++ b/src/Utils/Utils/Endianness.h @@ -1,175 +1,45 @@ #pragma once +#include +#include #include - -#define LITTLE_ENDIAN_ENDIANNESS 1234 -#define BIG_ENDIAN_ENDIANNESS 4321 - -#if defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER) - -// Windows always considered Little Endian -#define HOST_ENDIANNESS LITTLE_ENDIAN_ENDIANNESS - -#else - -#include -#if _BYTE_ORDER == _LITTLE_ENDIAN -#define HOST_ENDIANNESS LITTLE_ENDIAN_ENDIANNESS -#else -#define HOST_ENDIANNESS BIG_ENDIAN_ENDIANNESS -#endif - -#endif +#include namespace endianness { -#if HOST_ENDIANNESS == LITTLE_ENDIAN_ENDIANNESS - constexpr int16_t ToLittleEndian(const int16_t in) + template constexpr T ByteSwap(const T in) { - return in; + using Unsigned_t = std::make_unsigned_t; + return static_cast(std::byteswap(static_cast(in))); } - constexpr uint16_t ToLittleEndian(const uint16_t in) + template constexpr T ToLittleEndian(const T in) { - return in; + static_assert(std::endian::native == std::endian::little || std::endian::native == std::endian::big, "Mixed-endian platforms are not supported"); + + if constexpr (std::endian::native == std::endian::little) + return in; + else + return ByteSwap(in); } - constexpr int32_t ToLittleEndian(const int32_t in) + template constexpr T FromLittleEndian(const T in) { - return in; + return ToLittleEndian(in); } - constexpr uint32_t ToLittleEndian(const uint32_t in) + template constexpr T ToBigEndian(const T in) { - return in; + static_assert(std::endian::native == std::endian::little || std::endian::native == std::endian::big, "Mixed-endian platforms are not supported"); + + if constexpr (std::endian::native == std::endian::big) + return in; + else + return ByteSwap(in); } - constexpr int64_t ToLittleEndian(const int64_t in) + template constexpr T FromBigEndian(const T in) { - return in; + return ToBigEndian(in); } - - constexpr uint64_t ToLittleEndian(const uint64_t in) - { - return in; - } - - constexpr int16_t FromLittleEndian(const int16_t in) - { - return in; - } - - constexpr uint16_t FromLittleEndian(const uint16_t in) - { - return in; - } - - constexpr int32_t FromLittleEndian(const int32_t in) - { - return in; - } - - constexpr uint32_t FromLittleEndian(const uint32_t in) - { - return in; - } - - constexpr int64_t FromLittleEndian(const int64_t in) - { - return in; - } - - constexpr uint64_t FromLittleEndian(const uint64_t in) - { - return in; - } -#else - int16_t ToLittleEndian(int16_t in); - uint16_t ToLittleEndian(uint16_t in); - int32_t ToLittleEndian(int32_t in); - uint32_t ToLittleEndian(uint32_t in); - int64_t ToLittleEndian(int64_t in); - uint64_t ToLittleEndian(uint64_t in); - int16_t FromLittleEndian(int16_t in); - uint16_t FromLittleEndian(uint16_t in); - int32_t FromLittleEndian(int32_t in); - uint32_t FromLittleEndian(uint32_t in); - int64_t FromLittleEndian(int64_t in); - uint64_t FromLittleEndian(uint64_t in); -#endif - -#if HOST_ENDIANNESS == BIG_ENDIAN_ENDIANNESS - constexpr int16_t ToBigEndian(const int16_t in) - { - return in; - } - - constexpr uint16_t ToBigEndian(const uint16_t in) - { - return in; - } - - constexpr int32_t ToBigEndian(const int32_t in) - { - return in; - } - - constexpr uint32_t ToBigEndian(const uint32_t in) - { - return in; - } - - constexpr int64_t ToBigEndian(const int64_t in) - { - return in; - } - - constexpr uint64_t ToBigEndian(const uint64_t in) - { - return in; - } - - constexpr int16_t FromBigEndian(const int16_t in) - { - return in; - } - - constexpr uint16_t FromBigEndian(const uint16_t in) - { - return in; - } - - constexpr int32_t FromBigEndian(const int32_t in) - { - return in; - } - - constexpr uint32_t FromBigEndian(const uint32_t in) - { - return in; - } - - constexpr int64_t FromBigEndian(const int64_t in) - { - return in; - } - - constexpr uint64_t FromBigEndian(const uint64_t in) - { - return in; - } -#else - int16_t ToBigEndian(int16_t in); - uint16_t ToBigEndian(uint16_t in); - int32_t ToBigEndian(int32_t in); - uint32_t ToBigEndian(uint32_t in); - int64_t ToBigEndian(int64_t in); - uint64_t ToBigEndian(uint64_t in); - int16_t FromBigEndian(int16_t in); - uint16_t FromBigEndian(uint16_t in); - int32_t FromBigEndian(int32_t in); - uint32_t FromBigEndian(uint32_t in); - int64_t FromBigEndian(int64_t in); - uint64_t FromBigEndian(uint64_t in); -#endif } // namespace endianness