//---------------------------------------------------------------------------------------------------------------------- // // toml++ v1.1.0 // https://github.com/marzer/tomlplusplus // SPDX-License-Identifier: MIT // //---------------------------------------------------------------------------------------------------------------------- // // - THIS FILE WAS ASSEMBLED FROM MULTIPLE HEADER FILES BY A SCRIPT - PLEASE DON'T EDIT IT DIRECTLY - // // If you wish to submit a contribution to toml++, hooray and thanks! Before you crack on, please be aware that this // file was assembled from a number of smaller files by a python script, and code contributions should not be made // against it directly. You should instead make your changes in the relevant source file(s). The file names of the files // that contributed to this header can be found at the beginnings and ends of the corresponding sections of this file. // //---------------------------------------------------------------------------------------------------------------------- // // TOML language specifications: // Latest: https://github.com/toml-lang/toml/blob/master/README.md // v1.0.0-rc.1: https://github.com/toml-lang/toml/blob/master/versions/en/toml-v1.0.0-rc.1.md // v0.5.0: https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.5.0.md // //---------------------------------------------------------------------------------------------------------------------- // // MIT License // // Copyright (c) 2019-2020 Mark Gillard // Copyright (c) 2008-2010 Bjoern Hoehrmann (utf8_decoder) // // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated // documentation files (the "Software"), to deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the // Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //---------------------------------------------------------------------------------------------------------------------- // clang-format off #pragma once #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunknown-pragmas" #endif //----------------- ↓ toml_common.h ---------------------------------------------------------------------------------- #pragma region #ifdef TOML_CONFIG_HEADER #include TOML_CONFIG_HEADER #undef TOML_CONFIG_HEADER #endif #if !defined(TOML_ALL_INLINE) || (defined(TOML_ALL_INLINE) && TOML_ALL_INLINE) #undef TOML_ALL_INLINE #define TOML_ALL_INLINE 1 #endif #if defined(TOML_IMPLEMENTATION) || TOML_ALL_INLINE || defined(__INTELLISENSE__) #undef TOML_IMPLEMENTATION #define TOML_IMPLEMENTATION 1 #else #define TOML_IMPLEMENTATION 0 #endif #ifndef TOML_API #define TOML_API #endif #ifndef TOML_CHAR_8_STRINGS #define TOML_CHAR_8_STRINGS 0 #endif #ifndef TOML_UNRELEASED_FEATURES #define TOML_UNRELEASED_FEATURES 1 #endif #ifndef TOML_LARGE_FILES #define TOML_LARGE_FILES 0 #endif #ifndef TOML_UNDEF_MACROS #define TOML_UNDEF_MACROS 1 #endif //TOML_ASSERT #ifndef __cplusplus #error toml++ is a C++ library. #endif #ifdef __clang__ #define TOML_PUSH_WARNINGS _Pragma("clang diagnostic push") #define TOML_DISABLE_SWITCH_WARNINGS _Pragma("clang diagnostic ignored \"-Wswitch\"") #define TOML_DISABLE_INIT_WARNINGS _Pragma("clang diagnostic ignored \"-Wmissing-field-initializers\"") #define TOML_DISABLE_ALL_WARNINGS _Pragma("clang diagnostic ignored \"-Weverything\"") #define TOML_POP_WARNINGS _Pragma("clang diagnostic pop") #define TOML_ASSUME(cond) __builtin_assume(cond) #define TOML_UNREACHABLE __builtin_unreachable() #define TOML_GNU_ATTR(attr) __attribute__((attr)) #if defined(_MSC_VER) // msvc compat mode #ifdef __has_declspec_attribute #if __has_declspec_attribute(novtable) #define TOML_INTERFACE __declspec(novtable) #endif #if __has_declspec_attribute(empty_bases) #define TOML_EMPTY_BASES __declspec(empty_bases) #endif #define TOML_ALWAYS_INLINE __forceinline #define TOML_NEVER_INLINE __declspec(noinline) #endif #endif #ifdef __has_attribute #if !defined(TOML_ALWAYS_INLINE) && __has_attribute(always_inline) #define TOML_ALWAYS_INLINE __attribute__((__always_inline__)) inline #endif #if !defined(TOML_NEVER_INLINE) && __has_attribute(noinline) #define TOML_NEVER_INLINE __attribute__((__noinline__)) #endif #if !defined(TOML_TRIVIAL_ABI) && __has_attribute(trivial_abi) #define TOML_TRIVIAL_ABI __attribute__((__trivial_abi__)) #endif #endif #ifdef __EXCEPTIONS #define TOML_COMPILER_EXCEPTIONS 1 #else #define TOML_COMPILER_EXCEPTIONS 0 #endif //floating-point from_chars and to_chars are not implemented in any version of clang as of 1/1/2020 #ifndef TOML_FLOATING_POINT_CHARCONV #define TOML_FLOATING_POINT_CHARCONV 0 #endif #elif defined(_MSC_VER) || (defined(__INTEL_COMPILER) && defined(__ICL)) #define TOML_CPP_VERSION _MSVC_LANG #define TOML_PUSH_WARNINGS __pragma(warning(push)) #define TOML_DISABLE_SWITCH_WARNINGS __pragma(warning(disable: 4063)) #define TOML_DISABLE_ALL_WARNINGS __pragma(warning(pop)) \ __pragma(warning(push, 0)) #define TOML_POP_WARNINGS __pragma(warning(pop)) #define TOML_ALWAYS_INLINE __forceinline #define TOML_NEVER_INLINE __declspec(noinline) #define TOML_ASSUME(cond) __assume(cond) #define TOML_UNREACHABLE __assume(0) #define TOML_INTERFACE __declspec(novtable) #define TOML_EMPTY_BASES __declspec(empty_bases) #if !defined(TOML_RELOPS_REORDERING) && defined(__cpp_impl_three_way_comparison) #define TOML_RELOPS_REORDERING 1 #endif #ifdef _CPPUNWIND #define TOML_COMPILER_EXCEPTIONS 1 #else #define TOML_COMPILER_EXCEPTIONS 0 #endif #elif defined(__GNUC__) #define TOML_PUSH_WARNINGS _Pragma("GCC diagnostic push") #define TOML_DISABLE_SWITCH_WARNINGS _Pragma("GCC diagnostic ignored \"-Wswitch\"") #define TOML_DISABLE_INIT_WARNINGS _Pragma("GCC diagnostic ignored \"-Wmissing-field-initializers\"") \ _Pragma("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") \ _Pragma("GCC diagnostic ignored \"-Wuninitialized\"") #define TOML_DISABLE_ALL_WARNINGS _Pragma("GCC diagnostic ignored \"-Wall\"") \ _Pragma("GCC diagnostic ignored \"-Wextra\"") \ _Pragma("GCC diagnostic ignored \"-Wchar-subscripts\"") \ _Pragma("GCC diagnostic ignored \"-Wtype-limits\"") #define TOML_POP_WARNINGS _Pragma("GCC diagnostic pop") #define TOML_GNU_ATTR(attr) __attribute__((attr)) #define TOML_ALWAYS_INLINE __attribute__((__always_inline__)) inline #define TOML_NEVER_INLINE __attribute__((__noinline__)) #define TOML_UNREACHABLE __builtin_unreachable() #if !defined(TOML_RELOPS_REORDERING) && defined(__cpp_impl_three_way_comparison) #define TOML_RELOPS_REORDERING 1 #endif #ifdef __cpp_exceptions #define TOML_COMPILER_EXCEPTIONS 1 #else #define TOML_COMPILER_EXCEPTIONS 0 #endif // these pass the __has_attribute() test but cause warnings on if/else branches =/ #define TOML_LIKELY #define TOML_UNLIKELY // floating-point from_chars and to_chars are not implemented in any version of gcc as of 1/1/2020 #ifndef TOML_FLOATING_POINT_CHARCONV #define TOML_FLOATING_POINT_CHARCONV 0 #endif #endif #ifndef TOML_CPP_VERSION #define TOML_CPP_VERSION __cplusplus #endif #if TOML_CPP_VERSION < 201103L #error toml++ requires C++17 or higher. For a TOML parser supporting pre-C++11 see https://github.com/ToruNiina/Boost.toml #elif TOML_CPP_VERSION < 201703L #error toml++ requires C++17 or higher. For a TOML parser supporting C++11 see https://github.com/skystrife/cpptoml #elif TOML_CPP_VERSION >= 202600L #define TOML_CPP 26 #elif TOML_CPP_VERSION >= 202300L #define TOML_CPP 23 #elif TOML_CPP_VERSION >= 202002L #define TOML_CPP 20 #elif TOML_CPP_VERSION >= 201703L #define TOML_CPP 17 #endif #ifndef TOML_COMPILER_EXCEPTIONS #define TOML_COMPILER_EXCEPTIONS 1 #endif #if TOML_COMPILER_EXCEPTIONS #ifndef TOML_EXCEPTIONS #define TOML_EXCEPTIONS 1 #endif #else #if defined(TOML_EXCEPTIONS) && TOML_EXCEPTIONS #error TOML_EXCEPTIONS was explicitly enabled but exceptions are disabled/unsupported by the compiler. #endif #undef TOML_EXCEPTIONS #define TOML_EXCEPTIONS 0 #endif #if TOML_EXCEPTIONS #define TOML_MAY_THROW #else #define TOML_MAY_THROW noexcept #endif #ifndef TOML_DISABLE_INIT_WARNINGS #define TOML_DISABLE_INIT_WARNINGS #endif #ifndef TOML_FLOATING_POINT_CHARCONV #define TOML_FLOATING_POINT_CHARCONV 1 #endif #ifndef TOML_PUSH_WARNINGS #define TOML_PUSH_WARNINGS #endif #ifndef TOML_DISABLE_ALL_WARNINGS #define TOML_DISABLE_ALL_WARNINGS #endif #ifndef TOML_POP_WARNINGS #define TOML_POP_WARNINGS #endif #ifndef TOML_GNU_ATTR #define TOML_GNU_ATTR(attr) #endif #ifndef TOML_INTERFACE #define TOML_INTERFACE #endif #ifndef TOML_EMPTY_BASES #define TOML_EMPTY_BASES #endif #ifndef TOML_ALWAYS_INLINE #define TOML_ALWAYS_INLINE inline #endif #ifndef TOML_NEVER_INLINE #define TOML_NEVER_INLINE #endif #ifndef TOML_ASSUME #define TOML_ASSUME(cond) (void)0 #endif #ifndef TOML_UNREACHABLE #define TOML_UNREACHABLE TOML_ASSERT(false) #endif #define TOML_NO_DEFAULT_CASE default: TOML_UNREACHABLE #ifdef __cpp_consteval #define TOML_CONSTEVAL consteval #else #define TOML_CONSTEVAL constexpr #endif #ifndef __INTELLISENSE__ #if !defined(TOML_LIKELY) && __has_cpp_attribute(likely) #define TOML_LIKELY [[likely]] #endif #if !defined(TOML_UNLIKELY) && __has_cpp_attribute(unlikely) #define TOML_UNLIKELY [[unlikely]] #endif #if __has_cpp_attribute(nodiscard) >= 201907L #define TOML_NODISCARD_CTOR [[nodiscard]] #endif #endif //__INTELLISENSE__ #ifndef TOML_LIKELY #define TOML_LIKELY #endif #ifndef TOML_UNLIKELY #define TOML_UNLIKELY #endif #ifndef TOML_TRIVIAL_ABI #define TOML_TRIVIAL_ABI #endif #ifndef TOML_NODISCARD_CTOR #define TOML_NODISCARD_CTOR #endif #ifndef TOML_RELOPS_REORDERING #define TOML_RELOPS_REORDERING 0 #endif #if TOML_RELOPS_REORDERING #define TOML_ASYMMETRICAL_EQUALITY_OPS(...) #else #define TOML_ASYMMETRICAL_EQUALITY_OPS(LHS, RHS, ...) \ __VA_ARGS__ [[nodiscard]] friend bool operator == (RHS rhs, LHS lhs) noexcept { return lhs == rhs; } \ __VA_ARGS__ [[nodiscard]] friend bool operator != (LHS lhs, RHS rhs) noexcept { return !(lhs == rhs); } \ __VA_ARGS__ [[nodiscard]] friend bool operator != (RHS rhs, LHS lhs) noexcept { return !(lhs == rhs); } #endif #if TOML_ALL_INLINE #define TOML_FUNC_EXTERNAL_LINKAGE inline #else #define TOML_FUNC_EXTERNAL_LINKAGE #endif #define TOML_LIB_MAJOR 1 #define TOML_LIB_MINOR 1 #define TOML_LIB_PATCH 0 #define TOML_LANG_MAJOR 1 #define TOML_LANG_MINOR 0 #define TOML_LANG_PATCH 0 #define TOML_MAKE_VERSION(maj, min, rev) \ ((maj) * 1000 + (min) * 25 + (rev)) #if TOML_UNRELEASED_FEATURES #define TOML_LANG_EFFECTIVE_VERSION \ TOML_MAKE_VERSION(TOML_LANG_MAJOR, TOML_LANG_MINOR, TOML_LANG_PATCH+1) #else #define TOML_LANG_EFFECTIVE_VERSION \ TOML_MAKE_VERSION(TOML_LANG_MAJOR, TOML_LANG_MINOR, TOML_LANG_PATCH) #endif #define TOML_LANG_HIGHER_THAN(maj, min, rev) \ (TOML_LANG_EFFECTIVE_VERSION > TOML_MAKE_VERSION(maj, min, rev)) #define TOML_LANG_AT_LEAST(maj, min, rev) \ (TOML_LANG_EFFECTIVE_VERSION >= TOML_MAKE_VERSION(maj, min, rev)) #define TOML_LANG_UNRELEASED \ TOML_LANG_HIGHER_THAN(TOML_LANG_MAJOR, TOML_LANG_MINOR, TOML_LANG_PATCH) TOML_PUSH_WARNINGS TOML_DISABLE_ALL_WARNINGS #if __has_include() #include #endif #include #include //memcpy, memset #include #include #include #include #include #include #include #ifndef TOML_ASSERT #if !defined(NDEBUG) || defined(_DEBUG) || defined(DEBUG) #include #define TOML_ASSERT(expr) assert(expr) #else #define TOML_ASSERT(expr) (void)0 #endif #endif #ifndef TOML_OPTIONAL_TYPE #include #endif #if TOML_EXCEPTIONS #include #endif TOML_POP_WARNINGS #if TOML_CHAR_8_STRINGS #if !defined(__cpp_lib_char8_t) #error toml++ requires implementation support to use char8_t strings, but yours does not provide it. #endif #define TOML_STRING_PREFIX_1(S) u8##S #define TOML_STRING_PREFIX(S) TOML_STRING_PREFIX_1(S) #else #define TOML_STRING_PREFIX(S) S #endif #ifdef __cpp_lib_launder #define TOML_LAUNDER(x) std::launder(x) #else #define TOML_LAUNDER(x) x #endif #if !defined(DOXYGEN) && !defined(__INTELLISENSE__) #define TOML_ABI_NAMESPACES 1 #else #define TOML_ABI_NAMESPACES 0 #endif namespace toml { using namespace std::string_literals; using namespace std::string_view_literals; using size_t = std::size_t; using ptrdiff_t = std::ptrdiff_t; [[nodiscard]] TOML_ALWAYS_INLINE TOML_CONSTEVAL size_t operator"" _sz(unsigned long long n) noexcept { return static_cast(n); } #if TOML_CHAR_8_STRINGS using string_char = char8_t; using string = std::u8string; using string_view = std::u8string_view; #else using string_char = char; using string = std::string; using string_view = std::string_view; #endif #ifndef DOXYGEN // foward declarations are hidden from doxygen // because they fuck it up =/ struct date; struct time; struct time_offset; class node; class array; class table; template class node_view; template class value; template class default_formatter; template class json_formatter; #if TOML_ABI_NAMESPACES #ifdef TOML_OPTIONAL_TYPE inline namespace abi_custopt { #else inline namespace abi_stdopt { #endif #endif struct date_time; #if TOML_ABI_NAMESPACES } //end abi namespace for TOML_OPTIONAL_TYPE #endif #endif // !DOXYGEN enum class node_type : uint8_t { none, table, array, string, integer, floating_point, boolean, date, time, date_time }; #ifdef TOML_OPTIONAL_TYPE template using optional = TOML_OPTIONAL_TYPE; #else template using optional = std::optional; #endif #if TOML_LARGE_FILES using source_index = uint32_t; #else using source_index = uint16_t; #endif using source_path_ptr = std::shared_ptr; #if TOML_ABI_NAMESPACES #if TOML_LARGE_FILES inline namespace abi_lf { #else inline namespace abi_sf { #endif #endif struct TOML_TRIVIAL_ABI source_position { source_index line; source_index column; [[nodiscard]] explicit constexpr operator bool () const noexcept { return line > source_index{} && column > source_index{}; } [[nodiscard]] friend constexpr bool operator == (const source_position& lhs, const source_position& rhs) noexcept { return lhs.line == rhs.line && lhs.column == rhs.column; } [[nodiscard]] friend constexpr bool operator != (const source_position& lhs, const source_position& rhs) noexcept { return lhs.line != rhs.line || lhs.column != rhs.column; } [[nodiscard]] friend constexpr bool operator < (const source_position& lhs, const source_position& rhs) noexcept { return lhs.line < rhs.line || (lhs.line == rhs.line && lhs.column < rhs.column); } [[nodiscard]] friend constexpr bool operator <= (const source_position& lhs, const source_position& rhs) noexcept { return lhs.line < rhs.line || (lhs.line == rhs.line && lhs.column <= rhs.column); } }; struct source_region { source_position begin; source_position end; source_path_ptr path; }; TOML_PUSH_WARNINGS TOML_DISABLE_INIT_WARNINGS #if defined(DOXYGEN) || !TOML_EXCEPTIONS #if TOML_ABI_NAMESPACES inline namespace abi_noex { #endif class parse_error final { private: std::string description_; source_region source_; public: TOML_NODISCARD_CTOR parse_error(std::string&& desc, source_region&& src) noexcept : description_{ std::move(desc) }, source_{ std::move(src) } {} TOML_NODISCARD_CTOR parse_error(std::string&& desc, const source_region& src) noexcept : parse_error{ std::move(desc), source_region{ src } } {} TOML_NODISCARD_CTOR parse_error(std::string&& desc, const source_position& position, const source_path_ptr& path = {}) noexcept : parse_error{ std::move(desc), source_region{ position, position, path } } {} [[nodiscard]] std::string_view description() const noexcept { return description_; } [[nodiscard]] const source_region& source() const noexcept { return source_; } }; #else #if TOML_ABI_NAMESPACES inline namespace abi_ex { #endif class parse_error final : public std::runtime_error { private: source_region source_; public: TOML_NODISCARD_CTOR TOML_GNU_ATTR(nonnull) parse_error(const char* desc, source_region&& src) noexcept : std::runtime_error{ desc }, source_{ std::move(src) } {} TOML_NODISCARD_CTOR TOML_GNU_ATTR(nonnull) parse_error(const char* desc, const source_region& src) noexcept : parse_error{ desc, source_region{ src } } {} TOML_NODISCARD_CTOR TOML_GNU_ATTR(nonnull) parse_error(const char* desc, const source_position& position, const source_path_ptr& path = {}) noexcept : parse_error{ desc, source_region{ position, position, path } } {} [[nodiscard]] std::string_view description() const noexcept { return std::string_view{ what() }; } [[nodiscard]] const source_region& source() const noexcept { return source_; } }; #endif TOML_POP_WARNINGS #if TOML_ABI_NAMESPACES } //end abi namespace for TOML_EXCEPTIONS } //end abi namespace for TOML_LARGE_FILES #endif } namespace toml::impl { template using string_map = std::map>; //heterogeneous lookup template using remove_cvref_t = std::remove_cv_t>; template struct is_one_of_ : std::integral_constant) > {}; template inline constexpr bool is_one_of = is_one_of_::value; template [[nodiscard]] TOML_ALWAYS_INLINE constexpr std::underlying_type_t unbox_enum(T val) noexcept { return static_cast>(val); } // Q: "why not use std::find??" // A: Because is _huge_ and std::find would be the only thing I used from it. // I don't want to impose such a heavy compile-time burden on users. template [[nodiscard]] inline const T* find(const std::vector& haystack, const T& needle) noexcept { for (size_t i = 0, e = haystack.size(); i < e; i++) if (haystack[i] == needle) return haystack.data() + i; return nullptr; } #if TOML_ABI_NAMESPACES #if TOML_EXCEPTIONS inline namespace abi_impl_ex { #define TOML_PARSER_TYPENAME ::toml::impl::abi_impl_ex::parser #else inline namespace abi_impl_noex { #define TOML_PARSER_TYPENAME ::toml::impl::abi_impl_noex::parser #endif #else #define TOML_PARSER_TYPENAME ::toml::impl::parser #endif class parser; #if TOML_ABI_NAMESPACES } #endif template inline constexpr bool is_value = std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v; template inline constexpr bool is_value_or_promotable = is_value || std::is_same_v, string_char*> || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v #ifdef TOML_SMALL_FLOAT_TYPE || std::is_same_v #endif #ifdef TOML_SMALL_INT_TYPE || std::is_same_v #endif ; template inline constexpr bool is_value_or_node = is_value || std::is_same_v || std::is_same_v; template struct node_wrapper { using type = T; }; template <> struct node_wrapper { using type = value; }; template <> struct node_wrapper { using type = value; }; template <> struct node_wrapper { using type = value; }; template <> struct node_wrapper { using type = value; }; template <> struct node_wrapper { using type = value; }; template <> struct node_wrapper