summaryrefslogtreecommitdiffhomepage
path: root/vendor/toml++/impl/path.hpp
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2026-03-08 15:47:16 +0100
committerAmlal El Mahrouss <amlal@nekernel.org>2026-03-08 15:47:16 +0100
commitddb1cbc831b6d13b985d91022f01e955e24ae871 (patch)
tree985c7eda4fafa827eaad88b6b469b0baba791817 /vendor/toml++/impl/path.hpp
parent7a469801ecb55fcde0199d4e41b1cec3a17dcb05 (diff)
[CHORE] Patching TOML manifest parser to avoid null deref.nebuild-patches-deref
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'vendor/toml++/impl/path.hpp')
-rw-r--r--vendor/toml++/impl/path.hpp1399
1 files changed, 637 insertions, 762 deletions
diff --git a/vendor/toml++/impl/path.hpp b/vendor/toml++/impl/path.hpp
index 5bd0ef3..db3faaa 100644
--- a/vendor/toml++/impl/path.hpp
+++ b/vendor/toml++/impl/path.hpp
@@ -1,850 +1,725 @@
-//# This file is a part of toml++ and is subject to the the terms of the MIT license.
-//# Copyright (c) Mark Gillard <mark.gillard@outlook.com.au>
-//# See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text.
-// SPDX-License-Identifier: MIT
+// # This file is a part of toml++ and is subject to the the terms of the MIT license.
+// # Copyright (c) Mark Gillard <mark.gillard@outlook.com.au>
+// # See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text.
+// SPDX-License-Identifier: MIT
#pragma once
#include "forward_declarations.hpp"
-#include "std_vector.hpp"
#include "header_start.hpp"
+#include "std_vector.hpp"
-TOML_NAMESPACE_START
-{
- /// \brief Indicates type of path component, either a key, an index in an array, or invalid
- enum class TOML_CLOSED_ENUM path_component_type : uint8_t
- {
- key = 0x1,
- array_index = 0x2
- };
-
- /// \brief Represents a single component of a complete 'TOML-path': either a key or an array index
- class TOML_EXPORTED_CLASS path_component
- {
- /// \cond
- struct storage_t
- {
- static constexpr size_t size =
- (sizeof(size_t) < sizeof(std::string) ? sizeof(std::string) : sizeof(size_t));
- static constexpr size_t align =
- (alignof(size_t) < alignof(std::string) ? alignof(std::string) : alignof(size_t));
-
- alignas(align) unsigned char bytes[size];
- };
- alignas(storage_t::align) mutable storage_t value_storage_;
-
- path_component_type type_;
-
- TOML_PURE_GETTER
- TOML_EXPORTED_STATIC_FUNCTION
- static bool TOML_CALLCONV equal(const path_component&, const path_component&) noexcept;
-
- template <typename Type>
- TOML_PURE_INLINE_GETTER
- static Type* get_as(storage_t& s) noexcept
- {
- return TOML_LAUNDER(reinterpret_cast<Type*>(s.bytes));
- }
-
- static void store_key(std::string_view key, storage_t& storage_)
- {
- ::new (static_cast<void*>(storage_.bytes)) std::string{ key };
- }
-
- static void store_index(size_t index, storage_t& storage_) noexcept
- {
- ::new (static_cast<void*>(storage_.bytes)) std::size_t{ index };
- }
-
- void destroy() noexcept
- {
- if (type_ == path_component_type::key)
- get_as<std::string>(value_storage_)->~basic_string();
- }
-
- TOML_NODISCARD
- size_t& index_ref() noexcept
- {
- TOML_ASSERT_ASSUME(type_ == path_component_type::array_index);
- return *get_as<size_t>(value_storage_);
- }
-
- TOML_NODISCARD
- std::string& key_ref() noexcept
- {
- TOML_ASSERT_ASSUME(type_ == path_component_type::key);
- return *get_as<std::string>(value_storage_);
- }
- /// \endcond
-
- public:
- /// \brief Default constructor (creates an empty key).
- TOML_NODISCARD_CTOR
- TOML_EXPORTED_MEMBER_FUNCTION
- path_component();
-
- /// \brief Constructor for a path component that is an array index
- TOML_NODISCARD_CTOR
- TOML_EXPORTED_MEMBER_FUNCTION
- path_component(size_t index) noexcept;
-
- /// \brief Constructor for a path component that is a key string
- TOML_NODISCARD_CTOR
- TOML_EXPORTED_MEMBER_FUNCTION
- path_component(std::string_view key);
+TOML_NAMESPACE_START {
+ /// \brief Indicates type of path component, either a key, an index in an array, or invalid
+ enum class TOML_CLOSED_ENUM path_component_type : uint8_t { key = 0x1, array_index = 0x2 };
+
+ /// \brief Represents a single component of a complete 'TOML-path': either a key or an array index
+ class TOML_EXPORTED_CLASS path_component {
+ /// \cond
+ struct storage_t {
+ static constexpr size_t size =
+ (sizeof(size_t) < sizeof(std::string) ? sizeof(std::string) : sizeof(size_t));
+ static constexpr size_t align =
+ (alignof(size_t) < alignof(std::string) ? alignof(std::string) : alignof(size_t));
+
+ alignas(align) unsigned char bytes[size];
+ };
+ alignas(storage_t::align) mutable storage_t value_storage_;
+
+ path_component_type type_;
+
+ TOML_PURE_GETTER
+ TOML_EXPORTED_STATIC_FUNCTION
+ static bool TOML_CALLCONV equal(const path_component&, const path_component&) noexcept;
+
+ template <typename Type>
+ TOML_PURE_INLINE_GETTER static Type* get_as(storage_t& s) noexcept {
+ return TOML_LAUNDER(reinterpret_cast<Type*>(s.bytes));
+ }
+
+ static void store_key(std::string_view key, storage_t& storage_) {
+ ::new (static_cast<void*>(storage_.bytes)) std::string{key};
+ }
+
+ static void store_index(size_t index, storage_t& storage_) noexcept {
+ ::new (static_cast<void*>(storage_.bytes)) std::size_t{index};
+ }
+
+ void destroy() noexcept {
+ if (type_ == path_component_type::key) get_as<std::string>(value_storage_)->~basic_string();
+ }
+
+ TOML_NODISCARD
+ size_t& index_ref() noexcept {
+ TOML_ASSERT_ASSUME(type_ == path_component_type::array_index);
+ return *get_as<size_t>(value_storage_);
+ }
+
+ TOML_NODISCARD
+ std::string& key_ref() noexcept {
+ TOML_ASSERT_ASSUME(type_ == path_component_type::key);
+ return *get_as<std::string>(value_storage_);
+ }
+ /// \endcond
+
+ public:
+ /// \brief Default constructor (creates an empty key).
+ TOML_NODISCARD_CTOR
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path_component();
+
+ /// \brief Constructor for a path component that is an array index
+ TOML_NODISCARD_CTOR
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path_component(size_t index) noexcept;
+
+ /// \brief Constructor for a path component that is a key string
+ TOML_NODISCARD_CTOR
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path_component(std::string_view key);
#if TOML_ENABLE_WINDOWS_COMPAT
- /// \brief Constructor for a path component that is a key string
- ///
- /// \availability This constructor is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_NODISCARD_CTOR
- TOML_EXPORTED_MEMBER_FUNCTION
- path_component(std::wstring_view key);
+ /// \brief Constructor for a path component that is a key string
+ ///
+ /// \availability This constructor is only available when #TOML_ENABLE_WINDOWS_COMPAT is
+ /// enabled.
+ TOML_NODISCARD_CTOR
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path_component(std::wstring_view key);
#endif
- /// \brief Copy constructor.
- TOML_NODISCARD_CTOR
- TOML_EXPORTED_MEMBER_FUNCTION
- path_component(const path_component& pc);
+ /// \brief Copy constructor.
+ TOML_NODISCARD_CTOR
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path_component(const path_component& pc);
- /// \brief Move constructor.
- TOML_NODISCARD_CTOR
- TOML_EXPORTED_MEMBER_FUNCTION
- path_component(path_component&& pc) noexcept;
+ /// \brief Move constructor.
+ TOML_NODISCARD_CTOR
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path_component(path_component&& pc) noexcept;
- /// \brief Copy-assignment operator.
- TOML_EXPORTED_MEMBER_FUNCTION
- path_component& operator=(const path_component& rhs);
+ /// \brief Copy-assignment operator.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path_component& operator=(const path_component& rhs);
- /// \brief Move-assignment operator.
- TOML_EXPORTED_MEMBER_FUNCTION
- path_component& operator=(path_component&& rhs) noexcept;
+ /// \brief Move-assignment operator.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path_component& operator=(path_component&& rhs) noexcept;
- /// \brief Assigns an array index to this path component.
- TOML_EXPORTED_MEMBER_FUNCTION
- path_component& operator=(size_t new_index) noexcept;
+ /// \brief Assigns an array index to this path component.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path_component& operator=(size_t new_index) noexcept;
- /// \brief Assigns a path key to this path component.
- TOML_EXPORTED_MEMBER_FUNCTION
- path_component& operator=(std::string_view new_key);
+ /// \brief Assigns a path key to this path component.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path_component& operator=(std::string_view new_key);
#if TOML_ENABLE_WINDOWS_COMPAT
- /// \brief Assigns a path key to this path component.
- ///
- /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_EXPORTED_MEMBER_FUNCTION
- path_component& operator=(std::wstring_view new_key);
+ /// \brief Assigns a path key to this path component.
+ ///
+ /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path_component& operator=(std::wstring_view new_key);
#endif
- /// \brief Destructor.
- ~path_component() noexcept
- {
- destroy();
- }
-
- /// \name Array index accessors
- /// \warning It is undefined behaviour to call these functions when the path component does not represent an array index.
- /// Check #type() to determine the component's value type.
- /// @{
-
- /// \brief Returns the array index (const lvalue overload).
- TOML_PURE_GETTER
- size_t index() const noexcept
- {
- TOML_ASSERT_ASSUME(type_ == path_component_type::array_index);
- return *get_as<const size_t>(value_storage_);
- }
-
- /// \brief Returns the array index (const lvalue).
- TOML_PURE_INLINE_GETTER
- explicit operator size_t() const noexcept
- {
- return index();
- }
-
- /// @}
-
- /// \name Key accessors
- /// \warning It is undefined behaviour to call these functions when the path component does not represent a key.
- /// Check #type() to determine the component's value type.
- /// @{
-
- /// \brief Returns the key string.
- TOML_PURE_GETTER
- const std::string& key() const noexcept
- {
- TOML_ASSERT_ASSUME(type_ == path_component_type::key);
- return *get_as<const std::string>(value_storage_);
- }
-
- /// \brief Returns the key string.
- TOML_PURE_INLINE_GETTER
- explicit operator const std::string&() const noexcept
- {
- return key();
- }
-
- /// @}
-
- /// \brief Retrieve the type of this path component, either path_component::key or path_component::array_index
- TOML_PURE_INLINE_GETTER
- path_component_type type() const noexcept
- {
- return type_;
- }
-
- /// \name Equality
- /// @{
-
- /// \brief Returns true if two path components represent the same key or array index.
- TOML_PURE_INLINE_GETTER
- friend bool operator==(const path_component& lhs, const path_component& rhs) noexcept
- {
- return equal(lhs, rhs);
- }
-
- /// \brief Returns true if two path components do not represent the same key or array index.
- TOML_PURE_INLINE_GETTER
- friend bool operator!=(const path_component& lhs, const path_component& rhs) noexcept
- {
- return !equal(lhs, rhs);
- }
-
- /// @}
- };
-
- /// \brief A TOML path.
- ///
- /// \detail This type parses and represents a path to a TOML node. It validates
- /// the syntax of the path but does not ensure that the path refers to
- /// a valid node in any particular TOML document. If parsing fails,
- /// the object will evaluate as 'falsy', and will be empty.
- ///
- /// \cpp
- /// toml::path the_path("animals.cats[1]");
- ///
- /// // can use with tbl.at_path or operator[]
- /// std::cout << "second cat: " << tbl[the_path] << "\n";
- /// std::cout << "cats: " << tbl.at_path(the_path.parent_path()) << "\n";
- /// \ecpp
- ///
- /// \out
- /// second cat: lion
- /// cats: ['tiger', 'lion', 'puma']
- /// \eout
- class TOML_EXPORTED_CLASS path
- {
- private:
- /// \cond
-
- std::vector<path_component> components_;
-
- TOML_EXPORTED_MEMBER_FUNCTION
- void print_to(std::ostream&) const;
-
- TOML_PURE_GETTER
- TOML_EXPORTED_STATIC_FUNCTION
- static bool TOML_CALLCONV equal(const path&, const path&) noexcept;
-
- /// \endcond
-
- public:
- /// \brief Default constructor.
- TOML_NODISCARD_CTOR
- path() noexcept = default;
-
- /// \brief Construct a path by parsing from a string.
- TOML_NODISCARD_CTOR
- TOML_EXPORTED_MEMBER_FUNCTION
- explicit path(std::string_view);
+ /// \brief Destructor.
+ ~path_component() noexcept { destroy(); }
+
+ /// \name Array index accessors
+ /// \warning It is undefined behaviour to call these functions when the path component does not
+ /// represent an array index. Check #type() to determine the component's value type.
+ /// @{
+
+ /// \brief Returns the array index (const lvalue overload).
+ TOML_PURE_GETTER
+ size_t index() const noexcept {
+ TOML_ASSERT_ASSUME(type_ == path_component_type::array_index);
+ return *get_as<const size_t>(value_storage_);
+ }
+
+ /// \brief Returns the array index (const lvalue).
+ TOML_PURE_INLINE_GETTER
+ explicit operator size_t() const noexcept { return index(); }
+
+ /// @}
+
+ /// \name Key accessors
+ /// \warning It is undefined behaviour to call these functions when the path component does not
+ /// represent a key. Check #type() to determine the component's value type.
+ /// @{
+
+ /// \brief Returns the key string.
+ TOML_PURE_GETTER
+ const std::string& key() const noexcept {
+ TOML_ASSERT_ASSUME(type_ == path_component_type::key);
+ return *get_as<const std::string>(value_storage_);
+ }
+
+ /// \brief Returns the key string.
+ TOML_PURE_INLINE_GETTER
+ explicit operator const std::string&() const noexcept { return key(); }
+
+ /// @}
+
+ /// \brief Retrieve the type of this path component, either path_component::key or
+ /// path_component::array_index
+ TOML_PURE_INLINE_GETTER
+ path_component_type type() const noexcept { return type_; }
+
+ /// \name Equality
+ /// @{
+
+ /// \brief Returns true if two path components represent the same key or array index.
+ TOML_PURE_INLINE_GETTER
+ friend bool operator==(const path_component& lhs, const path_component& rhs) noexcept {
+ return equal(lhs, rhs);
+ }
+
+ /// \brief Returns true if two path components do not represent the same key or array index.
+ TOML_PURE_INLINE_GETTER
+ friend bool operator!=(const path_component& lhs, const path_component& rhs) noexcept {
+ return !equal(lhs, rhs);
+ }
+
+ /// @}
+ };
+
+ /// \brief A TOML path.
+ ///
+ /// \detail This type parses and represents a path to a TOML node. It validates
+ /// the syntax of the path but does not ensure that the path refers to
+ /// a valid node in any particular TOML document. If parsing fails,
+ /// the object will evaluate as 'falsy', and will be empty.
+ ///
+ /// \cpp
+ /// toml::path the_path("animals.cats[1]");
+ ///
+ /// // can use with tbl.at_path or operator[]
+ /// std::cout << "second cat: " << tbl[the_path] << "\n";
+ /// std::cout << "cats: " << tbl.at_path(the_path.parent_path()) << "\n";
+ /// \ecpp
+ ///
+ /// \out
+ /// second cat: lion
+ /// cats: ['tiger', 'lion', 'puma']
+ /// \eout
+ class TOML_EXPORTED_CLASS path {
+ private:
+ /// \cond
+
+ std::vector<path_component> components_;
+
+ TOML_EXPORTED_MEMBER_FUNCTION
+ void print_to(std::ostream&) const;
+
+ TOML_PURE_GETTER
+ TOML_EXPORTED_STATIC_FUNCTION
+ static bool TOML_CALLCONV equal(const path&, const path&) noexcept;
+
+ /// \endcond
+
+ public:
+ /// \brief Default constructor.
+ TOML_NODISCARD_CTOR
+ path() noexcept = default;
+
+ /// \brief Construct a path by parsing from a string.
+ TOML_NODISCARD_CTOR
+ TOML_EXPORTED_MEMBER_FUNCTION
+ explicit path(std::string_view);
#if TOML_ENABLE_WINDOWS_COMPAT
- /// \brief Construct a path by parsing from a string.
- ///
- /// \availability This constructor is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_NODISCARD_CTOR
- TOML_EXPORTED_MEMBER_FUNCTION
- explicit path(std::wstring_view);
+ /// \brief Construct a path by parsing from a string.
+ ///
+ /// \availability This constructor is only available when #TOML_ENABLE_WINDOWS_COMPAT is
+ /// enabled.
+ TOML_NODISCARD_CTOR
+ TOML_EXPORTED_MEMBER_FUNCTION
+ explicit path(std::wstring_view);
#endif
- /// \brief Default destructor.
- ~path() noexcept = default;
-
- /// \brief Copy constructor.
- TOML_NODISCARD_CTOR
- path(const path&) = default;
-
- /// \brief Move constructor.
- TOML_NODISCARD_CTOR
- path(path&&) noexcept = default;
-
- /// \brief Returns the number of components in the path.
- TOML_PURE_INLINE_GETTER
- size_t size() const noexcept
- {
- return components_.size();
- }
-
- /// \brief Returns true if the path has one or more components.
- TOML_PURE_INLINE_GETTER
- explicit operator bool() const noexcept
- {
- return !components_.empty();
- }
-
- /// \brief Whether (true) or not (false) the path is empty
- TOML_PURE_INLINE_GETTER
- bool empty() const noexcept
- {
- return components_.empty();
- }
-
- /// \brief Fetch a path component by index.
- TOML_PURE_INLINE_GETTER
- path_component& operator[](size_t index) noexcept
- {
- TOML_ASSERT(index < size());
- return components_[index];
- }
-
- /// \brief Fetch a path component by index (const overload).
- TOML_PURE_INLINE_GETTER
- const path_component& operator[](size_t index) const noexcept
- {
- TOML_ASSERT(index < size());
- return components_[index];
- }
-
- /// \name Assignment
- /// @{
-
- /// \brief Copy-assignment operator.
- path& operator=(const path&) = default;
-
- /// \brief Move-assignment operator.
- path& operator=(path&&) noexcept = default;
-
- /// \brief Replaces the contents of the path by parsing from a string.
- TOML_EXPORTED_MEMBER_FUNCTION
- path& operator=(std::string_view);
+ /// \brief Default destructor.
+ ~path() noexcept = default;
+
+ /// \brief Copy constructor.
+ TOML_NODISCARD_CTOR
+ path(const path&) = default;
+
+ /// \brief Move constructor.
+ TOML_NODISCARD_CTOR
+ path(path&&) noexcept = default;
+
+ /// \brief Returns the number of components in the path.
+ TOML_PURE_INLINE_GETTER
+ size_t size() const noexcept { return components_.size(); }
+
+ /// \brief Returns true if the path has one or more components.
+ TOML_PURE_INLINE_GETTER
+ explicit operator bool() const noexcept { return !components_.empty(); }
+
+ /// \brief Whether (true) or not (false) the path is empty
+ TOML_PURE_INLINE_GETTER
+ bool empty() const noexcept { return components_.empty(); }
+
+ /// \brief Fetch a path component by index.
+ TOML_PURE_INLINE_GETTER
+ path_component& operator[](size_t index) noexcept {
+ TOML_ASSERT(index < size());
+ return components_[index];
+ }
+
+ /// \brief Fetch a path component by index (const overload).
+ TOML_PURE_INLINE_GETTER
+ const path_component& operator[](size_t index) const noexcept {
+ TOML_ASSERT(index < size());
+ return components_[index];
+ }
+
+ /// \name Assignment
+ /// @{
+
+ /// \brief Copy-assignment operator.
+ path& operator=(const path&) = default;
+
+ /// \brief Move-assignment operator.
+ path& operator=(path&&) noexcept = default;
+
+ /// \brief Replaces the contents of the path by parsing from a string.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path& operator=(std::string_view);
#if TOML_ENABLE_WINDOWS_COMPAT
- /// \brief Replaces the contents of the path by parsing from a string.
- ///
- /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_EXPORTED_MEMBER_FUNCTION
- path& operator=(std::wstring_view);
+ /// \brief Replaces the contents of the path by parsing from a string.
+ ///
+ /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path& operator=(std::wstring_view);
#endif
- /// \brief Replaces the contents of the path with that of another.
- TOML_ALWAYS_INLINE
- path& assign(const path& p)
- {
- return *this = p;
- }
-
- /// \brief Replaces the contents of the path with that of another.
- TOML_ALWAYS_INLINE
- path& assign(path&& p) noexcept
- {
- return *this = std::move(p);
- }
-
- /// \brief Replaces the contents of the path object by a new path
- TOML_ALWAYS_INLINE
- path& assign(std::string_view str)
- {
- return *this = str;
- }
+ /// \brief Replaces the contents of the path with that of another.
+ TOML_ALWAYS_INLINE
+ path& assign(const path& p) { return *this = p; }
+
+ /// \brief Replaces the contents of the path with that of another.
+ TOML_ALWAYS_INLINE
+ path& assign(path&& p) noexcept { return *this = std::move(p); }
+
+ /// \brief Replaces the contents of the path object by a new path
+ TOML_ALWAYS_INLINE
+ path& assign(std::string_view str) { return *this = str; }
#if TOML_ENABLE_WINDOWS_COMPAT
- /// \brief Replaces the contents of the path object by a new path
- ///
- /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_ALWAYS_INLINE
- path& assign(std::wstring_view str)
- {
- return *this = str;
- }
+ /// \brief Replaces the contents of the path object by a new path
+ ///
+ /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
+ TOML_ALWAYS_INLINE
+ path& assign(std::wstring_view str) { return *this = str; }
#endif
- /// @}
+ /// @}
- /// \name Appending
- /// @{
+ /// \name Appending
+ /// @{
- /// \brief Appends another path onto the end of this one.
- TOML_EXPORTED_MEMBER_FUNCTION
- path& operator+=(const path&);
+ /// \brief Appends another path onto the end of this one.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path& operator+=(const path&);
- /// \brief Appends another path onto the end of this one.
- TOML_EXPORTED_MEMBER_FUNCTION
- path& operator+=(path&&);
+ /// \brief Appends another path onto the end of this one.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path& operator+=(path&&);
- /// \brief Parses a path and appends it onto the end of this one.
- TOML_EXPORTED_MEMBER_FUNCTION
- path& operator+=(std::string_view);
+ /// \brief Parses a path and appends it onto the end of this one.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path& operator+=(std::string_view);
#if TOML_ENABLE_WINDOWS_COMPAT
- /// \brief Parses a path and appends it onto the end of this one.
- ///
- /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_EXPORTED_MEMBER_FUNCTION
- path& operator+=(std::wstring_view);
+ /// \brief Parses a path and appends it onto the end of this one.
+ ///
+ /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path& operator+=(std::wstring_view);
#endif
- /// \brief Appends another path onto the end of this one.
- TOML_ALWAYS_INLINE
- path& append(const path& p)
- {
- return *this += p;
- }
-
- /// \brief Appends another path onto the end of this one.
- TOML_ALWAYS_INLINE
- path& append(path&& p)
- {
- return *this += std::move(p);
- }
-
- /// \brief Parses a path and appends it onto the end of this one.
- TOML_ALWAYS_INLINE
- path& append(std::string_view str)
- {
- return *this += str;
- }
+ /// \brief Appends another path onto the end of this one.
+ TOML_ALWAYS_INLINE
+ path& append(const path& p) { return *this += p; }
+
+ /// \brief Appends another path onto the end of this one.
+ TOML_ALWAYS_INLINE
+ path& append(path&& p) { return *this += std::move(p); }
+
+ /// \brief Parses a path and appends it onto the end of this one.
+ TOML_ALWAYS_INLINE
+ path& append(std::string_view str) { return *this += str; }
#if TOML_ENABLE_WINDOWS_COMPAT
- /// \brief Parses a path and appends it onto the end of this one.
- ///
- /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_ALWAYS_INLINE
- path& append(std::wstring_view str)
- {
- return *this += str;
- }
+ /// \brief Parses a path and appends it onto the end of this one.
+ ///
+ /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
+ TOML_ALWAYS_INLINE
+ path& append(std::wstring_view str) { return *this += str; }
#endif
- /// @}
+ /// @}
- /// \name Prepending
- /// @{
+ /// \name Prepending
+ /// @{
- /// \brief Prepends another path onto the beginning of this one.
- TOML_EXPORTED_MEMBER_FUNCTION
- path& prepend(const path&);
+ /// \brief Prepends another path onto the beginning of this one.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path& prepend(const path&);
- /// \brief Prepends another path onto the beginning of this one.
- TOML_EXPORTED_MEMBER_FUNCTION
- path& prepend(path&&);
+ /// \brief Prepends another path onto the beginning of this one.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path& prepend(path&&);
- /// \brief Parses a path and prepends it onto the beginning of this one.
- TOML_EXPORTED_MEMBER_FUNCTION
- path& prepend(std::string_view);
+ /// \brief Parses a path and prepends it onto the beginning of this one.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path& prepend(std::string_view);
#if TOML_ENABLE_WINDOWS_COMPAT
- /// \brief Parses a path and prepends it onto the beginning of this one.
- ///
- /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_EXPORTED_MEMBER_FUNCTION
- path& prepend(std::wstring_view);
+ /// \brief Parses a path and prepends it onto the beginning of this one.
+ ///
+ /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path& prepend(std::wstring_view);
#endif
- /// @}
-
- /// \name Concatenation
- /// @{
-
- /// \brief Concatenates two paths.
- TOML_NODISCARD
- friend path operator+(const path& lhs, const path& rhs)
- {
- path result = lhs;
- result += rhs;
- return result;
- }
-
- /// \brief Concatenates two paths.
- TOML_NODISCARD
- friend path operator+(const path& lhs, std::string_view rhs)
- {
- path result = lhs;
- result += rhs;
- return result;
- }
-
- /// \brief Concatenates two paths.
- TOML_NODISCARD
- friend path operator+(std::string_view lhs, const path& rhs)
- {
- path result = rhs;
- result.prepend(lhs);
- return result;
- }
+ /// @}
+
+ /// \name Concatenation
+ /// @{
+
+ /// \brief Concatenates two paths.
+ TOML_NODISCARD
+ friend path operator+(const path& lhs, const path& rhs) {
+ path result = lhs;
+ result += rhs;
+ return result;
+ }
+
+ /// \brief Concatenates two paths.
+ TOML_NODISCARD
+ friend path operator+(const path& lhs, std::string_view rhs) {
+ path result = lhs;
+ result += rhs;
+ return result;
+ }
+
+ /// \brief Concatenates two paths.
+ TOML_NODISCARD
+ friend path operator+(std::string_view lhs, const path& rhs) {
+ path result = rhs;
+ result.prepend(lhs);
+ return result;
+ }
#if TOML_ENABLE_WINDOWS_COMPAT
- /// \brief Concatenates two paths.
- ///
- /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_NODISCARD
- friend path operator+(const path& lhs, std::wstring_view rhs)
- {
- path result = lhs;
- result += rhs;
- return result;
- }
-
- /// \brief Concatenates two paths.
- ///
- /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_NODISCARD
- friend path operator+(std::wstring_view lhs, const path& rhs)
- {
- path result = rhs;
- result.prepend(lhs);
- return result;
- }
+ /// \brief Concatenates two paths.
+ ///
+ /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
+ TOML_NODISCARD
+ friend path operator+(const path& lhs, std::wstring_view rhs) {
+ path result = lhs;
+ result += rhs;
+ return result;
+ }
+
+ /// \brief Concatenates two paths.
+ ///
+ /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
+ TOML_NODISCARD
+ friend path operator+(std::wstring_view lhs, const path& rhs) {
+ path result = rhs;
+ result.prepend(lhs);
+ return result;
+ }
#endif
- /// @}
+ /// @}
- /// \name String conversion
- /// @{
+ /// \name String conversion
+ /// @{
- /// \brief Prints the string representation of a #toml::path out to a stream.
- TOML_ALWAYS_INLINE
- friend std::ostream& operator<<(std::ostream& os, const path& rhs)
- {
- rhs.print_to(os);
- return os;
- }
+ /// \brief Prints the string representation of a #toml::path out to a stream.
+ TOML_ALWAYS_INLINE
+ friend std::ostream& operator<<(std::ostream& os, const path& rhs) {
+ rhs.print_to(os);
+ return os;
+ }
- /// \brief Returns a string representation of this path.
- TOML_NODISCARD
- TOML_EXPORTED_MEMBER_FUNCTION
- std::string str() const;
+ /// \brief Returns a string representation of this path.
+ TOML_NODISCARD
+ TOML_EXPORTED_MEMBER_FUNCTION
+ std::string str() const;
- /// \brief Returns a string representation of this path.
- TOML_NODISCARD
- TOML_ALWAYS_INLINE
- explicit operator std::string() const
- {
- return str();
- }
+ /// \brief Returns a string representation of this path.
+ TOML_NODISCARD
+ TOML_ALWAYS_INLINE
+ explicit operator std::string() const { return str(); }
#if TOML_ENABLE_WINDOWS_COMPAT
- /// \brief Returns a string representation of this path.
- ///
- /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_NODISCARD
- TOML_EXPORTED_MEMBER_FUNCTION
- std::wstring wide_str() const;
-
- /// \brief Returns a string representation of this path.
- ///
- /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_NODISCARD
- TOML_ALWAYS_INLINE
- explicit operator std::wstring() const
- {
- return wide_str();
- }
+ /// \brief Returns a string representation of this path.
+ ///
+ /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
+ TOML_NODISCARD
+ TOML_EXPORTED_MEMBER_FUNCTION
+ std::wstring wide_str() const;
+
+ /// \brief Returns a string representation of this path.
+ ///
+ /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
+ TOML_NODISCARD
+ TOML_ALWAYS_INLINE
+ explicit operator std::wstring() const { return wide_str(); }
#endif
- /// @}
-
- /// \name Equality
- /// @{
-
- /// \brief Returns whether two paths are the same.
- TOML_PURE_INLINE_GETTER
- friend bool operator==(const path& lhs, const path& rhs) noexcept
- {
- return equal(lhs, rhs);
- }
-
- /// \brief Returns whether two paths are not the same.
- TOML_PURE_INLINE_GETTER
- friend bool operator!=(const path& lhs, const path& rhs) noexcept
- {
- return !equal(lhs, rhs);
- }
-
- /// \brief Returns whether two paths are the same.
- TOML_NODISCARD
- TOML_ALWAYS_INLINE
- friend bool operator==(const path& lhs, std::string_view rhs)
- {
- return lhs == path{ rhs };
- }
-
- /// \brief Returns whether two paths are the same.
- TOML_NODISCARD
- TOML_ALWAYS_INLINE
- friend bool operator==(std::string_view lhs, const path& rhs)
- {
- return rhs == lhs;
- }
-
- /// \brief Returns whether two paths are not the same.
- TOML_NODISCARD
- TOML_ALWAYS_INLINE
- friend bool operator!=(const path& lhs, std::string_view rhs)
- {
- return lhs != path{ rhs };
- }
-
- /// \brief Returns whether two paths are not the same.
- TOML_NODISCARD
- TOML_ALWAYS_INLINE
- friend bool operator!=(std::string_view lhs, const path& rhs)
- {
- return rhs != lhs;
- }
+ /// @}
+
+ /// \name Equality
+ /// @{
+
+ /// \brief Returns whether two paths are the same.
+ TOML_PURE_INLINE_GETTER
+ friend bool operator==(const path& lhs, const path& rhs) noexcept { return equal(lhs, rhs); }
+
+ /// \brief Returns whether two paths are not the same.
+ TOML_PURE_INLINE_GETTER
+ friend bool operator!=(const path& lhs, const path& rhs) noexcept { return !equal(lhs, rhs); }
+
+ /// \brief Returns whether two paths are the same.
+ TOML_NODISCARD
+ TOML_ALWAYS_INLINE
+ friend bool operator==(const path& lhs, std::string_view rhs) { return lhs == path{rhs}; }
+
+ /// \brief Returns whether two paths are the same.
+ TOML_NODISCARD
+ TOML_ALWAYS_INLINE
+ friend bool operator==(std::string_view lhs, const path& rhs) { return rhs == lhs; }
+
+ /// \brief Returns whether two paths are not the same.
+ TOML_NODISCARD
+ TOML_ALWAYS_INLINE
+ friend bool operator!=(const path& lhs, std::string_view rhs) { return lhs != path{rhs}; }
+
+ /// \brief Returns whether two paths are not the same.
+ TOML_NODISCARD
+ TOML_ALWAYS_INLINE
+ friend bool operator!=(std::string_view lhs, const path& rhs) { return rhs != lhs; }
#if TOML_ENABLE_WINDOWS_COMPAT
- /// \brief Returns whether two paths are the same.
- ///
- /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_NODISCARD
- TOML_ALWAYS_INLINE
- friend bool operator==(const path& lhs, std::wstring_view rhs)
- {
- return lhs == path{ rhs };
- }
-
- /// \brief Returns whether two paths are the same.
- ///
- /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_NODISCARD
- TOML_ALWAYS_INLINE
- friend bool operator==(std::wstring_view lhs, const path& rhs)
- {
- return rhs == lhs;
- }
-
- /// \brief Returns whether two paths are not the same.
- ///
- /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_NODISCARD
- TOML_ALWAYS_INLINE
- friend bool operator!=(const path& lhs, std::wstring_view rhs)
- {
- return lhs != path{ rhs };
- }
-
- /// \brief Returns whether two paths are not the same.
- ///
- /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
- TOML_NODISCARD
- TOML_ALWAYS_INLINE
- friend bool operator!=(std::wstring_view lhs, const path& rhs)
- {
- return rhs != lhs;
- }
-
-#endif // TOML_ENABLE_WINDOWS_COMPAT
-
- /// @}
-
- /// \name Iteration
- /// @{
-
- /// An iterator for iterating over the components in the path.
- /// \see #toml::path_component
- using iterator = std::vector<path_component>::iterator;
-
- /// A const iterator for iterating over the components in the path.
- /// \see #toml::path_component
- using const_iterator = std::vector<path_component>::const_iterator;
-
- /// \brief Returns an iterator to the first component in the path.
- /// \see #toml::path_component
- TOML_PURE_INLINE_GETTER
- iterator begin() noexcept
- {
- return components_.begin();
- }
-
- /// \brief Returns an iterator to one-past-the-last component in the path.
- /// \see #toml::path_component
- TOML_PURE_INLINE_GETTER
- iterator end() noexcept
- {
- return components_.end();
- }
-
- /// \brief Returns a const iterator to the first component in the path.
- /// \see #toml::path_component
- TOML_PURE_INLINE_GETTER
- const_iterator begin() const noexcept
- {
- return components_.begin();
- }
-
- /// \brief Returns a const iterator to one-past-the-last component in the path.
- /// \see #toml::path_component
- TOML_PURE_INLINE_GETTER
- const_iterator end() const noexcept
- {
- return components_.end();
- }
-
- /// \brief Returns a const iterator to the first component in the path.
- /// \see #toml::path_component
- TOML_PURE_INLINE_GETTER
- const_iterator cbegin() const noexcept
- {
- return components_.begin();
- }
-
- /// \brief Returns a const iterator to one-past-the-last component in the path.
- /// \see #toml::path_component
- TOML_PURE_INLINE_GETTER
- const_iterator cend() const noexcept
- {
- return components_.end();
- }
-
- /// @}
-
- /// \name Subpaths and Truncation
- /// @{
-
- /// \brief Erases the contents of the path.
- TOML_EXPORTED_MEMBER_FUNCTION
- void clear() noexcept;
-
- /// \brief Removes the number of terminal path components specified by n
- TOML_EXPORTED_MEMBER_FUNCTION
- path& truncate(size_t n);
-
- /// \brief Returns a toml::path object which has had n terminal path components removed
- TOML_NODISCARD
- TOML_EXPORTED_MEMBER_FUNCTION
- path truncated(size_t n) const;
-
- /// \brief Returns a toml::path object representing the path of the parent node
- TOML_NODISCARD
- TOML_EXPORTED_MEMBER_FUNCTION
- path parent() const;
-
- /// \brief Returns a toml::path object representing terminal n-parts of a TOML path
- TOML_NODISCARD
- TOML_EXPORTED_MEMBER_FUNCTION
- path leaf(size_t n = 1) const;
-
- /// \brief Returns a toml::path object that is a specified subpath of the current path, representing the
- /// range of path components from [start, end).
- TOML_NODISCARD
- TOML_EXPORTED_MEMBER_FUNCTION
- path subpath(const_iterator start, const_iterator end) const;
-
- /// \brief Returns a toml::path object that is a specified subpath of the current path, representing the
- /// range of path components with indexes from [start, start + length].
- TOML_NODISCARD
- TOML_EXPORTED_MEMBER_FUNCTION
- path subpath(size_t start, size_t length) const;
-
- /// @}
- };
-
- inline namespace literals
- {
- /// \brief Parses a TOML path from a string literal.
- ///
- /// \detail \cpp
- /// using namespace toml::literals;
- ///
- /// auto path = "main.settings.devices[2]"_tpath;
- /// std::cout << path.parent_path() << "\n";
- /// \ecpp
- ///
- /// \out
- /// main.settings.devices
- /// \eout
- ///
- /// \param str The string data.
- /// \param len The string length.
- ///
- /// \returns A #toml::path generated from the string literal.
- TOML_NODISCARD
- TOML_ALWAYS_INLINE
- path operator"" _tpath(const char* str, size_t len)
- {
- return path(std::string_view{ str, len });
- }
- }
-
- /// \brief Returns a view of the node matching a fully-qualified "TOML path".
- ///
- /// \detail \cpp
- /// auto config = toml::parse(R"(
- ///
- /// [foo]
- /// bar = [ 0, 1, 2, [ 3 ], { kek = 4 } ]
- ///
- /// )"sv);
- ///
- /// toml::path path1("foo.bar[2]");
- /// toml::path path2("foo.bar[4].kek");
- /// std::cout << toml::at_path(config, path1) << "\n";
- /// std::cout << toml::at_path(config, path1.parent_path()) << "\n";
- /// std::cout << toml::at_path(config, path2) << "\n";
- /// std::cout << toml::at_path(config, path2.parent_path()) << "\n";
- /// \ecpp
- ///
- /// \out
- /// 2
- /// [ 0, 1, 2, [ 3 ], { kek = 4 } ]
- /// 4
- /// { kek = 4 }
- /// \eout
- ///
- ///
- /// \note Keys in paths are interpreted literally, so whitespace (or lack thereof) matters:
- /// \cpp
- /// toml::at_path(config, toml::path("foo.bar")) // same as config["foo"]["bar"]
- /// toml::at_path(config, toml::path("foo. bar")) // same as config["foo"][" bar"]
- /// toml::at_path(config, toml::path("foo..bar")) // same as config["foo"][""]["bar"]
- /// toml::at_path(config, toml::path(".foo.bar")) // same as config[""]["foo"]["bar"]
- /// \ecpp
- /// <br>
- /// Additionally, TOML allows '.' (period) characters to appear in keys if they are quoted strings.
- /// This function makes no allowance for this, instead treating all period characters as sub-table delimiters.
- ///
- /// \param root The root node from which the path will be traversed.
- /// \param path The "TOML path" to traverse.
- TOML_NODISCARD
- TOML_EXPORTED_FREE_FUNCTION
- node_view<node> TOML_CALLCONV at_path(node & root, const toml::path& path) noexcept;
-
- /// \brief Returns a const view of the node matching a fully-qualified "TOML path".
- ///
- /// \see #toml::at_path(node&, const toml::path& path)
- TOML_NODISCARD
- TOML_EXPORTED_FREE_FUNCTION
- node_view<const node> TOML_CALLCONV at_path(const node& root, const toml::path& path) noexcept;
+ /// \brief Returns whether two paths are the same.
+ ///
+ /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
+ TOML_NODISCARD
+ TOML_ALWAYS_INLINE
+ friend bool operator==(const path& lhs, std::wstring_view rhs) { return lhs == path{rhs}; }
+
+ /// \brief Returns whether two paths are the same.
+ ///
+ /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
+ TOML_NODISCARD
+ TOML_ALWAYS_INLINE
+ friend bool operator==(std::wstring_view lhs, const path& rhs) { return rhs == lhs; }
+
+ /// \brief Returns whether two paths are not the same.
+ ///
+ /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
+ TOML_NODISCARD
+ TOML_ALWAYS_INLINE
+ friend bool operator!=(const path& lhs, std::wstring_view rhs) { return lhs != path{rhs}; }
+
+ /// \brief Returns whether two paths are not the same.
+ ///
+ /// \availability This overload is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
+ TOML_NODISCARD
+ TOML_ALWAYS_INLINE
+ friend bool operator!=(std::wstring_view lhs, const path& rhs) { return rhs != lhs; }
+
+#endif // TOML_ENABLE_WINDOWS_COMPAT
+
+ /// @}
+
+ /// \name Iteration
+ /// @{
+
+ /// An iterator for iterating over the components in the path.
+ /// \see #toml::path_component
+ using iterator = std::vector<path_component>::iterator;
+
+ /// A const iterator for iterating over the components in the path.
+ /// \see #toml::path_component
+ using const_iterator = std::vector<path_component>::const_iterator;
+
+ /// \brief Returns an iterator to the first component in the path.
+ /// \see #toml::path_component
+ TOML_PURE_INLINE_GETTER
+ iterator begin() noexcept { return components_.begin(); }
+
+ /// \brief Returns an iterator to one-past-the-last component in the path.
+ /// \see #toml::path_component
+ TOML_PURE_INLINE_GETTER
+ iterator end() noexcept { return components_.end(); }
+
+ /// \brief Returns a const iterator to the first component in the path.
+ /// \see #toml::path_component
+ TOML_PURE_INLINE_GETTER
+ const_iterator begin() const noexcept { return components_.begin(); }
+
+ /// \brief Returns a const iterator to one-past-the-last component in the path.
+ /// \see #toml::path_component
+ TOML_PURE_INLINE_GETTER
+ const_iterator end() const noexcept { return components_.end(); }
+
+ /// \brief Returns a const iterator to the first component in the path.
+ /// \see #toml::path_component
+ TOML_PURE_INLINE_GETTER
+ const_iterator cbegin() const noexcept { return components_.begin(); }
+
+ /// \brief Returns a const iterator to one-past-the-last component in the path.
+ /// \see #toml::path_component
+ TOML_PURE_INLINE_GETTER
+ const_iterator cend() const noexcept { return components_.end(); }
+
+ /// @}
+
+ /// \name Subpaths and Truncation
+ /// @{
+
+ /// \brief Erases the contents of the path.
+ TOML_EXPORTED_MEMBER_FUNCTION
+ void clear() noexcept;
+
+ /// \brief Removes the number of terminal path components specified by n
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path& truncate(size_t n);
+
+ /// \brief Returns a toml::path object which has had n terminal path components removed
+ TOML_NODISCARD
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path truncated(size_t n) const;
+
+ /// \brief Returns a toml::path object representing the path of the parent node
+ TOML_NODISCARD
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path parent() const;
+
+ /// \brief Returns a toml::path object representing terminal n-parts of a TOML path
+ TOML_NODISCARD
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path leaf(size_t n = 1) const;
+
+ /// \brief Returns a toml::path object that is a specified subpath of the current path,
+ /// representing the range of path components from [start, end).
+ TOML_NODISCARD
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path subpath(const_iterator start, const_iterator end) const;
+
+ /// \brief Returns a toml::path object that is a specified subpath of the current path,
+ /// representing the range of path components with indexes from [start, start + length].
+ TOML_NODISCARD
+ TOML_EXPORTED_MEMBER_FUNCTION
+ path subpath(size_t start, size_t length) const;
+
+ /// @}
+ };
+
+ inline namespace literals {
+ /// \brief Parses a TOML path from a string literal.
+ ///
+ /// \detail \cpp
+ /// using namespace toml::literals;
+ ///
+ /// auto path = "main.settings.devices[2]"_tpath;
+ /// std::cout << path.parent_path() << "\n";
+ /// \ecpp
+ ///
+ /// \out
+ /// main.settings.devices
+ /// \eout
+ ///
+ /// \param str The string data.
+ /// \param len The string length.
+ ///
+ /// \returns A #toml::path generated from the string literal.
+ TOML_NODISCARD
+ TOML_ALWAYS_INLINE
+ path operator"" _tpath(const char* str, size_t len) {
+ return path(std::string_view{str, len});
+ }
+ } // namespace literals
+
+ /// \brief Returns a view of the node matching a fully-qualified "TOML path".
+ ///
+ /// \detail \cpp
+ /// auto config = toml::parse(R"(
+ ///
+ /// [foo]
+ /// bar = [ 0, 1, 2, [ 3 ], { kek = 4 } ]
+ ///
+ /// )"sv);
+ ///
+ /// toml::path path1("foo.bar[2]");
+ /// toml::path path2("foo.bar[4].kek");
+ /// std::cout << toml::at_path(config, path1) << "\n";
+ /// std::cout << toml::at_path(config, path1.parent_path()) << "\n";
+ /// std::cout << toml::at_path(config, path2) << "\n";
+ /// std::cout << toml::at_path(config, path2.parent_path()) << "\n";
+ /// \ecpp
+ ///
+ /// \out
+ /// 2
+ /// [ 0, 1, 2, [ 3 ], { kek = 4 } ]
+ /// 4
+ /// { kek = 4 }
+ /// \eout
+ ///
+ ///
+ /// \note Keys in paths are interpreted literally, so whitespace (or lack thereof) matters:
+ /// \cpp
+ /// toml::at_path(config, toml::path("foo.bar")) // same as config["foo"]["bar"]
+ /// toml::at_path(config, toml::path("foo. bar")) // same as config["foo"][" bar"]
+ /// toml::at_path(config, toml::path("foo..bar")) // same as config["foo"][""]["bar"]
+ /// toml::at_path(config, toml::path(".foo.bar")) // same as config[""]["foo"]["bar"]
+ /// \ecpp
+ /// <br>
+ /// Additionally, TOML allows '.' (period) characters to appear in keys if they are quoted
+ /// strings. This function makes no allowance for this, instead treating all period characters as
+ /// sub-table delimiters.
+ ///
+ /// \param root The root node from which the path will be traversed.
+ /// \param path The "TOML path" to traverse.
+ TOML_NODISCARD
+ TOML_EXPORTED_FREE_FUNCTION
+ node_view<node> TOML_CALLCONV at_path(node & root, const toml::path& path) noexcept;
+
+ /// \brief Returns a const view of the node matching a fully-qualified "TOML path".
+ ///
+ /// \see #toml::at_path(node&, const toml::path& path)
+ TOML_NODISCARD
+ TOML_EXPORTED_FREE_FUNCTION
+ node_view<const node> TOML_CALLCONV at_path(const node& root, const toml::path& path) noexcept;
}
TOML_NAMESPACE_END;