1 /*
2 ===============================================================================
3 
4   FILE:  mydefs.hpp
5 
6   CONTENTS:
7 
8     Basic data type definitions and operations to be robust across platforms.
9 
10   PROGRAMMERS:
11 
12     martin.isenburg@rapidlasso.com  -  http://rapidlasso.com
13 
14   COPYRIGHT:
15 
16     (c) 2005-2015, martin isenburg, rapidlasso - fast tools to catch reality
17 
18     This is free software; you can redistribute and/or modify it under the
19     terms of the GNU Lesser General Licence as published by the Free Software
20     Foundation. See the COPYING file for more information.
21 
22     This software is distributed WITHOUT ANY WARRANTY and without even the
23     implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
24 
25   CHANGE HISTORY:
26 
27     28 October 2015 -- adding DLL bindings via 'COMPILE_AS_DLL' and 'USE_AS_DLL'
28     10 January 2011 -- licensing change for LGPL release and libLAS integration
29     13 July 2005 -- created after returning with many mosquito bites from OBX
30 
31 ===============================================================================
32 */
33 #ifndef MYDEFS_HPP
34 #define MYDEFS_HPP
35 
36 #ifndef _WIN32
37 #define LASLIB_DLL
38 #else  // _WIN32
39 #ifdef COMPILE_AS_DLL
40 #define LASLIB_DLL __declspec(dllexport)
41 #elif USE_AS_DLL
42 #define LASLIB_DLL __declspec(dllimport)
43 #else
44 #define LASLIB_DLL
45 #endif
46 #endif // _WIN32
47 
48 typedef char               CHAR;
49 
50 typedef int                I32;
51 typedef short              I16;
52 typedef char               I8;
53 
54 typedef unsigned int       U32;
55 typedef unsigned short     U16;
56 typedef unsigned char      U8;
57 
58 #if defined(_WIN32) && ! defined (__MINGW32__) // 64 byte integer under Windows
59 typedef unsigned __int64   U64;
60 typedef __int64            I64;
61 #else                                          // 64 byte integer elsewhere ...
62 typedef unsigned long long U64;
63 typedef long long          I64;
64 #endif
65 
66 typedef float              F32;
67 typedef double             F64;
68 
69 #if defined(_MSC_VER) || defined (__MINGW32__)
70 typedef int                BOOL;
71 #else
72 typedef bool               BOOL;
73 #endif
74 
75 typedef union U32I32F32 { U32 u32; I32 i32; F32 f32; } U32I32F32;
76 typedef union U64I64F64 { U64 u64; I64 i64; F64 f64; } U64I64F64;
77 typedef union I64U32I32F32 { I64 i64; U32 u32[2]; I32 i32[2]; F32 f32[2]; } I64U32I32F32;
78 
79 #define F32_MAX            +2.0e+37f
80 #define F32_MIN            -2.0e+37f
81 
82 #define F64_MAX            +2.0e+307
83 #define F64_MIN            -2.0e+307
84 
85 #define U8_MIN             ((U8)0x0)  // 0
86 #define U8_MAX             ((U8)0xFF) // 255
87 #define U8_MAX_MINUS_ONE   ((U8)0xFE) // 254
88 #define U8_MAX_PLUS_ONE    0x0100     // 256
89 
90 #define U16_MIN            ((U16)0x0)    // 0
91 #define U16_MAX            ((U16)0xFFFF) // 65535
92 #define U16_MAX_MINUS_ONE  ((U16)0xFFFE) // 65534
93 #define U16_MAX_PLUS_ONE   0x00010000    // 65536
94 
95 #define U32_MIN            ((U32)0x0)            // 0
96 #define U32_MAX            ((U32)0xFFFFFFFF)     // 4294967295
97 #define U32_MAX_MINUS_ONE  ((U32)0xFFFFFFFE)     // 4294967294
98 #if defined(WIN32)            // 64 byte unsigned int constant under Windows
99 #define U32_MAX_PLUS_ONE   0x0000000100000000    // 4294967296
100 #else                         // 64 byte unsigned int constant elsewhere ...
101 #define U32_MAX_PLUS_ONE   0x0000000100000000ull // 4294967296
102 #endif
103 
104 #define I8_MIN             ((I8)0x80) // -128
105 #define I8_MAX             ((I8)0x7F) // 127
106 
107 #define I16_MIN            ((I16)0x8000) // -32768
108 #define I16_MAX            ((I16)0x7FFF) // 32767
109 
110 #define I32_MIN            ((I32)0x80000000) // -2147483648
111 #define I32_MAX            ((I32)0x7FFFFFFF) //  2147483647
112 
113 #define I64_MIN            ((I64)0x8000000000000000)
114 #define I64_MAX            ((I64)0x7FFFFFFFFFFFFFFF)
115 
116 #define U8_FOLD(n)      (((n) < U8_MIN) ? (n+U8_MAX_PLUS_ONE) : (((n) > U8_MAX) ? (n-U8_MAX_PLUS_ONE) : (n)))
117 
118 #define I8_CLAMP(n)     (((n) <= I8_MIN) ? I8_MIN : (((n) >= I8_MAX) ? I8_MAX : ((I8)(n))))
119 #define U8_CLAMP(n)     (((n) <= U8_MIN) ? U8_MIN : (((n) >= U8_MAX) ? U8_MAX : ((U8)(n))))
120 
121 #define I16_CLAMP(n)    (((n) <= I16_MIN) ? I16_MIN : (((n) >= I16_MAX) ? I16_MAX : ((I16)(n))))
122 #define U16_CLAMP(n)    (((n) <= U16_MIN) ? U16_MIN : (((n) >= U16_MAX) ? U16_MAX : ((U16)(n))))
123 
124 #define I32_CLAMP(n)    (((n) <= I32_MIN) ? I32_MIN : (((n) >= I32_MAX) ? I32_MAX : ((I32)(n))))
125 #define U32_CLAMP(n)    (((n) <= U32_MIN) ? U32_MIN : (((n) >= U32_MAX) ? U32_MAX : ((U32)(n))))
126 
127 #define I8_QUANTIZE(n) (((n) >= 0) ? (I8)((n)+0.5) : (I8)((n)-0.5))
128 #define U8_QUANTIZE(n) (((n) >= 0) ? (U8)((n)+0.5) : (U8)(0))
129 
130 #define I16_QUANTIZE(n) (((n) >= 0) ? (I16)((n)+0.5) : (I16)((n)-0.5))
131 #define U16_QUANTIZE(n) (((n) >= 0) ? (U16)((n)+0.5) : (U16)(0))
132 
133 #define I32_QUANTIZE(n) (((n) >= 0) ? (I32)((n)+0.5) : (I32)((n)-0.5))
134 #define U32_QUANTIZE(n) (((n) >= 0) ? (U32)((n)+0.5) : (U32)(0))
135 
136 #define I64_QUANTIZE(n) (((n) >= 0) ? (I64)((n)+0.5) : (I64)((n)-0.5))
137 #define U64_QUANTIZE(n) (((n) >= 0) ? (U64)((n)+0.5) : (U64)(0))
138 
139 #define I16_FLOOR(n) ((((I16)(n)) > (n)) ? (((I16)(n))-1) : ((I16)(n)))
140 #define I32_FLOOR(n) ((((I32)(n)) > (n)) ? (((I32)(n))-1) : ((I32)(n)))
141 #define I64_FLOOR(n) ((((I64)(n)) > (n)) ? (((I64)(n))-1) : ((I64)(n)))
142 
143 #define I16_CEIL(n) ((((I16)(n)) < (n)) ? (((I16)(n))+1) : ((I16)(n)))
144 #define I32_CEIL(n) ((((I32)(n)) < (n)) ? (((I32)(n))+1) : ((I32)(n)))
145 #define I64_CEIL(n) ((((I64)(n)) < (n)) ? (((I64)(n))+1) : ((I64)(n)))
146 
147 #define I8_FITS_IN_RANGE(n) (((n) >= I8_MIN) && ((n) <= I8_MAX) ? TRUE : FALSE)
148 #define U8_FITS_IN_RANGE(n) (((n) >= U8_MIN) && ((n) <= U8_MAX) ? TRUE : FALSE)
149 #define I16_FITS_IN_RANGE(n) (((n) >= I16_MIN) && ((n) <= I16_MAX) ? TRUE : FALSE)
150 #define U16_FITS_IN_RANGE(n) (((n) >= U16_MIN) && ((n) <= U16_MAX) ? TRUE : FALSE)
151 #define I32_FITS_IN_RANGE(n) (((n) >= I32_MIN) && ((n) <= I32_MAX) ? TRUE : FALSE)
152 #define U32_FITS_IN_RANGE(n) (((n) >= U32_MIN) && ((n) <= U32_MAX) ? TRUE : FALSE)
153 
154 #define F32_IS_FINITE(n) ((F32_MIN < (n)) && ((n) < F32_MAX))
155 #define F64_IS_FINITE(n) ((F64_MIN < (n)) && ((n) < F64_MAX))
156 
157 #define U32_ZERO_BIT_0(n) (((n)&(U32)0xFFFFFFFE))
158 #define U32_ZERO_BIT_0_1(n) (((n)&(U32)0xFFFFFFFC))
159 
160 #ifndef FALSE
161 #define FALSE   0
162 #endif
163 
164 #ifndef TRUE
165 #define TRUE    1
166 #endif
167 
168 #ifndef NULL
169 #define NULL    0
170 #endif
171 
IS_LITTLE_ENDIAN()172 inline BOOL IS_LITTLE_ENDIAN()
173 {
174   const U32 i = 1;
175   return (*((const U8*)&i) == 1);
176 }
177 
178 #define ENDIANSWAP16(n) \
179 	( ((((U16) n) << 8) & 0xFF00) | \
180 	  ((((U16) n) >> 8) & 0x00FF) )
181 
182 #define ENDIANSWAP32(n) \
183 	( ((((U32) n) << 24) & 0xFF000000) |	\
184 	  ((((U32) n) <<  8) & 0x00FF0000) |	\
185 	  ((((U32) n) >>  8) & 0x0000FF00) |	\
186 	  ((((U32) n) >> 24) & 0x000000FF) )
187 
ENDIAN_SWAP_16(U8 * field)188 inline void ENDIAN_SWAP_16(U8* field)
189 {
190   U8 help = field[0];
191   field[0] = field[1];
192   field[1] = help;
193 }
194 
ENDIAN_SWAP_32(U8 * field)195 inline void ENDIAN_SWAP_32(U8* field)
196 {
197   U8 help;
198   help = field[0];
199   field[0] = field[3];
200   field[3] = help;
201   help = field[1];
202   field[1] = field[2];
203   field[2] = help;
204 }
205 
ENDIAN_SWAP_64(U8 * field)206 inline void ENDIAN_SWAP_64(U8* field)
207 {
208   U8 help;
209   help = field[0];
210   field[0] = field[7];
211   field[7] = help;
212   help = field[1];
213   field[1] = field[6];
214   field[6] = help;
215   help = field[2];
216   field[2] = field[5];
217   field[5] = help;
218   help = field[3];
219   field[3] = field[4];
220   field[4] = help;
221 }
222 
ENDIAN_SWAP_16(const U8 * from,U8 * to)223 inline void ENDIAN_SWAP_16(const U8* from, U8* to)
224 {
225   to[0] = from[1];
226   to[1] = from[0];
227 }
228 
ENDIAN_SWAP_32(const U8 * from,U8 * to)229 inline void ENDIAN_SWAP_32(const U8* from, U8* to)
230 {
231   to[0] = from[3];
232   to[1] = from[2];
233   to[2] = from[1];
234   to[3] = from[0];
235 }
236 
ENDIAN_SWAP_64(const U8 * from,U8 * to)237 inline void ENDIAN_SWAP_64(const U8* from, U8* to)
238 {
239   to[0] = from[7];
240   to[1] = from[6];
241   to[2] = from[5];
242   to[3] = from[4];
243   to[4] = from[3];
244   to[5] = from[2];
245   to[6] = from[1];
246   to[7] = from[0];
247 }
248 
249 #if defined(_MSC_VER)
250 #include <windows.h>
251 wchar_t* UTF8toUTF16(const char* utf8);
252 #endif
253 
254 #endif
255