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()172inline 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)188inline 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)195inline 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)206inline 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)223inline 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)229inline 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)237inline 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