8 #ifndef INCLUDED_eabase_H
9 #define INCLUDED_eabase_H
15 #include <EABase/config/eacompiler.h>
18 #include <EABase/config/eacompilertraits.h>
21 #include <EABase/config/eaplatform.h>
23 #if defined(EA_PRAGMA_ONCE_SUPPORTED)
28 #include <EABase/version.h>
31 #include <EABase/eaunits.h>
39 #if defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_MSVC) || defined(EA_WCHAR_T_NON_NATIVE) || defined(EA_PLATFORM_SONY)
40 #if defined(EA_COMPILER_MSVC)
41 #pragma warning(push, 0)
42 #pragma warning(disable: 4265 4365 4836 4574)
45 #if defined(EA_COMPILER_MSVC)
53 #if defined(EA_COMPILER_CLANG) && defined(EA_PLATFORM_APPLE)
62 #if !defined(__cplusplus) && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201100L
82 #if defined(__cplusplus)
85 #define NULL ((void*)0)
106 #ifdef EA_COMPILER_HAS_INTTYPES
116 #ifndef __STDC_FORMAT_MACROS
117 #define __STDC_FORMAT_MACROS
121 #if !defined(EA_COMPILER_MSVC) || (defined(EA_COMPILER_MSVC) && EA_COMPILER_VERSION >= 1800)
122 #include <inttypes.h>
124 #if defined(_MSC_VER)
125 #pragma warning(push, 0)
130 #if defined(_MSC_VER)
134 #if !defined(FLT_EVAL_METHOD) && (defined(__FLT_EVAL_METHOD__) || defined(_FEVAL))
135 #ifdef __FLT_EVAL_METHOD__
136 #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
138 #define FLT_EVAL_METHOD _FEVAL
146 #if defined(__MINGW32__) || (defined(EA_PLATFORM_ANDROID) && !(defined(EA_ANDROID_SDK_LEVEL) && EA_ANDROID_SDK_LEVEL >= 21))
147 #if defined(__FLT_EVAL_METHOD__)
148 #if(__FLT_EVAL_METHOD__== 0)
149 typedef float float_t;
150 typedef double double_t;
151 #elif(__FLT_EVAL_METHOD__ == 1)
152 typedef double float_t;
153 typedef double double_t;
154 #elif(__FLT_EVAL_METHOD__ == 2)
155 typedef long double float_t;
156 typedef long double double_t;
159 typedef float float_t;
160 typedef double double_t;
165 #if defined(__SIZEOF_SIZE_T__) && (__SIZEOF_SIZE_T__ == 4) && (defined(__have_long64) || defined(__have_longlong64))
193 #if !defined(__BIT_TYPES_DEFINED__) && !defined(__int8_t_defined)
194 typedef signed char int8_t;
196 #if !defined( __int8_t_defined )
197 typedef signed short int16_t;
198 typedef signed int int32_t;
199 #define __int8_t_defined
201 typedef unsigned char uint8_t;
202 typedef unsigned short uint16_t;
203 #if !defined( __uint32_t_defined )
204 typedef unsigned int uint32_t;
205 #define __uint32_t_defined
211 #if defined(_MSC_VER) && _MSC_VER >= 1800
213 #elif defined(FLT_EVAL_METHOD)
214 #if (FLT_EVAL_METHOD == 0)
215 typedef float float_t;
216 typedef double double_t;
217 #elif (FLT_EVAL_METHOD == 1)
218 typedef double float_t;
219 typedef double double_t;
220 #elif (FLT_EVAL_METHOD == 2)
221 typedef long double float_t;
222 typedef long double double_t;
226 #if defined(EA_COMPILER_MSVC)
227 typedef signed __int64 int64_t;
228 typedef unsigned __int64 uint64_t;
231 typedef signed long long int64_t;
232 typedef unsigned long long uint64_t;
252 #ifndef INT8_C_DEFINED
253 #define INT8_C_DEFINED
256 #define INT8_C(x) int8_t(x)
259 #define UINT8_C(x) uint8_t(x)
262 #define INT16_C(x) int16_t(x)
265 #define UINT16_C(x) uint16_t(x)
268 #define INT32_C(x) x##L
271 #define UINT32_C(x) x##UL
274 #define INT64_C(x) x##LL
277 #define UINT64_C(x) x##ULL
280 #define UINTMAX_C(x) UINT64_C(x)
286 #ifndef INT8_MAX_DEFINED
287 #define INT8_MAX_DEFINED
294 #define INT16_MAX 32767
297 #define INT32_MAX 2147483647
300 #define INT64_MAX INT64_C(9223372036854775807)
303 #define INTMAX_MAX INT64_MAX
306 #if EA_PLATFORM_PTR_SIZE == 4
307 #define INTPTR_MAX INT32_MAX
309 #define INTPTR_MAX INT64_MAX
315 #define INT8_MIN -128
318 #define INT16_MIN -32768
321 #define INT32_MIN (-INT32_MAX - 1)
324 #define INT64_MIN (-INT64_MAX - 1)
327 #define INTMAX_MIN INT64_MIN
330 #if EA_PLATFORM_PTR_SIZE == 4
331 #define INTPTR_MIN INT32_MIN
333 #define INTPTR_MIN INT64_MIN
339 #define UINT8_MAX 0xffU
342 #define UINT16_MAX 0xffffU
345 #define UINT32_MAX UINT32_C(0xffffffff)
348 #define UINT64_MAX UINT64_C(0xffffffffffffffff)
351 #define UINTMAX_MAX UINT64_MAX
354 #if EA_PLATFORM_PTR_SIZE == 4
355 #define UINTPTR_MAX UINT32_MAX
357 #define UINTPTR_MAX UINT64_MAX
362 #ifndef FLT_EVAL_METHOD
363 #define FLT_EVAL_METHOD 0
364 typedef float float_t;
365 typedef double double_t;
368 #if defined(EA_COMPILER_HAS_INTTYPES) && (!defined(EA_COMPILER_MSVC) || (defined(EA_COMPILER_MSVC) && EA_COMPILER_VERSION >= 1800))
369 #define EA_COMPILER_HAS_C99_FORMAT_MACROS
372 #ifndef EA_COMPILER_HAS_C99_FORMAT_MACROS
391 #ifndef __STDC_FORMAT_MACROS
392 #define __STDC_FORMAT_MACROS
395 #if defined(EA_COMPILER_MSVC)
396 #define EA_PRI_64_LENGTH_SPECIFIER "I64"
397 #define EA_SCN_64_LENGTH_SPECIFIER "I64"
399 #define EA_PRI_64_LENGTH_SPECIFIER "ll"
400 #define EA_SCN_64_LENGTH_SPECIFIER "ll"
404 #if defined(EA_COMPILER_IS_C99) || defined(EA_COMPILER_GNUC)
434 #define PRId64 EA_PRI_64_LENGTH_SPECIFIER "d"
435 #define PRIi64 EA_PRI_64_LENGTH_SPECIFIER "i"
436 #define PRIo64 EA_PRI_64_LENGTH_SPECIFIER "o"
437 #define PRIu64 EA_PRI_64_LENGTH_SPECIFIER "u"
438 #define PRIx64 EA_PRI_64_LENGTH_SPECIFIER "x"
439 #define PRIX64 EA_PRI_64_LENGTH_SPECIFIER "X"
441 #if (EA_PLATFORM_PTR_SIZE == 4)
442 #define PRIdPTR PRId32
443 #define PRIiPTR PRIi32
444 #define PRIoPTR PRIo32
445 #define PRIuPTR PRIu32
446 #define PRIxPTR PRIx32
447 #define PRIXPTR PRIX32
448 #elif (EA_PLATFORM_PTR_SIZE == 8)
449 #define PRIdPTR PRId64
450 #define PRIiPTR PRIi64
451 #define PRIoPTR PRIo64
452 #define PRIuPTR PRIu64
453 #define PRIxPTR PRIx64
454 #define PRIXPTR PRIX64
458 #if defined(EA_COMPILER_IS_C99) || defined(EA_COMPILER_GNUC)
484 #define SCNd64 EA_SCN_64_LENGTH_SPECIFIER "d"
485 #define SCNi64 EA_SCN_64_LENGTH_SPECIFIER "i"
486 #define SCNo64 EA_SCN_64_LENGTH_SPECIFIER "o"
487 #define SCNu64 EA_SCN_64_LENGTH_SPECIFIER "u"
488 #define SCNx64 EA_SCN_64_LENGTH_SPECIFIER "x"
490 #if defined(EA_COMPILER_MSVC) && (EA_COMPILER_VERSION >= 1900)
491 #define SCNdPTR PRIdPTR
492 #define SCNiPTR PRIiPTR
493 #define SCNoPTR PRIoPTR
494 #define SCNuPTR PRIuPTR
495 #define SCNxPTR PRIxPTR
496 #elif (EA_PLATFORM_PTR_SIZE == 4)
497 #define SCNdPTR SCNd32
498 #define SCNiPTR SCNi32
499 #define SCNoPTR SCNo32
500 #define SCNuPTR SCNu32
501 #define SCNxPTR SCNx32
502 #elif (EA_PLATFORM_PTR_SIZE == 8)
503 #define SCNdPTR SCNd64
504 #define SCNiPTR SCNi64
505 #define SCNoPTR SCNo64
506 #define SCNuPTR SCNu64
507 #define SCNxPTR SCNx64
517 #ifndef BOOL8_T_DEFINED
518 #define BOOL8_T_DEFINED
519 #if defined(EA_COMPILER_MSVC) || (defined(EA_COMPILER_INTEL) && defined(EA_PLATFORM_WINDOWS))
520 #if defined(__cplusplus)
521 typedef bool bool8_t;
523 typedef int8_t bool8_t;
526 typedef int8_t bool8_t;
536 #if !defined(_INTPTR_T_DEFINED) && !defined(_intptr_t_defined) && !defined(EA_COMPILER_HAS_C99_TYPES)
537 #if (EA_PLATFORM_PTR_SIZE == 4)
538 typedef int32_t intptr_t;
539 #elif (EA_PLATFORM_PTR_SIZE == 8)
540 typedef int64_t intptr_t;
543 #define _intptr_t_defined
544 #define _INTPTR_T_DEFINED
547 #if !defined(_UINTPTR_T_DEFINED) && !defined(_uintptr_t_defined) && !defined(EA_COMPILER_HAS_C99_TYPES)
548 #if (EA_PLATFORM_PTR_SIZE == 4)
549 typedef uint32_t uintptr_t;
550 #elif (EA_PLATFORM_PTR_SIZE == 8)
551 typedef uint64_t uintptr_t;
554 #define _uintptr_t_defined
555 #define _UINTPTR_T_DEFINED
558 #if !defined(EA_COMPILER_HAS_INTTYPES)
559 #ifndef INTMAX_T_DEFINED
560 #define INTMAX_T_DEFINED
570 typedef int64_t intmax_t;
571 typedef uint64_t uintmax_t;
582 #if !defined(__GNUC__)
586 #if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED)
588 #define _SSIZE_T_DEFINED
590 #if defined(_MSC_VER) && (EA_PLATFORM_PTR_SIZE == 8)
591 typedef __int64 ssize_t;
593 typedef long ssize_t;
597 #include <sys/types.h>
604 #if defined(EA_COMPILER_MSVC)
605 #if defined(EA_WCHAR_T_NON_NATIVE)
608 #ifdef EA_COMPILER_MSVC
609 #pragma warning(push, 3)
612 #ifdef EA_COMPILER_MSVC
661 #if !defined(EA_CHAR16_NATIVE)
663 #if defined(_MSC_VER) && (_MSC_VER >= 1600) && defined(_HAS_CHAR16_T_LANGUAGE_SUPPORT) && _HAS_CHAR16_T_LANGUAGE_SUPPORT
664 #define EA_CHAR16_NATIVE 1
665 #elif defined(EA_COMPILER_CLANG) && defined(EA_COMPILER_CPP11_ENABLED)
666 #if __has_feature(cxx_unicode_literals)
667 #define EA_CHAR16_NATIVE 1
668 #elif (EA_COMPILER_VERSION >= 300) && !(defined(EA_PLATFORM_IPHONE) || defined(EA_PLATFORM_OSX))
669 #define EA_CHAR16_NATIVE 1
670 #elif defined(EA_PLATFORM_APPLE)
671 #define EA_CHAR16_NATIVE 1
673 #define EA_CHAR16_NATIVE 0
675 #elif defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 404) && defined(__CHAR16_TYPE__) && defined(EA_COMPILER_CPP11_ENABLED)
676 #define EA_CHAR16_NATIVE 1
677 #elif defined(EA_COMPILER_GNUC) && (EA_COMPILER_VERSION >= 4004) && !defined(EA_COMPILER_EDG) && (defined(EA_COMPILER_CPP11_ENABLED) || defined(__STDC_VERSION__))
678 #define EA_CHAR16_NATIVE 1
680 #define EA_CHAR16_NATIVE 0
684 #if !defined(EA_CHAR32_NATIVE)
686 #if defined(_MSC_VER) && (_MSC_VER >= 1600) && defined(_HAS_CHAR16_T_LANGUAGE_SUPPORT) && _HAS_CHAR16_T_LANGUAGE_SUPPORT
687 #define EA_CHAR32_NATIVE 1
688 #elif defined(EA_COMPILER_CLANG) && defined(EA_COMPILER_CPP11_ENABLED)
689 #if __has_feature(cxx_unicode_literals)
690 #define EA_CHAR32_NATIVE 1
691 #elif (EA_COMPILER_VERSION >= 300) && !(defined(EA_PLATFORM_IPHONE) || defined(EA_PLATFORM_OSX))
692 #define EA_CHAR32_NATIVE 1
693 #elif defined(EA_PLATFORM_APPLE)
694 #define EA_CHAR32_NATIVE 1
696 #define EA_CHAR32_NATIVE 0
698 #elif defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 404) && defined(__CHAR32_TYPE__) && defined(EA_COMPILER_CPP11_ENABLED)
699 #define EA_CHAR32_NATIVE 1
700 #elif defined(EA_COMPILER_GNUC) && (EA_COMPILER_VERSION >= 4004) && !defined(EA_COMPILER_EDG) && (defined(EA_COMPILER_CPP11_ENABLED) || defined(__STDC_VERSION__))
701 #define EA_CHAR32_NATIVE 1
703 #define EA_CHAR32_NATIVE 0
708 #if EA_CHAR16_NATIVE || EA_CHAR32_NATIVE
709 #define EA_WCHAR_UNIQUE 1
711 #define EA_WCHAR_UNIQUE 0
726 #define CHAR8_T_DEFINED
727 #define EA_CHAR8_UNIQUE 1
729 #define EA_CHAR8_UNIQUE 0
733 #ifndef CHAR8_T_DEFINED
734 #define CHAR8_T_DEFINED
735 #if defined(EA_PLATFORM_APPLE)
738 typedef char char8_t;
745 #if defined(__GNUC__) && !defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(__CHAR16_TYPE__)
746 typedef __CHAR16_TYPE__ char16_t;
747 typedef __CHAR32_TYPE__ char32_t;
749 #elif (EA_WCHAR_SIZE == 2)
750 #if (defined(_MSC_VER) && (_MSC_VER >= 1600))
751 #if !defined(_CHAR16T)
754 #if !defined(_HAS_CHAR16_T_LANGUAGE_SUPPORT) || !_HAS_CHAR16_T_LANGUAGE_SUPPORT
755 typedef wchar_t char16_t;
756 typedef uint32_t char32_t;
759 typedef wchar_t char16_t;
760 typedef uint32_t char32_t;
763 typedef uint16_t char16_t;
764 #if defined(__cplusplus)
765 typedef wchar_t char32_t;
767 typedef uint32_t char32_t;
775 #define EA_LIMITS_DIGITS_S(T) ((sizeof(T) * 8) - 1)
776 #define EA_LIMITS_DIGITS_U(T) ((sizeof(T) * 8))
777 #define EA_LIMITS_DIGITS(T) ((EA_LIMITS_IS_SIGNED(T) ? EA_LIMITS_DIGITS_S(T) : EA_LIMITS_DIGITS_U(T)))
778 #define EA_LIMITS_IS_SIGNED(T) ((T)(-1) < 0)
779 #define EA_LIMITS_MIN_S(T) ((T)((T)1 << EA_LIMITS_DIGITS_S(T)))
780 #define EA_LIMITS_MIN_U(T) ((T)0)
781 #define EA_LIMITS_MIN(T) ((EA_LIMITS_IS_SIGNED(T) ? EA_LIMITS_MIN_S(T) : EA_LIMITS_MIN_U(T)))
782 #define EA_LIMITS_MAX_S(T) ((T)(((((T)1 << (EA_LIMITS_DIGITS(T) - 1)) - 1) << 1) + 1))
783 #define EA_LIMITS_MAX_U(T) ((T)~(T)0)
784 #define EA_LIMITS_MAX(T) ((EA_LIMITS_IS_SIGNED(T) ? EA_LIMITS_MAX_S(T) : EA_LIMITS_MAX_U(T)))
786 #if !defined(CHAR8_MIN)
787 #define CHAR8_MIN EA_LIMITS_MIN(char8_t)
790 #if !defined(CHAR8_MAX)
791 #define CHAR8_MAX EA_LIMITS_MAX(char8_t)
794 #if !defined(CHAR16_MIN)
795 #define CHAR16_MIN EA_LIMITS_MIN(char16_t)
798 #if !defined(CHAR16_MAX)
799 #define CHAR16_MAX EA_LIMITS_MAX(char16_t)
802 #if !defined(CHAR32_MIN)
803 #define CHAR32_MIN EA_LIMITS_MIN(char32_t)
806 #if !defined(CHAR32_MAX)
807 #define CHAR32_MAX EA_LIMITS_MAX(char32_t)
824 #define EA_CHAR8(s) u8 ## s
826 #define EA_CHAR8(s) s
831 #define EA_WCHAR_(s) L ## s
832 #define EA_WCHAR(s) EA_WCHAR_(s)
836 #if EA_CHAR16_NATIVE && !defined(_MSC_VER)
837 #define EA_CHAR16_(s) u ## s
838 #define EA_CHAR16(s) EA_CHAR16_(s)
839 #elif (EA_WCHAR_SIZE == 2)
840 #if defined(_MSC_VER) && (_MSC_VER >= 1900) && defined(__cplusplus)
841 #define EA_CHAR16_(s) u ## s
842 #define EA_CHAR16(s) EA_CHAR16_(s)
844 #define EA_CHAR16_(s) L ## s
845 #define EA_CHAR16(s) EA_CHAR16_(s)
853 #if EA_CHAR32_NATIVE && !defined(_MSC_VER)
854 #define EA_CHAR32_(s) U ## s
855 #define EA_CHAR32(s) EA_CHAR32_(s)
856 #elif (EA_WCHAR_SIZE == 2)
857 #if defined(_MSC_VER) && (_MSC_VER >= 1900) && defined(__cplusplus)
858 #define EA_CHAR32_(s) U ## s
859 #define EA_CHAR32(s) EA_CHAR32_(s)
863 #elif (EA_WCHAR_SIZE == 4)
864 #define EA_CHAR32_(s) L ## s
865 #define EA_CHAR32(s) EA_CHAR32_(s)
867 #error Unexpected size of wchar_t
875 #if defined(EABASE_ENABLE_EATEXT_MACROS)
879 #define EAText16(x) EA_CHAR16(x)
880 #define EAChar16(x) EA_CHAR16(x)
897 #if defined(EA_COMPILER_NO_CONSTEXPR)
899 #define EAArrayCount(x) (sizeof(x) / sizeof(x[0]))
906 template <
typename T,
size_t N>
907 char (&EAArraySizeHelper(T (&x)[N]))[N];
909 template <
typename T,
size_t N>
910 char (&EAArraySizeHelper(T (&&x)[N]))[N];
912 #define EAArrayCount(x) (sizeof(EAArraySizeHelper(x)))
927 #if defined(_MSC_VER) && (_MSC_VER >= 1600) && defined(__cplusplus)
929 #elif !defined(__cplusplus) && defined(EA_PLATFORM_ANDROID) && ((defined(__STDC_VERSION__) && __STDC_VERSION__ < 201100L) || !defined(__STDC_VERSION__))
931 #define NEED_CUSTOM_STATIC_ASSERT
932 #elif defined(__clang__) && defined(__cplusplus)
934 #if !(__has_feature(cxx_static_assert) || __has_extension(cxx_static_assert))
935 #define NEED_CUSTOM_STATIC_ASSERT
937 #elif defined(__GNUC__) && (defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(__cplusplus) && (__cplusplus >= 201103L)))
939 #elif defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401) && defined(EA_COMPILER_CPP11_ENABLED)
941 #elif !defined(__cplusplus) && defined(__GLIBC__) && defined(__USE_ISOC11)
943 #elif !defined(__cplusplus) && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201100L
946 #define NEED_CUSTOM_STATIC_ASSERT
949 #ifdef NEED_CUSTOM_STATIC_ASSERT
954 #define EA_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused))
956 #define EA_STATIC_ASSERT_UNUSED_ATTRIBUTE
958 #define EA_STATIC_ASSERT_TOKEN_PASTE(a,b) a ## b
959 #define EA_STATIC_ASSERT_CONCATENATE_HELPER(a,b) EA_STATIC_ASSERT_TOKEN_PASTE(a,b)
961 #if defined(__COUNTER__)
962 #define static_assert(expression, description) typedef char EA_STATIC_ASSERT_CONCATENATE_HELPER(compileTimeAssert,__COUNTER__) [((expression) != 0) ? 1 : -1] EA_STATIC_ASSERT_UNUSED_ATTRIBUTE
964 #define static_assert(expression, description) typedef char EA_STATIC_ASSERT_CONCATENATE_HELPER(compileTimeAssert,__LINE__) [((expression) != 0) ? 1 : -1] EA_STATIC_ASSERT_UNUSED_ATTRIBUTE
967 #undef NEED_CUSTOM_STATIC_ASSERT
999 #define EA_ENABLED 111-
1000 #define EA_DISABLED 333-
1002 #define EA_IS_ENABLED(x) (333 == 333 * 111 / ((x 0) * (((x 0) == 333 ? 1 : 0) + ((x 0) == 111 ? 1 : 0))))
1009 #include <EABase/int128.h>