37 constexpr static uint16 swap (uint16 value)
noexcept;
40 constexpr static int16 swap (int16 value)
noexcept;
43 static uint32 swap (uint32 value)
noexcept;
46 static int32 swap (int32 value)
noexcept;
49 static uint64 swap (uint64 value)
noexcept;
52 static int64 swap (int64 value)
noexcept;
55 static float swap (
float value)
noexcept;
58 static double swap (
double value)
noexcept;
62 template <
typename Type>
65 #if JUCE_LITTLE_ENDIAN
73 template <
typename Type>
76 #if JUCE_LITTLE_ENDIAN
85 constexpr static uint32 littleEndianInt (
const void* bytes)
noexcept;
88 constexpr static uint64 littleEndianInt64 (
const void* bytes)
noexcept;
91 constexpr static uint16 littleEndianShort (
const void* bytes)
noexcept;
94 constexpr static int littleEndian24Bit (
const void* bytes)
noexcept;
97 static void littleEndian24BitToChars (int32 value,
void* destBytes)
noexcept;
101 constexpr static uint32 bigEndianInt (
const void* bytes)
noexcept;
104 constexpr static uint64 bigEndianInt64 (
const void* bytes)
noexcept;
107 constexpr static uint16 bigEndianShort (
const void* bytes)
noexcept;
110 constexpr static int bigEndian24Bit (
const void* bytes)
noexcept;
113 static void bigEndian24BitToChars (int32 value,
void* destBytes)
noexcept;
117 constexpr static uint16 makeInt (uint8 leastSig, uint8 mostSig)
noexcept;
120 constexpr static uint32 makeInt (uint8 leastSig, uint8 byte1, uint8 byte2, uint8 mostSig)
noexcept;
123 constexpr static uint64 makeInt (uint8 leastSig, uint8 byte1, uint8 byte2, uint8 byte3,
124 uint8 byte4, uint8 byte5, uint8 byte6, uint8 mostSig)
noexcept;
130 #if JUCE_LITTLE_ENDIAN
143constexpr inline uint16
ByteOrder::swap (uint16 v)
noexcept {
return static_cast<uint16
> ((v << 8) | (v >> 8)); }
144constexpr inline int16
ByteOrder::swap (int16 v)
noexcept {
return static_cast<int16
> (swap (
static_cast<uint16
> (v))); }
145inline int32
ByteOrder::swap (int32 v)
noexcept {
return static_cast<int32
> (swap (
static_cast<uint32
> (v))); }
146inline int64
ByteOrder::swap (int64 v)
noexcept {
return static_cast<int64
> (swap (
static_cast<uint64
> (v))); }
147inline float ByteOrder::swap (
float v)
noexcept {
union { uint32 asUInt;
float asFloat; } n; n.asFloat = v; n.asUInt = swap (n.asUInt);
return n.asFloat; }
148inline double ByteOrder::swap (
double v)
noexcept {
union { uint64 asUInt;
double asFloat; } n; n.asFloat = v; n.asUInt = swap (n.asUInt);
return n.asFloat; }
150#if JUCE_MSVC && ! defined (__INTEL_COMPILER)
151 #pragma intrinsic (_byteswap_ulong)
156 #if JUCE_MAC || JUCE_IOS
157 return OSSwapInt32 (n);
158 #elif (JUCE_GCC || JUCE_CLANG) && JUCE_INTEL && ! JUCE_NO_INLINE_ASM
159 asm(
"bswap %%eax" :
"=a"(n) :
"a"(n));
162 return _byteswap_ulong (n);
166 return (n << 24) | (n >> 24) | ((n & 0xff00) << 8) | ((n & 0xff0000) >> 8);
172 #if JUCE_MAC || JUCE_IOS
173 return OSSwapInt64 (value);
175 return _byteswap_uint64 (value);
177 return (((uint64) swap ((uint32) value)) << 32) | swap ((uint32) (value >> 32));
183 return static_cast<uint16
> (
static_cast<uint16
> (b0) | (
static_cast<uint16
> (b1) << 8));
188 return static_cast<uint32
> (b0) | (
static_cast<uint32
> (b1) << 8)
189 | (
static_cast<uint32
> (b2) << 16) | (
static_cast<uint32
> (b3) << 24);
192constexpr inline uint64
ByteOrder::makeInt (uint8 b0, uint8 b1, uint8 b2, uint8 b3, uint8 b4, uint8 b5, uint8 b6, uint8 b7)
noexcept
194 return static_cast<uint64
> (b0) | (
static_cast<uint64
> (b1) << 8) | (
static_cast<uint64
> (b2) << 16) | (
static_cast<uint64
> (b3) << 24)
195 | (
static_cast<uint64
> (b4) << 32) | (
static_cast<uint64
> (b5) << 40) | (
static_cast<uint64
> (b6) << 48) | (
static_cast<uint64
> (b7) << 56);
198constexpr inline uint16
ByteOrder::littleEndianShort (
const void* bytes)
noexcept {
return makeInt (
static_cast<const uint8*
> (bytes)[0],
static_cast<const uint8*
> (bytes)[1]); }
199constexpr inline uint32
ByteOrder::littleEndianInt (
const void* bytes)
noexcept {
return makeInt (
static_cast<const uint8*
> (bytes)[0],
static_cast<const uint8*
> (bytes)[1],
200 static_cast<const uint8*
> (bytes)[2],
static_cast<const uint8*
> (bytes)[3]); }
201constexpr inline uint64
ByteOrder::littleEndianInt64 (
const void* bytes)
noexcept {
return makeInt (
static_cast<const uint8*
> (bytes)[0],
static_cast<const uint8*
> (bytes)[1],
202 static_cast<const uint8*
> (bytes)[2],
static_cast<const uint8*
> (bytes)[3],
203 static_cast<const uint8*
> (bytes)[4],
static_cast<const uint8*
> (bytes)[5],
204 static_cast<const uint8*
> (bytes)[6],
static_cast<const uint8*
> (bytes)[7]); }
206constexpr inline uint16
ByteOrder::bigEndianShort (
const void* bytes)
noexcept {
return makeInt (
static_cast<const uint8*
> (bytes)[1],
static_cast<const uint8*
> (bytes)[0]); }
207constexpr inline uint32
ByteOrder::bigEndianInt (
const void* bytes)
noexcept {
return makeInt (
static_cast<const uint8*
> (bytes)[3],
static_cast<const uint8*
> (bytes)[2],
208 static_cast<const uint8*
> (bytes)[1],
static_cast<const uint8*
> (bytes)[0]); }
209constexpr inline uint64
ByteOrder::bigEndianInt64 (
const void* bytes)
noexcept {
return makeInt (
static_cast<const uint8*
> (bytes)[7],
static_cast<const uint8*
> (bytes)[6],
210 static_cast<const uint8*
> (bytes)[5],
static_cast<const uint8*
> (bytes)[4],
211 static_cast<const uint8*
> (bytes)[3],
static_cast<const uint8*
> (bytes)[2],
212 static_cast<const uint8*
> (bytes)[1],
static_cast<const uint8*
> (bytes)[0]); }
214constexpr inline int32
ByteOrder::littleEndian24Bit (
const void* bytes)
noexcept {
return (int32) ((((uint32)
static_cast<const int8*
> (bytes)[2]) << 16) | (((uint32)
static_cast<const uint8*
> (bytes)[1]) << 8) | ((uint32)
static_cast<const uint8*
> (bytes)[0])); }
215constexpr inline int32
ByteOrder::bigEndian24Bit (
const void* bytes)
noexcept {
return (int32) ((((uint32)
static_cast<const int8*
> (bytes)[0]) << 16) | (((uint32)
static_cast<const uint8*
> (bytes)[1]) << 8) | ((uint32)
static_cast<const uint8*
> (bytes)[2])); }
217inline void ByteOrder::littleEndian24BitToChars (int32 value,
void* destBytes)
noexcept {
static_cast<uint8*
> (destBytes)[0] = (uint8) value;
static_cast<uint8*
> (destBytes)[1] = (uint8) (value >> 8);
static_cast<uint8*
> (destBytes)[2] = (uint8) (value >> 16); }
218inline void ByteOrder::bigEndian24BitToChars (int32 value,
void* destBytes)
noexcept {
static_cast<uint8*
> (destBytes)[0] = (uint8) (value >> 16);
static_cast<uint8*
> (destBytes)[1] = (uint8) (value >> 8);
static_cast<uint8*
> (destBytes)[2] = (uint8) value; }
static constexpr uint64 bigEndianInt64(const void *bytes) noexcept
static constexpr uint32 bigEndianInt(const void *bytes) noexcept
static constexpr uint32 littleEndianInt(const void *bytes) noexcept
static Type swapIfLittleEndian(Type value) noexcept
static void littleEndian24BitToChars(int32 value, void *destBytes) noexcept
static constexpr uint16 bigEndianShort(const void *bytes) noexcept
static constexpr uint16 littleEndianShort(const void *bytes) noexcept
static constexpr uint16 makeInt(uint8 leastSig, uint8 mostSig) noexcept
static constexpr uint16 swap(uint16 value) noexcept
static constexpr uint64 littleEndianInt64(const void *bytes) noexcept
static void bigEndian24BitToChars(int32 value, void *destBytes) noexcept
static constexpr int littleEndian24Bit(const void *bytes) noexcept
static Type swapIfBigEndian(Type value) noexcept
static constexpr bool isBigEndian() noexcept
static constexpr int bigEndian24Bit(const void *bytes) noexcept