LMMS
Loading...
Searching...
No Matches
ByteOrder.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the Water library.
5 Copyright (c) 2016 ROLI Ltd.
6 Copyright (C) 2017-2022 Filipe Coelho <falktx@falktx.com>
7
8 Permission is granted to use this software under the terms of the ISC license
9 http://www.isc.org/downloads/software-support-policy/isc-license/
10
11 Permission to use, copy, modify, and/or distribute this software for any
12 purpose with or without fee is hereby granted, provided that the above
13 copyright notice and this permission notice appear in all copies.
14
15 THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD
16 TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17 FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
18 OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
19 USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
20 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
21 OF THIS SOFTWARE.
22
23 ==============================================================================
24*/
25
26#ifndef WATER_BYTEORDER_H_INCLUDED
27#define WATER_BYTEORDER_H_INCLUDED
28
29#include "../water.h"
30
31#if defined(CARLA_OS_BSD)
32# include <sys/endian.h>
33#elif defined(CARLA_OS_LINUX)
34# include <byteswap.h>
35#elif defined(CARLA_OS_MAC)
36# include <libkern/OSByteOrder.h>
37#endif
38
39namespace water {
40
41//==============================================================================
46{
47public:
48 //==============================================================================
50 static uint16 swap (uint16 value) noexcept;
51
53 static uint32 swap (uint32 value) noexcept;
54
56 static uint64 swap (uint64 value) noexcept;
57
58 //==============================================================================
60 static uint16 swapIfBigEndian (uint16 value) noexcept;
61
63 static uint32 swapIfBigEndian (uint32 value) noexcept;
64
66 static uint64 swapIfBigEndian (uint64 value) noexcept;
67
69 static int16 swapIfBigEndian (int16 value) noexcept;
70
72 static int32 swapIfBigEndian (int32 value) noexcept;
73
75 static int64 swapIfBigEndian (int64 value) noexcept;
76
78 static float swapIfBigEndian (float value) noexcept;
79
81 static double swapIfBigEndian (double value) noexcept;
82
84 static uint16 swapIfLittleEndian (uint16 value) noexcept;
85
87 static uint32 swapIfLittleEndian (uint32 value) noexcept;
88
90 static uint64 swapIfLittleEndian (uint64 value) noexcept;
91
93 static int16 swapIfLittleEndian (int16 value) noexcept;
94
96 static int32 swapIfLittleEndian (int32 value) noexcept;
97
99 static int64 swapIfLittleEndian (int64 value) noexcept;
100
102 static float swapIfLittleEndian (float value) noexcept;
103
105 static double swapIfLittleEndian (double value) noexcept;
106
107 //==============================================================================
109 static uint32 littleEndianInt (const void* bytes) noexcept;
110
112 static uint64 littleEndianInt64 (const void* bytes) noexcept;
113
115 static uint16 littleEndianShort (const void* bytes) noexcept;
116
118 static uint32 bigEndianInt (const void* bytes) noexcept;
119
121 static uint64 bigEndianInt64 (const void* bytes) noexcept;
122
124 static uint16 bigEndianShort (const void* bytes) noexcept;
125
126 //==============================================================================
128 static int littleEndian24Bit (const void* bytes) noexcept;
129
131 static int bigEndian24Bit (const void* bytes) noexcept;
132
134 static void littleEndian24BitToChars (int value, void* destBytes) noexcept;
135
137 static void bigEndian24BitToChars (int value, void* destBytes) noexcept;
138
139 //==============================================================================
141 static bool isBigEndian() noexcept;
142
143private:
145
147};
148
149
150//==============================================================================
152{
153 #if defined(CARLA_OS_BSD)
154 return bswap16 (n);
155 #elif defined(CARLA_OS_LINUX)
156 return bswap_16 (n);
157 #else
158 return static_cast<uint16> ((n << 8) | (n >> 8));
159 #endif
160}
161
163{
164 #if defined(CARLA_OS_BSD)
165 return bswap32 (n);
166 #elif defined(CARLA_OS_LINUX)
167 return bswap_32 (n);
168 #elif defined(CARLA_OS_MAC)
169 return OSSwapInt32 (n);
170 #elif defined(__i386__) || defined(__x86_64__)
171 asm("bswap %%eax" : "=a"(n) : "a"(n));
172 return n;
173 #else
174 return (n << 24) | (n >> 24) | ((n & 0xff00) << 8) | ((n & 0xff0000) >> 8);
175 #endif
176}
177
179{
180 #if defined(CARLA_OS_BSD)
181 return bswap64 (value);
182 #elif defined(CARLA_OS_LINUX)
183 return bswap_64 (value);
184 #elif defined(CARLA_OS_MAC)
185 return OSSwapInt64 (value);
186 #else
187 return (((uint64) swap ((uint32) value)) << 32) | swap ((uint32) (value >> 32));
188 #endif
189}
190
191#if defined(__BIG_ENDIAN__) || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
192 inline uint16 ByteOrder::swapIfBigEndian (const uint16 v) noexcept { return swap (v); }
193 inline uint32 ByteOrder::swapIfBigEndian (const uint32 v) noexcept { return swap (v); }
194 inline uint64 ByteOrder::swapIfBigEndian (const uint64 v) noexcept { return swap (v); }
195 inline int16 ByteOrder::swapIfBigEndian (const int16 v) noexcept { return static_cast<int16> (swap (static_cast<uint16> (v))); }
196 inline int32 ByteOrder::swapIfBigEndian (const int32 v) noexcept { return static_cast<int16> (swap (static_cast<uint16> (v))); }
197 inline int64 ByteOrder::swapIfBigEndian (const int64 v) noexcept { return static_cast<int16> (swap (static_cast<uint16> (v))); }
198 inline float ByteOrder::swapIfBigEndian (const float v) noexcept { union { uint32 asUInt; float asFloat; } n; n.asFloat = v; n.asUInt = ByteOrder::swap (n.asUInt); return n.asFloat; }
199 inline double ByteOrder::swapIfBigEndian (const double v) noexcept { union { uint64 asUInt; double asFloat; } n; n.asFloat = v; n.asUInt = ByteOrder::swap (n.asUInt); return n.asFloat; }
200
201 inline uint16 ByteOrder::swapIfLittleEndian (const uint16 v) noexcept { return v; }
202 inline uint32 ByteOrder::swapIfLittleEndian (const uint32 v) noexcept { return v; }
203 inline uint64 ByteOrder::swapIfLittleEndian (const uint64 v) noexcept { return v; }
204 inline int16 ByteOrder::swapIfLittleEndian (const int16 v) noexcept { return v; }
205 inline int32 ByteOrder::swapIfLittleEndian (const int32 v) noexcept { return v; }
206 inline int64 ByteOrder::swapIfLittleEndian (const int64 v) noexcept { return v; }
207 inline float ByteOrder::swapIfLittleEndian (const float v) noexcept { return v; }
208 inline double ByteOrder::swapIfLittleEndian (const double v) noexcept { return v; }
209
210 inline uint32 ByteOrder::littleEndianInt (const void* const bytes) noexcept { return swap (*static_cast<const uint32*> (bytes)); }
211 inline uint64 ByteOrder::littleEndianInt64 (const void* const bytes) noexcept { return swap (*static_cast<const uint64*> (bytes)); }
212 inline uint16 ByteOrder::littleEndianShort (const void* const bytes) noexcept { return swap (*static_cast<const uint16*> (bytes)); }
213 inline uint32 ByteOrder::bigEndianInt (const void* const bytes) noexcept { return *static_cast<const uint32*> (bytes); }
214 inline uint64 ByteOrder::bigEndianInt64 (const void* const bytes) noexcept { return *static_cast<const uint64*> (bytes); }
215 inline uint16 ByteOrder::bigEndianShort (const void* const bytes) noexcept { return *static_cast<const uint16*> (bytes); }
216 inline bool ByteOrder::isBigEndian() noexcept { return true; }
217#else
218 inline uint16 ByteOrder::swapIfBigEndian (const uint16 v) noexcept { return v; }
219 inline uint32 ByteOrder::swapIfBigEndian (const uint32 v) noexcept { return v; }
220 inline uint64 ByteOrder::swapIfBigEndian (const uint64 v) noexcept { return v; }
221 inline int16 ByteOrder::swapIfBigEndian (const int16 v) noexcept { return v; }
222 inline int32 ByteOrder::swapIfBigEndian (const int32 v) noexcept { return v; }
223 inline int64 ByteOrder::swapIfBigEndian (const int64 v) noexcept { return v; }
224 inline float ByteOrder::swapIfBigEndian (const float v) noexcept { return v; }
225 inline double ByteOrder::swapIfBigEndian (const double v) noexcept { return v; }
226
227 inline uint16 ByteOrder::swapIfLittleEndian (const uint16 v) noexcept { return swap (v); }
228 inline uint32 ByteOrder::swapIfLittleEndian (const uint32 v) noexcept { return swap (v); }
229 inline uint64 ByteOrder::swapIfLittleEndian (const uint64 v) noexcept { return swap (v); }
230 inline int16 ByteOrder::swapIfLittleEndian (const int16 v) noexcept { return static_cast<int16> (swap (static_cast<uint16> (v))); }
231 inline int32 ByteOrder::swapIfLittleEndian (const int32 v) noexcept { return static_cast<int32> (swap (static_cast<uint32> (v))); }
232 inline int64 ByteOrder::swapIfLittleEndian (const int64 v) noexcept { return static_cast<int64> (swap (static_cast<uint64> (v))); }
233 inline float ByteOrder::swapIfLittleEndian (const float v) noexcept { union { uint32 asUInt; float asFloat; } n; n.asFloat = v; n.asUInt = ByteOrder::swap (n.asUInt); return n.asFloat; }
234 inline double ByteOrder::swapIfLittleEndian (const double v) noexcept { union { uint64 asUInt; double asFloat; } n; n.asFloat = v; n.asUInt = ByteOrder::swap (n.asUInt); return n.asFloat; }
235
236 inline uint32 ByteOrder::littleEndianInt (const void* const bytes) noexcept { return *static_cast<const uint32*> (bytes); }
237 inline uint64 ByteOrder::littleEndianInt64 (const void* const bytes) noexcept { return *static_cast<const uint64*> (bytes); }
238 inline uint16 ByteOrder::littleEndianShort (const void* const bytes) noexcept { return *static_cast<const uint16*> (bytes); }
239 inline uint32 ByteOrder::bigEndianInt (const void* const bytes) noexcept { return swap (*static_cast<const uint32*> (bytes)); }
240 inline uint64 ByteOrder::bigEndianInt64 (const void* const bytes) noexcept { return swap (*static_cast<const uint64*> (bytes)); }
241 inline uint16 ByteOrder::bigEndianShort (const void* const bytes) noexcept { return swap (*static_cast<const uint16*> (bytes)); }
242 inline bool ByteOrder::isBigEndian() noexcept { return false; }
243#endif
244
245inline int ByteOrder::littleEndian24Bit (const void* const bytes) noexcept { return (((int) static_cast<const int8*> (bytes)[2]) << 16) | (((int) static_cast<const uint8*> (bytes)[1]) << 8) | ((int) static_cast<const uint8*> (bytes)[0]); }
246inline int ByteOrder::bigEndian24Bit (const void* const bytes) noexcept { return (((int) static_cast<const int8*> (bytes)[0]) << 16) | (((int) static_cast<const uint8*> (bytes)[1]) << 8) | ((int) static_cast<const uint8*> (bytes)[2]); }
247inline void ByteOrder::littleEndian24BitToChars (const int value, void* const 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); }
248inline void ByteOrder::bigEndian24BitToChars (const int value, void* const 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; }
249
250}
251
252#endif // WATER_BYTEORDER_H_INCLUDED
#define CARLA_DECLARE_NON_COPYABLE(ClassName)
Definition CarlaDefines.h:242
#define noexcept
Definition DistrhoDefines.h:72
int64_t int64
Definition basics.h:91
int16_t int16
Definition basics.h:87
int32_t int32
Definition basics.h:89
uint64_t uint64
Definition basics.h:92
uint16_t uint16
Definition basics.h:88
uint32_t uint32
Definition basics.h:90
ByteOrder() WATER_DELETED_FUNCTION
static void littleEndian24BitToChars(int value, void *destBytes) noexcept
Definition ByteOrder.h:247
static uint32 littleEndianInt(const void *bytes) noexcept
Definition ByteOrder.h:236
static uint64 bigEndianInt64(const void *bytes) noexcept
Definition ByteOrder.h:240
static uint64 littleEndianInt64(const void *bytes) noexcept
Definition ByteOrder.h:237
static uint16 swapIfLittleEndian(uint16 value) noexcept
Definition ByteOrder.h:227
static void bigEndian24BitToChars(int value, void *destBytes) noexcept
Definition ByteOrder.h:248
static bool isBigEndian() noexcept
Definition ByteOrder.h:242
static uint16 bigEndianShort(const void *bytes) noexcept
Definition ByteOrder.h:241
ByteOrder() WATER_DELETED_FUNCTION
static uint32 bigEndianInt(const void *bytes) noexcept
Definition ByteOrder.h:239
static uint16 littleEndianShort(const void *bytes) noexcept
Definition ByteOrder.h:238
static uint16 swap(uint16 value) noexcept
Definition ByteOrder.h:151
static int littleEndian24Bit(const void *bytes) noexcept
Definition ByteOrder.h:245
static int bigEndian24Bit(const void *bytes) noexcept
Definition ByteOrder.h:246
static uint16 swapIfBigEndian(uint16 value) noexcept
Definition ByteOrder.h:218
unsigned v[N_MAX]
Definition inflate.c:1584
static PuglViewHint int value
Definition pugl.h:1708
#define WATER_DELETED_FUNCTION
Definition AudioSampleBuffer.h:33
signed short int16
Definition water.h:92
unsigned int uint32
Definition water.h:98
unsigned long long uint64
Definition water.h:102
unsigned short uint16
Definition water.h:94
long long int64
Definition water.h:100
unsigned char uint8
Definition water.h:90
signed int int32
Definition water.h:96
signed char int8
Definition water.h:88
int n
Definition crypt.c:458
typedef int(UZ_EXP MsgFn)()