12#error toml++ is a C++ library.
17#if _MSVC_LANG > __cplusplus
18#define TOML_CPP _MSVC_LANG
22#define TOML_CPP __cplusplus
24#if TOML_CPP >= 202900L
27#elif TOML_CPP >= 202600L
30#elif TOML_CPP >= 202302L
33#elif TOML_CPP >= 202002L
36#elif TOML_CPP >= 201703L
39#elif TOML_CPP >= 201402L
42#elif TOML_CPP >= 201103L
52#error toml++ requires C++17 or higher. For a pre-C++11 TOML library see https:
54#error toml++ requires C++17 or higher. For a C++11 TOML library see https:
61#ifndef TOML_MAKE_VERSION
62#define TOML_MAKE_VERSION(major, minor, patch) (((major) * 10000) + ((minor) * 100) + ((patch)))
65#ifndef TOML_INTELLISENSE
66#ifdef __INTELLISENSE__
67#define TOML_INTELLISENSE 1
69#define TOML_INTELLISENSE 0
74#if defined(DOXYGEN) || defined(__DOXYGEN) || defined(__DOXYGEN__) || defined(__doxygen__) || \
75 defined(__POXY__) || defined(__poxy__)
84#define TOML_CLANG __clang_major__
94#if TOML_CLANG && defined(__apple_build_version__)
96#define TOML_CLANG_VERSION TOML_MAKE_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
97#if TOML_CLANG_VERSION >= TOML_MAKE_VERSION(15, 0, 0)
99#elif TOML_CLANG_VERSION >= TOML_MAKE_VERSION(14, 3, 0)
101#elif TOML_CLANG_VERSION >= TOML_MAKE_VERSION(14, 0, 0)
103#elif TOML_CLANG_VERSION >= TOML_MAKE_VERSION(13, 1, 6)
105#elif TOML_CLANG_VERSION >= TOML_MAKE_VERSION(13, 0, 0)
107#elif TOML_CLANG_VERSION >= TOML_MAKE_VERSION(12, 0, 5)
109#elif TOML_CLANG_VERSION >= TOML_MAKE_VERSION(12, 0, 0)
111#elif TOML_CLANG_VERSION >= TOML_MAKE_VERSION(11, 0, 3)
113#elif TOML_CLANG_VERSION >= TOML_MAKE_VERSION(11, 0, 0)
115#elif TOML_CLANG_VERSION >= TOML_MAKE_VERSION(10, 0, 1)
120#undef TOML_CLANG_VERSION
125#ifdef __INTEL_COMPILER
126#define TOML_ICC __INTEL_COMPILER
128#define TOML_ICC_CL TOML_ICC
138#ifndef TOML_MSVC_LIKE
140#define TOML_MSVC_LIKE _MSC_VER
142#define TOML_MSVC_LIKE 0
147#if TOML_MSVC_LIKE && !TOML_CLANG && !TOML_ICC
148#define TOML_MSVC TOML_MSVC_LIKE
156#define TOML_GCC_LIKE __GNUC__
158#define TOML_GCC_LIKE 0
163#if TOML_GCC_LIKE && !TOML_CLANG && !TOML_ICC
164#define TOML_GCC TOML_GCC_LIKE
171#if defined(__CUDACC__) || defined(__CUDA_ARCH__) || defined(__CUDA_LIBDEVICE__)
182#ifndef TOML_ARCH_ITANIUM
183#if defined(__ia64__) || defined(__ia64) || defined(_IA64) || defined(__IA64__) || defined(_M_IA64)
184#define TOML_ARCH_ITANIUM 1
185#define TOML_ARCH_BITNESS 64
187#define TOML_ARCH_ITANIUM 0
191#ifndef TOML_ARCH_AMD64
192#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || \
194#define TOML_ARCH_AMD64 1
195#define TOML_ARCH_BITNESS 64
197#define TOML_ARCH_AMD64 0
202#if defined(__i386__) || defined(_M_IX86)
203#define TOML_ARCH_X86 1
204#define TOML_ARCH_BITNESS 32
206#define TOML_ARCH_X86 0
211#if defined(__aarch64__) || defined(__ARM_ARCH_ISA_A64) || defined(_M_ARM64) || \
212 defined(__ARM_64BIT_STATE) || defined(_M_ARM64EC)
213#define TOML_ARCH_ARM32 0
214#define TOML_ARCH_ARM64 1
215#define TOML_ARCH_ARM 1
216#define TOML_ARCH_BITNESS 64
217#elif defined(__arm__) || defined(_M_ARM) || defined(__ARM_32BIT_STATE)
218#define TOML_ARCH_ARM32 1
219#define TOML_ARCH_ARM64 0
220#define TOML_ARCH_ARM 1
221#define TOML_ARCH_BITNESS 32
223#define TOML_ARCH_ARM32 0
224#define TOML_ARCH_ARM64 0
225#define TOML_ARCH_ARM 0
229#ifndef TOML_ARCH_BITNESS
230#define TOML_ARCH_BITNESS 0
234#if TOML_ARCH_BITNESS == 64
235#define TOML_ARCH_X64 1
237#define TOML_ARCH_X64 0
245#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || \
247#define TOML_WINDOWS 1
249#define TOML_WINDOWS 0
269#ifndef TOML_HAS_INCLUDE
271#define TOML_HAS_INCLUDE(header) __has_include(header)
273#define TOML_HAS_INCLUDE(header) 0
278#ifndef TOML_HAS_BUILTIN
280#define TOML_HAS_BUILTIN(name) __has_builtin(name)
282#define TOML_HAS_BUILTIN(name) 0
287#ifndef TOML_HAS_FEATURE
289#define TOML_HAS_FEATURE(name) __has_feature(name)
291#define TOML_HAS_FEATURE(name) 0
297#ifdef __has_attribute
298#define TOML_HAS_ATTR(attr) __has_attribute(attr)
300#define TOML_HAS_ATTR(attr) 0
305#ifndef TOML_HAS_CPP_ATTR
306#ifdef __has_cpp_attribute
307#define TOML_HAS_CPP_ATTR(attr) __has_cpp_attribute(attr)
309#define TOML_HAS_CPP_ATTR(attr) 0
315#if TOML_CLANG || TOML_GCC_LIKE
316#define TOML_ATTR(...) __attribute__((__VA_ARGS__))
318#define TOML_ATTR(...)
325#define TOML_DECLSPEC(...) __declspec(__VA_ARGS__)
327#define TOML_DECLSPEC(...)
332#ifndef TOML_COMPILER_HAS_EXCEPTIONS
333#if defined(__EXCEPTIONS) || defined(_CPPUNWIND) || defined(__cpp_exceptions)
334#define TOML_COMPILER_HAS_EXCEPTIONS 1
336#define TOML_COMPILER_HAS_EXCEPTIONS 0
341#ifndef TOML_COMPILER_HAS_RTTI
342#if defined(_CPPRTTI) || defined(__GXX_RTTI) || TOML_HAS_FEATURE(cxx_rtti)
343#define TOML_COMPILER_HAS_RTTI 1
345#define TOML_COMPILER_HAS_RTTI 0
350#define TOML_CONCAT_1(x, y) x##y
351#define TOML_CONCAT(x, y) TOML_CONCAT_1(x, y)
354#define TOML_MAKE_STRING_1(s) #s
355#define TOML_MAKE_STRING(s) TOML_MAKE_STRING_1(s)
359#define TOML_PRAGMA_CLANG(decl) _Pragma(TOML_MAKE_STRING(clang decl))
361#define TOML_PRAGMA_CLANG(decl)
364#define TOML_PRAGMA_CLANG_GE_8(decl) TOML_PRAGMA_CLANG(decl)
366#define TOML_PRAGMA_CLANG_GE_8(decl)
369#define TOML_PRAGMA_CLANG_GE_9(decl) TOML_PRAGMA_CLANG(decl)
371#define TOML_PRAGMA_CLANG_GE_9(decl)
374#define TOML_PRAGMA_CLANG_GE_10(decl) TOML_PRAGMA_CLANG(decl)
376#define TOML_PRAGMA_CLANG_GE_10(decl)
379#define TOML_PRAGMA_CLANG_GE_11(decl) TOML_PRAGMA_CLANG(decl)
381#define TOML_PRAGMA_CLANG_GE_11(decl)
384#define TOML_PRAGMA_GCC(decl) _Pragma(TOML_MAKE_STRING(GCC decl))
386#define TOML_PRAGMA_GCC(decl)
389#define TOML_PRAGMA_MSVC(...) __pragma(__VA_ARGS__)
391#define TOML_PRAGMA_MSVC(...)
394#define TOML_PRAGMA_ICC(...) __pragma(__VA_ARGS__)
396#define TOML_PRAGMA_ICC(...)
401#define TOML_ALWAYS_INLINE __forceinline
402#elif TOML_GCC || TOML_CLANG || TOML_HAS_ATTR(__always_inline__)
403#define TOML_ALWAYS_INLINE \
404 TOML_ATTR(__always_inline__) \
407#define TOML_ALWAYS_INLINE inline
412#define TOML_NEVER_INLINE TOML_DECLSPEC(noinline)
414#define TOML_NEVER_INLINE TOML_ATTR(noinline)
416#if TOML_GCC || TOML_CLANG || TOML_HAS_ATTR(__noinline__)
417#define TOML_NEVER_INLINE TOML_ATTR(__noinline__)
420#ifndef TOML_NEVER_INLINE
421#define TOML_NEVER_INLINE
425#define TOML_ABSTRACT_INTERFACE TOML_DECLSPEC(novtable)
426#define TOML_EMPTY_BASES TOML_DECLSPEC(empty_bases)
429#if TOML_CLANG || TOML_HAS_ATTR(__trivial_abi__)
430#define TOML_TRIVIAL_ABI TOML_ATTR(__trivial_abi__)
432#define TOML_TRIVIAL_ABI
436#if TOML_CPP >= 17 && TOML_HAS_CPP_ATTR(nodiscard) >= 201603
437#define TOML_NODISCARD [[nodiscard]]
438#elif TOML_CLANG || TOML_GCC || TOML_HAS_ATTR(__warn_unused_result__)
439#define TOML_NODISCARD TOML_ATTR(__warn_unused_result__)
441#define TOML_NODISCARD
445#if TOML_CPP >= 17 && TOML_HAS_CPP_ATTR(nodiscard) >= 201907
446#define TOML_NODISCARD_CTOR [[nodiscard]]
448#define TOML_NODISCARD_CTOR
455 TOML_DECLSPEC(noalias) \
464 TOML_DECLSPEC(noalias) \
470#ifndef TOML_INLINE_GETTER
471#define TOML_INLINE_GETTER \
475#ifndef TOML_PURE_GETTER
476#define TOML_PURE_GETTER \
480#ifndef TOML_PURE_INLINE_GETTER
481#define TOML_PURE_INLINE_GETTER \
486#ifndef TOML_CONST_GETTER
487#define TOML_CONST_GETTER \
491#ifndef TOML_CONST_INLINE_GETTER
492#define TOML_CONST_INLINE_GETTER \
500#define TOML_ASSUME(expr) __assume(expr)
501#elif TOML_ICC || TOML_CLANG || TOML_HAS_BUILTIN(__builtin_assume)
502#define TOML_ASSUME(expr) __builtin_assume(expr)
503#elif TOML_HAS_CPP_ATTR(assume) >= 202207
504#define TOML_ASSUME(expr) [[assume(expr)]]
505#elif TOML_HAS_ATTR(__assume__)
506#define TOML_ASSUME(expr) __attribute__((__assume__(expr)))
508#define TOML_ASSUME(expr) static_cast<void>(0)
513#define TOML_UNREACHABLE __assume(0)
514#elif TOML_ICC || TOML_CLANG || TOML_GCC || TOML_HAS_BUILTIN(__builtin_unreachable)
515#define TOML_UNREACHABLE __builtin_unreachable()
517#define TOML_UNREACHABLE static_cast<void>(0)
521#if TOML_CPP >= 20 && TOML_HAS_CPP_ATTR(likely) >= 201803
522#define TOML_LIKELY(...) (__VA_ARGS__) [[likely]]
523#define TOML_LIKELY_CASE [[likely]]
524#elif TOML_GCC || TOML_CLANG || TOML_HAS_BUILTIN(__builtin_expect)
525#define TOML_LIKELY(...) (__builtin_expect(!!(__VA_ARGS__), 1))
527#define TOML_LIKELY(...) (__VA_ARGS__)
529#ifndef TOML_LIKELY_CASE
530#define TOML_LIKELY_CASE
534#if TOML_CPP >= 20 && TOML_HAS_CPP_ATTR(unlikely) >= 201803
535#define TOML_UNLIKELY(...) (__VA_ARGS__) [[unlikely]]
536#define TOML_UNLIKELY_CASE [[unlikely]]
537#elif TOML_GCC || TOML_CLANG || TOML_HAS_BUILTIN(__builtin_expect)
538#define TOML_UNLIKELY(...) (__builtin_expect(!!(__VA_ARGS__), 0))
540#define TOML_UNLIKELY(...) (__VA_ARGS__)
542#ifndef TOML_UNLIKELY_CASE
543#define TOML_UNLIKELY_CASE
547#if TOML_CLANG || TOML_HAS_ATTR(flag_enum)
548#define TOML_FLAGS_ENUM __attribute__((flag_enum))
550#define TOML_FLAGS_ENUM
554#if TOML_CLANG || TOML_HAS_ATTR(enum_extensibility)
555#define TOML_OPEN_ENUM __attribute__((enum_extensibility(open)))
556#define TOML_CLOSED_ENUM __attribute__((enum_extensibility(closed)))
558#define TOML_OPEN_ENUM
559#define TOML_CLOSED_ENUM
563#define TOML_OPEN_FLAGS_ENUM TOML_OPEN_ENUM TOML_FLAGS_ENUM
564#define TOML_CLOSED_FLAGS_ENUM TOML_CLOSED_ENUM TOML_FLAGS_ENUM
567#define TOML_MAKE_FLAGS_2(T, op, linkage) \
568 TOML_CONST_INLINE_GETTER \
569 linkage constexpr T operator op(T lhs, T rhs) noexcept { \
570 using under = std::underlying_type_t<T>; \
571 return static_cast<T>(static_cast<under>(lhs) op static_cast<under>(rhs)); \
574 linkage constexpr T& operator TOML_CONCAT(op, =)(T & lhs, T rhs) noexcept { \
575 return lhs = (lhs op rhs); \
579#define TOML_MAKE_FLAGS_1(T, linkage) \
580 static_assert(std::is_enum_v<T>); \
582 TOML_MAKE_FLAGS_2(T, &, linkage); \
583 TOML_MAKE_FLAGS_2(T, |, linkage); \
584 TOML_MAKE_FLAGS_2(T, ^, linkage); \
586 TOML_CONST_INLINE_GETTER \
587 linkage constexpr T operator~(T val) noexcept { \
588 using under = std::underlying_type_t<T>; \
589 return static_cast<T>(~static_cast<under>(val)); \
592 TOML_CONST_INLINE_GETTER \
593 linkage constexpr bool operator!(T val) noexcept { \
594 using under = std::underlying_type_t<T>; \
595 return !static_cast<under>(val); \
599#define TOML_MAKE_FLAGS(T) TOML_MAKE_FLAGS_1(T, )
601#define TOML_UNUSED(...) static_cast<void>(__VA_ARGS__)
603#define TOML_DELETE_DEFAULTS(T) \
604 T(const T&) = delete; \
606 T& operator=(const T&) = delete; \
607 T& operator=(T&&) = delete
609#define TOML_ASYMMETRICAL_EQUALITY_OPS(LHS, RHS, ...) \
610 __VA_ARGS__ TOML_NODISCARD friend bool operator==(RHS rhs, LHS lhs) noexcept { \
613 __VA_ARGS__ TOML_NODISCARD friend bool operator!=(LHS lhs, RHS rhs) noexcept { \
614 return !(lhs == rhs); \
616 __VA_ARGS__ TOML_NODISCARD friend bool operator!=(RHS rhs, LHS lhs) noexcept { \
617 return !(lhs == rhs); \
621#define TOML_EVAL_BOOL_1(T, F) T
622#define TOML_EVAL_BOOL_0(T, F) F
624#if !defined(__POXY__) && !defined(POXY_IMPLEMENTATION_DETAIL)
625#define POXY_IMPLEMENTATION_DETAIL(...) __VA_ARGS__
634#define TOML_PUSH_WARNINGS \
635 TOML_PRAGMA_CLANG(diagnostic push) \
636 TOML_PRAGMA_CLANG(diagnostic ignored "-Wunknown-warning-option") \
639#define TOML_DISABLE_SWITCH_WARNINGS \
640 TOML_PRAGMA_CLANG(diagnostic ignored "-Wswitch") \
643#define TOML_DISABLE_ARITHMETIC_WARNINGS \
644 TOML_PRAGMA_CLANG_GE_10(diagnostic ignored "-Wimplicit-int-float-conversion") \
645 TOML_PRAGMA_CLANG(diagnostic ignored "-Wfloat-equal") \
646 TOML_PRAGMA_CLANG(diagnostic ignored "-Wdouble-promotion") \
647 TOML_PRAGMA_CLANG(diagnostic ignored "-Wchar-subscripts") \
648 TOML_PRAGMA_CLANG(diagnostic ignored "-Wshift-sign-overflow") \
651#define TOML_DISABLE_SPAM_WARNINGS \
652 TOML_PRAGMA_CLANG_GE_8(diagnostic ignored "-Wdefaulted-function-deleted") \
653 TOML_PRAGMA_CLANG_GE_9(diagnostic ignored "-Wctad-maybe-unsupported") \
654 TOML_PRAGMA_CLANG_GE_10(diagnostic ignored "-Wzero-as-null-pointer-constant") \
655 TOML_PRAGMA_CLANG_GE_11(diagnostic ignored "-Wsuggest-destructor-override") \
656 TOML_PRAGMA_CLANG(diagnostic ignored "-Wweak-vtables") \
657 TOML_PRAGMA_CLANG(diagnostic ignored "-Wweak-template-vtables") \
658 TOML_PRAGMA_CLANG(diagnostic ignored "-Wdouble-promotion") \
659 TOML_PRAGMA_CLANG(diagnostic ignored "-Wchar-subscripts") \
660 TOML_PRAGMA_CLANG(diagnostic ignored "-Wmissing-field-initializers") \
661 TOML_PRAGMA_CLANG(diagnostic ignored "-Wpadded") \
664#define TOML_POP_WARNINGS \
665 TOML_PRAGMA_CLANG(diagnostic pop) \
668#define TOML_DISABLE_WARNINGS \
669 TOML_PRAGMA_CLANG(diagnostic push) \
670 TOML_PRAGMA_CLANG(diagnostic ignored "-Weverything") \
671 static_assert(true, "")
673#define TOML_ENABLE_WARNINGS \
674 TOML_PRAGMA_CLANG(diagnostic pop) \
677#define TOML_SIMPLE_STATIC_ASSERT_MESSAGES 1
681#define TOML_PUSH_WARNINGS __pragma(warning(push)) static_assert(true)
683#if TOML_HAS_INCLUDE(<CodeAnalysis / Warnings.h>)
684#pragma warning(push, 0)
685#include <CodeAnalysis/Warnings.h>
687#define TOML_DISABLE_CODE_ANALYSIS_WARNINGS \
688 __pragma(warning(disable : ALL_CODE_ANALYSIS_WARNINGS)) static_assert(true)
690#define TOML_DISABLE_CODE_ANALYSIS_WARNINGS static_assert(true)
693#define TOML_DISABLE_SWITCH_WARNINGS \
694 __pragma(warning(disable : 4061)) __pragma(warning(disable : 4062)) \
695 __pragma(warning(disable : 4063)) __pragma( \
696 warning(disable : 5262)) \
697 __pragma(warning(disable : 26819)) \
700#define TOML_DISABLE_SPAM_WARNINGS \
701 __pragma(warning(disable : 4127)) \
702 __pragma(warning(disable : 4324)) \
703 __pragma(warning(disable : 4348)) \
704 __pragma(warning(disable : 4464)) \
705 __pragma(warning(disable : 4505)) \
706 __pragma(warning(disable : 4514)) \
707 __pragma(warning(disable : 4582)) \
708 __pragma(warning(disable : 4619)) \
710 warning(disable : 4623)) \
711 __pragma(warning(disable : 4625)) \
713 warning(disable : 4626)) \
714 __pragma(warning(disable : 4710)) \
715 __pragma(warning(disable : 4711)) \
716 __pragma(warning(disable : 4820)) \
717 __pragma(warning(disable : 4946)) \
718 __pragma(warning(disable : 5026)) \
723 __pragma(warning(disable : 5045)) \
724 __pragma(warning(disable : 5264)) \
725 __pragma(warning(disable : 26451)) __pragma(warning(disable : 26490)) \
726 __pragma(warning(disable : 26495)) __pragma(warning(disable : 26812)) \
727 __pragma(warning(disable : 26819)) static_assert(true)
729#define TOML_DISABLE_ARITHMETIC_WARNINGS \
730 __pragma(warning(disable : 4365)) \
731 __pragma(warning(disable : 4738)) \
732 __pragma(warning(disable : 5219)) \
735#define TOML_POP_WARNINGS __pragma(warning(pop)) static_assert(true)
737#define TOML_DISABLE_WARNINGS \
738 __pragma(warning(push, 0)) __pragma(warning(disable : 4348)) __pragma(warning(disable : 4668)) \
739 __pragma(warning(disable : 5105)) __pragma(warning(disable : 5264)) \
740 TOML_DISABLE_CODE_ANALYSIS_WARNINGS; \
741 TOML_DISABLE_SWITCH_WARNINGS; \
742 TOML_DISABLE_SPAM_WARNINGS; \
743 TOML_DISABLE_ARITHMETIC_WARNINGS; \
746#define TOML_ENABLE_WARNINGS TOML_POP_WARNINGS
750#define TOML_PUSH_WARNINGS __pragma(warning(push)) static_assert(true)
752#define TOML_DISABLE_SPAM_WARNINGS \
753 __pragma(warning(disable : 82)) \
754 __pragma(warning(disable : 111)) \
755 __pragma(warning(disable : 869)) \
756 __pragma(warning(disable : 1011)) \
757 __pragma(warning(disable : 2261)) \
760#define TOML_POP_WARNINGS __pragma(warning(pop)) static_assert(true)
762#define TOML_DISABLE_WARNINGS __pragma(warning(push, 0)) TOML_DISABLE_SPAM_WARNINGS
764#define TOML_ENABLE_WARNINGS __pragma(warning(pop)) static_assert(true)
768#define TOML_PUSH_WARNINGS \
769 TOML_PRAGMA_GCC(diagnostic push) \
772#define TOML_DISABLE_SWITCH_WARNINGS \
773 TOML_PRAGMA_GCC(diagnostic ignored "-Wswitch") \
774 TOML_PRAGMA_GCC(diagnostic ignored "-Wswitch-enum") \
775 TOML_PRAGMA_GCC(diagnostic ignored "-Wswitch-default") \
778#define TOML_DISABLE_ARITHMETIC_WARNINGS \
779 TOML_PRAGMA_GCC(diagnostic ignored "-Wfloat-equal") \
780 TOML_PRAGMA_GCC(diagnostic ignored "-Wsign-conversion") \
781 TOML_PRAGMA_GCC(diagnostic ignored "-Wchar-subscripts") \
784#define TOML_DISABLE_SUGGEST_ATTR_WARNINGS \
785 TOML_PRAGMA_GCC(diagnostic ignored "-Wsuggest-attribute=const") \
786 TOML_PRAGMA_GCC(diagnostic ignored "-Wsuggest-attribute=pure") \
789#define TOML_DISABLE_SPAM_WARNINGS \
790 TOML_PRAGMA_GCC(diagnostic ignored "-Wpadded") \
791 TOML_PRAGMA_GCC(diagnostic ignored "-Wcast-align") \
792 TOML_PRAGMA_GCC(diagnostic ignored "-Wcomment") \
793 TOML_PRAGMA_GCC(diagnostic ignored "-Wtype-limits") \
794 TOML_PRAGMA_GCC(diagnostic ignored "-Wuseless-cast") \
795 TOML_PRAGMA_GCC(diagnostic ignored "-Wchar-subscripts") \
796 TOML_PRAGMA_GCC(diagnostic ignored "-Wsubobject-linkage") \
797 TOML_PRAGMA_GCC(diagnostic ignored "-Wmissing-field-initializers") \
798 TOML_PRAGMA_GCC(diagnostic ignored "-Wmaybe-uninitialized") \
799 TOML_PRAGMA_GCC(diagnostic ignored "-Wnoexcept") \
800 TOML_PRAGMA_GCC(diagnostic ignored "-Wnull-dereference") \
801 TOML_PRAGMA_GCC(diagnostic ignored "-Wduplicated-branches") \
804#define TOML_POP_WARNINGS \
805 TOML_PRAGMA_GCC(diagnostic pop) \
808#define TOML_DISABLE_WARNINGS \
809 TOML_PRAGMA_GCC(diagnostic push) \
810 TOML_PRAGMA_GCC(diagnostic ignored "-Wall") \
811 TOML_PRAGMA_GCC(diagnostic ignored "-Wextra") \
812 TOML_PRAGMA_GCC(diagnostic ignored "-Wpedantic") \
813 TOML_DISABLE_SWITCH_WARNINGS; \
814 TOML_DISABLE_ARITHMETIC_WARNINGS; \
815 TOML_DISABLE_SUGGEST_ATTR_WARNINGS; \
816 TOML_DISABLE_SPAM_WARNINGS; \
819#define TOML_ENABLE_WARNINGS \
820 TOML_PRAGMA_GCC(diagnostic pop) \
825#ifndef TOML_PUSH_WARNINGS
826#define TOML_PUSH_WARNINGS static_assert(true)
828#ifndef TOML_DISABLE_CODE_ANALYSIS_WARNINGS
829#define TOML_DISABLE_CODE_ANALYSIS_WARNINGS static_assert(true)
831#ifndef TOML_DISABLE_SWITCH_WARNINGS
832#define TOML_DISABLE_SWITCH_WARNINGS static_assert(true)
834#ifndef TOML_DISABLE_SUGGEST_ATTR_WARNINGS
835#define TOML_DISABLE_SUGGEST_ATTR_WARNINGS static_assert(true)
837#ifndef TOML_DISABLE_SPAM_WARNINGS
838#define TOML_DISABLE_SPAM_WARNINGS static_assert(true)
840#ifndef TOML_DISABLE_ARITHMETIC_WARNINGS
841#define TOML_DISABLE_ARITHMETIC_WARNINGS static_assert(true)
843#ifndef TOML_POP_WARNINGS
844#define TOML_POP_WARNINGS static_assert(true)
846#ifndef TOML_DISABLE_WARNINGS
847#define TOML_DISABLE_WARNINGS static_assert(true)
849#ifndef TOML_ENABLE_WARNINGS
850#define TOML_ENABLE_WARNINGS static_assert(true)
852#ifndef TOML_SIMPLE_STATIC_ASSERT_MESSAGES
853#define TOML_SIMPLE_STATIC_ASSERT_MESSAGES 0
866#ifdef TOML_CONFIG_HEADER
867#include TOML_CONFIG_HEADER
871#define TOML_CONFIG_HEADER
879#ifndef TOML_SHARED_LIB
880#define TOML_SHARED_LIB 0
884#if !defined(TOML_HEADER_ONLY) && defined(TOML_ALL_INLINE)
885#define TOML_HEADER_ONLY TOML_ALL_INLINE
887#if !defined(TOML_HEADER_ONLY) || (defined(TOML_HEADER_ONLY) && TOML_HEADER_ONLY) || \
889#undef TOML_HEADER_ONLY
890#define TOML_HEADER_ONLY 1
892#if TOML_DOXYGEN || TOML_SHARED_LIB
893#undef TOML_HEADER_ONLY
894#define TOML_HEADER_ONLY 0
912#if defined(TOML_IMPLEMENTATION) || TOML_HEADER_ONLY
913#undef TOML_IMPLEMENTATION
914#define TOML_IMPLEMENTATION 1
916#define TOML_IMPLEMENTATION 0
923#if !defined(TOML_EXPORTED_MEMBER_FUNCTION) && !defined(TOML_EXPORTED_STATIC_FUNCTION) && \
924 !defined(TOML_EXPORTED_FREE_FUNCTION) && !defined(TOML_EXPORTED_CLASS) && defined(TOML_API)
925#define TOML_EXPORTED_MEMBER_FUNCTION TOML_API
926#define TOML_EXPORTED_STATIC_FUNCTION TOML_API
927#define TOML_EXPORTED_FREE_FUNCTION TOML_API
933#undef TOML_EXPORTED_CLASS
934#undef TOML_EXPORTED_MEMBER_FUNCTION
935#undef TOML_EXPORTED_STATIC_FUNCTION
936#undef TOML_EXPORTED_FREE_FUNCTION
938#if TOML_IMPLEMENTATION
939#define TOML_EXPORTED_CLASS __declspec(dllexport)
940#define TOML_EXPORTED_FREE_FUNCTION __declspec(dllexport)
942#define TOML_EXPORTED_CLASS __declspec(dllimport)
943#define TOML_EXPORTED_FREE_FUNCTION __declspec(dllimport)
946#define TOML_CALLCONV __cdecl
948#elif defined(__GNUC__) && __GNUC__ >= 4
949#define TOML_EXPORTED_CLASS __attribute__((visibility("default")))
950#define TOML_EXPORTED_MEMBER_FUNCTION __attribute__((visibility("default")))
951#define TOML_EXPORTED_STATIC_FUNCTION __attribute__((visibility("default")))
952#define TOML_EXPORTED_FREE_FUNCTION __attribute__((visibility("default")))
955#ifndef TOML_EXPORTED_CLASS
956#define TOML_EXPORTED_CLASS
958#ifndef TOML_EXPORTED_MEMBER_FUNCTION
959#define TOML_EXPORTED_MEMBER_FUNCTION
961#ifndef TOML_EXPORTED_STATIC_FUNCTION
962#define TOML_EXPORTED_STATIC_FUNCTION
964#ifndef TOML_EXPORTED_FREE_FUNCTION
965#define TOML_EXPORTED_FREE_FUNCTION
992#if !defined(TOML_ENABLE_UNRELEASED_FEATURES) && \
993 defined(TOML_UNRELEASED_FEATURES)
995#define TOML_ENABLE_UNRELEASED_FEATURES TOML_UNRELEASED_FEATURES
997#if (defined(TOML_ENABLE_UNRELEASED_FEATURES) && TOML_ENABLE_UNRELEASED_FEATURES) || \
999#undef TOML_ENABLE_UNRELEASED_FEATURES
1000#define TOML_ENABLE_UNRELEASED_FEATURES 1
1002#ifndef TOML_ENABLE_UNRELEASED_FEATURES
1003#define TOML_ENABLE_UNRELEASED_FEATURES 0
1013#if !defined(TOML_ENABLE_PARSER) && defined(TOML_PARSER)
1014#define TOML_ENABLE_PARSER TOML_PARSER
1016#if !defined(TOML_ENABLE_PARSER) || (defined(TOML_ENABLE_PARSER) && TOML_ENABLE_PARSER) || \
1018#undef TOML_ENABLE_PARSER
1019#define TOML_ENABLE_PARSER 1
1028#if !defined(TOML_ENABLE_FORMATTERS) || \
1029 (defined(TOML_ENABLE_FORMATTERS) && TOML_ENABLE_FORMATTERS) || TOML_INTELLISENSE
1030#undef TOML_ENABLE_FORMATTERS
1031#define TOML_ENABLE_FORMATTERS 1
1044#if !defined(TOML_ENABLE_SIMD) || (defined(TOML_ENABLE_SIMD) && TOML_ENABLE_SIMD) || \
1046#undef TOML_ENABLE_SIMD
1047#define TOML_ENABLE_SIMD 1
1051#if !defined(TOML_ENABLE_WINDOWS_COMPAT) && \
1052 defined(TOML_WINDOWS_COMPAT)
1053#define TOML_ENABLE_WINDOWS_COMPAT TOML_WINDOWS_COMPAT
1055#if !defined(TOML_ENABLE_WINDOWS_COMPAT) || \
1056 (defined(TOML_ENABLE_WINDOWS_COMPAT) && TOML_ENABLE_WINDOWS_COMPAT) || TOML_INTELLISENSE
1057#undef TOML_ENABLE_WINDOWS_COMPAT
1058#define TOML_ENABLE_WINDOWS_COMPAT 1
1062#undef TOML_ENABLE_WINDOWS_COMPAT
1063#define TOML_ENABLE_WINDOWS_COMPAT 0
1066#ifndef TOML_INCLUDE_WINDOWS_H
1067#define TOML_INCLUDE_WINDOWS_H 0
1081#ifdef TOML_OPTIONAL_TYPE
1082#define TOML_HAS_CUSTOM_OPTIONAL_TYPE 1
1084#define TOML_HAS_CUSTOM_OPTIONAL_TYPE 0
1088#define TOML_OPTIONAL_TYPE
1099#if TOML_COMPILER_HAS_EXCEPTIONS
1100#if !defined(TOML_EXCEPTIONS) || (defined(TOML_EXCEPTIONS) && TOML_EXCEPTIONS)
1101#undef TOML_EXCEPTIONS
1102#define TOML_EXCEPTIONS 1
1105#if defined(TOML_EXCEPTIONS) && TOML_EXCEPTIONS
1106#error TOML_EXCEPTIONS was explicitly enabled but exceptions are disabled/unsupported by the compiler.
1108#undef TOML_EXCEPTIONS
1109#define TOML_EXCEPTIONS 0
1116#ifndef TOML_CALLCONV
1117#define TOML_CALLCONV
1125#define TOML_SMALL_FLOAT_TYPE
1133#ifndef TOML_UNDEF_MACROS
1134#define TOML_UNDEF_MACROS 1
1137#ifndef TOML_MAX_NESTED_VALUES
1138#define TOML_MAX_NESTED_VALUES 256
1144#ifdef TOML_CHAR_8_STRINGS
1145#if TOML_CHAR_8_STRINGS
1146#error TOML_CHAR_8_STRINGS was removed in toml++ 2.0.0; all value setters and getters now work with char8_t strings implicitly.
1150#ifdef TOML_LARGE_FILES
1151#if !TOML_LARGE_FILES
1152#error Support for !TOML_LARGE_FILES (i.e. 'small files') was removed in toml++ 3.0.0.
1156#ifndef TOML_LIFETIME_HOOKS
1157#define TOML_LIFETIME_HOOKS 0
1162#define TOML_ASSERT(expr) static_assert(true)
1170#define TOML_ASSERT(expr) assert(expr)
1173#define TOML_ASSERT_ASSUME(expr) TOML_ASSUME(expr)
1175#define TOML_ASSERT_ASSUME(expr) TOML_ASSERT(expr)
1183#define TOML_SMALL_INT_TYPE
1191#ifndef TOML_ENABLE_FLOAT16
1192#define TOML_ENABLE_FLOAT16 0
1205#if !defined(TOML_FLOAT_CHARCONV) && (TOML_GCC || TOML_CLANG || (TOML_ICC && !TOML_ICC_CL))
1208#define TOML_FLOAT_CHARCONV 0
1210#if !defined(TOML_INT_CHARCONV) && (defined(__EMSCRIPTEN__) || defined(__APPLE__))
1213#define TOML_INT_CHARCONV 0
1215#ifndef TOML_INT_CHARCONV
1216#define TOML_INT_CHARCONV 1
1218#ifndef TOML_FLOAT_CHARCONV
1219#define TOML_FLOAT_CHARCONV 1
1221#if (TOML_INT_CHARCONV || TOML_FLOAT_CHARCONV) && !TOML_HAS_INCLUDE(<charconv>)
1222#undef TOML_INT_CHARCONV
1223#undef TOML_FLOAT_CHARCONV
1224#define TOML_INT_CHARCONV 0
1225#define TOML_FLOAT_CHARCONV 0
1233#if defined(__cpp_concepts) && __cpp_concepts >= 201907
1234#define TOML_REQUIRES(...) requires(__VA_ARGS__)
1236#define TOML_REQUIRES(...)
1238#define TOML_ENABLE_IF(...) , typename std::enable_if<(__VA_ARGS__), int>::type = 0
1239#define TOML_CONSTRAINED_TEMPLATE(condition, ...) \
1240 template <__VA_ARGS__ TOML_ENABLE_IF(condition)> \
1241 TOML_REQUIRES(condition)
1242#define TOML_HIDDEN_CONSTRAINT(condition, ...) TOML_CONSTRAINED_TEMPLATE(condition, __VA_ARGS__)
1245#ifndef TOML_CONSTRAINED_TEMPLATE
1246#define TOML_CONSTRAINED_TEMPLATE(condition, ...) template <__VA_ARGS__>
1248#ifndef TOML_HIDDEN_CONSTRAINT
1249#define TOML_HIDDEN_CONSTRAINT(condition, ...)
1257#if defined(__SIZEOF_FLOAT128__) && defined(__FLT128_MANT_DIG__) && defined(__LDBL_MANT_DIG__) && \
1258 __FLT128_MANT_DIG__ > __LDBL_MANT_DIG__
1259#define TOML_FLOAT128 __float128
1266#ifdef __SIZEOF_INT128__
1267#define TOML_INT128 __int128_t
1268#define TOML_UINT128 __uint128_t
1278#define TOML_LIB_SINGLE_HEADER 0
1280#if TOML_ENABLE_UNRELEASED_FEATURES
1281 #define TOML_LANG_EFFECTIVE_VERSION \
1282 TOML_MAKE_VERSION(TOML_LANG_MAJOR, TOML_LANG_MINOR, TOML_LANG_PATCH+1)
1284 #define TOML_LANG_EFFECTIVE_VERSION \
1285 TOML_MAKE_VERSION(TOML_LANG_MAJOR, TOML_LANG_MINOR, TOML_LANG_PATCH)
1288#define TOML_LANG_HIGHER_THAN(major, minor, patch) \
1289 (TOML_LANG_EFFECTIVE_VERSION > TOML_MAKE_VERSION(major, minor, patch))
1291#define TOML_LANG_AT_LEAST(major, minor, patch) \
1292 (TOML_LANG_EFFECTIVE_VERSION >= TOML_MAKE_VERSION(major, minor, patch))
1294#define TOML_LANG_UNRELEASED \
1295 TOML_LANG_HIGHER_THAN(TOML_LANG_MAJOR, TOML_LANG_MINOR, TOML_LANG_PATCH)
1297#ifndef TOML_ABI_NAMESPACES
1299 #define TOML_ABI_NAMESPACES 0
1301 #define TOML_ABI_NAMESPACES 1
1304#if TOML_ABI_NAMESPACES
1305 #define TOML_NAMESPACE_START namespace toml { inline namespace TOML_CONCAT(v, TOML_LIB_MAJOR)
1306 #define TOML_NAMESPACE_END } static_assert(true)
1307 #define TOML_NAMESPACE ::toml::TOML_CONCAT(v, TOML_LIB_MAJOR)
1308 #define TOML_ABI_NAMESPACE_START(name) inline namespace name { static_assert(true)
1309 #define TOML_ABI_NAMESPACE_BOOL(cond, T, F) TOML_ABI_NAMESPACE_START(TOML_CONCAT(TOML_EVAL_BOOL_, cond)(T, F))
1310 #define TOML_ABI_NAMESPACE_END } static_assert(true)
1312 #define TOML_NAMESPACE_START namespace toml
1313 #define TOML_NAMESPACE_END static_assert(true)
1314 #define TOML_NAMESPACE toml
1315 #define TOML_ABI_NAMESPACE_START(...) static_assert(true)
1316 #define TOML_ABI_NAMESPACE_BOOL(...) static_assert(true)
1317 #define TOML_ABI_NAMESPACE_END static_assert(true)
1319#define TOML_IMPL_NAMESPACE_START TOML_NAMESPACE_START { namespace impl
1320#define TOML_IMPL_NAMESPACE_END } TOML_NAMESPACE_END
1322 #define TOML_ANON_NAMESPACE_START static_assert(TOML_IMPLEMENTATION); TOML_IMPL_NAMESPACE_START
1323 #define TOML_ANON_NAMESPACE_END TOML_IMPL_NAMESPACE_END
1324 #define TOML_ANON_NAMESPACE TOML_NAMESPACE::impl
1325 #define TOML_EXTERNAL_LINKAGE inline
1326 #define TOML_INTERNAL_LINKAGE inline
1328 #define TOML_ANON_NAMESPACE_START static_assert(TOML_IMPLEMENTATION); \
1329 using namespace toml; \
1331 #define TOML_ANON_NAMESPACE_END static_assert(true)
1332 #define TOML_ANON_NAMESPACE
1333 #define TOML_EXTERNAL_LINKAGE
1334 #define TOML_INTERNAL_LINKAGE static
1348#if TOML_SIMPLE_STATIC_ASSERT_MESSAGES
1350 #define TOML_SA_NEWLINE " "
1351 #define TOML_SA_LIST_SEP ", "
1352 #define TOML_SA_LIST_BEG " ("
1353 #define TOML_SA_LIST_END ")"
1354 #define TOML_SA_LIST_NEW " "
1355 #define TOML_SA_LIST_NXT ", "
1359 #define TOML_SA_NEWLINE "\n| "
1360 #define TOML_SA_LIST_SEP TOML_SA_NEWLINE " - "
1361 #define TOML_SA_LIST_BEG TOML_SA_LIST_SEP
1362 #define TOML_SA_LIST_END
1363 #define TOML_SA_LIST_NEW TOML_SA_NEWLINE TOML_SA_NEWLINE
1364 #define TOML_SA_LIST_NXT TOML_SA_LIST_NEW
1368#define TOML_SA_NATIVE_VALUE_TYPE_LIST \
1369 TOML_SA_LIST_BEG "std::string" \
1370 TOML_SA_LIST_SEP "int64_t" \
1371 TOML_SA_LIST_SEP "double" \
1372 TOML_SA_LIST_SEP "bool" \
1373 TOML_SA_LIST_SEP "toml::date" \
1374 TOML_SA_LIST_SEP "toml::time" \
1375 TOML_SA_LIST_SEP "toml::date_time" \
1378#define TOML_SA_NODE_TYPE_LIST \
1379 TOML_SA_LIST_BEG "toml::table" \
1380 TOML_SA_LIST_SEP "toml::array" \
1381 TOML_SA_LIST_SEP "toml::value<std::string>" \
1382 TOML_SA_LIST_SEP "toml::value<int64_t>" \
1383 TOML_SA_LIST_SEP "toml::value<double>" \
1384 TOML_SA_LIST_SEP "toml::value<bool>" \
1385 TOML_SA_LIST_SEP "toml::value<toml::date>" \
1386 TOML_SA_LIST_SEP "toml::value<toml::time>" \
1387 TOML_SA_LIST_SEP "toml::value<toml::date_time>" \
1390#define TOML_SA_UNWRAPPED_NODE_TYPE_LIST \
1391 TOML_SA_LIST_NEW "A native TOML value type" \
1392 TOML_SA_NATIVE_VALUE_TYPE_LIST \
1394 TOML_SA_LIST_NXT "A TOML node type" \
1395 TOML_SA_NODE_TYPE_LIST
#define TOML_DISABLE_WARNINGS
#define TOML_ENABLE_WARNINGS