Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions include/toml++/impl/array.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
#include "std_utility.hpp"
#include "std_vector.hpp"
#include "std_initializer_list.hpp"
#include "preprocessor.hpp"
#include "trivia_piece.hpp"
#include "value.hpp"
#include "make_node.hpp"
#include "header_start.hpp"
Expand Down Expand Up @@ -290,6 +292,7 @@ TOML_NAMESPACE_START
using vector_iterator = typename vector_type::iterator;
using const_vector_iterator = typename vector_type::const_iterator;
vector_type elems_;
optional<std::vector<trivia_piece>> inner_trailing_trivia_;

TOML_NODISCARD_CTOR
TOML_EXPORTED_MEMBER_FUNCTION
Expand Down Expand Up @@ -404,6 +407,20 @@ TOML_NAMESPACE_START
TOML_EXPORTED_MEMBER_FUNCTION
array& operator=(array&& rhs) noexcept;

/// \brief Gets the inner trailing trivia.
TOML_CONST_INLINE_GETTER
const optional<std::vector<trivia_piece>> inner_trailing_trivia() const noexcept
{
return inner_trailing_trivia_;
}

/// \brief Sets the inner trailing trivia.
TOML_EXPORTED_MEMBER_FUNCTION
void set_inner_trailing_trivia(optional<std::vector<trivia_piece>> trivia) noexcept
{
inner_trailing_trivia_ = trivia;
}

/// \name Type checks
/// @{

Expand Down
8 changes: 6 additions & 2 deletions include/toml++/impl/array.inl
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@ TOML_NAMESPACE_START

TOML_EXTERNAL_LINKAGE
array::array(const array& other) //
: node(other)
: node(other),
inner_trailing_trivia_(other.inner_trailing_trivia_)
{
elems_.reserve(other.elems_.size());
for (const auto& elem : other)
Expand All @@ -79,7 +80,8 @@ TOML_NAMESPACE_START
TOML_EXTERNAL_LINKAGE
array::array(array && other) noexcept //
: node(std::move(other)),
elems_(std::move(other.elems_))
elems_(std::move(other.elems_)),
inner_trailing_trivia_(other.inner_trailing_trivia_)
{
#if TOML_LIFETIME_HOOKS
TOML_ARRAY_CREATED;
Expand All @@ -96,6 +98,7 @@ TOML_NAMESPACE_START
elems_.reserve(rhs.elems_.size());
for (const auto& elem : rhs)
elems_.emplace_back(impl::make_node(elem));
inner_trailing_trivia_ = rhs.inner_trailing_trivia_;
}
return *this;
}
Expand All @@ -107,6 +110,7 @@ TOML_NAMESPACE_START
{
node::operator=(std::move(rhs));
elems_ = std::move(rhs.elems_);
inner_trailing_trivia_ = rhs.inner_trailing_trivia_;
}
return *this;
}
Expand Down
1 change: 1 addition & 0 deletions include/toml++/impl/date_time.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "forward_declarations.hpp"
#include "print_to_stream.hpp"
#include "header_start.hpp"
#include "std_optional.hpp"

TOML_NAMESPACE_START
{
Expand Down
6 changes: 6 additions & 0 deletions include/toml++/impl/formatter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,12 @@ TOML_IMPL_NAMESPACE_START
return !!(config_.flags & format_flags::terse_key_value_pairs);
}

TOML_PURE_INLINE_GETTER
bool preserve_source_trivia() const noexcept
{
return !!(config_.flags & format_flags::preserve_source_trivia);
}

TOML_EXPORTED_MEMBER_FUNCTION
void attach(std::ostream& stream) noexcept;

Expand Down
3 changes: 3 additions & 0 deletions include/toml++/impl/forward_declarations.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,9 @@ TOML_NAMESPACE_START // abi namespace

/// \brief Avoids the use of whitespace around key-value pairs.
terse_key_value_pairs = (1ull << 12),

/// \brief Preserves trivia of nodes that have it (i.e. were passed with collect_trivia enabled).
preserve_source_trivia = (1ull << 13)
};
TOML_MAKE_FLAGS(format_flags);

Expand Down
99 changes: 83 additions & 16 deletions include/toml++/impl/key.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
// SPDX-License-Identifier: MIT
#pragma once

#include "std_vector.hpp"
#include "trivia_piece.hpp"
#include "source_region.hpp"
#include "std_utility.hpp"
#include "print_to_stream.hpp"
Expand Down Expand Up @@ -33,6 +35,8 @@ TOML_NAMESPACE_START
private:
std::string key_;
source_region source_;
std::optional<std::vector<trivia_piece>> leading_trivia_;
std::optional<std::vector<trivia_piece>> trailing_trivia_;

public:
/// \brief Default constructor.
Expand All @@ -41,44 +45,74 @@ TOML_NAMESPACE_START

/// \brief Constructs a key from a string view and source region.
TOML_NODISCARD_CTOR
explicit key(std::string_view k, source_region&& src = {}) //
explicit key(std::string_view k,
source_region&& src = {},
optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) //
: key_{ k },
source_{ std::move(src) }
source_{ std::move(src) },
leading_trivia_(leading_trivia),
trailing_trivia_(trailing_trivia)
{}

/// \brief Constructs a key from a string view and source region.
TOML_NODISCARD_CTOR
explicit key(std::string_view k, const source_region& src) //
explicit key(std::string_view k,
const source_region& src,
optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) //
: key_{ k },
source_{ src }
source_{ src },
leading_trivia_(leading_trivia),
trailing_trivia_(trailing_trivia)
{}

/// \brief Constructs a key from a string and source region.
TOML_NODISCARD_CTOR
explicit key(std::string&& k, source_region&& src = {}) noexcept //
explicit key(std::string&& k,
source_region&& src = {},
optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) noexcept //
: key_{ std::move(k) },
source_{ std::move(src) }
source_{ std::move(src) },
leading_trivia_(leading_trivia),
trailing_trivia_(trailing_trivia)
{}

/// \brief Constructs a key from a string and source region.
TOML_NODISCARD_CTOR
explicit key(std::string&& k, const source_region& src) noexcept //
explicit key(std::string&& k,
const source_region& src,
optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) noexcept //
: key_{ std::move(k) },
source_{ src }
source_{ src },
leading_trivia_(leading_trivia),
trailing_trivia_(trailing_trivia)
{}

/// \brief Constructs a key from a c-string and source region.
TOML_NODISCARD_CTOR
explicit key(const char* k, source_region&& src = {}) //
explicit key(const char* k,
source_region&& src = {},
optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) //
: key_{ k },
source_{ std::move(src) }
source_{ std::move(src) },
leading_trivia_(leading_trivia),
trailing_trivia_(trailing_trivia)
{}

/// \brief Constructs a key from a c-string view and source region.
TOML_NODISCARD_CTOR
explicit key(const char* k, const source_region& src) //
explicit key(const char* k,
const source_region& src,
optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) //
: key_{ k },
source_{ src }
source_{ src },
leading_trivia_(leading_trivia),
trailing_trivia_(trailing_trivia)
{}

#if TOML_ENABLE_WINDOWS_COMPAT
Expand All @@ -87,18 +121,28 @@ TOML_NAMESPACE_START
///
/// \availability This constructor is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
TOML_NODISCARD_CTOR
explicit key(std::wstring_view k, source_region&& src = {}) //
explicit key(std::wstring_view k,
source_region&& src = {},
optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) //
: key_{ impl::narrow(k) },
source_{ std::move(src) }
source_{ std::move(src) },
leading_trivia_(leading_trivia),
trailing_trivia_(trailing_trivia)
{}

/// \brief Constructs a key from a wide string and source region.
///
/// \availability This constructor is only available when #TOML_ENABLE_WINDOWS_COMPAT is enabled.
TOML_NODISCARD_CTOR
explicit key(std::wstring_view k, const source_region& src) //
explicit key(std::wstring_view k,
const source_region& src,
optional<std::vector<trivia_piece>> leading_trivia = optional<std::vector<trivia_piece>>(),
optional<std::vector<trivia_piece>> trailing_trivia = optional<std::vector<trivia_piece>>()) //
: key_{ impl::narrow(k) },
source_{ src }
source_{ src },
leading_trivia_(leading_trivia),
trailing_trivia_(trailing_trivia)
{}

#endif
Expand Down Expand Up @@ -155,6 +199,23 @@ TOML_NAMESPACE_START

/// @}

/// \name Metadata
/// @{

/// \brief Returns the key's leading trivia.
optional<std::vector<trivia_piece>> leading_trivia() const noexcept
{
return leading_trivia_;
}

/// \brief Returns the key's trailing trivia.
optional<std::vector<trivia_piece>> trailing_trivia() const noexcept
{
return trailing_trivia_;
}

/// @}

/// \name Equality and Comparison
/// \attention These operations only compare the underlying strings; source regions are ignored for the purposes of all comparison!
/// @{
Expand Down Expand Up @@ -332,4 +393,10 @@ TOML_NAMESPACE_START
}
TOML_NAMESPACE_END;

template<> struct std::hash<toml::key> {
std::size_t operator()(toml::key const& k) const noexcept {
return std::hash<std::string_view>{}(k.str());
}
};

#include "header_end.hpp"
33 changes: 33 additions & 0 deletions include/toml++/impl/node.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@
#pragma once

#include "std_utility.hpp"
#include "std_vector.hpp"
#include "forward_declarations.hpp"
#include "source_region.hpp"
#include "header_start.hpp"
#include "preprocessor.hpp"
#include "trivia_piece.hpp"

TOML_NAMESPACE_START
{
Expand All @@ -22,6 +25,8 @@ TOML_NAMESPACE_START

friend class TOML_PARSER_TYPENAME;
source_region source_{};
std::optional<std::vector<trivia_piece>> leading_trivia_;
std::optional<std::vector<trivia_piece>> trailing_trivia_;

template <typename T>
TOML_NODISCARD
Expand Down Expand Up @@ -728,6 +733,34 @@ TOML_NAMESPACE_START

/// @}

/// \brief Returns the leading trivia attached to this node.
TOML_PURE_INLINE_GETTER
const optional<std::vector<trivia_piece>>& leading_trivia() const noexcept
{
return leading_trivia_;
}

/// \brief Returns the trailing trivia attached to this node.
TOML_PURE_INLINE_GETTER
const optional<std::vector<trivia_piece>>& trailing_trivia() const noexcept
{
return trailing_trivia_;
}

/// \brief Sets the leading trivia attached to this node.
TOML_EXPORTED_MEMBER_FUNCTION
void set_leading_trivia(optional<std::vector<trivia_piece>> leading_trivia) noexcept
{
leading_trivia_ = leading_trivia;
}

/// \brief Sets the trailing trivia attached to this node.
TOML_EXPORTED_MEMBER_FUNCTION
void set_trailing_trivia(optional<std::vector<trivia_piece>> trailing_trivia) noexcept
{
trailing_trivia_ = trailing_trivia;
}

private:
/// \cond

Expand Down
14 changes: 11 additions & 3 deletions include/toml++/impl/node.inl
Original file line number Diff line number Diff line change
Expand Up @@ -29,25 +29,31 @@ TOML_NAMESPACE_START

TOML_EXTERNAL_LINKAGE
node::node(node && other) noexcept //
: source_{ std::exchange(other.source_, {}) }
: source_{ std::exchange(other.source_, {}) },
leading_trivia_(other.leading_trivia_),
trailing_trivia_(other.trailing_trivia_)
{}

TOML_EXTERNAL_LINKAGE
node::node(const node& /*other*/) noexcept
node::node(const node& other) noexcept
: leading_trivia_(other.leading_trivia_),
trailing_trivia_(other.trailing_trivia_)
{
// does not copy source information - this is not an error
//
// see https://github.com/marzer/tomlplusplus/issues/49#issuecomment-665089577
}

TOML_EXTERNAL_LINKAGE
node& node::operator=(const node& /*rhs*/) noexcept
node& node::operator=(const node& rhs) noexcept
{
// does not copy source information - this is not an error
//
// see https://github.com/marzer/tomlplusplus/issues/49#issuecomment-665089577

source_ = {};
leading_trivia_ = rhs.leading_trivia_;
trailing_trivia_ = rhs.trailing_trivia_;
return *this;
}

Expand All @@ -56,6 +62,8 @@ TOML_NAMESPACE_START
{
if (&rhs != this)
source_ = std::exchange(rhs.source_, {});
leading_trivia_ = rhs.leading_trivia_;
trailing_trivia_ = rhs.trailing_trivia_;
return *this;
}

Expand Down
Loading