mirror of
https://github.com/ToruNiina/toml11.git
synced 2025-12-16 03:08:52 +08:00
Merge pull request #288 from evanwporter/patch-1
add support for `toml::get<std::unordered_set>`
This commit is contained in:
@@ -398,6 +398,25 @@ get(const basic_value<TC>& v)
|
|||||||
cxx::make_index_sequence<std::tuple_size<T>::value>{});
|
cxx::make_index_sequence<std::tuple_size<T>::value>{});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// std::unordered_set
|
||||||
|
|
||||||
|
template<typename T, typename TC>
|
||||||
|
cxx::enable_if_t<toml::detail::is_unordered_set<T>::value, T>
|
||||||
|
get(const basic_value<TC>& v)
|
||||||
|
{
|
||||||
|
using value_type = typename T::value_type;
|
||||||
|
const auto& a = v.as_array();
|
||||||
|
|
||||||
|
T container;
|
||||||
|
for (const auto& elem : a)
|
||||||
|
{
|
||||||
|
container.insert(get<value_type>(elem));
|
||||||
|
}
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// map-like types; most likely STL map, like std::map or std::unordered_map.
|
// map-like types; most likely STL map, like std::map or std::unordered_map.
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
#include <unordered_set>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#if defined(TOML11_HAS_STRING_VIEW)
|
#if defined(TOML11_HAS_STRING_VIEW)
|
||||||
@@ -165,6 +166,12 @@ struct is_std_tuple_impl<std::tuple<Ts...>> : std::true_type{};
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
using is_std_tuple = is_std_tuple_impl<cxx::remove_cvref_t<T>>;
|
using is_std_tuple = is_std_tuple_impl<cxx::remove_cvref_t<T>>;
|
||||||
|
|
||||||
|
template<typename T> struct is_unordered_set_impl : std::false_type {};
|
||||||
|
template<typename T>
|
||||||
|
struct is_unordered_set_impl<std::unordered_set<T>> : std::true_type {};
|
||||||
|
template<typename T>
|
||||||
|
using is_unordered_set = is_unordered_set_impl<cxx::remove_cvref_t<T>>;
|
||||||
|
|
||||||
#if defined(TOML11_HAS_OPTIONAL)
|
#if defined(TOML11_HAS_OPTIONAL)
|
||||||
template<typename T> struct is_std_optional_impl : std::false_type{};
|
template<typename T> struct is_std_optional_impl : std::false_type{};
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
|||||||
@@ -406,6 +406,44 @@ TEST_CASE("testing toml::get<array-of-arrays>")
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("testing toml::get<unordered_set>")
|
||||||
|
{
|
||||||
|
using value_type = toml::value;
|
||||||
|
|
||||||
|
{
|
||||||
|
const value_type v(toml::array{1, 2, 3, 4});
|
||||||
|
const std::unordered_set<int> uset = toml::get<std::unordered_set<int>>(v);
|
||||||
|
|
||||||
|
CHECK_EQ(uset.size(), 4u);
|
||||||
|
CHECK(uset.count(1) == 1);
|
||||||
|
CHECK(uset.count(2) == 1);
|
||||||
|
CHECK(uset.count(3) == 1);
|
||||||
|
CHECK(uset.count(4) == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const value_type v(toml::array{"alpha", "beta", "delta"});
|
||||||
|
const std::unordered_set<std::string> uset = toml::get<std::unordered_set<std::string>>(v);
|
||||||
|
|
||||||
|
CHECK_EQ(uset.size(), 3u);
|
||||||
|
CHECK(uset.count("alpha") == 1);
|
||||||
|
CHECK(uset.count("beta") == 1);
|
||||||
|
CHECK(uset.count("delta") == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
value_type v(toml::array{42, 42, 54, 69});
|
||||||
|
const std::unordered_set<int> uset = toml::get<std::unordered_set<int>>(std::move(v));
|
||||||
|
|
||||||
|
// Set will only have one "42"
|
||||||
|
CHECK_EQ(uset.size(), 3u);
|
||||||
|
CHECK(uset.count(42) == 1);
|
||||||
|
CHECK(uset.count(54) == 1);
|
||||||
|
CHECK(uset.count(69) == 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST_CASE("testing toml::get<table-like>")
|
TEST_CASE("testing toml::get<table-like>")
|
||||||
{
|
{
|
||||||
using value_type = toml::value;
|
using value_type = toml::value;
|
||||||
|
|||||||
Reference in New Issue
Block a user