mirror of
https://github.com/ToruNiina/toml11.git
synced 2024-11-22 12:30:04 +00:00
fix: support getting a container of external types
This commit is contained in:
parent
31e450f9af
commit
190636b791
@ -80,3 +80,37 @@ BOOST_AUTO_TEST_CASE(test_conversion_by_specialization)
|
||||
|
||||
BOOST_TEST(v == v2);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_recursive_conversion)
|
||||
{
|
||||
const toml::value v{
|
||||
toml::table{{"a", 42}, {"b", "baz"}},
|
||||
toml::table{{"a", 43}, {"b", "qux"}},
|
||||
toml::table{{"a", 44}, {"b", "quux"}},
|
||||
toml::table{{"a", 45}, {"b", "foobar"}},
|
||||
};
|
||||
|
||||
const auto foos = toml::get<std::vector<extlib::foo>>(v);
|
||||
BOOST_TEST(foos.size() == 4ul);
|
||||
BOOST_TEST(foos.at(0).a == 42);
|
||||
BOOST_TEST(foos.at(1).a == 43);
|
||||
BOOST_TEST(foos.at(2).a == 44);
|
||||
BOOST_TEST(foos.at(3).a == 45);
|
||||
|
||||
BOOST_TEST(foos.at(0).b == "baz");
|
||||
BOOST_TEST(foos.at(1).b == "qux");
|
||||
BOOST_TEST(foos.at(2).b == "quux");
|
||||
BOOST_TEST(foos.at(3).b == "foobar");
|
||||
|
||||
const auto bars = toml::get<std::vector<extlib::bar>>(v);
|
||||
BOOST_TEST(bars.size() == 4ul);
|
||||
BOOST_TEST(bars.at(0).a == 42);
|
||||
BOOST_TEST(bars.at(1).a == 43);
|
||||
BOOST_TEST(bars.at(2).a == 44);
|
||||
BOOST_TEST(bars.at(3).a == 45);
|
||||
|
||||
BOOST_TEST(bars.at(0).b == "baz");
|
||||
BOOST_TEST(bars.at(1).b == "qux");
|
||||
BOOST_TEST(bars.at(2).b == "quux");
|
||||
BOOST_TEST(bars.at(3).b == "foobar");
|
||||
}
|
||||
|
18
toml/get.hpp
18
toml/get.hpp
@ -174,6 +174,20 @@ template<typename T, typename std::enable_if<detail::conjunction<
|
||||
>::value, std::nullptr_t>::type = nullptr>
|
||||
T get(const toml::value& v);
|
||||
|
||||
template<typename T, typename std::enable_if<detail::conjunction<
|
||||
detail::negation<detail::is_exact_toml_type<T>>, // not a toml::value
|
||||
detail::has_from_toml_method<T>, // but has from_toml(toml::value) memfn
|
||||
std::is_default_constructible<T> // and default constructible
|
||||
>::value, std::nullptr_t>::type = nullptr>
|
||||
T get(const toml::value& v);
|
||||
|
||||
template<typename T, typename std::enable_if<detail::conjunction<
|
||||
detail::negation<detail::is_exact_toml_type<T>> // not a toml::value
|
||||
>::value, std::nullptr_t>::type = nullptr,
|
||||
std::size_t = sizeof(::toml::from<T>) // and has from<T> specialization
|
||||
>
|
||||
T get(const toml::value& v);
|
||||
|
||||
// ============================================================================
|
||||
// array-like types; most likely STL container, like std::vector, etc.
|
||||
|
||||
@ -306,7 +320,7 @@ template<typename T, typename std::enable_if<detail::conjunction<
|
||||
detail::negation<detail::is_exact_toml_type<T>>, // not a toml::value
|
||||
detail::has_from_toml_method<T>, // but has from_toml(toml::value) memfn
|
||||
std::is_default_constructible<T> // and default constructible
|
||||
>::value, std::nullptr_t>::type = nullptr>
|
||||
>::value, std::nullptr_t>::type>
|
||||
T get(const toml::value& v)
|
||||
{
|
||||
T ud;
|
||||
@ -315,7 +329,7 @@ T get(const toml::value& v)
|
||||
}
|
||||
template<typename T, typename std::enable_if<detail::conjunction<
|
||||
detail::negation<detail::is_exact_toml_type<T>> // not a toml::value
|
||||
>::value, std::nullptr_t>::type = nullptr,
|
||||
>::value, std::nullptr_t>::type,
|
||||
std::size_t = sizeof(::toml::from<T>) // and has from<T> specialization
|
||||
>
|
||||
T get(const toml::value& v)
|
||||
|
Loading…
Reference in New Issue
Block a user