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)103inline uint8_t U8_FOLD(int i) 104 { 105 return uint8_t(i); 106 } 107 u8_fold(int i)108inline 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)174inline 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)181inline 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)192inline 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)209inline 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)215inline 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)223inline 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