diff options
Diffstat (limited to 'include/EASTL/internal/config.h')
-rw-r--r-- | include/EASTL/internal/config.h | 1938 |
1 files changed, 0 insertions, 1938 deletions
diff --git a/include/EASTL/internal/config.h b/include/EASTL/internal/config.h deleted file mode 100644 index 0564e18..0000000 --- a/include/EASTL/internal/config.h +++ /dev/null @@ -1,1938 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Copyright (c) Electronic Arts Inc. All rights reserved. -///////////////////////////////////////////////////////////////////////////// - - -#ifndef EASTL_INTERNAL_CONFIG_H -#define EASTL_INTERNAL_CONFIG_H - - -/////////////////////////////////////////////////////////////////////////////// -// ReadMe -// -// This is the EASTL configuration file. All configurable parameters of EASTL -// are controlled through this file. However, all the settings here can be -// manually overridden by the user. There are three ways for a user to override -// the settings in this file: -// -// - Simply edit this file. -// - Define EASTL_USER_CONFIG_HEADER. -// - Predefine individual defines (e.g. EASTL_ASSERT). -// -/////////////////////////////////////////////////////////////////////////////// - - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_USER_CONFIG_HEADER -// -// This allows the user to define a header file to be #included before the -// EASTL config.h contents are compiled. A primary use of this is to override -// the contents of this config.h file. Note that all the settings below in -// this file are user-overridable. -// -// Example usage: -// #define EASTL_USER_CONFIG_HEADER "MyConfigOverrides.h" -// #include <EASTL/vector.h> -// -/////////////////////////////////////////////////////////////////////////////// - -#ifdef EASTL_USER_CONFIG_HEADER - #include EASTL_USER_CONFIG_HEADER -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_EABASE_DISABLED -// -// The user can disable EABase usage and manually supply the configuration -// via defining EASTL_EABASE_DISABLED and defining the appropriate entities -// globally or via the above EASTL_USER_CONFIG_HEADER. -// -// Example usage: -// #define EASTL_EABASE_DISABLED -// #include <EASTL/vector.h> -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_EABASE_DISABLED - #include <EABase/eabase.h> -#endif -#include <EABase/eahave.h> - -#if defined(EA_PRAGMA_ONCE_SUPPORTED) - #pragma once -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_VERSION -// -// We more or less follow the conventional EA packaging approach to versioning -// here. A primary distinction here is that minor versions are defined as two -// digit entities (e.g. .03") instead of minimal digit entities ".3"). The logic -// here is that the value is a counter and not a floating point fraction. -// Note that the major version doesn't have leading zeros. -// -// Example version strings: -// "0.91.00" // Major version 0, minor version 91, patch version 0. -// "1.00.00" // Major version 1, minor and patch version 0. -// "3.10.02" // Major version 3, minor version 10, patch version 02. -// "12.03.01" // Major version 12, minor version 03, patch version -// -// Example usage: -// printf("EASTL version: %s", EASTL_VERSION); -// printf("EASTL version: %d.%d.%d", EASTL_VERSION_N / 10000 % 100, EASTL_VERSION_N / 100 % 100, EASTL_VERSION_N % 100); -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_VERSION - #define EASTL_VERSION "3.20.02" - #define EASTL_VERSION_N 32002 -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EA_COMPILER_NO_STANDARD_CPP_LIBRARY -// -// Defined as 1 or undefined. -// Implements support for the definition of EA_COMPILER_NO_STANDARD_CPP_LIBRARY for the case -// of using EABase versions prior to the addition of its EA_COMPILER_NO_STANDARD_CPP_LIBRARY support. -// -#if !defined(EA_COMPILER_NO_STANDARD_CPP_LIBRARY) - #if defined(EA_PLATFORM_ANDROID) - // Disabled because EA's eaconfig/android_config/android_sdk packages currently - // don't support linking STL libraries. Perhaps we can figure out what linker arguments - // are needed for an app so we can manually specify them and then re-enable this code. - // - //#include <android/api-level.h> - // - //#if (__ANDROID_API__ < 9) // Earlier versions of Android provide no std C++ STL implementation. - #define EA_COMPILER_NO_STANDARD_CPP_LIBRARY 1 - //#endif - #endif -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EA_NOEXCEPT -// -// Defined as a macro. Provided here for backward compatibility with older -// EABase versions prior to 2.00.40 that don't yet define it themselves. -// -#if !defined(EA_NOEXCEPT) - #define EA_NOEXCEPT - #define EA_NOEXCEPT_IF(predicate) - #define EA_NOEXCEPT_EXPR(expression) false -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EA_CPP14_CONSTEXPR -// -// Defined as constexpr when a C++14 compiler is present. Defines it as nothing -// when using a C++11 compiler. -// C++14 relaxes the specification for constexpr such that it allows more -// kinds of expressions. Since a C++11 compiler doesn't allow this, we need -// to make a unique define for C++14 constexpr. This macro should be used only -// when you are using it with code that specfically requires C++14 constexpr -// functionality beyond the regular C++11 constexpr functionality. -// http://en.wikipedia.org/wiki/C%2B%2B14#Relaxed_constexpr_restrictions -// -#if !defined(EA_CPP14_CONSTEXPR) - #if defined(EA_COMPILER_CPP14_ENABLED) - #define EA_CPP14_CONSTEXPR constexpr - #else - #define EA_CPP14_CONSTEXPR // not supported - #define EA_NO_CPP14_CONSTEXPR - #endif -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL namespace -// -// We define this so that users that #include this config file can reference -// these namespaces without seeing any other files that happen to use them. -/////////////////////////////////////////////////////////////////////////////// - -/// EA Standard Template Library -namespace eastl -{ - // Intentionally empty. -} - - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_DEBUG -// -// Defined as an integer >= 0. Default is 1 for debug builds and 0 for -// release builds. This define is also a master switch for the default value -// of some other settings. -// -// Example usage: -// #if EASTL_DEBUG -// ... -// #endif -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_DEBUG - #if defined(EA_DEBUG) || defined(_DEBUG) - #define EASTL_DEBUG 1 - #else - #define EASTL_DEBUG 0 - #endif -#endif - -// Developer debug. Helps EASTL developers assert EASTL is coded correctly. -// Normally disabled for users since it validates internal things and not user things. -#ifndef EASTL_DEV_DEBUG - #define EASTL_DEV_DEBUG 0 -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_DEBUGPARAMS_LEVEL -// -// EASTL_DEBUGPARAMS_LEVEL controls what debug information is passed through to -// the allocator by default. -// This value may be defined by the user ... if not it will default to 1 for -// EA_DEBUG builds, otherwise 0. -// -// 0 - no debug information is passed through to allocator calls. -// 1 - 'name' is passed through to allocator calls. -// 2 - 'name', __FILE__, and __LINE__ are passed through to allocator calls. -// -// This parameter mirrors the equivalent parameter in the CoreAllocator package. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_DEBUGPARAMS_LEVEL - #if EASTL_DEBUG - #define EASTL_DEBUGPARAMS_LEVEL 2 - #else - #define EASTL_DEBUGPARAMS_LEVEL 0 - #endif -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_DLL -// -// Defined as 0 or 1. The default is dependent on the definition of EA_DLL. -// If EA_DLL is defined, then EASTL_DLL is 1, else EASTL_DLL is 0. -// EA_DLL is a define that controls DLL builds within the EAConfig build system. -// EASTL_DLL controls whether EASTL is built and used as a DLL. -// Normally you wouldn't do such a thing, but there are use cases for such -// a thing, particularly in the case of embedding C++ into C# applications. -// -#ifndef EASTL_DLL - #if defined(EA_DLL) - #define EASTL_DLL 1 - #else - #define EASTL_DLL 0 - #endif -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_IF_NOT_DLL -// -// Utility to include expressions only for static builds. -// -#ifndef EASTL_IF_NOT_DLL - #if EASTL_DLL - #define EASTL_IF_NOT_DLL(x) - #else - #define EASTL_IF_NOT_DLL(x) x - #endif -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_API -// -// This is used to label functions as DLL exports under Microsoft platforms. -// If EA_DLL is defined, then the user is building EASTL as a DLL and EASTL's -// non-templated functions will be exported. EASTL template functions are not -// labelled as EASTL_API (and are thus not exported in a DLL build). This is -// because it's not possible (or at least unsafe) to implement inline templated -// functions in a DLL. -// -// Example usage of EASTL_API: -// EASTL_API int someVariable = 10; // Export someVariable in a DLL build. -// -// struct EASTL_API SomeClass{ // Export SomeClass and its member functions in a DLL build. -// EASTL_LOCAL void PrivateMethod(); // Not exported. -// }; -// -// EASTL_API void SomeFunction(); // Export SomeFunction in a DLL build. -// -// -#if defined(EA_DLL) && !defined(EASTL_DLL) - #define EASTL_DLL 1 -#endif - -#ifndef EASTL_API // If the build file hasn't already defined this to be dllexport... - #if EASTL_DLL - #if defined(_MSC_VER) - #define EASTL_API __declspec(dllimport) - #define EASTL_LOCAL - #elif defined(__CYGWIN__) - #define EASTL_API __attribute__((dllimport)) - #define EASTL_LOCAL - #elif (defined(__GNUC__) && (__GNUC__ >= 4)) - #define EASTL_API __attribute__ ((visibility("default"))) - #define EASTL_LOCAL __attribute__ ((visibility("hidden"))) - #else - #define EASTL_API - #define EASTL_LOCAL - #endif - #else - #define EASTL_API - #define EASTL_LOCAL - #endif -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_EASTDC_API -// -// This is used for importing EAStdC functions into EASTL, possibly via a DLL import. -// -#ifndef EASTL_EASTDC_API - #if EASTL_DLL - #if defined(_MSC_VER) - #define EASTL_EASTDC_API __declspec(dllimport) - #define EASTL_EASTDC_LOCAL - #elif defined(__CYGWIN__) - #define EASTL_EASTDC_API __attribute__((dllimport)) - #define EASTL_EASTDC_LOCAL - #elif (defined(__GNUC__) && (__GNUC__ >= 4)) - #define EASTL_EASTDC_API __attribute__ ((visibility("default"))) - #define EASTL_EASTDC_LOCAL __attribute__ ((visibility("hidden"))) - #else - #define EASTL_EASTDC_API - #define EASTL_EASTDC_LOCAL - #endif - #else - #define EASTL_EASTDC_API - #define EASTL_EASTDC_LOCAL - #endif -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_EASTDC_VSNPRINTF -// -// Defined as 0 or 1. By default it is 1. -// -// When enabled EASTL uses EAStdC's Vsnprintf function directly instead of -// having the user provide a global Vsnprintf8/16/32 function. The benefit -// of this is that it will allow EASTL to just link to EAStdC's Vsnprintf -// without the user doing anything. The downside is that any users who aren't -// already using EAStdC will either need to now depend on EAStdC or globally -// define this property to be 0 and simply provide functions that have the same -// names. See the usage of EASTL_EASTDC_VSNPRINTF in string.h for more info. -// -#if !defined(EASTL_EASTDC_VSNPRINTF) - #define EASTL_EASTDC_VSNPRINTF 1 -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_NAME_ENABLED / EASTL_NAME / EASTL_NAME_VAL -// -// Used to wrap debug string names. In a release build, the definition -// goes away. These are present to avoid release build compiler warnings -// and to make code simpler. -// -// Example usage of EASTL_NAME: -// // pName will defined away in a release build and thus prevent compiler warnings. -// void allocator::set_name(const char* EASTL_NAME(pName)) -// { -// #if EASTL_NAME_ENABLED -// mpName = pName; -// #endif -// } -// -// Example usage of EASTL_NAME_VAL: -// // "xxx" is defined to NULL in a release build. -// vector<T, Allocator>::vector(const allocator_type& allocator = allocator_type(EASTL_NAME_VAL("xxx"))); -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_NAME_ENABLED - #define EASTL_NAME_ENABLED EASTL_DEBUG -#endif - -#ifndef EASTL_NAME - #if EASTL_NAME_ENABLED - #define EASTL_NAME(x) x - #define EASTL_NAME_VAL(x) x - #else - #define EASTL_NAME(x) - #define EASTL_NAME_VAL(x) ((const char*)NULL) - #endif -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_DEFAULT_NAME_PREFIX -// -// Defined as a string literal. Defaults to "EASTL". -// This define is used as the default name for EASTL where such a thing is -// referenced in EASTL. For example, if the user doesn't specify an allocator -// name for their deque, it is named "EASTL deque". However, you can override -// this to say "SuperBaseball deque" by changing EASTL_DEFAULT_NAME_PREFIX. -// -// Example usage (which is simply taken from how deque.h uses this define): -// #ifndef EASTL_DEQUE_DEFAULT_NAME -// #define EASTL_DEQUE_DEFAULT_NAME EASTL_DEFAULT_NAME_PREFIX " deque" -// #endif -// -#ifndef EASTL_DEFAULT_NAME_PREFIX - #define EASTL_DEFAULT_NAME_PREFIX "EASTL" -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_ASSERT_ENABLED -// -// Defined as 0 or non-zero. Default is same as EASTL_DEBUG. -// If EASTL_ASSERT_ENABLED is non-zero, then asserts will be executed via -// the assertion mechanism. -// -// Example usage: -// #if EASTL_ASSERT_ENABLED -// EASTL_ASSERT(v.size() > 17); -// #endif -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_ASSERT_ENABLED - #define EASTL_ASSERT_ENABLED EASTL_DEBUG -#endif - -// Developer assert. Helps EASTL developers assert EASTL is coded correctly. -// Normally disabled for users since it validates internal things and not user things. -#ifndef EASTL_DEV_ASSERT_ENABLED - #define EASTL_DEV_ASSERT_ENABLED EASTL_DEV_DEBUG -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_EMPTY_REFERENCE_ASSERT_ENABLED -// -// Defined as 0 or non-zero. Default is same as EASTL_ASSERT_ENABLED. -// This is like EASTL_ASSERT_ENABLED, except it is for empty container -// references. Sometime people like to be able to take a reference to -// the front of the container, but not use it if the container is empty. -// In practice it's often easier and more efficient to do this than to write -// extra code to check if the container is empty. -// -// NOTE: If this is enabled, EASTL_ASSERT_ENABLED must also be enabled -// -// Example usage: -// template <typename T, typename Allocator> -// inline typename vector<T, Allocator>::reference -// vector<T, Allocator>::front() -// { -// #if EASTL_ASSERT_ENABLED -// EASTL_ASSERT(mpEnd > mpBegin); -// #endif -// -// return *mpBegin; -// } -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_EMPTY_REFERENCE_ASSERT_ENABLED - #define EASTL_EMPTY_REFERENCE_ASSERT_ENABLED EASTL_ASSERT_ENABLED -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// SetAssertionFailureFunction -// -// Allows the user to set a custom assertion failure mechanism. -// -// Example usage: -// void Assert(const char* pExpression, void* pContext); -// SetAssertionFailureFunction(Assert, this); -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_ASSERTION_FAILURE_DEFINED - #define EASTL_ASSERTION_FAILURE_DEFINED - - namespace eastl - { - typedef void (*EASTL_AssertionFailureFunction)(const char* pExpression, void* pContext); - EASTL_API void SetAssertionFailureFunction(EASTL_AssertionFailureFunction pFunction, void* pContext); - - // These are the internal default functions that implement asserts. - EASTL_API void AssertionFailure(const char* pExpression); - EASTL_API void AssertionFailureFunctionDefault(const char* pExpression, void* pContext); - } -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_ASSERT -// -// Assertion macro. Can be overridden by user with a different value. -// -// Example usage: -// EASTL_ASSERT(intVector.size() < 100); -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_ASSERT - #if EASTL_ASSERT_ENABLED - #define EASTL_ASSERT(expression) \ - EA_DISABLE_VC_WARNING(4127) \ - do { \ - EA_ANALYSIS_ASSUME(expression); \ - (void)((expression) || (eastl::AssertionFailure(#expression), 0)); \ - } while (0) \ - EA_RESTORE_VC_WARNING() - #else - #define EASTL_ASSERT(expression) - #endif -#endif - -// Developer assert. Helps EASTL developers assert EASTL is coded correctly. -// Normally disabled for users since it validates internal things and not user things. -#ifndef EASTL_DEV_ASSERT - #if EASTL_DEV_ASSERT_ENABLED - #define EASTL_DEV_ASSERT(expression) \ - EA_DISABLE_VC_WARNING(4127) \ - do { \ - EA_ANALYSIS_ASSUME(expression); \ - (void)((expression) || (eastl::AssertionFailure(#expression), 0)); \ - } while(0) \ - EA_RESTORE_VC_WARNING() - #else - #define EASTL_DEV_ASSERT(expression) - #endif -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_ASSERT_MSG -// -// Example usage: -// EASTL_ASSERT_MSG(false, "detected error condition!"); -// -/////////////////////////////////////////////////////////////////////////////// -#ifndef EASTL_ASSERT_MSG - #if EASTL_ASSERT_ENABLED - #define EASTL_ASSERT_MSG(expression, message) \ - EA_DISABLE_VC_WARNING(4127) \ - do { \ - EA_ANALYSIS_ASSUME(expression); \ - (void)((expression) || (eastl::AssertionFailure(message), 0)); \ - } while (0) \ - EA_RESTORE_VC_WARNING() - #else - #define EASTL_ASSERT_MSG(expression, message) - #endif -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_FAIL_MSG -// -// Failure macro. Can be overridden by user with a different value. -// -// Example usage: -// EASTL_FAIL("detected error condition!"); -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_FAIL_MSG - #if EASTL_ASSERT_ENABLED - #define EASTL_FAIL_MSG(message) (eastl::AssertionFailure(message)) - #else - #define EASTL_FAIL_MSG(message) - #endif -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_CT_ASSERT / EASTL_CT_ASSERT_NAMED -// -// EASTL_CT_ASSERT is a macro for compile time assertion checks, useful for -// validating *constant* expressions. The advantage over using EASTL_ASSERT -// is that errors are caught at compile time instead of runtime. -// -// Example usage: -// EASTL_CT_ASSERT(sizeof(uint32_t) == 4); -// -/////////////////////////////////////////////////////////////////////////////// - -#define EASTL_CT_ASSERT(expression) static_assert(expression, #expression) - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_CT_ASSERT_MSG -// -// EASTL_CT_ASSERT_MSG is a macro for compile time assertion checks, useful for -// validating *constant* expressions. The advantage over using EASTL_ASSERT -// is that errors are caught at compile time instead of runtime. -// The message must be a string literal. -// -// Example usage: -// EASTL_CT_ASSERT_MSG(sizeof(uint32_t) == 4, "The size of uint32_t must be 4."); -// -/////////////////////////////////////////////////////////////////////////////// - -#define EASTL_CT_ASSERT_MSG(expression, message) static_assert(expression, message) - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_DEBUG_BREAK / EASTL_DEBUG_BREAK_OVERRIDE -// -// This function causes an app to immediately stop under the debugger. -// It is implemented as a macro in order to allow stopping at the site -// of the call. -// -// EASTL_DEBUG_BREAK_OVERRIDE allows one to define EASTL_DEBUG_BREAK directly. -// This is useful in cases where you desire to disable EASTL_DEBUG_BREAK -// but do not wish to (or cannot) define a custom void function() to replace -// EASTL_DEBUG_BREAK callsites. -// -// Example usage: -// EASTL_DEBUG_BREAK(); -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_DEBUG_BREAK_OVERRIDE - #ifndef EASTL_DEBUG_BREAK - #if defined(_MSC_VER) && (_MSC_VER >= 1300) - #define EASTL_DEBUG_BREAK() __debugbreak() // This is a compiler intrinsic which will map to appropriate inlined asm for the platform. - #elif (defined(EA_PROCESSOR_ARM) && !defined(EA_PROCESSOR_ARM64)) && defined(__APPLE__) - #define EASTL_DEBUG_BREAK() asm("trap") - #elif defined(EA_PROCESSOR_ARM64) && defined(__APPLE__) - #include <signal.h> - #include <unistd.h> - #define EASTL_DEBUG_BREAK() kill( getpid(), SIGINT ) - #elif defined(EA_PROCESSOR_ARM64) && defined(__GNUC__) - #define EASTL_DEBUG_BREAK() asm("brk 10") - #elif defined(EA_PROCESSOR_ARM) && defined(__GNUC__) - #define EASTL_DEBUG_BREAK() asm("BKPT 10") // The 10 is arbitrary. It's just a unique id. - #elif defined(EA_PROCESSOR_ARM) && defined(__ARMCC_VERSION) - #define EASTL_DEBUG_BREAK() __breakpoint(10) - #elif defined(EA_PROCESSOR_POWERPC) // Generic PowerPC. - #define EASTL_DEBUG_BREAK() asm(".long 0") // This triggers an exception by executing opcode 0x00000000. - #elif (defined(EA_PROCESSOR_X86) || defined(EA_PROCESSOR_X86_64)) && defined(EA_ASM_STYLE_INTEL) - #define EASTL_DEBUG_BREAK() { __asm int 3 } - #elif (defined(EA_PROCESSOR_X86) || defined(EA_PROCESSOR_X86_64)) && (defined(EA_ASM_STYLE_ATT) || defined(__GNUC__)) - #define EASTL_DEBUG_BREAK() asm("int3") - #else - void EASTL_DEBUG_BREAK(); // User must define this externally. - #endif - #else - void EASTL_DEBUG_BREAK(); // User must define this externally. - #endif -#else - #ifndef EASTL_DEBUG_BREAK - #if EASTL_DEBUG_BREAK_OVERRIDE == 1 - // define an empty callable to satisfy the call site. - #define EASTL_DEBUG_BREAK ([]{}) - #else - #define EASTL_DEBUG_BREAK EASTL_DEBUG_BREAK_OVERRIDE - #endif - #else - #error EASTL_DEBUG_BREAK is already defined yet you would like to override it. Please ensure no other headers are already defining EASTL_DEBUG_BREAK before this header (config.h) is included - #endif -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_CRASH -// -// Executes an invalid memory write, which should result in an exception -// on most platforms. -// -/////////////////////////////////////////////////////////////////////////////// - -#define EASTL_CRASH() *((volatile int*)0) = 0xDEADC0DE; - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_ALLOCATOR_COPY_ENABLED -// -// Defined as 0 or 1. Default is 0 (disabled) until some future date. -// If enabled (1) then container operator= copies the allocator from the -// source container. It ideally should be set to enabled but for backwards -// compatibility with older versions of EASTL it is currently set to 0. -// Regardless of whether this value is 0 or 1, this container copy constructs -// or copy assigns allocators. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_ALLOCATOR_COPY_ENABLED - #define EASTL_ALLOCATOR_COPY_ENABLED 0 -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_FIXED_SIZE_TRACKING_ENABLED -// -// Defined as an integer >= 0. Default is same as EASTL_DEBUG. -// If EASTL_FIXED_SIZE_TRACKING_ENABLED is enabled, then fixed -// containers in debug builds track the max count of objects -// that have been in the container. This allows for the tuning -// of fixed container sizes to their minimum required size. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_FIXED_SIZE_TRACKING_ENABLED - #define EASTL_FIXED_SIZE_TRACKING_ENABLED EASTL_DEBUG -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_RTTI_ENABLED -// -// Defined as 0 or 1. Default is 1 if RTTI is supported by the compiler. -// This define exists so that we can use some dynamic_cast operations in the -// code without warning. dynamic_cast is only used if the specifically refers -// to it; EASTL won't do dynamic_cast behind your back. -// -// Example usage: -// #if EASTL_RTTI_ENABLED -// pChildClass = dynamic_cast<ChildClass*>(pParentClass); -// #endif -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_RTTI_ENABLED - // The VC++ default Standard Library (Dinkumware) disables major parts of RTTI - // (e.g. type_info) if exceptions are disabled, even if RTTI itself is enabled. - // _HAS_EXCEPTIONS is defined by Dinkumware to 0 or 1 (disabled or enabled). - #if defined(EA_COMPILER_NO_RTTI) || (defined(_MSC_VER) && defined(EA_HAVE_DINKUMWARE_CPP_LIBRARY) && !(defined(_HAS_EXCEPTIONS) && _HAS_EXCEPTIONS)) - #define EASTL_RTTI_ENABLED 0 - #else - #define EASTL_RTTI_ENABLED 1 - #endif -#endif - - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_EXCEPTIONS_ENABLED -// -// Defined as 0 or 1. Default is to follow what the compiler settings are. -// The user can predefine EASTL_EXCEPTIONS_ENABLED to 0 or 1; however, if the -// compiler is set to disable exceptions then EASTL_EXCEPTIONS_ENABLED is -// forced to a value of 0 regardless of the user predefine. -// -// Note that we do not enable EASTL exceptions by default if the compiler -// has exceptions enabled. To enable EASTL_EXCEPTIONS_ENABLED you need to -// manually set it to 1. -// -/////////////////////////////////////////////////////////////////////////////// - -#if !defined(EASTL_EXCEPTIONS_ENABLED) || ((EASTL_EXCEPTIONS_ENABLED == 1) && defined(EA_COMPILER_NO_EXCEPTIONS)) - #define EASTL_EXCEPTIONS_ENABLED 0 -#endif - - - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_STRING_OPT_XXXX -// -// Enables some options / optimizations options that cause the string class -// to behave slightly different from the C++ standard basic_string. These are -// options whereby you can improve performance by avoiding operations that -// in practice may never occur for you. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_STRING_OPT_EXPLICIT_CTORS - // Defined as 0 or 1. Default is 0. - // Defines if we should implement explicity in constructors where the C++ - // standard string does not. The advantage of enabling explicit constructors - // is that you can do this: string s = "hello"; in addition to string s("hello"); - // The disadvantage of enabling explicity constructors is that there can be - // silent conversions done which impede performance if the user isn't paying - // attention. - // C++ standard string ctors are not explicit. - #define EASTL_STRING_OPT_EXPLICIT_CTORS 0 -#endif - -#ifndef EASTL_STRING_OPT_LENGTH_ERRORS - // Defined as 0 or 1. Default is equal to EASTL_EXCEPTIONS_ENABLED. - // Defines if we check for string values going beyond kMaxSize - // (a very large value) and throw exections if so. - // C++ standard strings are expected to do such checks. - #define EASTL_STRING_OPT_LENGTH_ERRORS EASTL_EXCEPTIONS_ENABLED -#endif - -#ifndef EASTL_STRING_OPT_RANGE_ERRORS - // Defined as 0 or 1. Default is equal to EASTL_EXCEPTIONS_ENABLED. - // Defines if we check for out-of-bounds references to string - // positions and throw exceptions if so. Well-behaved code shouldn't - // refence out-of-bounds positions and so shouldn't need these checks. - // C++ standard strings are expected to do such range checks. - #define EASTL_STRING_OPT_RANGE_ERRORS EASTL_EXCEPTIONS_ENABLED -#endif - -#ifndef EASTL_STRING_OPT_ARGUMENT_ERRORS - // Defined as 0 or 1. Default is 0. - // Defines if we check for NULL ptr arguments passed to string - // functions by the user and throw exceptions if so. Well-behaved code - // shouldn't pass bad arguments and so shouldn't need these checks. - // Also, some users believe that strings should check for NULL pointers - // in all their arguments and do no-ops if so. This is very debatable. - // C++ standard strings are not required to check for such argument errors. - #define EASTL_STRING_OPT_ARGUMENT_ERRORS 0 -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_BITSET_SIZE_T -// -// Defined as 0 or 1. Default is 1. -// Controls whether bitset uses size_t or eastl_size_t. -// -#ifndef EASTL_BITSET_SIZE_T - #define EASTL_BITSET_SIZE_T 1 -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_INT128_SUPPORTED -// -// Defined as 0 or 1. -// -#ifndef EASTL_INT128_SUPPORTED - #if defined(EA_COMPILER_INTMAX_SIZE) && (EA_COMPILER_INTMAX_SIZE >= 16) - #define EASTL_INT128_SUPPORTED 1 - #else - #define EASTL_INT128_SUPPORTED 0 - #endif -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_GCC_STYLE_INT128_SUPPORTED -// -// Defined as 0 or 1. -// Specifies whether __int128_t/__uint128_t are defined. -// -#ifndef EASTL_GCC_STYLE_INT128_SUPPORTED -#if EASTL_INT128_SUPPORTED && (defined(EA_COMPILER_GNUC) || defined(__clang__)) -#define EASTL_GCC_STYLE_INT128_SUPPORTED 1 -#else -#define EASTL_GCC_STYLE_INT128_SUPPORTED 0 -#endif -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_DEFAULT_ALLOCATOR_ALIGNED_ALLOCATIONS_SUPPORTED -// -// Defined as 0 or 1. -// Tells if you can use the default EASTL allocator to do aligned allocations, -// which for most uses tells if you can store aligned objects in containers -// that use default allocators. It turns out that when built as a DLL for -// some platforms, EASTL doesn't have a way to do aligned allocations, as it -// doesn't have a heap that supports it. There is a way to work around this -// with dynamically defined allocators, but that's currently a to-do. -// -#ifndef EASTL_DEFAULT_ALLOCATOR_ALIGNED_ALLOCATIONS_SUPPORTED - #if EASTL_DLL - #define EASTL_DEFAULT_ALLOCATOR_ALIGNED_ALLOCATIONS_SUPPORTED 0 - #else - #define EASTL_DEFAULT_ALLOCATOR_ALIGNED_ALLOCATIONS_SUPPORTED 1 - #endif -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_INT128_DEFINED -// -// Defined as 0 or 1. -// Specifies whether eastl_int128_t/eastl_uint128_t have been typedef'd yet. -// NB: these types are not considered fundamental, arithmetic or integral when using the EAStdC implementation. -// this changes the compiler type traits defined in type_traits.h. -// eg. is_signed<eastl_int128_t>::value may be false, because it is not arithmetic. -// -#ifndef EASTL_INT128_DEFINED - #if EASTL_INT128_SUPPORTED - #define EASTL_INT128_DEFINED 1 - - #if EASTL_GCC_STYLE_INT128_SUPPORTED - typedef __int128_t eastl_int128_t; - typedef __uint128_t eastl_uint128_t; - #else - typedef int128_t eastl_int128_t; // The EAStdC package defines an EA::StdC::int128_t and uint128_t type, - typedef uint128_t eastl_uint128_t; // though they are currently within the EA::StdC namespace. - #endif - #endif -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_BITSET_WORD_TYPE_DEFAULT / EASTL_BITSET_WORD_SIZE_DEFAULT -// -// Defined as an integral power of two type, usually uint32_t or uint64_t. -// Specifies the word type that bitset should use internally to implement -// storage. By default this is the platform register word size, but there -// may be reasons to use a different value. -// -// Defines the integral data type used by bitset by default. -// You can override this default on a bitset-by-bitset case by supplying a -// custom bitset WordType template parameter. -// -// The C++ standard specifies that the std::bitset word type be unsigned long, -// but that isn't necessarily the most efficient data type for the given platform. -// We can follow the standard and be potentially less efficient or we can do what -// is more efficient but less like the C++ std::bitset. -// -#if !defined(EASTL_BITSET_WORD_TYPE_DEFAULT) - #if defined(EASTL_BITSET_WORD_SIZE) // EASTL_BITSET_WORD_SIZE is deprecated, but we temporarily support the ability for the user to specify it. Use EASTL_BITSET_WORD_TYPE_DEFAULT instead. - #if (EASTL_BITSET_WORD_SIZE == 4) - #define EASTL_BITSET_WORD_TYPE_DEFAULT uint32_t - #define EASTL_BITSET_WORD_SIZE_DEFAULT 4 - #else - #define EASTL_BITSET_WORD_TYPE_DEFAULT uint64_t - #define EASTL_BITSET_WORD_SIZE_DEFAULT 8 - #endif - #elif (EA_PLATFORM_WORD_SIZE == 16) // EA_PLATFORM_WORD_SIZE is defined in EABase. - #define EASTL_BITSET_WORD_TYPE_DEFAULT uint128_t - #define EASTL_BITSET_WORD_SIZE_DEFAULT 16 - #elif (EA_PLATFORM_WORD_SIZE == 8) - #define EASTL_BITSET_WORD_TYPE_DEFAULT uint64_t - #define EASTL_BITSET_WORD_SIZE_DEFAULT 8 - #elif (EA_PLATFORM_WORD_SIZE == 4) - #define EASTL_BITSET_WORD_TYPE_DEFAULT uint32_t - #define EASTL_BITSET_WORD_SIZE_DEFAULT 4 - #else - #define EASTL_BITSET_WORD_TYPE_DEFAULT uint16_t - #define EASTL_BITSET_WORD_SIZE_DEFAULT 2 - #endif -#endif - - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_LIST_SIZE_CACHE -// -// Defined as 0 or 1. Default is 1. Changed from 0 in version 1.16.01. -// If defined as 1, the list and slist containers (and possibly any additional -// containers as well) keep a member mSize (or similar) variable which allows -// the size() member function to execute in constant time (a.k.a. O(1)). -// There are debates on both sides as to whether it is better to have this -// cached value or not, as having it entails some cost (memory and code). -// To consider: Make list size caching an optional template parameter. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_LIST_SIZE_CACHE - #define EASTL_LIST_SIZE_CACHE 1 -#endif - -#ifndef EASTL_SLIST_SIZE_CACHE - #define EASTL_SLIST_SIZE_CACHE 1 -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_MAX_STACK_USAGE -// -// Defined as an integer greater than zero. Default is 4000. -// There are some places in EASTL where temporary objects are put on the -// stack. A common example of this is in the implementation of container -// swap functions whereby a temporary copy of the container is made. -// There is a problem, however, if the size of the item created on the stack -// is very large. This can happen with fixed-size containers, for example. -// The EASTL_MAX_STACK_USAGE define specifies the maximum amount of memory -// (in bytes) that the given platform/compiler will safely allow on the stack. -// Platforms such as Windows will generally allow larger values than embedded -// systems or console machines, but it is usually a good idea to stick with -// a max usage value that is portable across all platforms, lest the user be -// surprised when something breaks as it is ported to another platform. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_MAX_STACK_USAGE - #define EASTL_MAX_STACK_USAGE 4000 -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_VA_COPY_ENABLED -// -// Defined as 0 or 1. Default is 1 for compilers that need it, 0 for others. -// Some compilers on some platforms implement va_list whereby its contents -// are destroyed upon usage, even if passed by value to another function. -// With these compilers you can use va_copy to save and restore a va_list. -// Known compiler/platforms that destroy va_list contents upon usage include: -// CodeWarrior on PowerPC -// GCC on x86-64 -// However, va_copy is part of the C99 standard and not part of earlier C and -// C++ standards. So not all compilers support it. VC++ doesn't support va_copy, -// but it turns out that VC++ doesn't usually need it on the platforms it supports, -// and va_copy can usually be implemented via memcpy(va_list, va_list) with VC++. -// -// Example usage: -// void Function(va_list arguments) -// { -// #if EASTL_VA_COPY_ENABLED -// va_list argumentsCopy; -// va_copy(argumentsCopy, arguments); -// #endif -// <use arguments or argumentsCopy> -// #if EASTL_VA_COPY_ENABLED -// va_end(argumentsCopy); -// #endif -// } -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_VA_COPY_ENABLED - #if ((defined(__GNUC__) && (__GNUC__ >= 3)) || defined(__clang__)) && (!defined(__i386__) || defined(__x86_64__)) && !defined(__ppc__) && !defined(__PPC__) && !defined(__PPC64__) - #define EASTL_VA_COPY_ENABLED 1 - #else - #define EASTL_VA_COPY_ENABLED 0 - #endif -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_OPERATOR_EQUALS_OTHER_ENABLED -// -// Defined as 0 or 1. Default is 0 until such day that it's deemed safe. -// When enabled, enables operator= for other char types, e.g. for code -// like this: -// eastl::string8 s8; -// eastl::string16 s16; -// s8 = s16; -// This option is considered experimental, and may exist as such for an -// indefinite amount of time. -// -#if !defined(EASTL_OPERATOR_EQUALS_OTHER_ENABLED) - #define EASTL_OPERATOR_EQUALS_OTHER_ENABLED 0 -#endif -/////////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_LIST_PROXY_ENABLED -// -#if !defined(EASTL_LIST_PROXY_ENABLED) - // GCC with -fstrict-aliasing has bugs (or undocumented functionality in their - // __may_alias__ implementation. The compiler gets confused about function signatures. - // VC8 (1400) doesn't need the proxy because it has built-in smart debugging capabilities. - #if defined(EASTL_DEBUG) && !defined(__GNUC__) && (!defined(_MSC_VER) || (_MSC_VER < 1400)) - #define EASTL_LIST_PROXY_ENABLED 1 - #define EASTL_LIST_PROXY_MAY_ALIAS EASTL_MAY_ALIAS - #else - #define EASTL_LIST_PROXY_ENABLED 0 - #define EASTL_LIST_PROXY_MAY_ALIAS - #endif -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_STD_ITERATOR_CATEGORY_ENABLED -// -// Defined as 0 or 1. Default is 0. -// If defined as non-zero, EASTL iterator categories (iterator.h's input_iterator_tag, -// forward_iterator_tag, etc.) are defined to be those from std C++ in the std -// namespace. The reason for wanting to enable such a feature is that it allows -// EASTL containers and algorithms to work with std STL containes and algorithms. -// The default value was changed from 1 to 0 in EASL 1.13.03, January 11, 2012. -// The reason for the change was that almost nobody was taking advantage of it and -// it was slowing down compile times for some compilers quite a bit due to them -// having a lot of headers behind <iterator>. -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_STD_ITERATOR_CATEGORY_ENABLED - #define EASTL_STD_ITERATOR_CATEGORY_ENABLED 0 -#endif - -#if EASTL_STD_ITERATOR_CATEGORY_ENABLED - #define EASTL_ITC_NS std -#else - #define EASTL_ITC_NS eastl -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_VALIDATION_ENABLED -// -// Defined as an integer >= 0. Default is to be equal to EASTL_DEBUG. -// If nonzero, then a certain amount of automatic runtime validation is done. -// Runtime validation is not considered the same thing as asserting that user -// input values are valid. Validation refers to internal consistency checking -// of the validity of containers and their iterators. Validation checking is -// something that often involves significantly more than basic assertion -// checking, and it may sometimes be desirable to disable it. -// This macro would generally be used internally by EASTL. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_VALIDATION_ENABLED - #define EASTL_VALIDATION_ENABLED EASTL_DEBUG -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_VALIDATE_COMPARE -// -// Defined as EASTL_ASSERT or defined away. Default is EASTL_ASSERT if EASTL_VALIDATION_ENABLED is enabled. -// This is used to validate user-supplied comparison functions, particularly for sorting purposes. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_VALIDATE_COMPARE_ENABLED - #define EASTL_VALIDATE_COMPARE_ENABLED EASTL_VALIDATION_ENABLED -#endif - -#if EASTL_VALIDATE_COMPARE_ENABLED - #define EASTL_VALIDATE_COMPARE EASTL_ASSERT -#else - #define EASTL_VALIDATE_COMPARE(expression) -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_VALIDATE_INTRUSIVE_LIST -// -// Defined as an integral value >= 0. Controls the amount of automatic validation -// done by intrusive_list. A value of 0 means no automatic validation is done. -// As of this writing, EASTL_VALIDATE_INTRUSIVE_LIST defaults to 0, as it makes -// the intrusive_list_node become a non-POD, which may be an issue for some code. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_VALIDATE_INTRUSIVE_LIST - #define EASTL_VALIDATE_INTRUSIVE_LIST 0 -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_FORCE_INLINE -// -// Defined as a "force inline" expression or defined away. -// You generally don't need to use forced inlining with the Microsoft and -// Metrowerks compilers, but you may need it with the GCC compiler (any version). -// -// Example usage: -// template <typename T, typename Allocator> -// EASTL_FORCE_INLINE typename vector<T, Allocator>::size_type -// vector<T, Allocator>::size() const -// { return mpEnd - mpBegin; } -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_FORCE_INLINE - #define EASTL_FORCE_INLINE EA_FORCE_INLINE -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_MAY_ALIAS -// -// Defined as a macro that wraps the GCC may_alias attribute. This attribute -// has no significance for VC++ because VC++ doesn't support the concept of -// strict aliasing. Users should avoid writing code that breaks strict -// aliasing rules; EASTL_MAY_ALIAS is for cases with no alternative. -// -// Example usage: -// uint32_t value EASTL_MAY_ALIAS; -// -// Example usage: -// typedef uint32_t EASTL_MAY_ALIAS value_type; -// value_type value; -// -#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 303) && !defined(EA_COMPILER_RVCT) - #define EASTL_MAY_ALIAS __attribute__((__may_alias__)) -#else - #define EASTL_MAY_ALIAS -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_LIKELY / EASTL_UNLIKELY -// -// Defined as a macro which gives a hint to the compiler for branch -// prediction. GCC gives you the ability to manually give a hint to -// the compiler about the result of a comparison, though it's often -// best to compile shipping code with profiling feedback under both -// GCC (-fprofile-arcs) and VC++ (/LTCG:PGO, etc.). However, there -// are times when you feel very sure that a boolean expression will -// usually evaluate to either true or false and can help the compiler -// by using an explicity directive... -// -// Example usage: -// if(EASTL_LIKELY(a == 0)) // Tell the compiler that a will usually equal 0. -// { ... } -// -// Example usage: -// if(EASTL_UNLIKELY(a == 0)) // Tell the compiler that a will usually not equal 0. -// { ... } -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_LIKELY - #if defined(__GNUC__) && (__GNUC__ >= 3) - #define EASTL_LIKELY(x) __builtin_expect(!!(x), true) - #define EASTL_UNLIKELY(x) __builtin_expect(!!(x), false) - #else - #define EASTL_LIKELY(x) (x) - #define EASTL_UNLIKELY(x) (x) - #endif -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_STD_TYPE_TRAITS_AVAILABLE -// -// Defined as 0 or 1; default is based on auto-detection. -// Specifies whether Standard C++11 <type_traits> support exists. -// Sometimes the auto-detection below fails to work properly and the -// user needs to override it. Does not define whether the compiler provides -// built-in compiler type trait support (e.g. __is_abstract()), as some -// compilers will EASTL_STD_TYPE_TRAITS_AVAILABLE = 0, but have built -// in type trait support. -// -#ifndef EASTL_STD_TYPE_TRAITS_AVAILABLE - /* Disabled because we don't currently need it. - #if defined(_MSC_VER) && (_MSC_VER >= 1500) // VS2008 or later - #pragma warning(push, 0) - #include <yvals.h> - #pragma warning(pop) - #if ((defined(_HAS_TR1) && _HAS_TR1) || _MSC_VER >= 1700) // VS2012 (1700) and later has built-in type traits support. - #define EASTL_STD_TYPE_TRAITS_AVAILABLE 1 - #include <type_traits> - #else - #define EASTL_STD_TYPE_TRAITS_AVAILABLE 0 - #endif - - #elif defined(EA_COMPILER_CLANG) || (defined(EA_COMPILER_GNUC) && (EA_COMPILER_VERSION >= 4003) && !defined(__GCCXML__)) && !defined(EA_COMPILER_NO_STANDARD_CPP_LIBRARY) - #include <cstddef> // This will define __GLIBCXX__ if using GNU's libstdc++ and _LIBCPP_VERSION if using clang's libc++. - - #if defined(EA_COMPILER_CLANG) && !defined(EA_PLATFORM_APPLE) // As of v3.0.0, Apple's clang doesn't support type traits. - // http://clang.llvm.org/docs/LanguageExtensions.html#checking_type_traits - // Clang has some built-in compiler trait support. This support doesn't currently - // directly cover all our type_traits, though the C++ Standard Library that's used - // with clang could fill that in. - #define EASTL_STD_TYPE_TRAITS_AVAILABLE 1 - #endif - - #if !defined(EASTL_STD_TYPE_TRAITS_AVAILABLE) - #if defined(_LIBCPP_VERSION) // This is defined by clang's libc++. - #include <type_traits> - - #elif defined(__GLIBCXX__) && (__GLIBCXX__ >= 20090124) // It's not clear if this is the oldest version that has type traits; probably it isn't. - #define EASTL_STD_TYPE_TRAITS_AVAILABLE 1 - - #if defined(__GXX_EXPERIMENTAL_CXX0X__) // To do: Update this test to include conforming C++11 implementations. - #include <type_traits> - #else - #include <tr1/type_traits> - #endif - #else - #define EASTL_STD_TYPE_TRAITS_AVAILABLE 0 - #endif - #endif - - #elif defined(__MSL_CPP__) && (__MSL_CPP__ >= 0x8000) // CodeWarrior compiler. - #define EASTL_STD_TYPE_TRAITS_AVAILABLE 0 - // To do: Implement support for this (via modifying the EASTL type - // traits headers, as CodeWarrior provides this. - #else - #define EASTL_STD_TYPE_TRAITS_AVAILABLE 0 - #endif - */ -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_COMPILER_INTRINSIC_TYPE_TRAITS_AVAILABLE -// -// Defined as 0 or 1; default is based on auto-detection. -// Specifies whether the compiler provides built-in compiler type trait support -// (e.g. __is_abstract()). Does not specify any details about which traits -// are available or what their standards-compliance is. Nevertheless this is a -// useful macro identifier for our type traits implementation. -// -#ifndef EASTL_COMPILER_INTRINSIC_TYPE_TRAITS_AVAILABLE - #if defined(_MSC_VER) && (_MSC_VER >= 1500) && !defined(EA_COMPILER_CLANG_CL) // VS2008 or later - #pragma warning(push, 0) - #include <yvals.h> - #pragma warning(pop) - #if ((defined(_HAS_TR1) && _HAS_TR1) || _MSC_VER >= 1700) // VS2012 (1700) and later has built-in type traits support. - #define EASTL_COMPILER_INTRINSIC_TYPE_TRAITS_AVAILABLE 1 - #else - #define EASTL_COMPILER_INTRINSIC_TYPE_TRAITS_AVAILABLE 0 - #endif - #elif defined(__clang__) && defined(__APPLE__) && defined(_CXXCONFIG) // Apple clang but with GCC's libstdc++. - #define EASTL_COMPILER_INTRINSIC_TYPE_TRAITS_AVAILABLE 0 - #elif defined(__clang__) - #define EASTL_COMPILER_INTRINSIC_TYPE_TRAITS_AVAILABLE 1 - #elif defined(EA_COMPILER_GNUC) && (EA_COMPILER_VERSION >= 4003) && !defined(__GCCXML__) - #define EASTL_COMPILER_INTRINSIC_TYPE_TRAITS_AVAILABLE 1 - #elif defined(__MSL_CPP__) && (__MSL_CPP__ >= 0x8000) // CodeWarrior compiler. - #define EASTL_COMPILER_INTRINSIC_TYPE_TRAITS_AVAILABLE 1 - #else - #define EASTL_COMPILER_INTRINSIC_TYPE_TRAITS_AVAILABLE 0 - #endif -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_RESET_ENABLED -// -// Defined as 0 or 1; default is 1 for the time being. -// The reset_lose_memory function works the same as reset, as described below. -// -// Specifies whether the container reset functionality is enabled. If enabled -// then <container>::reset forgets its memory, otherwise it acts as the clear -// function. The reset function is potentially dangerous, as it (by design) -// causes containers to not free their memory. -// This option has no applicability to the bitset::reset function, as bitset -// isn't really a container. Also it has no applicability to the smart pointer -// wrappers (e.g. intrusive_ptr). -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_RESET_ENABLED - #define EASTL_RESET_ENABLED 0 -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_MINMAX_ENABLED -// -// Defined as 0 or 1; default is 1. -// Specifies whether the min and max algorithms are available. -// It may be useful to disable the min and max algorithms because sometimes -// #defines for min and max exist which would collide with EASTL min and max. -// Note that there are already alternative versions of min and max in EASTL -// with the min_alt and max_alt functions. You can use these without colliding -// with min/max macros that may exist. -// -/////////////////////////////////////////////////////////////////////////////// -#ifndef EASTL_MINMAX_ENABLED - #define EASTL_MINMAX_ENABLED 1 -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_NOMINMAX -// -// Defined as 0 or 1; default is 1. -// MSVC++ has #defines for min/max which collide with the min/max algorithm -// declarations. If EASTL_NOMINMAX is defined as 1, then we undefine min and -// max if they are #defined by an external library. This allows our min and -// max definitions in algorithm.h to work as expected. An alternative to -// the enabling of EASTL_NOMINMAX is to #define NOMINMAX in your project -// settings if you are compiling for Windows. -// Note that this does not control the availability of the EASTL min and max -// algorithms; the EASTL_MINMAX_ENABLED configuration parameter does that. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_NOMINMAX - #define EASTL_NOMINMAX 1 -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_STD_CPP_ONLY -// -// Defined as 0 or 1; default is 0. -// Disables the use of compiler language extensions. We use compiler language -// extensions only in the case that they provide some benefit that can't be -// had any other practical way. But sometimes the compiler is set to disable -// language extensions or sometimes one compiler's preprocesor is used to generate -// code for another compiler, and so it's necessary to disable language extension usage. -// -// Example usage: -// #if defined(_MSC_VER) && !EASTL_STD_CPP_ONLY -// enum : size_type { npos = container_type::npos }; // Microsoft extension which results in significantly smaller debug symbols. -// #else -// static const size_type npos = container_type::npos; -// #endif -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_STD_CPP_ONLY - #define EASTL_STD_CPP_ONLY 0 -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_NO_RVALUE_REFERENCES -// -// Defined as 0 or 1. -// This is the same as EABase EA_COMPILER_NO_RVALUE_REFERENCES except that it -// follows the convention of being always defined, as 0 or 1. -/////////////////////////////////////////////////////////////////////////////// -#if !defined(EASTL_NO_RVALUE_REFERENCES) - #if defined(EA_COMPILER_NO_RVALUE_REFERENCES) - #define EASTL_NO_RVALUE_REFERENCES 1 - #else - #define EASTL_NO_RVALUE_REFERENCES 0 - #endif -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_MOVE_SEMANTICS_ENABLED -// -// Defined as 0 or 1. -// If enabled then C++11-like functionality with rvalue references and move -// operations is enabled. -/////////////////////////////////////////////////////////////////////////////// -#if !defined(EASTL_MOVE_SEMANTICS_ENABLED) - #if EASTL_NO_RVALUE_REFERENCES // If the compiler doesn't support rvalue references or EASTL is configured to disable them... - #define EASTL_MOVE_SEMANTICS_ENABLED 0 - #else - #define EASTL_MOVE_SEMANTICS_ENABLED 1 - #endif -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_VARIADIC_TEMPLATES_ENABLED -// -// Defined as 0 or 1. -// If enabled then C++11-like functionality with variadic templates is enabled. -/////////////////////////////////////////////////////////////////////////////// -#if !defined(EASTL_VARIADIC_TEMPLATES_ENABLED) - #if defined(EA_COMPILER_NO_VARIADIC_TEMPLATES) // If the compiler doesn't support variadic templates - #define EASTL_VARIADIC_TEMPLATES_ENABLED 0 - #else - #define EASTL_VARIADIC_TEMPLATES_ENABLED 1 - #endif -#endif - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_VARIABLE_TEMPLATES_ENABLED -// -// Defined as 0 or 1. -// If enabled then C++11-like functionality with variable templates is enabled. -/////////////////////////////////////////////////////////////////////////////// -#if !defined(EASTL_VARIABLE_TEMPLATES_ENABLED) - #if((EABASE_VERSION_N < 20605) || defined(EA_COMPILER_NO_VARIABLE_TEMPLATES)) - #define EASTL_VARIABLE_TEMPLATES_ENABLED 0 - #else - #define EASTL_VARIABLE_TEMPLATES_ENABLED 1 - #endif -#endif - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_INLINE_VARIABLE_ENABLED -// -// Defined as 0 or 1. -// If enabled then C++17-like functionality with inline variable is enabled. -/////////////////////////////////////////////////////////////////////////////// -#if !defined(EASTL_INLINE_VARIABLE_ENABLED) - #if((EABASE_VERSION_N < 20707) || defined(EA_COMPILER_NO_INLINE_VARIABLES)) - #define EASTL_INLINE_VARIABLE_ENABLED 0 - #else - #define EASTL_INLINE_VARIABLE_ENABLED 1 - #endif -#endif - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_CPP17_INLINE_VARIABLE -// -// Used to prefix a variable as inline when C++17 inline variables are available -// Usage: EASTL_CPP17_INLINE_VARIABLE constexpr bool type_trait_v = type_trait::value -/////////////////////////////////////////////////////////////////////////////// -#if !defined(EASTL_CPP17_INLINE_VARIABLE) - #if EASTL_INLINE_VARIABLE_ENABLED - #define EASTL_CPP17_INLINE_VARIABLE inline - #else - #define EASTL_CPP17_INLINE_VARIABLE - #endif -#endif - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_HAVE_CPP11_TYPE_TRAITS -// -// Defined as 0 or 1. -// This is the same as EABase EA_HAVE_CPP11_TYPE_TRAITS except that it -// follows the convention of being always defined, as 0 or 1. Note that this -// identifies if the Standard Library has C++11 type traits and not if EASTL -// has its equivalents to C++11 type traits. -/////////////////////////////////////////////////////////////////////////////// -#if !defined(EASTL_HAVE_CPP11_TYPE_TRAITS) - // To do: Change this to use the EABase implementation once we have a few months of testing - // of this and we are sure it works right. Do this at some point after ~January 2014. - #if defined(EA_HAVE_DINKUMWARE_CPP_LIBRARY) && (_CPPLIB_VER >= 540) // Dinkumware. VS2012+ - #define EASTL_HAVE_CPP11_TYPE_TRAITS 1 - #elif defined(EA_COMPILER_CPP11_ENABLED) && defined(EA_HAVE_LIBSTDCPP_LIBRARY) && defined(EA_COMPILER_GNUC) && (EA_COMPILER_VERSION >= 4007) // Prior versions of libstdc++ have incomplete support for C++11 type traits. - #define EASTL_HAVE_CPP11_TYPE_TRAITS 1 - #elif defined(EA_HAVE_LIBCPP_LIBRARY) && (_LIBCPP_VERSION >= 1) - #define EASTL_HAVE_CPP11_TYPE_TRAITS 1 - #else - #define EASTL_HAVE_CPP11_TYPE_TRAITS 0 - #endif -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EA_COMPILER_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS undef -// -// We need revise this macro to be undefined in some cases, in case the user -// isn't using an updated EABase. -/////////////////////////////////////////////////////////////////////////////// -#if defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 403) // It may in fact be supported by 4.01 or 4.02 but we don't have compilers to test with. - #if defined(EA_COMPILER_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS) - #undef EA_COMPILER_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS - #endif -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_NO_RANGE_BASED_FOR_LOOP -// -// Defined as 0 or 1. -// This is the same as EABase EA_COMPILER_NO_RANGE_BASED_FOR_LOOP except that it -// follows the convention of being always defined, as 0 or 1. -/////////////////////////////////////////////////////////////////////////////// -#if !defined(EASTL_NO_RANGE_BASED_FOR_LOOP) - #if defined(EA_COMPILER_NO_RANGE_BASED_FOR_LOOP) - #define EASTL_NO_RANGE_BASED_FOR_LOOP 1 - #else - #define EASTL_NO_RANGE_BASED_FOR_LOOP 0 - #endif -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_ALIGN_OF -// -// Determines the alignment of a type. -// -// Example usage: -// size_t alignment = EASTL_ALIGN_OF(int); -// -/////////////////////////////////////////////////////////////////////////////// -#ifndef EASTL_ALIGN_OF - #define EASTL_ALIGN_OF alignof -#endif - - - - -/////////////////////////////////////////////////////////////////////////////// -// eastl_size_t -// -// Defined as an unsigned integer type, usually either size_t or uint32_t. -// Defaults to size_t to match std STL unless the user specifies to use -// uint32_t explicitly via the EASTL_SIZE_T_32BIT define -// -// Example usage: -// eastl_size_t n = intVector.size(); -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_SIZE_T_32BIT // Defines whether EASTL_SIZE_T uses uint32_t/int32_t as opposed to size_t/ssize_t. - #define EASTL_SIZE_T_32BIT 0 // This makes a difference on 64 bit platforms because they use a 64 bit size_t. -#endif // By default we do the same thing as std STL and use size_t. - -#ifndef EASTL_SIZE_T - #if (EASTL_SIZE_T_32BIT == 0) || (EA_PLATFORM_WORD_SIZE == 4) - #include <stddef.h> - #define EASTL_SIZE_T size_t - #define EASTL_SSIZE_T intptr_t - #else - #define EASTL_SIZE_T uint32_t - #define EASTL_SSIZE_T int32_t - #endif -#endif - -typedef EASTL_SIZE_T eastl_size_t; // Same concept as std::size_t. -typedef EASTL_SSIZE_T eastl_ssize_t; // Signed version of eastl_size_t. Concept is similar to Posix's ssize_t. - - - - -/////////////////////////////////////////////////////////////////////////////// -// AddRef / Release -// -// AddRef and Release are used for "intrusive" reference counting. By the term -// "intrusive", we mean that the reference count is maintained by the object -// and not by the user of the object. Given that an object implements referencing -// counting, the user of the object needs to be able to increment and decrement -// that reference count. We do that via the venerable AddRef and Release functions -// which the object must supply. These defines here allow us to specify the name -// of the functions. They could just as well be defined to addref and delref or -// IncRef and DecRef. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTLAddRef - #define EASTLAddRef AddRef -#endif - -#ifndef EASTLRelease - #define EASTLRelease Release -#endif - - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_ALLOCATOR_EXPLICIT_ENABLED -// -// Defined as 0 or 1. Default is 0 for now but ideally would be changed to -// 1 some day. It's 0 because setting it to 1 breaks some existing code. -// This option enables the allocator ctor to be explicit, which avoids -// some undesirable silent conversions, especially with the string class. -// -// Example usage: -// class allocator -// { -// public: -// EASTL_ALLOCATOR_EXPLICIT allocator(const char* pName); -// }; -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef EASTL_ALLOCATOR_EXPLICIT_ENABLED - #define EASTL_ALLOCATOR_EXPLICIT_ENABLED 0 -#endif - -#if EASTL_ALLOCATOR_EXPLICIT_ENABLED - #define EASTL_ALLOCATOR_EXPLICIT explicit -#else - #define EASTL_ALLOCATOR_EXPLICIT -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_ALLOCATOR_MIN_ALIGNMENT -// -// Defined as an integral power-of-2 that's >= 1. -// Identifies the minimum alignment that EASTL should assume its allocators -// use. There is code within EASTL that decides whether to do a Malloc or -// MallocAligned call and it's typically better if it can use the Malloc call. -// But this requires knowing what the minimum possible alignment is. -#if !defined(EASTL_ALLOCATOR_MIN_ALIGNMENT) - #define EASTL_ALLOCATOR_MIN_ALIGNMENT EA_PLATFORM_MIN_MALLOC_ALIGNMENT -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL_SYSTEM_ALLOCATOR_MIN_ALIGNMENT -// -// Identifies the minimum alignment that EASTL should assume system allocations -// from malloc and new will have. -#if !defined(EASTL_SYSTEM_ALLOCATOR_MIN_ALIGNMENT) - #if defined(EA_PLATFORM_MICROSOFT) || defined(EA_PLATFORM_APPLE) - #define EASTL_SYSTEM_ALLOCATOR_MIN_ALIGNMENT 16 - #else - #define EASTL_SYSTEM_ALLOCATOR_MIN_ALIGNMENT (EA_PLATFORM_PTR_SIZE * 2) - #endif -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// EASTL allocator -// -// The EASTL allocator system allows you to redefine how memory is allocated -// via some defines that are set up here. In the container code, memory is -// allocated via macros which expand to whatever the user has them set to -// expand to. Given that there are multiple allocator systems available, -// this system allows you to configure it to use whatever system you want, -// provided your system meets the requirements of this library. -// The requirements are: -// -// - Must be constructable via a const char* (name) parameter. -// Some uses of allocators won't require this, however. -// - Allocate a block of memory of size n and debug name string. -// - Allocate a block of memory of size n, debug name string, -// alignment a, and offset o. -// - Free memory allocated via either of the allocation functions above. -// - Provide a default allocator instance which can be used if the user -// doesn't provide a specific one. -// -/////////////////////////////////////////////////////////////////////////////// - -// namespace eastl -// { -// class allocator -// { -// allocator(const char* pName = NULL); -// -// void* allocate(size_t n, int flags = 0); -// void* allocate(size_t n, size_t alignment, size_t offset, int flags = 0); -// void deallocate(void* p, size_t n); -// -// const char* get_name() const; -// void set_name(const char* pName); -// }; -// -// allocator* GetDefaultAllocator(); // This is used for anonymous allocations. -// } - -#ifndef EASTLAlloc // To consider: Instead of calling through pAllocator, just go directly to operator new, since that's what allocator does. - #define EASTLAlloc(allocator, n) (allocator).allocate(n); -#endif - -#ifndef EASTLAllocFlags // To consider: Instead of calling through pAllocator, just go directly to operator new, since that's what allocator does. - #define EASTLAllocFlags(allocator, n, flags) (allocator).allocate(n, flags); -#endif - -#ifndef EASTLAllocAligned - #define EASTLAllocAligned(allocator, n, alignment, offset) (allocator).allocate((n), (alignment), (offset)) -#endif - -#ifndef EASTLAllocAlignedFlags - #define EASTLAllocAlignedFlags(allocator, n, alignment, offset, flags) (allocator).allocate((n), (alignment), (offset), (flags)) -#endif - -#ifndef EASTLFree - #define EASTLFree(allocator, p, size) (allocator).deallocate((void*)(p), (size)) // Important to cast to void* as p may be non-const. -#endif - -#ifndef EASTLAllocatorType - #define EASTLAllocatorType eastl::allocator -#endif - -#ifndef EASTLDummyAllocatorType - #define EASTLDummyAllocatorType eastl::dummy_allocator -#endif - -#ifndef EASTLAllocatorDefault - // EASTLAllocatorDefault returns the default allocator instance. This is not a global - // allocator which implements all container allocations but is the allocator that is - // used when EASTL needs to allocate memory internally. There are very few cases where - // EASTL allocates memory internally, and in each of these it is for a sensible reason - // that is documented to behave as such. - #define EASTLAllocatorDefault eastl::GetDefaultAllocator -#endif - - -/// EASTL_ALLOCATOR_DEFAULT_NAME -/// -/// Defines a default allocator name in the absence of a user-provided name. -/// -#ifndef EASTL_ALLOCATOR_DEFAULT_NAME - #define EASTL_ALLOCATOR_DEFAULT_NAME EASTL_DEFAULT_NAME_PREFIX // Unless the user overrides something, this is "EASTL". -#endif - -/// EASTL_USE_FORWARD_WORKAROUND -/// -/// This is to workaround a compiler bug that we found in VS2013. Update 1 did not fix it. -/// This should be fixed in a future release of VS2013 http://accentuable4.rssing.com/browser.php?indx=3511740&item=15696 -/// -#ifndef EASTL_USE_FORWARD_WORKAROUND - #if defined(_MSC_FULL_VER) && _MSC_FULL_VER == 180021005 || (defined(__EDG_VERSION__) && (__EDG_VERSION__ < 405))// VS2013 initial release - #define EASTL_USE_FORWARD_WORKAROUND 1 - #else - #define EASTL_USE_FORWARD_WORKAROUND 0 - #endif -#endif - - -/// EASTL_TUPLE_ENABLED -/// EASTL tuple implementation depends on variadic template support -#if EASTL_VARIADIC_TEMPLATES_ENABLED && !defined(EA_COMPILER_NO_TEMPLATE_ALIASES) - #define EASTL_TUPLE_ENABLED 1 -#else - #define EASTL_TUPLE_ENABLED 0 -#endif - - -/// EASTL_FUNCTION_ENABLED -/// -#ifndef EASTL_FUNCTION_ENABLED - #define EASTL_FUNCTION_ENABLED 1 -#endif - - -/// EASTL_USER_LITERALS_ENABLED -#ifndef EASTL_USER_LITERALS_ENABLED - #if defined(EA_COMPILER_CPP14_ENABLED) - #define EASTL_USER_LITERALS_ENABLED 1 - #else - #define EASTL_USER_LITERALS_ENABLED 0 - #endif -#endif - - -/// EASTL_INLINE_NAMESPACES_ENABLED -#ifndef EASTL_INLINE_NAMESPACES_ENABLED - #if defined(EA_COMPILER_CPP14_ENABLED) - #define EASTL_INLINE_NAMESPACES_ENABLED 1 - #else - #define EASTL_INLINE_NAMESPACES_ENABLED 0 - #endif -#endif - - -/// EASTL_CORE_ALLOCATOR_ENABLED -#ifndef EASTL_CORE_ALLOCATOR_ENABLED - #define EASTL_CORE_ALLOCATOR_ENABLED 0 -#endif - -/// EASTL_OPENSOURCE -/// This is enabled when EASTL is building built in an "open source" mode. Which is a mode that eliminates code -/// dependencies on other technologies that have not been released publically. -/// EASTL_OPENSOURCE = 0, is the default. -/// EASTL_OPENSOURCE = 1, utilizes technologies that not publically available. -/// -#ifndef EASTL_OPENSOURCE - #define EASTL_OPENSOURCE 0 -#endif - - -/// EASTL_OPTIONAL_ENABLED -#if defined(EA_COMPILER_MSVC_2012) - #define EASTL_OPTIONAL_ENABLED 0 -#elif defined(EA_COMPILER_MSVC_2013) - #define EASTL_OPTIONAL_ENABLED 0 -#elif defined(EA_COMPILER_MSVC_2015) - #define EASTL_OPTIONAL_ENABLED 1 -#elif EASTL_VARIADIC_TEMPLATES_ENABLED && !defined(EA_COMPILER_NO_TEMPLATE_ALIASES) && !defined(EA_COMPILER_NO_DEFAULTED_FUNCTIONS) && defined(EA_COMPILER_CPP11_ENABLED) - #define EASTL_OPTIONAL_ENABLED 1 -#else - #define EASTL_OPTIONAL_ENABLED 0 -#endif - - -/// EASTL_HAS_UNIQUE_OBJECT_REPRESENTATIONS_AVAILABLE -#if defined(__clang__) - // NB: !__is_identifier() is correct: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66970#c11 - #if !__is_identifier(__has_unique_object_representations) - #define EASTL_HAS_UNIQUE_OBJECT_REPRESENTATIONS_AVAILABLE 1 - #else - #define EASTL_HAS_UNIQUE_OBJECT_REPRESENTATIONS_AVAILABLE 0 - #endif -#elif defined(_MSC_VER) && (_MSC_VER >= 1913) // VS2017 15.6+ - #define EASTL_HAS_UNIQUE_OBJECT_REPRESENTATIONS_AVAILABLE 1 -#else - #define EASTL_HAS_UNIQUE_OBJECT_REPRESENTATIONS_AVAILABLE 0 -#endif - -#if defined(__clang__) - // NB: !__is_identifier() is correct: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66970#c11 - #if !__is_identifier(__is_final) - #define EASTL_IS_FINAL_AVAILABLE 1 - #else - #define EASTL_IS_FINAL_AVAILABLE 0 - #endif -#elif defined(_MSC_VER) && (_MSC_VER >= 1914) // VS2017 15.7+ - #define EASTL_IS_FINAL_AVAILABLE 1 -#elif defined(EA_COMPILER_GNUC) - #define EASTL_IS_FINAL_AVAILABLE 1 -#else - #define EASTL_IS_FINAL_AVAILABLE 0 -#endif - -#if defined(__clang__) - // NB: !__is_identifier() is correct: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66970#c11 - #if !__is_identifier(__is_aggregate) - #define EASTL_IS_AGGREGATE_AVAILABLE 1 - #else - #define EASTL_IS_AGGREGATE_AVAILABLE 0 - #endif -#elif defined(_MSC_VER) && (_MSC_VER >= 1915) // VS2017 15.8+ - #define EASTL_IS_AGGREGATE_AVAILABLE 1 -#elif defined(EA_COMPILER_GNUC) - #define EASTL_IS_AGGREGATE_AVAILABLE 1 -#else - #define EASTL_IS_AGGREGATE_AVAILABLE 0 -#endif - - -/// EASTL_ENABLE_PAIR_FIRST_ELEMENT_CONSTRUCTOR -/// This feature define allows users to toggle the problematic eastl::pair implicit -/// single element constructor. -#ifndef EASTL_ENABLE_PAIR_FIRST_ELEMENT_CONSTRUCTOR - #define EASTL_ENABLE_PAIR_FIRST_ELEMENT_CONSTRUCTOR 0 -#endif - -/// EASTL_SYSTEM_BIG_ENDIAN_STATEMENT -/// EASTL_SYSTEM_LITTLE_ENDIAN_STATEMENT -/// These macros allow you to write endian specific macros as statements. -/// This allows endian specific code to be macro expanded from within other macros -/// -#if defined(EA_SYSTEM_BIG_ENDIAN) - #define EASTL_SYSTEM_BIG_ENDIAN_STATEMENT(...) __VA_ARGS__ -#else - #define EASTL_SYSTEM_BIG_ENDIAN_STATEMENT(...) -#endif - -#if defined(EA_SYSTEM_LITTLE_ENDIAN) - #define EASTL_SYSTEM_LITTLE_ENDIAN_STATEMENT(...) __VA_ARGS__ -#else - #define EASTL_SYSTEM_LITTLE_ENDIAN_STATEMENT(...) -#endif - -/// EASTL_CONSTEXPR_BIT_CAST_SUPPORTED -/// eastl::bit_cast, in order to be implemented as constexpr, requires explicit compiler support. -/// This macro defines whether it's possible for bit_cast to be constexpr. -/// -#if (defined(EA_COMPILER_MSVC) && defined(EA_COMPILER_MSVC_VERSION_14_26) && EA_COMPILER_VERSION >= EA_COMPILER_MSVC_VERSION_14_26) \ - || EA_COMPILER_HAS_BUILTIN(__builtin_bit_cast) - #define EASTL_CONSTEXPR_BIT_CAST_SUPPORTED 1 -#else - #define EASTL_CONSTEXPR_BIT_CAST_SUPPORTED 0 -#endif - - - -#endif // Header include guard |