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-2013, martin isenburg, rapidlasso - 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     10 January 2011 -- licensing change for LGPL release and liblas integration
28     13 July 2005 -- created after returning with many mosquito bites from OBX
29 
30 ===============================================================================
31 */
32 #ifndef MYDEFS_HPP
33 #define MYDEFS_HPP
34 
35 typedef char               CHAR;
36 
37 typedef int                I32;
38 typedef short              I16;
39 typedef char               I8;
40 
41 typedef unsigned int       U32;
42 typedef unsigned short     U16;
43 typedef unsigned char      U8;
44 
45 #if defined(_WIN32) && ! defined (__MINGW32__) // 64 byte integer under Windows
46 typedef unsigned __int64   U64;
47 typedef __int64            I64;
48 #else                                          // 64 byte integer elsewhere ...
49 typedef unsigned long long U64;
50 typedef long long          I64;
51 #endif
52 
53 typedef float              F32;
54 typedef double             F64;
55 
56 #if defined(_MSC_VER) || defined (__MINGW32__)
57 typedef int                BOOL;
58 #else
59 typedef bool               BOOL;
60 #endif
61 
62 typedef union U32I32F32 { U32 u32; I32 i32; F32 f32; } U32I32F32;
63 typedef union U64I64F64 { U64 u64; I64 i64; F64 f64; } U64I64F64;
64 
65 #define F32_MAX            +2.0e+37f
66 #define F32_MIN            -2.0e+37f
67 
68 #define F64_MAX            +2.0e+307
69 #define F64_MIN            -2.0e+307
70 
71 #define U8_MIN             ((U8)0x0)  // 0
72 #define U8_MAX             ((U8)0xFF) // 255
73 #define U8_MAX_PLUS_ONE    0x0100     // 256
74 
75 #define U16_MIN            ((U16)0x0)    // 0
76 #define U16_MAX            ((U16)0xFFFF) // 65535
77 #define U16_MAX_PLUS_ONE   0x00010000    // 65536
78 
79 #define U32_MIN            ((U32)0x0)            // 0
80 #define U32_MAX            ((U32)0xFFFFFFFF)     // 4294967295
81 #if defined(WIN32)            // 64 byte unsigned int constant under Windows
82 #define U32_MAX_PLUS_ONE   0x0000000100000000    // 4294967296
83 #else                         // 64 byte unsigned int constant elsewhere ...
84 #define U32_MAX_PLUS_ONE   0x0000000100000000ull // 4294967296
85 #endif
86 
87 #define I8_MIN             ((I8)0x80) // -128
88 #define I8_MAX             ((I8)0x7F) // 127
89 
90 #define I16_MIN            ((I16)0x8000) // -32768
91 #define I16_MAX            ((I16)0x7FFF) // 32767
92 
93 #define I32_MIN            ((I32)0x80000000) // -2147483648
94 #define I32_MAX            ((I32)0x7FFFFFFF) //  2147483647
95 
96 #define I64_MIN            ((I64)0x8000000000000000)
97 #define I64_MAX            ((I64)0x7FFFFFFFFFFFFFFF)
98 
99 /**
100 #define U8_FOLD(n)      (((n) < U8_MIN) ? (n+U8_MAX_PLUS_ONE) : (((n) > U8_MAX) ? (n-U8_MAX_PLUS_ONE) : (n)))
101 **/
102 
U8_FOLD(int i)103 inline uint8_t U8_FOLD(int i)
104 {
105     return uint8_t(i);
106 }
107 
u8_fold(int i)108 inline uint8_t u8_fold(int i)
109 {
110     return uint8_t(i);
111 }
112 
113 #define I8_CLAMP(n)     (((n) <= I8_MIN) ? I8_MIN : (((n) >= I8_MAX) ? I8_MAX : ((I8)(n))))
114 #define U8_CLAMP(n)     (((n) <= U8_MIN) ? U8_MIN : (((n) >= U8_MAX) ? U8_MAX : ((U8)(n))))
115 
116 #define I16_CLAMP(n)    (((n) <= I16_MIN) ? I16_MIN : (((n) >= I16_MAX) ? I16_MAX : ((I16)(n))))
117 #define U16_CLAMP(n)    (((n) <= U16_MIN) ? U16_MIN : (((n) >= U16_MAX) ? U16_MAX : ((U16)(n))))
118 
119 #define I32_CLAMP(n)    (((n) <= I32_MIN) ? I32_MIN : (((n) >= I32_MAX) ? I32_MAX : ((I32)(n))))
120 #define U32_CLAMP(n)    (((n) <= U32_MIN) ? U32_MIN : (((n) >= U32_MAX) ? U32_MAX : ((U32)(n))))
121 
122 #define I8_QUANTIZE(n) (((n) >= 0) ? (I8)((n)+0.5f) : (I8)((n)-0.5f))
123 #define U8_QUANTIZE(n) (((n) >= 0) ? (U8)((n)+0.5f) : (U8)(0))
124 
125 #define I16_QUANTIZE(n) (((n) >= 0) ? (I16)((n)+0.5f) : (I16)((n)-0.5f))
126 #define U16_QUANTIZE(n) (((n) >= 0) ? (U16)((n)+0.5f) : (U16)(0))
127 
128 #define I32_QUANTIZE(n) (((n) >= 0) ? (I32)((n)+0.5f) : (I32)((n)-0.5f))
129 #define U32_QUANTIZE(n) (((n) >= 0) ? (U32)((n)+0.5f) : (U32)(0))
130 
131 #define I64_QUANTIZE(n) (((n) >= 0) ? (I64)((n)+0.5f) : (I64)((n)-0.5f))
132 #define U64_QUANTIZE(n) (((n) >= 0) ? (U64)((n)+0.5f) : (U64)(0))
133 
134 #define I16_FLOOR(n) ((((I16)(n)) > (n)) ? (((I16)(n))-1) : ((I16)(n)))
135 #define I32_FLOOR(n) ((((I32)(n)) > (n)) ? (((I32)(n))-1) : ((I32)(n)))
136 #define I64_FLOOR(n) ((((I64)(n)) > (n)) ? (((I64)(n))-1) : ((I64)(n)))
137 
138 #define I16_CEIL(n) ((((I16)(n)) < (n)) ? (((I16)(n))+1) : ((I16)(n)))
139 #define I32_CEIL(n) ((((I32)(n)) < (n)) ? (((I32)(n))+1) : ((I32)(n)))
140 #define I64_CEIL(n) ((((I64)(n)) < (n)) ? (((I64)(n))+1) : ((I64)(n)))
141 
142 #define I8_FITS_IN_RANGE(n) (((n) >= I8_MIN) && ((n) <= I8_MAX) ? TRUE : FALSE)
143 #define U8_FITS_IN_RANGE(n) (((n) >= U8_MIN) && ((n) <= U8_MAX) ? TRUE : FALSE)
144 #define I16_FITS_IN_RANGE(n) (((n) >= I16_MIN) && ((n) <= I16_MAX) ? TRUE : FALSE)
145 #define U16_FITS_IN_RANGE(n) (((n) >= U16_MIN) && ((n) <= U16_MAX) ? TRUE : FALSE)
146 
147 #define F32_IS_FINITE(n) ((F32_MIN < (n)) && ((n) < F32_MAX))
148 #define F64_IS_FINITE(n) ((F64_MIN < (n)) && ((n) < F64_MAX))
149 
150 #define U32_ZERO_BIT_0(n) (((n)&(U32)0xFFFFFFFE))
151 
152 #ifndef FALSE
153 #define FALSE   0
154 #endif
155 
156 #ifndef TRUE
157 #define TRUE    1
158 #endif
159 
160 #ifndef NULL
161 #define NULL    0
162 #endif
163 
164 #define ENDIANSWAP16(n) \
165 	( ((((U16) n) << 8) & 0xFF00) | \
166 	  ((((U16) n) >> 8) & 0x00FF) )
167 
168 #define ENDIANSWAP32(n) \
169 	( ((((U32) n) << 24) & 0xFF000000) |	\
170 	  ((((U32) n) <<  8) & 0x00FF0000) |	\
171 	  ((((U32) n) >>  8) & 0x0000FF00) |	\
172 	  ((((U32) n) >> 24) & 0x000000FF) )
173 
ENDIAN_SWAP_16(U8 * field)174 inline void ENDIAN_SWAP_16(U8* field)
175 {
176   U8 help = field[0];
177   field[0] = field[1];
178   field[1] = help;
179 }
180 
ENDIAN_SWAP_32(U8 * field)181 inline void ENDIAN_SWAP_32(U8* field)
182 {
183   U8 help;
184   help = field[0];
185   field[0] = field[3];
186   field[3] = help;
187   help = field[1];
188   field[1] = field[2];
189   field[2] = help;
190 }
191 
ENDIAN_SWAP_64(U8 * field)192 inline void ENDIAN_SWAP_64(U8* field)
193 {
194   U8 help;
195   help = field[0];
196   field[0] = field[7];
197   field[7] = help;
198   help = field[1];
199   field[1] = field[6];
200   field[6] = help;
201   help = field[2];
202   field[2] = field[5];
203   field[5] = help;
204   help = field[3];
205   field[3] = field[4];
206   field[4] = help;
207 }
208 
ENDIAN_SWAP_16(const U8 * from,U8 * to)209 inline void ENDIAN_SWAP_16(const U8* from, U8* to)
210 {
211   to[0] = from[1];
212   to[1] = from[0];
213 }
214 
ENDIAN_SWAP_32(const U8 * from,U8 * to)215 inline void ENDIAN_SWAP_32(const U8* from, U8* to)
216 {
217   to[0] = from[3];
218   to[1] = from[2];
219   to[2] = from[1];
220   to[3] = from[0];
221 }
222 
ENDIAN_SWAP_64(const U8 * from,U8 * to)223 inline void ENDIAN_SWAP_64(const U8* from, U8* to)
224 {
225   to[0] = from[7];
226   to[1] = from[6];
227   to[2] = from[5];
228   to[3] = from[4];
229   to[4] = from[3];
230   to[5] = from[2];
231   to[6] = from[1];
232   to[7] = from[0];
233 }
234 
235 
236 // Some constants
237 /* this header byte needs to change in case incompatible change happen */
238 #define AC_HEADER_BYTE 2
239 #define AC_BUFFER_SIZE 1024
240 
241 const U32 AC__MinLength = 0x01000000U;   // threshold for renormalization
242 const U32 AC__MaxLength = 0xFFFFFFFFU;      // maximum AC interval length
243 
244                                            // Maximum values for binary models
245 const U32 BM__LengthShift = 13;     // length bits discarded before mult.
246 const U32 BM__MaxCount    = 1 << BM__LengthShift;  // for adaptive models
247 
248                                           // Maximum values for general models
249 const U32 DM__LengthShift = 15;     // length bits discarded before mult.
250 const U32 DM__MaxCount    = 1 << DM__LengthShift;  // for adaptive models
251 
252 #endif
253