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