You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

281 lines
9.2 KiB

////////////////////////////////////////////////////////////////////
// Config.h
//
// Copyright 2007 cDc@seacave
// Distributed under the Boost Software License, Version 1.0
// (See http://www.boost.org/LICENSE_1_0.txt)
#ifndef __SEACAVE_CONFIG_H__
#define __SEACAVE_CONFIG_H__
// Configure everything that needs to be globally known
#include "ConfigLocal.h"
// D E F I N E S ///////////////////////////////////////////////////
#ifdef _MSC_VER
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#if _MSC_VER > 1400
#ifndef NTDDI_VERSION // There's now just one symbol to specify the minimum target operating system.
#define NTDDI_VERSION NTDDI_WIN7 // All the other symbols are set automatically to the appropriate values for the target operating system.
#endif
#else
#ifndef WINVER // Allow use of features specific to Windows 95 and Windows NT 4 or later.
#define WINVER 0x0500 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif
#ifndef _WIN32_WINNT // Allow use of features specific to Windows NT 4 or later.
#define _WIN32_WINNT 0x0500 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif
#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif
#ifndef _WIN32_IE // Allow use of features specific to IE 4.0 or later.
#define _WIN32_IE 0x0501 // Change this to the appropriate value to target IE 5.0 or later.
#endif
#endif
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#endif
#ifndef STRICT
#define STRICT
#endif
#define WIN32_MEAN_AND_LEAN
#define NOMINMAX
#define _USE_MATH_DEFINES
#if _MSC_VER >= 1400
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS 1
#endif
#ifndef _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_DEPRECATE 1
#endif
#ifndef _ATL_SECURE_NO_DEPRECATE
#define _ATL_SECURE_NO_DEPRECATE 1
#endif
#ifndef _CRT_NON_CONFORMING_SWPRINTFS
#define _CRT_NON_CONFORMING_SWPRINTFS 1
#endif
#ifndef _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 0 // disable automatically overloading CPP names to secure versions
#endif
#if 0 && defined(_DEBUG) && !defined(_ITERATOR_DEBUG_LEVEL) // might not build if linking statically to 3rd party libraries
#define _ITERATOR_DEBUG_LEVEL 1 // disable std iterator debugging even in Debug, as it is very slow
#endif
#endif
//----------------------------------------------------------------------
// For Microsoft Visual C++, externally accessible symbols must be
// explicitly indicated with DLL_API.
//
// The following ifdef block is the standard way of creating macros
// which make exporting from a DLL simpler. All files within this DLL
// are compiled with the DLL_EXPORTS preprocessor symbol defined on the
// command line. In contrast, projects that use (or import) the DLL
// objects do not define the DLL_EXPORTS symbol. This way any other
// project whose source files include this file see DLL_API functions as
// being imported from a DLL, whereas this DLL sees symbols defined with
// this macro as being exported.
//----------------------------------------------------------------------
#define EXPORT_API __declspec(dllexport)
#define IMPORT_API __declspec(dllimport)
/*----------------------------------------------------------------*/
#ifdef _USRDLL
#ifdef Common_EXPORTS
#define GENERAL_API EXPORT_API
#define GENERAL_TPL
#else
#define GENERAL_API IMPORT_API
#define GENERAL_TPL extern
#endif
#else
#define GENERAL_API
#define GENERAL_TPL
#endif
/*----------------------------------------------------------------*/
// Define platform type
#if _WIN64
#define _ENVIRONMENT64
#else
#define _ENVIRONMENT32
#endif
#else // _MSC_VER
#if !defined(_DEBUG) && !defined(NDEBUG)
#define _DEBUG
#endif
//----------------------------------------------------------------------
// DLL_API is ignored for all other systems
//----------------------------------------------------------------------
#define EXPORT_API
#define IMPORT_API
#define GENERAL_API
#define GENERAL_TPL
// Define platform type
#if __x86_64__ || __ppc64__
#define _ENVIRONMENT64
#else
#define _ENVIRONMENT32
#endif
#endif // _MSC_VER
#if __cplusplus >= 201103L || (__clang_major__ >= 4 || (__clang_major__ >= 3 && __clang_minor__ >= 3))
#define _SUPPORT_CPP11
#endif
#if __cplusplus >= 201402L || (__clang_major__ >= 4 || (__clang_major__ >= 3 && __clang_minor__ >= 4))
#define _SUPPORT_CPP14
#endif
#if __cplusplus >= 201703L || __clang_major__ >= 5
#define _SUPPORT_CPP17
#endif
#if __cplusplus >= 202002L || __clang_major__ >= 10
#define _SUPPORT_CPP20
#endif
#if defined(__powerpc__)
#define _PLATFORM_PPC 1
#elif defined(__arm__) || defined (__arm64__) || defined(__aarch64__) || defined(_M_ARM) || defined(_M_ARMT)
#define _PLATFORM_ARM 1
#else
#define _PLATFORM_X86 1
#endif
#if !defined(_DEBUG) && !defined(_PROFILE)
#define _RELEASE // exclude code useful only for debug
#endif
//optimization flags
#if defined(_MSC_VER)
# define ALIGN(n) __declspec(align(n))
# define NOINITVTABLE __declspec(novtable) //disable generating code to initialize the vfptr in the constructor(s) and destructor of the class
# define DECRESTRICT __declspec(restrict) //applied to a function declaration or definition that returns a pointer type and tells the compiler that the function returns an object that will not be aliased with any other pointers
# define NOALIAS __declspec(noalias) //applied to a function declaration or definition that returns a pointer type and tells the compiler that the function call does not modify or reference visible global state and only modifies the memory pointed to directly by pointer parameters (first-level indirections)
# define RESTRICT __restrict //applied to a function parameter
# define MEMALLOC __declspec(noalias) __declspec(restrict)
# define DEPRECATED __declspec(deprecated)
# define MAYBEUNUSED
# define HOT
# define COLD
# define THREADLOCAL __declspec(thread)
# define FORCEINLINE __forceinline
#elif defined(__GNUC__)
# define ALIGN(n) __attribute__((aligned(n)))
# define NOINITVTABLE
# define DECRESTRICT
# define NOALIAS
# define RESTRICT __restrict__
# define MEMALLOC __attribute__ ((__malloc__))
# define DEPRECATED __attribute__ ((__deprecated__))
# define MAYBEUNUSED __attribute__ ((unused))
# define HOT __attribute__((hot)) __attribute__((optimize("-O3"))) __attribute__((optimize("-ffast-math"))) //optimize for speed, even in debug
# define COLD __attribute__((cold)) //optimize for size
# define THREADLOCAL __thread
# define FORCEINLINE inline //__attribute__((always_inline))
#else
# define ALIGN(n)
# define NOINITVTABLE
# define DECRESTRICT
# define NOALIAS
# define RESTRICT
# define MEMALLOC
# define DEPRECATED
# define MAYBEUNUSED
# define HOT
# define COLD
# define THREADLOCAL __thread
# define FORCEINLINE inline
#endif
#ifndef _SUPPORT_CPP11
# define constexpr inline
#endif
#ifdef _SUPPORT_CPP17
# undef MAYBEUNUSED
# define MAYBEUNUSED [[maybe_unused]]
#endif
#define SAFE_DELETE(p) { if (p!=NULL) { delete (p); (p)=NULL; } }
#define SAFE_DELETE_ARR(p) { if (p!=NULL) { delete [] (p); (p)=NULL; } }
#define SAFE_FREE(p) { if (p!=NULL) { free(p); (p)=NULL; } }
#define SAFE_RELEASE(p) { if (p!=NULL) { (p)->Release(); (p)=NULL; } }
#ifdef _DEBUG
#ifdef _MSC_VER
#define _DEBUGINFO
#define _CRTDBG_MAP_ALLOC //enable this to show also the filename (DEBUG_NEW should also be defined in each file)
#include <cstdlib>
#include <crtdbg.h>
#ifdef _INC_CRTDBG
#define ASSERT(exp) {if (!(exp) && 1 == _CrtDbgReport(_CRT_ASSERT, __FILE__, __LINE__, NULL, #exp)) _CrtDbgBreak();}
#else
#define ASSERT(exp) {if (!(exp)) __debugbreak();}
#endif // _INC_CRTDBG
#define TRACE(...) {TCHAR buffer[2048]; _sntprintf(buffer, 2048, __VA_ARGS__); OutputDebugString(buffer);}
#else // _MSC_VER
#include <assert.h>
#define ASSERT(exp) assert(exp)
#define TRACE(...)
#endif // _MSC_VER
#else
#ifdef _RELEASE
#define ASSERT(exp)
#else
#ifdef _MSC_VER
#define ASSERT(exp) {if (!(exp)) __debugbreak();}
#else // _MSC_VER
#define ASSERT(exp) {if (!(exp)) __builtin_trap();}
#endif // _MSC_VER
#endif
#define TRACE(...)
#endif // _DEBUG
#define ASSERTM(exp, msg) ASSERT(exp)
namespace SEACAVE_ASSERT
{
template <bool value> struct compile_time_assert;
template <> struct compile_time_assert<true> { enum {value=1}; };
template <typename T, typename U> struct assert_are_same_type;
template <typename T> struct assert_are_same_type<T,T> { enum{value=1}; };
template <typename T, typename U> struct assert_are_not_same_type { enum{value=1}; };
template <typename T> struct assert_are_not_same_type<T,T> {};
}
#define STATIC_ASSERT(expression) \
MAYBEUNUSED typedef char CTA##__LINE__[::SEACAVE_ASSERT::compile_time_assert<(bool)(expression)>::value]
#define ASSERT_ARE_SAME_TYPE(type1, type2) \
MAYBEUNUSED typedef char AAST##__LINE__[::SEACAVE_ASSERT::assert_are_same_type<type1,type2>::value]
#define ASSERT_ARE_NOT_SAME_TYPE(type1, type2) \
MAYBEUNUSED typedef char AANST##__LINE__[::SEACAVE_ASSERT::assert_are_not_same_type<type1,type2>::value]
/*----------------------------------------------------------------*/
#endif // __SEACAVE_CONFIG_H__