#pragma once
#include "box2d/base.h"
#define B2_NULL_INDEX ( -1 )
#define B2_RESTRICT restrict
#ifdef NDEBUG
#define B2_DEBUG 0
#else
#define B2_DEBUG 1
#endif
#if defined( BOX2D_VALIDATE ) && !defined( NDEBUG )
#define B2_VALIDATE 1
#else
#define B2_VALIDATE 0
#endif
#if defined( _WIN64 )
#define B2_PLATFORM_WINDOWS
#elif defined( __ANDROID__ )
#define B2_PLATFORM_ANDROID
#elif defined( __linux__ )
#define B2_PLATFORM_LINUX
#elif defined( __APPLE__ )
#include <TargetConditionals.h>
#if defined( TARGET_OS_IPHONE ) && !TARGET_OS_IPHONE
#define B2_PLATFORM_MACOS
#else
#define B2_PLATFORM_IOS
#endif
#elif defined( __EMSCRIPTEN__ )
#define B2_PLATFORM_WASM
#else
#define B2_PLATFORM_UNKNOWN
#endif
#if defined( __x86_64__ ) || defined( _M_X64 ) || defined( __i386__ ) || defined( _M_IX86 )
#define B2_CPU_X86_X64
#elif defined( __aarch64__ ) || defined( _M_ARM64 ) || defined( __arm__ ) || defined( _M_ARM )
#define B2_CPU_ARM
#elif defined( __EMSCRIPTEN__ )
#define B2_CPU_WASM
#else
#define B2_CPU_UNKNOWN
#endif
#if defined( BOX2D_ENABLE_SIMD )
#if defined( B2_CPU_X86_X64 )
#if defined( BOX2D_AVX2 )
#define B2_SIMD_AVX2
#define B2_SIMD_WIDTH 8
#else
#define B2_SIMD_SSE2
#define B2_SIMD_WIDTH 4
#endif
#elif defined( B2_CPU_ARM )
#define B2_SIMD_NEON
#define B2_SIMD_WIDTH 4
#elif defined( B2_CPU_WASM )
#define B2_CPU_WASM
#define B2_SIMD_SSE2
#define B2_SIMD_WIDTH 4
#else
#define B2_SIMD_NONE
#define B2_SIMD_WIDTH 4
#endif
#else
#define B2_SIMD_NONE
#define B2_SIMD_WIDTH 4
#endif
#if defined( __clang__ )
#define B2_COMPILER_CLANG
#elif defined( __GNUC__ )
#define B2_COMPILER_GCC
#elif defined( _MSC_VER )
#define B2_COMPILER_MSVC
#endif
#if defined( B2_COMPILER_MSVC )
#define B2_BREAKPOINT __debugbreak()
#elif defined( B2_COMPILER_GCC ) || defined( B2_COMPILER_CLANG )
#define B2_BREAKPOINT __builtin_trap()
#else
#include <assert.h>
#definef B2_BREAKPOINT assert(0)
#endif
#if !defined( NDEBUG ) || defined( B2_ENABLE_ASSERT )
extern b2AssertFcn* b2AssertHandler;
#define B2_ASSERT( condition ) \
do \
{ \
if ( !( condition ) && b2AssertHandler( #condition, __FILE__, (int)__LINE__ ) ) \
B2_BREAKPOINT; \
} \
while ( 0 )
#else
#define B2_ASSERT( ... ) ( (void)0 )
#endif
#ifdef BOX2D_PROFILE
#include <tracy/TracyC.h>
#define b2TracyCZoneC( ctx, color, active ) TracyCZoneC( ctx, color, active )
#define b2TracyCZoneNC( ctx, name, color, active ) TracyCZoneNC( ctx, name, color, active )
#define b2TracyCZoneEnd( ctx ) TracyCZoneEnd( ctx )
#else
#define b2TracyCZoneC( ctx, color, active )
#define b2TracyCZoneNC( ctx, name, color, active )
#define b2TracyCZoneEnd( ctx )
#endif
extern float b2_lengthUnitsPerMeter;
#define b2_huge ( 100000.0f * b2_lengthUnitsPerMeter )
#define b2_maxWorkers 64
#define b2_graphColorCount 12
#define b2_linearSlop ( 0.005f * b2_lengthUnitsPerMeter )
#define b2_maxWorlds 128
#define b2_maxRotation ( 0.25f * b2_pi )
#define b2_speculativeDistance ( 4.0f * b2_linearSlop )
#define b2_aabbMargin ( 0.1f * b2_lengthUnitsPerMeter )
#define b2_timeToSleep 0.5f
#define B2_ARRAY_COUNT( A ) (int)( sizeof( A ) / sizeof( A[0] ) )
#define B2_MAYBE_UNUSED( x ) ( (void)( x ) )
#define B2_SECRET_COOKIE 1152023
#define b2CheckDef( DEF ) B2_ASSERT( DEF->internalValue == B2_SECRET_COOKIE )
void* b2Alloc( int size );
void b2Free( void* mem, int size );
void* b2GrowAlloc( void* oldMem, int oldSize, int newSize );