#pragma once #include #include #include namespace Feather { enum class Endian { Little, Big }; // TODO: Make this constexpr inline uint8_t ReverseBytes(uint8_t n) { return n; } #ifdef __GNUC__ inline uint16_t ReverseBytes(uint16_t n) { return __builtin_bswap16(n); } inline uint32_t ReverseBytes(uint32_t n) { return __builtin_bswap32(n); } inline uint64_t ReverseBytes(uint64_t n) { return __builtin_bswap64(n); } #else inline uint16_t ReverseBytes(uint16_t n) { return _byteswap_ushort(n); } inline uint32_t ReverseBytes(uint32_t n) { return _byteswap_ulong (n); } inline uint64_t ReverseBytes(uint64_t n) { return _byteswap_uint64(n); } #endif inline int8_t ReverseBytes(int8_t n) { return n; } inline int16_t ReverseBytes(int16_t n) { return int16_t(ReverseBytes(uint16_t(n))); } inline int32_t ReverseBytes(int32_t n) { return int32_t(ReverseBytes(uint32_t(n))); } inline int64_t ReverseBytes(int64_t n) { return int64_t(ReverseBytes(uint64_t(n))); } template inline T ReverseBytesBitcast(T n) { static_assert(sizeof(T) == sizeof(J)); return std::bit_cast(ReverseBytes(std::bit_cast(n))); } inline float ReverseBytes(float n) { return ReverseBytesBitcast(n); } inline double ReverseBytes(double n) { return ReverseBytesBitcast(n); } }