#pragma once #include // (u)int*_t #if defined(__GLIBC__) # include # if __BYTE_ORDER == __LITTLE_ENDIAN # define OX_BIG_ENDIAN false # define OX_LITTLE_ENDIAN true # elif __BYTE_ORDER == __BIG_ENDIAN # define OX_BIG_ENDIAN true # define OX_LITTLE_ENDIAN false # else # error Whatever your endianness is... Onyx does not like it. # endif #elif defined(_BIG_ENDIAN) # define OX_BIG_ENDIAN true # define OX_LITTLE_ENDIAN false #elif defined(_LITTLE_ENDIAN) # define OX_BIG_ENDIAN false # define OX_LITTLE_ENDIAN true #elif defined(__sparc) || defined(__sparc__) || defined(_POWER) \ || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) \ || defined(_MIPSEB) || defined(_POWER) || defined(__s390__) # define OX_BIG_ENDIAN true # define OX_LITTLE_ENDIAN false #elif defined(__i386__) || defined(__alpha__) || defined(__ia64) \ || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) \ || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) \ || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) \ || defined(_M_X64) # define OX_BIG_ENDIAN false # define OX_LITTLE_ENDIAN true #else # error "Onyx could not detect your machine's endianness." #endif namespace onyx { namespace util { /// \brief Test whether the current machine runs in big-endian mode. /// \note In big-endian mode the most significant byte is stored at /// the lowest address, so the number \c 0x04030201UL is laid out as /// \c 0x04, \c 0x03, \c 0x02, \c 0x01 in memory. constexpr bool IsBigEndian = OX_BIG_ENDIAN; /// \brief Test whether the current machine runs in little-endian mode. /// \note In little-endian mode the most significant byte is stored at /// the highest address, so the number \c 0x04030201UL is laid out as /// \c 0x01, \c 0x02, \c 0x03, \c 0x04 in memory. constexpr bool IsLittleEndian = OX_LITTLE_ENDIAN; /// \brief Does nothing. /// \param x A 1-byte integer value. /// \return The very same value. /// \note Try not to need to do this. inline uint8_t byte_swap(uint8_t x) noexcept {return x;} /// \brief Swaps the integer's bytes. /// \param x A 2-byte integer value. /// \return The byte-swapped value. /// \note Try not to need to do this. inline uint16_t byte_swap(uint16_t x) noexcept {return __builtin_bswap16(x);} /// \brief Swaps the integer's bytes. /// \param x A 4-byte integer value. /// \return The byte-swapped value. /// \note Try not to need to do this. inline uint32_t byte_swap(uint32_t x) noexcept {return __builtin_bswap32(x);} /// \brief Swaps the integer's bytes. /// \param x A 8-byte integer value. /// \return The byte-swapped value. /// \note Try not to need to do this. inline uint64_t byte_swap(uint64_t x) noexcept {return __builtin_bswap64(x);} }} // namespace onyx::util