added additional node_view constructors
also made node conversion operators explicit
This commit is contained in:
parent
9b4614a4e7
commit
11a0e84ced
@ -123,6 +123,7 @@ int main(int argc, char** argv)
|
||||
tree.push_back(&root);
|
||||
constexpr size_t max_depth = 10u;
|
||||
int container_min_values = 10;
|
||||
bool in_arr = false;
|
||||
|
||||
const auto add = [&](auto&& obj) noexcept -> toml::node&
|
||||
{
|
||||
@ -143,6 +144,7 @@ int main(int argc, char** argv)
|
||||
{
|
||||
tree.push_back(new_node);
|
||||
container_min_values = rand(1, 4);
|
||||
in_arr = toml::is_array<decltype(obj)>;
|
||||
}
|
||||
else
|
||||
container_min_values--;
|
||||
@ -153,14 +155,20 @@ int main(int argc, char** argv)
|
||||
|
||||
while (node_budget)
|
||||
{
|
||||
if (rand(100) >= 75)
|
||||
if (!in_arr && rand(100) >= 75)
|
||||
{
|
||||
if (container_min_values <= 0 && tree.size() < max_depth)
|
||||
add(toml::table{}).ref<toml::table>().is_inline(tree.size() >= max_depth - 2u && rand(100) >= 85);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (static_cast<toml::node_type>((rand() % 8) + 2))
|
||||
toml::node_type new_node_type;
|
||||
if (auto arr = tree.back()->as_array(); arr && !arr->empty())
|
||||
new_node_type = arr->front().type();
|
||||
else
|
||||
new_node_type = static_cast<toml::node_type>((rand() % 8) + 2);
|
||||
|
||||
switch (new_node_type)
|
||||
{
|
||||
case toml::node_type::array:
|
||||
if (container_min_values <= 0 && tree.size() < max_depth)
|
||||
@ -199,7 +207,10 @@ int main(int argc, char** argv)
|
||||
break;
|
||||
}
|
||||
if (container_min_values <= 0 && tree.size() >= 2u && rand(100) >= 85)
|
||||
{
|
||||
tree.pop_back();
|
||||
in_arr = !tree.empty() && tree.back()->type() == toml::node_type::array;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -816,10 +816,10 @@ TOML_NAMESPACE_START
|
||||
}
|
||||
|
||||
/// \brief Creates a `node_view` pointing to this node.
|
||||
[[nodiscard]] operator node_view<node>() noexcept;
|
||||
[[nodiscard]] explicit operator node_view<node>() noexcept;
|
||||
|
||||
/// \brief Creates a `node_view` pointing to this node (const overload).
|
||||
[[nodiscard]] operator node_view<const node>() const noexcept;
|
||||
[[nodiscard]] explicit operator node_view<const node>() const noexcept;
|
||||
};
|
||||
}
|
||||
TOML_NAMESPACE_END
|
||||
|
@ -59,21 +59,19 @@ TOML_NAMESPACE_START
|
||||
template <typename ViewedType>
|
||||
class TOML_API TOML_TRIVIAL_ABI node_view
|
||||
{
|
||||
static_assert(
|
||||
impl::is_one_of<ViewedType, toml::node, const toml::node>,
|
||||
"A toml::node_view<> must wrap toml::node or const toml::node."
|
||||
);
|
||||
|
||||
public:
|
||||
using viewed_type = ViewedType;
|
||||
|
||||
private:
|
||||
friend class TOML_NAMESPACE::node;
|
||||
friend class TOML_NAMESPACE::table;
|
||||
template <typename T> friend class TOML_NAMESPACE::node_view;
|
||||
|
||||
mutable viewed_type* node_ = nullptr;
|
||||
|
||||
TOML_NODISCARD_CTOR
|
||||
node_view(viewed_type* node) noexcept
|
||||
: node_{ node }
|
||||
{}
|
||||
|
||||
template <typename Func>
|
||||
static constexpr bool visit_is_nothrow
|
||||
= noexcept(std::declval<viewed_type*>()->visit(std::declval<Func&&>()));
|
||||
@ -84,6 +82,18 @@ TOML_NAMESPACE_START
|
||||
TOML_NODISCARD_CTOR
|
||||
node_view() noexcept = default;
|
||||
|
||||
/// \brief Constructs node_view of a specific node.
|
||||
TOML_NODISCARD_CTOR
|
||||
explicit node_view(viewed_type* node) noexcept
|
||||
: node_{ node }
|
||||
{}
|
||||
|
||||
/// \brief Constructs node_view of a specific node.
|
||||
TOML_NODISCARD_CTOR
|
||||
explicit node_view(viewed_type& node) noexcept
|
||||
: node_{ &node }
|
||||
{}
|
||||
|
||||
///// \brief Copy constructor.
|
||||
TOML_NODISCARD_CTOR
|
||||
node_view(const node_view&) noexcept = default;
|
||||
@ -547,8 +557,8 @@ TOML_NAMESPACE_START
|
||||
node_view operator[] (std::string_view key) const noexcept
|
||||
{
|
||||
if (auto tbl = this->as_table())
|
||||
return { tbl->get(key) };
|
||||
return { nullptr };
|
||||
return node_view{ tbl->get(key) };
|
||||
return node_view{ nullptr };
|
||||
}
|
||||
|
||||
#if TOML_WINDOWS_COMPAT
|
||||
@ -565,8 +575,8 @@ TOML_NAMESPACE_START
|
||||
node_view operator[] (std::wstring_view key) const noexcept
|
||||
{
|
||||
if (auto tbl = this->as_table())
|
||||
return { tbl->get(key) };
|
||||
return { nullptr };
|
||||
return node_view{ tbl->get(key) };
|
||||
return node_view{ nullptr };
|
||||
}
|
||||
|
||||
#endif // TOML_WINDOWS_COMPAT
|
||||
@ -581,13 +591,21 @@ TOML_NAMESPACE_START
|
||||
node_view operator[] (size_t index) const noexcept
|
||||
{
|
||||
if (auto arr = this->as_array())
|
||||
return { arr->get(index) };
|
||||
return { nullptr };
|
||||
return node_view{ arr->get(index) };
|
||||
return node_view{ nullptr };
|
||||
}
|
||||
|
||||
template <typename Char, typename T>
|
||||
friend std::basic_ostream<Char>& operator << (std::basic_ostream<Char>&, const node_view<T>&);
|
||||
};
|
||||
template <typename T> node_view(const value<T>&) -> node_view<const node>;
|
||||
node_view(const table&) -> node_view<const node>;
|
||||
node_view(const array&) -> node_view<const node>;
|
||||
template <typename T> node_view(value<T>&) -> node_view<node>;
|
||||
node_view(table&) -> node_view<node>;
|
||||
node_view(array&) -> node_view<node>;
|
||||
template <typename T> node_view(const T*) -> node_view<const node>;
|
||||
template <typename T> node_view(T*) -> node_view<node>;
|
||||
|
||||
/// \brief Prints the viewed node out to a stream.
|
||||
template <typename Char, typename T>
|
||||
|
@ -160,12 +160,12 @@ TOML_NAMESPACE_START
|
||||
TOML_EXTERNAL_LINKAGE
|
||||
node_view<node> table::operator[] (std::string_view key) noexcept
|
||||
{
|
||||
return { this->get(key) };
|
||||
return node_view<node>{ this->get(key) };
|
||||
}
|
||||
TOML_EXTERNAL_LINKAGE
|
||||
node_view<const node> table::operator[] (std::string_view key) const noexcept
|
||||
{
|
||||
return { this->get(key) };
|
||||
return node_view<const node>{ this->get(key) };
|
||||
}
|
||||
|
||||
TOML_EXTERNAL_LINKAGE
|
||||
@ -232,12 +232,12 @@ TOML_NAMESPACE_START
|
||||
TOML_EXTERNAL_LINKAGE
|
||||
node_view<node> table::operator[] (std::wstring_view key) noexcept
|
||||
{
|
||||
return { this->get(key) };
|
||||
return node_view<node>{ this->get(key) };
|
||||
}
|
||||
TOML_EXTERNAL_LINKAGE
|
||||
node_view<const node> table::operator[] (std::wstring_view key) const noexcept
|
||||
{
|
||||
return { this->get(key) };
|
||||
return node_view<const node>{ this->get(key) };
|
||||
}
|
||||
|
||||
TOML_EXTERNAL_LINKAGE
|
||||
|
54
toml.hpp
54
toml.hpp
@ -2475,8 +2475,8 @@ TOML_NAMESPACE_START
|
||||
return do_ref<T>(*this);
|
||||
}
|
||||
|
||||
[[nodiscard]] operator node_view<node>() noexcept;
|
||||
[[nodiscard]] operator node_view<const node>() const noexcept;
|
||||
[[nodiscard]] explicit operator node_view<node>() noexcept;
|
||||
[[nodiscard]] explicit operator node_view<const node>() const noexcept;
|
||||
};
|
||||
}
|
||||
TOML_NAMESPACE_END
|
||||
@ -4379,21 +4379,19 @@ TOML_NAMESPACE_START
|
||||
template <typename ViewedType>
|
||||
class TOML_API TOML_TRIVIAL_ABI node_view
|
||||
{
|
||||
static_assert(
|
||||
impl::is_one_of<ViewedType, toml::node, const toml::node>,
|
||||
"A toml::node_view<> must wrap toml::node or const toml::node."
|
||||
);
|
||||
|
||||
public:
|
||||
using viewed_type = ViewedType;
|
||||
|
||||
private:
|
||||
friend class TOML_NAMESPACE::node;
|
||||
friend class TOML_NAMESPACE::table;
|
||||
template <typename T> friend class TOML_NAMESPACE::node_view;
|
||||
|
||||
mutable viewed_type* node_ = nullptr;
|
||||
|
||||
TOML_NODISCARD_CTOR
|
||||
node_view(viewed_type* node) noexcept
|
||||
: node_{ node }
|
||||
{}
|
||||
|
||||
template <typename Func>
|
||||
static constexpr bool visit_is_nothrow
|
||||
= noexcept(std::declval<viewed_type*>()->visit(std::declval<Func&&>()));
|
||||
@ -4403,6 +4401,16 @@ TOML_NAMESPACE_START
|
||||
TOML_NODISCARD_CTOR
|
||||
node_view() noexcept = default;
|
||||
|
||||
TOML_NODISCARD_CTOR
|
||||
explicit node_view(viewed_type* node) noexcept
|
||||
: node_{ node }
|
||||
{}
|
||||
|
||||
TOML_NODISCARD_CTOR
|
||||
explicit node_view(viewed_type& node) noexcept
|
||||
: node_{ &node }
|
||||
{}
|
||||
|
||||
TOML_NODISCARD_CTOR
|
||||
node_view(const node_view&) noexcept = default;
|
||||
|
||||
@ -4655,8 +4663,8 @@ TOML_NAMESPACE_START
|
||||
node_view operator[] (std::string_view key) const noexcept
|
||||
{
|
||||
if (auto tbl = this->as_table())
|
||||
return { tbl->get(key) };
|
||||
return { nullptr };
|
||||
return node_view{ tbl->get(key) };
|
||||
return node_view{ nullptr };
|
||||
}
|
||||
|
||||
#if TOML_WINDOWS_COMPAT
|
||||
@ -4665,8 +4673,8 @@ TOML_NAMESPACE_START
|
||||
node_view operator[] (std::wstring_view key) const noexcept
|
||||
{
|
||||
if (auto tbl = this->as_table())
|
||||
return { tbl->get(key) };
|
||||
return { nullptr };
|
||||
return node_view{ tbl->get(key) };
|
||||
return node_view{ nullptr };
|
||||
}
|
||||
|
||||
#endif // TOML_WINDOWS_COMPAT
|
||||
@ -4675,13 +4683,21 @@ TOML_NAMESPACE_START
|
||||
node_view operator[] (size_t index) const noexcept
|
||||
{
|
||||
if (auto arr = this->as_array())
|
||||
return { arr->get(index) };
|
||||
return { nullptr };
|
||||
return node_view{ arr->get(index) };
|
||||
return node_view{ nullptr };
|
||||
}
|
||||
|
||||
template <typename Char, typename T>
|
||||
friend std::basic_ostream<Char>& operator << (std::basic_ostream<Char>&, const node_view<T>&);
|
||||
};
|
||||
template <typename T> node_view(const value<T>&) -> node_view<const node>;
|
||||
node_view(const table&) -> node_view<const node>;
|
||||
node_view(const array&) -> node_view<const node>;
|
||||
template <typename T> node_view(value<T>&) -> node_view<node>;
|
||||
node_view(table&) -> node_view<node>;
|
||||
node_view(array&) -> node_view<node>;
|
||||
template <typename T> node_view(const T*) -> node_view<const node>;
|
||||
template <typename T> node_view(T*) -> node_view<node>;
|
||||
|
||||
template <typename Char, typename T>
|
||||
inline std::basic_ostream<Char>& operator << (std::basic_ostream<Char>& os, const node_view<T>& nv)
|
||||
@ -7908,12 +7924,12 @@ TOML_NAMESPACE_START
|
||||
TOML_EXTERNAL_LINKAGE
|
||||
node_view<node> table::operator[] (std::string_view key) noexcept
|
||||
{
|
||||
return { this->get(key) };
|
||||
return node_view<node>{ this->get(key) };
|
||||
}
|
||||
TOML_EXTERNAL_LINKAGE
|
||||
node_view<const node> table::operator[] (std::string_view key) const noexcept
|
||||
{
|
||||
return { this->get(key) };
|
||||
return node_view<const node>{ this->get(key) };
|
||||
}
|
||||
|
||||
TOML_EXTERNAL_LINKAGE
|
||||
@ -7980,12 +7996,12 @@ TOML_NAMESPACE_START
|
||||
TOML_EXTERNAL_LINKAGE
|
||||
node_view<node> table::operator[] (std::wstring_view key) noexcept
|
||||
{
|
||||
return { this->get(key) };
|
||||
return node_view<node>{ this->get(key) };
|
||||
}
|
||||
TOML_EXTERNAL_LINKAGE
|
||||
node_view<const node> table::operator[] (std::wstring_view key) const noexcept
|
||||
{
|
||||
return { this->get(key) };
|
||||
return node_view<const node>{ this->get(key) };
|
||||
}
|
||||
|
||||
TOML_EXTERNAL_LINKAGE
|
||||
|
Loading…
Reference in New Issue
Block a user