add built-in array support in get_to
This commit is contained in:
parent
2806b201a8
commit
e6e6805c6c
4 changed files with 56 additions and 0 deletions
|
@ -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
|
||||||
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)
|
||||||
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
|
||||||
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")
|
||||||
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"};
|
||||||
|
|
Loading…
Reference in a new issue