add built-in array support in get_to

parent 2806b201
...@@ -157,6 +157,16 @@ void from_json(const BasicJsonType& j, std::valarray<T>& l) ...@@ -157,6 +157,16 @@ void from_json(const BasicJsonType& j, std::valarray<T>& l)
std::copy(j.m_value.array->begin(), j.m_value.array->end(), std::begin(l)); std::copy(j.m_value.array->begin(), j.m_value.array->end(), std::begin(l));
} }
template <typename BasicJsonType, typename T, std::size_t N>
auto from_json(const BasicJsonType& j, T (&arr)[N])
-> decltype(j.template get<T>(), void())
{
for (std::size_t i = 0; i < N; ++i)
{
arr[i] = j.at(i).template get<T>();
}
}
template<typename BasicJsonType> template<typename BasicJsonType>
void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/)
{ {
......
...@@ -2684,6 +2684,19 @@ class basic_json ...@@ -2684,6 +2684,19 @@ class basic_json
return v; return v;
} }
template <
typename T, std::size_t N,
typename Array = T (&)[N],
detail::enable_if_t <
detail::has_from_json<basic_json_t, Array>::value, int > = 0 >
Array get_to(T (&v)[N]) const
noexcept(noexcept(JSONSerializer<Array>::from_json(
std::declval<const basic_json_t&>(), v)))
{
JSONSerializer<Array>::from_json(*this, v);
return v;
}
/*! /*!
@brief get a pointer value (implicit) @brief get a pointer value (implicit)
......
...@@ -1445,6 +1445,16 @@ void from_json(const BasicJsonType& j, std::valarray<T>& l) ...@@ -1445,6 +1445,16 @@ void from_json(const BasicJsonType& j, std::valarray<T>& l)
std::copy(j.m_value.array->begin(), j.m_value.array->end(), std::begin(l)); std::copy(j.m_value.array->begin(), j.m_value.array->end(), std::begin(l));
} }
template <typename BasicJsonType, typename T, std::size_t N>
auto from_json(const BasicJsonType& j, T (&arr)[N])
-> decltype(j.template get<T>(), void())
{
for (std::size_t i = 0; i < N; ++i)
{
arr[i] = j.at(i).template get<T>();
}
}
template<typename BasicJsonType> template<typename BasicJsonType>
void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/)
{ {
...@@ -15475,6 +15485,19 @@ class basic_json ...@@ -15475,6 +15485,19 @@ class basic_json
return v; return v;
} }
template <
typename T, std::size_t N,
typename Array = T (&)[N],
detail::enable_if_t <
detail::has_from_json<basic_json_t, Array>::value, int > = 0 >
Array get_to(T (&v)[N]) const
noexcept(noexcept(JSONSerializer<Array>::from_json(
std::declval<const basic_json_t&>(), v)))
{
JSONSerializer<Array>::from_json(*this, v);
return v;
}
/*! /*!
@brief get a pointer value (implicit) @brief get a pointer value (implicit)
......
...@@ -386,6 +386,16 @@ TEST_CASE("value conversion") ...@@ -386,6 +386,16 @@ TEST_CASE("value conversion")
CHECK(json(a) == j); CHECK(json(a) == j);
} }
SECTION("built-in arrays")
{
const int nbs[] = {0, 1, 2};
int nbs2[] = {0, 0, 0};
json j2 = nbs;
j2.get_to(nbs2);
CHECK(std::equal(std::begin(nbs), std::end(nbs), std::begin(nbs2)));
}
SECTION("std::deque<json>") SECTION("std::deque<json>")
{ {
std::deque<json> a{"previous", "value"}; std::deque<json> a{"previous", "value"};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment