/** ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** * Copyright 2014 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ #ifndef XENIA_BASE_BYTE_ORDER_H_ #define XENIA_BASE_BYTE_ORDER_H_ #include #include "xenia/base/platform.h" #if XE_PLATFORM_MAC #include #endif // XE_PLATFORM_MAC namespace xe { #if XE_COMPILER_MSVC #define XENIA_BASE_BYTE_SWAP_16 _byteswap_ushort #define XENIA_BASE_BYTE_SWAP_32 _byteswap_ulong #define XENIA_BASE_BYTE_SWAP_64 _byteswap_uint64 #elif XE_PLATFORM_MAC #define XENIA_BASE_BYTE_SWAP_16 OSSwapInt16 #define XENIA_BASE_BYTE_SWAP_32 OSSwapInt32 #define XENIA_BASE_BYTE_SWAP_64 OSSwapInt64 #else #define XENIA_BASE_BYTE_SWAP_16 __bswap_16 #define XENIA_BASE_BYTE_SWAP_32 __bswap_32 #define XENIA_BASE_BYTE_SWAP_64 __bswap_64 #endif // XE_COMPILER_MSVC inline int8_t byte_swap(int8_t value) { return value; } inline uint8_t byte_swap(uint8_t value) { return value; } inline int16_t byte_swap(int16_t value) { return static_cast( XENIA_BASE_BYTE_SWAP_16(static_cast(value))); } inline uint16_t byte_swap(uint16_t value) { return XENIA_BASE_BYTE_SWAP_16(value); } inline uint16_t byte_swap(wchar_t value) { return static_cast(XENIA_BASE_BYTE_SWAP_16(value)); } inline int32_t byte_swap(int32_t value) { return static_cast( XENIA_BASE_BYTE_SWAP_32(static_cast(value))); } inline uint32_t byte_swap(uint32_t value) { return XENIA_BASE_BYTE_SWAP_32(value); } inline int64_t byte_swap(int64_t value) { return static_cast( XENIA_BASE_BYTE_SWAP_64(static_cast(value))); } inline uint64_t byte_swap(uint64_t value) { return XENIA_BASE_BYTE_SWAP_64(value); } inline float byte_swap(float value) { uint32_t temp = byte_swap(*reinterpret_cast(&value)); return *reinterpret_cast(&temp); } inline double byte_swap(double value) { uint64_t temp = byte_swap(*reinterpret_cast(&value)); return *reinterpret_cast(&temp); } template inline T byte_swap(T value) { if (sizeof(T) == 4) { return static_cast(byte_swap(static_cast(value))); } else { assert_always("not handled"); } } template struct be { be() = default; be(const T &src) : value(xe::byte_swap(src)) {} be(const be &other) { value = other.value; } operator T() const { return xe::byte_swap(value); } be &operator+=(int a) { *this = *this + a; return *this; } be &operator-=(int a) { *this = *this - a; return *this; } be &operator++() { *this += 1; return *this; } // ++a be operator++(int) { *this += 1; return (*this - 1); } // a++ be &operator--() { *this -= 1; return *this; } // --a be operator--(int) { *this -= 1; return (*this + 1); } // a-- T value; }; } // namespace xe #endif // XENIA_BASE_BYTE_ORDER_H_