44// SPDX-License-Identifier: MIT
55#pragma once
66
7+ #include " std_vector.hpp"
8+ #include " trivia_piece.hpp"
79#include " source_region.hpp"
810#include " std_utility.hpp"
911#include " print_to_stream.hpp"
@@ -33,6 +35,8 @@ TOML_NAMESPACE_START
3335 private:
3436 std::string key_;
3537 source_region source_;
38+ std::optional<std::vector<trivia_piece>> leading_trivia_;
39+ std::optional<std::vector<trivia_piece>> trailing_trivia_;
3640
3741 public:
3842 // / \brief Default constructor.
@@ -41,44 +45,74 @@ TOML_NAMESPACE_START
4145
4246 // / \brief Constructs a key from a string view and source region.
4347 TOML_NODISCARD_CTOR
44- explicit key (std::string_view k, source_region&& src = {}) //
48+ explicit key (std::string_view k,
49+ source_region&& src = {},
50+ optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
51+ optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) //
4552 : key_{ k },
46- source_{ std::move (src) }
53+ source_{ std::move (src) },
54+ leading_trivia_ (leading_trivia),
55+ trailing_trivia_ (trailing_trivia)
4756 {}
4857
4958 // / \brief Constructs a key from a string view and source region.
5059 TOML_NODISCARD_CTOR
51- explicit key (std::string_view k, const source_region& src) //
60+ explicit key (std::string_view k,
61+ const source_region& src,
62+ optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
63+ optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) //
5264 : key_{ k },
53- source_{ src }
65+ source_{ src },
66+ leading_trivia_ (leading_trivia),
67+ trailing_trivia_ (trailing_trivia)
5468 {}
5569
5670 // / \brief Constructs a key from a string and source region.
5771 TOML_NODISCARD_CTOR
58- explicit key (std::string&& k, source_region&& src = {}) noexcept //
72+ explicit key (std::string&& k,
73+ source_region&& src = {},
74+ optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
75+ optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) noexcept //
5976 : key_{ std::move (k) },
60- source_{ std::move (src) }
77+ source_{ std::move (src) },
78+ leading_trivia_ (leading_trivia),
79+ trailing_trivia_ (trailing_trivia)
6180 {}
6281
6382 // / \brief Constructs a key from a string and source region.
6483 TOML_NODISCARD_CTOR
65- explicit key (std::string&& k, const source_region& src) noexcept //
84+ explicit key (std::string&& k,
85+ const source_region& src,
86+ optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
87+ optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) noexcept //
6688 : key_{ std::move (k) },
67- source_{ src }
89+ source_{ src },
90+ leading_trivia_ (leading_trivia),
91+ trailing_trivia_ (trailing_trivia)
6892 {}
6993
7094 // / \brief Constructs a key from a c-string and source region.
7195 TOML_NODISCARD_CTOR
72- explicit key (const char * k, source_region&& src = {}) //
96+ explicit key (const char * k,
97+ source_region&& src = {},
98+ optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
99+ optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) //
73100 : key_{ k },
74- source_{ std::move (src) }
101+ source_{ std::move (src) },
102+ leading_trivia_ (leading_trivia),
103+ trailing_trivia_ (trailing_trivia)
75104 {}
76105
77106 // / \brief Constructs a key from a c-string view and source region.
78107 TOML_NODISCARD_CTOR
79- explicit key (const char * k, const source_region& src) //
108+ explicit key (const char * k,
109+ const source_region& src,
110+ optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
111+ optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) //
80112 : key_{ k },
81- source_{ src }
113+ source_{ src },
114+ leading_trivia_ (leading_trivia),
115+ trailing_trivia_ (trailing_trivia)
82116 {}
83117
84118#if TOML_ENABLE_WINDOWS_COMPAT
@@ -87,18 +121,28 @@ TOML_NAMESPACE_START
87121 // /
88122 // / \availability This constructor is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
89123 TOML_NODISCARD_CTOR
90- explicit key (std::wstring_view k, source_region&& src = {}) //
124+ explicit key (std::wstring_view k,
125+ source_region&& src = {},
126+ optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
127+ optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) //
91128 : key_{ impl::narrow (k) },
92- source_{ std::move (src) }
129+ source_{ std::move (src) },
130+ leading_trivia_ (leading_trivia),
131+ trailing_trivia_(trailing_trivia)
93132 {}
94133
95134 // / \brief Constructs a key from a wide string and source region.
96135 // /
97136 // / \availability This constructor is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
98137 TOML_NODISCARD_CTOR
99- explicit key (std::wstring_view k, const source_region& src) //
138+ explicit key (std::wstring_view k,
139+ const source_region& src,
140+ optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
141+ optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) //
100142 : key_{ impl::narrow (k) },
101- source_{ src }
143+ source_{ src },
144+ leading_trivia_ (leading_trivia),
145+ trailing_trivia_(trailing_trivia)
102146 {}
103147
104148#endif
@@ -155,6 +199,23 @@ TOML_NAMESPACE_START
155199
156200 // / @}
157201
202+ // / \name Metadata
203+ // / @{
204+
205+ // / \brief Returns the key's leading trivia.
206+ optional<std::vector<trivia_piece>> leading_trivia () const noexcept
207+ {
208+ return leading_trivia_;
209+ }
210+
211+ // / \brief Returns the key's trailing trivia.
212+ optional<std::vector<trivia_piece>> trailing_trivia () const noexcept
213+ {
214+ return trailing_trivia_;
215+ }
216+
217+ // / @}
218+
158219 // / \name Equality and Comparison
159220 // / \attention These operations only compare the underlying strings; source regions are ignored for the purposes of all comparison!
160221 // / @{
0 commit comments