//---------------------------------------------------------------------------------------------------------------------- // // toml++ v0.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 specification: // Latest: https://github.com/toml-lang/toml/blob/master/README.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 // // 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. // //---------------------------------------------------------------------------------------------------------------------- // // UTF-8 decoding is performed using a derivative of Bjoern Hoehrmann's 'Flexible and Economical UTF-8 Decoder' // See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. // // Copyright (c) 2008-2010 Bjoern Hoehrmann // // 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 #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_ASSERT #ifdef assert #define TOML_ASSERT(expr) assert(expr) #else #define TOML_ASSERT(expr) (void)0 #endif #endif #ifndef TOML_UNDEF_MACROS #define TOML_UNDEF_MACROS 1 #endif #ifndef __cplusplus #error toml++ is a C++ library. #endif #if defined(__clang__) || defined(__GNUC__) #define TOML_GCC_ATTR(attr) __attribute__((attr)) #else #define TOML_GCC_ATTR(attr) #endif #ifdef __clang__ #ifndef __cpp_exceptions #define TOML_EXCEPTIONS 0 #endif #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_ALWAYS_INLINE TOML_GCC_ATTR(__always_inline__) inline #define TOML_ASSUME(cond) __builtin_assume(cond) #define TOML_UNREACHABLE __builtin_unreachable() #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 //floating-point from_chars and to_chars are not implemented in any version of clang as of 1/1/2020 #ifndef TOML_USE_STREAMS_FOR_FLOATS #define TOML_USE_STREAMS_FOR_FLOATS 1 #endif #elif defined(_MSC_VER) #ifndef _CPPUNWIND #define TOML_EXCEPTIONS 0 #endif #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_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 #elif defined(__GNUC__) #ifndef __cpp_exceptions #define TOML_EXCEPTIONS 0 #endif #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_ALWAYS_INLINE TOML_GCC_ATTR(__always_inline__) inline #define TOML_UNREACHABLE __builtin_unreachable() //floating-point from_chars and to_chars are not implemented in any version of gcc as of 1/1/2020 #ifndef TOML_USE_STREAMS_FOR_FLOATS #define TOML_USE_STREAMS_FOR_FLOATS 1 #endif #if !defined(TOML_RELOPS_REORDERING) && defined(__cpp_impl_three_way_comparison) #define TOML_RELOPS_REORDERING 1 #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 >= 202000L #define TOML_CPP 20 #elif TOML_CPP_VERSION >= 201703L #define TOML_CPP 17 #endif #ifndef TOML_EXCEPTIONS #define TOML_EXCEPTIONS 1 #endif #ifndef TOML_DOXYGEN #define TOML_DOXYGEN 0 #endif #if TOML_EXCEPTIONS #define TOML_MAY_THROW #define TOML_MAY_THROW_UNLESS(...) noexcept(__VA_ARGS__) #else #define TOML_MAY_THROW noexcept #define TOML_MAY_THROW_UNLESS(...) noexcept #endif #ifndef TOML_DISABLE_INIT_WARNINGS #define TOML_DISABLE_INIT_WARNINGS #endif #ifndef TOML_USE_STREAMS_FOR_FLOATS #define TOML_USE_STREAMS_FOR_FLOATS 0 #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_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_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 __has_cpp_attribute(likely) #define TOML_LIKELY [[likely]] #endif #if __has_cpp_attribute(unlikely) #define TOML_UNLIKELY [[unlikely]] #endif #if __has_cpp_attribute(no_unique_address) #define TOML_NO_UNIQUE_ADDRESS [[no_unique_address]] #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_NO_UNIQUE_ADDRESS #define TOML_NO_UNIQUE_ADDRESS #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 #define TOML_LIB_MAJOR 0 #define TOML_LIB_MINOR 1 #define TOML_LIB_PATCH 0 #define TOML_LANG_MAJOR 0 #define TOML_LANG_MINOR 5 #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_EXACTLY(maj, min, rev) \ (TOML_LANG_EFFECTIVE_VERSION == TOML_MAKE_VERSION(maj, min, rev)) TOML_PUSH_WARNINGS TOML_DISABLE_ALL_WARNINGS #include #include //memcpy, memset #include //log10 #include #include #include #include #include #include #include #include #if TOML_USE_STREAMS_FOR_FLOATS #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 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 struct date; struct time; struct time_offset; struct date_time; class node; template class node_view; template class value; class array; class table; enum class node_type : uint8_t { none, table, array, string, integer, floating_point, boolean, date, time, date_time }; #if TOML_LARGE_FILES using source_index = uint32_t; #else using source_index = uint16_t; #endif struct 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); } template friend std::basic_ostream& operator << (std::basic_ostream& lhs, const source_position& rhs) TOML_MAY_THROW; }; using source_path_ptr = std::shared_ptr; struct source_region { source_position begin; source_position end; source_path_ptr path; template friend std::basic_ostream& operator << (std::basic_ostream& lhs, const source_region& rhs) TOML_MAY_THROW; }; TOML_PUSH_WARNINGS TOML_DISABLE_INIT_WARNINGS #if TOML_DOXYGEN || !TOML_EXCEPTIONS 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 class parse_error final : public std::runtime_error { private: source_region source_; public: TOML_NODISCARD_CTOR TOML_GCC_ATTR(nonnull) parse_error(const char* desc, source_region&& src) noexcept : std::runtime_error{ desc }, source_{ std::move(src) } {} TOML_NODISCARD_CTOR TOML_GCC_ATTR(nonnull) parse_error(const char* desc, const source_region& src) noexcept : parse_error{ desc, source_region{ src } } {} TOML_NODISCARD_CTOR TOML_GCC_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 } namespace toml::impl { template using string_map = std::map>; //heterogeneous lookup #if defined(__cpp_lib_remove_cvref) || (defined(_MSC_VER) && defined(_HAS_CXX20) && _HAS_CXX20) template using remove_cvref_t = std::remove_cvref_t; #else template using remove_cvref_t = std::remove_cv_t>; #endif template struct is_one_of_ : std::integral_constant) > {}; template inline constexpr bool is_one_of = is_one_of_::value; template using enable_if_one_of = std::enable_if_t>; template using enable_if_not_one_of = std::enable_if_t>; 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 inline std::optional 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 i; return {}; } class parser; 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