// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
// SPDX-FileCopyrightText: 2023 Jorrit Rouwe
// SPDX-License-Identifier: MIT

#pragma once

JPH_NAMESPACE_BEGIN

/// Construct a string that lists the most important configuration settings
inline const char *GetConfigurationString()
{
	return JPH_IF_SINGLE_PRECISION_ELSE("Single", "Double") " precision "
#if defined(JPH_CPU_X86)
		"x86 "
#elif defined(JPH_CPU_ARM)
		"ARM "
#elif defined(JPH_CPU_RISCV)
		"RISC-V "
#elif defined(JPH_CPU_PPC)
		"PowerPC "
	#ifdef JPH_CPU_BIG_ENDIAN
		"(Big Endian) "
	#else
		"(Little Endian) "
	#endif
#elif defined(JPH_CPU_LOONGARCH)
		"LoongArch "
#elif defined(JPH_CPU_E2K)
		"E2K "
#elif defined(JPH_CPU_WASM)
		"WASM "
#else
	#error Unknown CPU architecture
#endif
#if JPH_CPU_ADDRESS_BITS == 64
		"64-bit "
#elif JPH_CPU_ADDRESS_BITS == 32
		"32-bit "
#endif
		"with instructions: "
#ifdef JPH_USE_NEON
		"NEON "
#endif
#ifdef JPH_USE_SSE
		"SSE2 "
#endif
#ifdef JPH_USE_SSE4_1
		"SSE4.1 "
#endif
#ifdef JPH_USE_SSE4_2
		"SSE4.2 "
#endif
#ifdef JPH_USE_AVX
		"AVX "
#endif
#ifdef JPH_USE_AVX2
		"AVX2 "
#endif
#ifdef JPH_USE_AVX512
		"AVX512 "
#endif
#ifdef JPH_USE_F16C
		"F16C "
#endif
#ifdef JPH_USE_LZCNT
		"LZCNT "
#endif
#ifdef JPH_USE_TZCNT
		"TZCNT "
#endif
#ifdef JPH_USE_FMADD
		"FMADD "
#endif
#ifdef JPH_CROSS_PLATFORM_DETERMINISTIC
		"(Cross Platform Deterministic) "
#endif
#ifdef JPH_FLOATING_POINT_EXCEPTIONS_ENABLED
		"(FP Exceptions) "
#endif
#ifdef JPH_DEBUG_RENDERER
		"(Debug Renderer) "
#endif
#ifdef JPH_PROFILE_ENABLED
		"(Profile) "
#endif
#if defined(JPH_OBJECT_LAYER_BITS) && JPH_OBJECT_LAYER_BITS == 32
		"(32-bit ObjectLayer) "
#else
		"(16-bit ObjectLayer) "
#endif
#ifdef JPH_ENABLE_ASSERTS
		"(Assertions) "
#endif
#ifdef JPH_OBJECT_STREAM
		"(ObjectStream) "
#endif
#ifdef JPH_DEBUG
		"(Debug) "
#endif
#if defined(__cpp_rtti) && __cpp_rtti
		"(C++ RTTI) "
#endif
#if defined(__cpp_exceptions) && __cpp_exceptions
		"(C++ Exceptions) "
#endif
		;
}

JPH_NAMESPACE_END