NAVTOR SDK  v.3.0
Software Development Kit for fast and efficient development of ECDIS, ECS and generic marine applications
platform.h
Go to the documentation of this file.
1 #ifndef SDK_BASE_PLATFORM_H_
11 #define SDK_BASE_PLATFORM_H_
12 
13 #include <limits>
14 #include <cstdint>
15 #include <cmath>
16 
17 #if (_MSC_VER >= 1600) || defined(__GNUC__)
18 # include <stdint.h> // stdint.h is missing from MS Visual Studio 2003 up to 2008.
19 #endif
20 
21 // Version numbers
22 #define SDK_VERSION_MAJOR ${SDK_VERSION_MAJOR}
23 #define SDK_VERSION_MINOR ${SDK_VERSION_MINOR}
24 #define SDK_VERSION_PATCH ${SDK_VERSION_PATCH}
25 
26 #if !defined(SDK_ARCH_CPU_LITTLE_ENDIAN)
27 # define SDK_ARCH_CPU_LITTLE_ENDIAN 1
28 #endif
29 
30 // Recognized Operating Systems (SDK_OS_x)
31 #if defined(__APPLE__)
32 # include <TargetConditionals.h>
33 # if !defined(SDK_OS_MAC) // MacOS/IOS
34 # define SDK_OS_MAC 1
35 # endif
36 # if defined(TARGET_OS_MACOS) && !defined(SDK_OS_MACOSX) // MacOS
37 # define SDK_OS_MACOSX 1
38 # endif
39 # if defined(TARGET_OS_IOS) && !defined(SDK_OS_IOS) // IOS
40 # define SDK_OS_IOS 1
41 # endif
42 #elif defined(ANDROID) || defined(__ANDROID__) // Android
43 # if !defined(SDK_OS_ANDROID)
44 # define SDK_OS_ANDROID 1
45 # endif
46 #elif defined(__linux__) || defined(__linux) // Linux
47 # if !defined(SDK_OS_LINUX)
48 # define SDK_OS_LINUX 1
49 # endif
50 #elif defined(_WIN32) || defined(__WIN32__) // Windows
51 # if !defined(SDK_OS_WIN)
52 # define SDK_OS_WIN 1
53 # endif
54 #else
55 # error "Error: Unknown or unsupported OS!"
56 #endif
57 
58 // POSIX OS
59 #if defined(SDK_OS_MAC) || defined(SDK_OS_LINUX) || defined(SDK_OS_ANDROID)
60 # if !defined(SDK_OS_POSIX)
61 # define SDK_OS_POSIX 1
62 # endif
63 #endif
64 
65 // Debug / Release modes
66 #if defined(_DEBUG) || defined(DEBUG)
67 # if !defined(SDK_DEBUG)
68 # define SDK_DEBUG
69 # endif
70 #else
71 # if !defined(SDK_NDEBUG)
72 # define SDK_NDEBUG
73 # endif
74 #endif
75 
76 // Recognized compilers (SDK_CC_x)
77 #if defined(__clang__)
78 // CLANG on Windows platform define
79 // _MSC_VER so test it first
80 # if !defined(SDK_CC_CLANG)
81 # define SDK_CC_CLANG
82 # endif
83 #elif defined(_MSC_VER)
84 # if !defined(SDK_CC_MSVC)
85 # define SDK_CC_MSVC
86 # endif
87 #elif defined(__BORLANDC__)
88 # if !defined(SDK_CC_BCC)
89 # define SDK_CC_BCC
90 # endif
91 #elif defined(__GNUC__)
92 # if !defined(SDK_CC_GNU)
93 # define SDK_CC_GNU
94 # define SDK_CC_GCC
95 # endif
96 # if defined(__MINGW32__)
97 # if !defined(SDK_CC_MINGW)
98 # define SDK_CC_MINGW
99 # endif
100 # endif
101 #endif
102 
103 // Recognized architectures (SDK_ARCH_x)
104 #if defined(_WIN64) || defined(__LP64__) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__powerpc64__) || defined(__alpha__) || defined(__ia64__) || defined(__s390__) || defined(__s390x__) || defined(__arm64__) || defined(__aarch64__)
105 # if !defined(SDK_ARCH_64BITS)
106 # define SDK_ARCH_64BITS
107 # endif
108 #else
109 # if !defined(SDK_ARCH_32BITS)
110 # define SDK_ARCH_32BITS
111 # endif
112 #endif
113 
114 #if defined(__i386) || defined(__i386__) || defined(_X86_) || defined(__x86_64) || defined(_M_IX86) || defined(_M_X64)
115 # if !defined(SDK_ARCH_X86)
116 # define SDK_ARCH_X86
117 # endif
118 #elif defined(__arm__) || defined(__thumb__) || defined(__arm64__) || defined(__aarch64__)
119 # if !defined(SDK_ARCH_ARM)
120 # define SDK_ARCH_ARM
121 # endif
122 #else
123 # error "Error: Unsupported architecture!"
124 #endif
125 
126 
127 
130 #if (defined(SDK_ARCH_X86) || defined(SDK_ARCH_ARM)) && defined(SDK_ARCH_32BITS)
131 
132  typedef signed char SDKInt8;
133  typedef unsigned char SDKUInt8;
134  typedef signed short SDKInt16;
135  typedef unsigned short SDKUInt16;
136  typedef signed long SDKInt32;
137  typedef unsigned long SDKUInt32;
138  typedef signed long long SDKInt64;
139  typedef unsigned long long SDKUInt64;
140  typedef SDKInt32 SDKIntptr;
141  typedef SDKUInt32 SDKUIntptr;
142 
143 #elif (defined(SDK_ARCH_X86) || defined(SDK_ARCH_ARM)) && defined(SDK_ARCH_64BITS)
144  typedef signed char SDKInt8;
145  typedef unsigned char SDKUInt8;
146  typedef signed short SDKInt16;
147  typedef unsigned short SDKUInt16;
148  typedef signed int SDKInt32;
149  typedef unsigned int SDKUInt32;
150  typedef int64_t SDKInt64;
151  typedef uint64_t SDKUInt64;
152  typedef SDKInt64 SDKIntptr;
153  typedef SDKUInt64 SDKUIntptr;
154 #else
155  #error "Error: Portable integers were not defined!"
156 #endif
157 
158 // Limits for the portable integer types.
159 // (current definitions are only valid for x86 architectures)
161 static const SDKInt8 SDK_MIN_INT8 = -127 - 1;
163 static const SDKInt8 SDK_MAX_INT8 = 127;
165 static const SDKUInt8 SDK_MAX_UINT8 = 0xFF;
166 
168 static const SDKInt16 SDK_MIN_INT16 = -32767 - 1;
170 static const SDKInt16 SDK_MAX_INT16 = 32767;
172 static const SDKUInt16 SDK_MAX_UINT16 = 0xFFFF;
173 
175 static const SDKInt32 SDK_MIN_INT32 = -2147483647 - 1;
177 static const SDKInt32 SDK_MAX_INT32 = 2147483647;
179 static const SDKUInt32 SDK_MAX_UINT32 = 0xFFFFFFFF;
180 
181 #if defined(SDK_CC_MSVC)
182 static const SDKInt64 SDK_MAX_INT64 = 0x7FFFFFFFFFFFFFFF;
185 static const SDKUInt64 SDK_MAX_UINT64 = 0xFFFFFFFFFFFFFFFF;
186 #else
187 static const SDKInt64 SDK_MAX_INT64 = 0x7FFFFFFFFFFFFFFFLL;
190 static const SDKUInt64 SDK_MAX_UINT64 = 0xFFFFFFFFFFFFFFFFULL;
191 #endif
192 
194 static const SDKInt64 SDK_MIN_INT64 = -SDK_MAX_INT64 - 1;
195 
197 static const float SDK_MAX_FLOAT = 3.402823466e+38F;
199 static const float SDK_MIN_FLOAT = 1.175494351e-38F;
200 
202 static const double SDK_MAX_DOUBLE = 1.7976931348623158e+308;
204 static const double SDK_MIN_DOUBLE = 2.2250738585072014e-308;
206 
207 #if !defined(SDK_DETERMINE_BYTES_ORDER)
208 // Little/Big/PDP endian
209 // Idea taken from
210 // http://stackoverflow.com/questions/2100331/c-macro-definition-to-determine-big-endian-or-little-endian-machine
211 enum
212 {
213  SDK_LITTLE_ENDIAN = 0x04030201UL,
214  SDK_BIG_ENDIAN = 0x01020304UL,
215  SDK_PDP_ENDIAN = 0x02010403UL
216 };
217 
218 static const union
219 {
220  SDKUInt8 bytes[4];
221  SDKUInt32 val;
222 } g_sdk_bytes_order_checker_host = {{ 1, 2, 3, 4 }};
223 
224 // Use given macros as:
225 // if (SDK_LITTLE_ENDIAN == SDK_DETERMINE_ENDIAN)
226 // ...
227 // else if (SDK_BIG_ENDIAN == SDK_DETERMINE_ENDIAN)
228 // ...
229 # define SDK_DETERMINE_BYTES_ORDER (g_sdk_bytes_order_checker_host.val)
230 #endif // !defined(SDK_DETERMINE_BYTES_ORDER)
231 
232 // Returns the number of elements in a statically-allocated array
233 #if !defined(SDK_ARRAY_LENGTH)
234 # define SDK_ARRAY_LENGTH( array ) ( sizeof( array ) / sizeof( array[0] ) )
235 #endif
236 
237 // Suppresses 'unused parameter' warnings
238 #if !defined(SDK_UNUSED)
239 # define SDK_UNUSED( x ) (void)x;
240 #endif
241 
242 // Constant for null pointers
243 #ifndef NULL
244 # define NULL 0
245 #endif
246 
247 #if defined(SDK_OS_WIN)
248 # define SDK_ERRNO ::GetLastError()
249 #elif defined(SDK_OS_POSIX)
250 # define SDK_ERRNO errno
251 #else
252 # define SDK_ERRNO
253 #endif
254 
255 // Inlining macros
256 #if defined(SDK_CC_MSVC)
257 # define SDK_INLINE __inline
258 # define SDK_FORCE_INLINE __forceinline
259 # define SDK_NO_INLINE __declspec(noinline)
260 #elif defined(SDK_CC_BCC)
261 # define SDK_INLINE inline
262 # define SDK_FORCE_INLINE inline
263 # define SDK_NO_INLINE
264 #else // assumes the compiler is GCC-compatible
265 # define SDK_INLINE __inline__
266 # define SDK_FORCE_INLINE __attribute__((always_inline))
267 # define SDK_NO_INLINE __attribute__((noinline))
268 #endif
269 
270 // To make export symbols in a C style
271 #define SDK_EXTERN_C extern "C"
272 #define SDK_EXTERN_C_BEGIN extern "C" {
273 #define SDK_EXTERN_C_END }
274 
275 // File permissions for Android
276 // S_IREAD/S_IWRITE/S_IEXEC are obsolete synonyms provided for BSD compatibility
277 // which does not exist in Android platform
278 // see http://www.gnu.org/software/libc/manual/html_node/Permission-Bits.html
279 #if defined(SDK_OS_ANDROID)
280 # define S_IREAD S_IRUSR
281 # define S_IWRITE S_IWUSR
282 # define S_IEXEC S_IXUSR
283 #endif
284 
285 // Portable shared-library interface attributes
286 #if defined(SDK_CC_MSVC)
287 # define SDK_DLL_LOCAL
288 # define SDK_DLL_EXPORT __declspec(dllexport)
289 # define SDK_DLL_IMPORT __declspec(dllimport)
290 #else
291 # define SDK_DLL_LOCAL __attribute__ ((visibility ("hidden")))
292 # define SDK_DLL_EXPORT __attribute__ ((visibility ("default")))
293 # define SDK_DLL_IMPORT __attribute__ ((visibility ("default")))
294 #endif
295 
296 // In case library is compiled as:
297 // 1) Dynamic/shared library. Library defines SDK_DYNAMIC_LIB and SDK_EXPORT
298 // 2) Static library. Library defines nothing
299 
300 // In case client uses library as:
301 // 1) Via SDK components framework. Client does not defines anything
302 // 2) As static library with direct linking. Client does not defines anything
303 // 3) As dynamic/shared library with direct linking. Client defines SDK_DYNAMIC_LIB
304 #if defined (SDK_DYNAMIC_LIB)
305 # if defined(SDK_EXPORT)
306 # define SDK_EXPORT_API SDK_DLL_EXPORT
307 # else
308 # define SDK_EXPORT_API SDK_DLL_IMPORT
309 # endif
310 #else
311 # define SDK_EXPORT_API
312 #endif
313 
314 // case 1: base_library uses as dynamic/shared library
315 // client does not defines anything
316 // case 2: base_library uses as static library
317 // client defines SDK_STATIC_BASE_LIBRARY
318 #if !defined(SDK_STATIC_BASE_LIBRARY)
319 // Base library as dynamic/shared library
320 # if defined(SDK_BASE_LIBRARY_EXPORT) // SDK_BASE_LIBRARY_EXPORT uses internally only
321 # define SDK_BASE_LIBRARY_EXPORT_API SDK_DLL_EXPORT
322 # else
323 # define SDK_BASE_LIBRARY_EXPORT_API SDK_DLL_IMPORT
324 # endif
325 #else
326 // Base library as static library
327 # define SDK_BASE_LIBRARY_EXPORT_API
328 #endif
329 
330 // data packing
331 // usage:
332 // SDK_PACK(struct myStruct { int a; });
333 // typedef SDK_PACK(struct myStruct { int a; }) pstruct;
334 #if defined(SDK_CC_MSVC)
335 # define SDK_PACK( decl ) __pragma( pack(push, 1) ) decl __pragma( pack(pop) )
336 #elif defined(SDK_CC_BCC)
337 # define SDK_PACK( decl ) decl
338 #else
339 # // NAVICO #if defined(SDK_ARCH_ARM)
340 # if 0
341 # define SDK_PACK( decl ) __packed decl
342 # else
343 # define SDK_PACK( decl ) decl __attribute__((__packed__))
344 # endif
345 #endif
346 
347 #if !defined(SDK_CDECL)
348 # if defined(SDK_CC_MSVC)
349 # define SDK_CDECL __cdecl
350 # elif defined(SDK_CC_BCC)
351 # define SDK_CDECL __cdecl
352 # else
353 # if defined(SDK_CC_GNU) || defined(SDK_CC_GCC) || defined(SDK_CC_CLANG)
354 # define SDK_CDECL //__attribute__((cdecl))
355 # else
356 # define SDK_CDECL
357 # endif
358 # endif
359 #endif
360 
361 // To control calling convention
362 #if !defined(SDK_CALLTYPE)
363 # define SDK_CALLTYPE SDK_CDECL
364 #endif
365 
366 #if !defined(SDK_APICALLTYPE)
367 # define SDK_APICALLTYPE SDK_CALLTYPE
368 #endif
369 
370 #if !defined(SDK_API)
371 # define SDK_API SDKInt32 SDK_APICALLTYPE
372 #endif
373 
374 #if defined(SDK_CC_GCC) || defined(SDK_CC_CLANG)
375 # if !defined(__cdecl)
376 # define __cdecl
377 # endif
378 #endif
379 
381 #if defined(SDK_CC_MSVC)
382 # pragma warning( push )
383 # pragma warning( default : 4005 )
384 # pragma warning( disable : 4100 ) // unreferenced formal parameter
385 #endif
386 
387 #if defined(SDK_CC_BCC)
388 # pragma warn -8098 // Multi-character constant
389 #endif
390 
391 // Annotate a virtual method indicating it must be overriding a virtual
392 // method in the parent class.
393 // Use like:
394 // virtual void foo() OVERRIDE;
395 #if defined(SDK_CC_MSVC)
396 # define OVERRIDE override
397 #elif defined(SDK_CC_CLANG)
398 # define OVERRIDE override
399 #else
400 # define OVERRIDE
401 #endif
402 
403 #if defined(SDK_ARCH_64BITS)
404 typedef SDKInt64 SDKAtomicRefCount;
405 #else
406 typedef SDKInt32 SDKAtomicRefCount;
407 #endif
408 
409 // Makes std:: visible from std::tr1
410 // as tr1 moved to std in clang
411 #if defined(SDK_CC_CLANG)
412 namespace std{
413  namespace tr1{
414  using namespace std;
415  }
416 }
417 #endif
418 
419 // Some useful stuff stolen from BOOST/CONFIG.HPP
420 #if 1
421 # if defined(SDK_CC_MSVC)
422 # if (_MSC_FULL_VER > 100000000)
423 # define SDK_MSVC_FULL_VER _MSC_FULL_VER
424 # else
425 # define SDK_MSVC_FULL_VER (_MSC_FULL_VER * 10)
426 # endif
427 
428 // Attempt to suppress VC6 warnings about the length of decorated names (obsolete):
429 # pragma warning( disable : 4503 ) // warning: decorated name length exceeded
430 
431 // C++ features supported by VC++ 10 (aka 2010)
432 # if (_MSC_VER >= 1600)
433 # define SDK_CXX0X_SYNTAX_SUPPORT 1
434 # define SDK_HAS_CXX0X_AUTO_DECLARATIONS
435 # define SDK_HAS_CXX0X_AUTO_MULTIDECLARATIONS
436 # define SDK_HAS_CXX0X_LAMBDAS
437 # define SDK_HAS_CXX0X_RVALUE_REFS
438 # define SDK_HAS_CXX0X_STATIC_ASSERT
439 # define SDK_HAS_CXX0X_NULLPTR
440 # define SDK_HAS_CXX0X_DECLTYPE
441 # endif // _MSC_VER >= 1600
442 
443 // C++11 features supported by VC++ 12 (aka 2013).
444 # if _MSC_FULL_VER >= 180020827
445 # define SDK_HAS_CXX0X_DEFAULTED_FUNCTIONS
446 # define SDK_HAS_CXX0X_NON_PUBLIC_DEFAULTED_FUNCTIONS
447 # endif
448 # elif defined(SDK_CC_GNU)
449 # define SDK_GNUC_FULL_VER (10000 * __GNUC__ + 100 * __GNUC_MINOR__ + __GNUC_PATCHLEVEL__)
450 # if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L)
451 # define SDK_CXX0X_SYNTAX_SUPPORT 1
452 # endif
453 # if (SDK_GNUC_FULL_VER >= 40300) && defined(SDK_CXX0X_SYNTAX_SUPPORT)
454 # define SDK_HAS_CXX0X_DECLTYPE
455 # define SDK_HAS_CXX0X_RVALUE_REFS
456 # define SDK_HAS_CXX0X_STATIC_ASSERT
457 # define SDK_HAS_CXX0X_VARIADIC_TMPL
458 # endif
459 # if (SDK_GNUC_FULL_VER >= 40400) && defined(SDK_CXX0X_SYNTAX_SUPPORT)
460 # define SDK_HAS_CXX0X_DEFAULTED_FUNCTIONS
461 # endif
462 # if (SDK_GNUC_FULL_VER >= 40500) && defined(SDK_CXX0X_SYNTAX_SUPPORT)
463 # define SDK_HAS_CXX0X_NON_PUBLIC_DEFAULTED_FUNCTIONS
464 # endif
465 # elif defined(SDK_CC_BCC)
466 // Borland C++ Builder 2008 and below:
467 # if (__BORLANDC__ >= 0x599)
468 # pragma defineonoption BOOST_CODEGEAR_0X_SUPPORT -Ax
469 # endif
470 //
471 // C++0x Macros:
472 //
473 # if !defined( BOOST_CODEGEAR_0X_SUPPORT ) || (__BORLANDC__ < 0x610)
474 # define SDK_NO_CXX11_CHAR16_T
475 # define SDK_NO_CXX11_CHAR32_T
476 # define SDK_NO_CXX11_DECLTYPE
477 # define SDK_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
478 # define SDK_NO_CXX11_EXTERN_TEMPLATE
479 # define SDK_NO_CXX11_RVALUE_REFERENCES
480 # define SDK_NO_CXX11_SCOPED_ENUMS
481 # define SDK_NO_CXX11_STATIC_ASSERT
482 # else
483 # define SDK_CXX0X_SYNTAX_SUPPORT 1
484 # define SDK_HAS_CXX0X_ALIGNOF
485 # define SDK_HAS_CXX0X_CHAR16_T
486 # define SDK_HAS_CXX0X_CHAR32_T
487 # define SDK_HAS_CXX0X_DECLTYPE
488 # define SDK_HAS_CXX0X_EXPLICIT_CONVERSION_OPS
489 # define SDK_HAS_CXX0X_REF_QUALIFIER
490 # define SDK_HAS_CXX0X_RVALUE_REFS
491 # define SDK_HAS_CXX0X_STATIC_ASSERT
492 # endif
493 # endif // SDK_CC_BCC
494 
495 # if defined(SDK_HAS_CXX0X_DEFAULTED_FUNCTIONS) \
496  && defined(SDK_HAS_CXX0X_NON_PUBLIC_DEFAULTED_FUNCTIONS)
497 # define SDK_CXX0X_DEFAULTED_FUNCTION(fun, body) fun = default;
498 # else
499 # define SDK_CXX0X_DEFAULTED_FUNCTION(fun, body) fun body
500 # endif
501 
502 # define SDK_PP_COMMA() ,
503 #endif // 1
504 
505 #endif // SDK_BASE_PLATFORM_H_
SDK_MIN_FLOAT
static const float SDK_MIN_FLOAT
Min limit of float.
Definition: platform.h:199
SDK_MAX_INT64
static const SDKInt64 SDK_MAX_INT64
Max limit of 64-bit signed integer.
Definition: platform.h:188
SDK_MAX_UINT8
static const SDKUInt8 SDK_MAX_UINT8
Max limit of 8-bit unsigned integer.
Definition: platform.h:165
SDK_MIN_INT32
static const SDKInt32 SDK_MIN_INT32
Min limit of 32-bit signed integer.
Definition: platform.h:175
SDK_MIN_INT64
static const SDKInt64 SDK_MIN_INT64
Min limit of 64-bit signed integer.
Definition: platform.h:194
SDK_MAX_DOUBLE
static const double SDK_MAX_DOUBLE
Max limit of double.
Definition: platform.h:202
SDK_MIN_INT16
static const SDKInt16 SDK_MIN_INT16
Min limit of 16-bit signed integer.
Definition: platform.h:168
SDK_MAX_INT32
static const SDKInt32 SDK_MAX_INT32
Max limit of 32-bit signed integer.
Definition: platform.h:177
SDK_MIN_DOUBLE
static const double SDK_MIN_DOUBLE
Min limit of double.
Definition: platform.h:204
SDK_MAX_INT8
static const SDKInt8 SDK_MAX_INT8
Max limit of 8-bit signed integer.
Definition: platform.h:163
SDK_MAX_UINT32
static const SDKUInt32 SDK_MAX_UINT32
Max limit of 32-bit unsigned integer.
Definition: platform.h:179
SDK_MAX_UINT64
static const SDKUInt64 SDK_MAX_UINT64
Max limit of 64-bit unsigned integer.
Definition: platform.h:190
SDK_MAX_FLOAT
static const float SDK_MAX_FLOAT
Max limit of float.
Definition: platform.h:197
SDK_MIN_INT8
static const SDKInt8 SDK_MIN_INT8
Min limit of 8-bit signed integer.
Definition: platform.h:161
SDK_MAX_UINT16
static const SDKUInt16 SDK_MAX_UINT16
Max limit of 16-bit unsigned integer.
Definition: platform.h:172
SDK_MAX_INT16
static const SDKInt16 SDK_MAX_INT16
Max limit of 16-bit signed integer.
Definition: platform.h:170