diff --git a/include/toml11/get.hpp b/include/toml11/get.hpp index 3805d09..0704471 100644 --- a/include/toml11/get.hpp +++ b/include/toml11/get.hpp @@ -398,6 +398,25 @@ get(const basic_value& v) cxx::make_index_sequence::value>{}); } +// ============================================================================ +// std::unordered_set + +template +cxx::enable_if_t::value, T> +get(const basic_value& v) +{ + using value_type = typename T::value_type; + const auto& a = v.as_array(); + + T container; + for (const auto& elem : a) + { + container.insert(get(elem)); + } + return container; +} + + // ============================================================================ // map-like types; most likely STL map, like std::map or std::unordered_map. diff --git a/include/toml11/traits.hpp b/include/toml11/traits.hpp index 49b7ff3..27ef1d4 100644 --- a/include/toml11/traits.hpp +++ b/include/toml11/traits.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #if defined(TOML11_HAS_STRING_VIEW) @@ -165,6 +166,12 @@ struct is_std_tuple_impl> : std::true_type{}; template using is_std_tuple = is_std_tuple_impl>; +template struct is_unordered_set_impl : std::false_type {}; +template +struct is_unordered_set_impl> : std::true_type {}; +template +using is_unordered_set = is_unordered_set_impl>; + #if defined(TOML11_HAS_OPTIONAL) template struct is_std_optional_impl : std::false_type{}; template diff --git a/tests/test_get.cpp b/tests/test_get.cpp index 3c00d2d..137ce0c 100644 --- a/tests/test_get.cpp +++ b/tests/test_get.cpp @@ -406,6 +406,44 @@ TEST_CASE("testing toml::get") } } +TEST_CASE("testing toml::get") +{ + using value_type = toml::value; + + { + const value_type v(toml::array{1, 2, 3, 4}); + const std::unordered_set uset = toml::get>(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 uset = toml::get>(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 uset = toml::get>(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") { using value_type = toml::value;