mirror of
https://github.com/nlohmann/json.git
synced 2025-08-09 05:22:48 +03:00
Add support of multi-dim C-style array member of struct. (#4262)
* Add support of multi-dim C-style array. * Support up to 4 dimensional array. * Suppress clang-tidy checks for C-style arrays
This commit is contained in:
@@ -212,6 +212,54 @@ auto from_json(const BasicJsonType& j, T (&arr)[N]) // NOLINT(cppcoreguidelines
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename T, std::size_t N1, std::size_t N2>
|
||||||
|
auto from_json(const BasicJsonType& j, T (&arr)[N1][N2]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
-> decltype(j.template get<T>(), void())
|
||||||
|
{
|
||||||
|
for (std::size_t i1 = 0; i1 < N1; ++i1)
|
||||||
|
{
|
||||||
|
for (std::size_t i2 = 0; i2 < N2; ++i2)
|
||||||
|
{
|
||||||
|
arr[i1][i2] = j.at(i1).at(i2).template get<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename T, std::size_t N1, std::size_t N2, std::size_t N3>
|
||||||
|
auto from_json(const BasicJsonType& j, T (&arr)[N1][N2][N3]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
-> decltype(j.template get<T>(), void())
|
||||||
|
{
|
||||||
|
for (std::size_t i1 = 0; i1 < N1; ++i1)
|
||||||
|
{
|
||||||
|
for (std::size_t i2 = 0; i2 < N2; ++i2)
|
||||||
|
{
|
||||||
|
for (std::size_t i3 = 0; i3 < N3; ++i3)
|
||||||
|
{
|
||||||
|
arr[i1][i2][i3] = j.at(i1).at(i2).at(i3).template get<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename T, std::size_t N1, std::size_t N2, std::size_t N3, std::size_t N4>
|
||||||
|
auto from_json(const BasicJsonType& j, T (&arr)[N1][N2][N3][N4]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
-> decltype(j.template get<T>(), void())
|
||||||
|
{
|
||||||
|
for (std::size_t i1 = 0; i1 < N1; ++i1)
|
||||||
|
{
|
||||||
|
for (std::size_t i2 = 0; i2 < N2; ++i2)
|
||||||
|
{
|
||||||
|
for (std::size_t i3 = 0; i3 < N3; ++i3)
|
||||||
|
{
|
||||||
|
for (std::size_t i4 = 0; i4 < N4; ++i4)
|
||||||
|
{
|
||||||
|
arr[i1][i2][i3][i4] = j.at(i1).at(i2).at(i3).at(i4).template get<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template<typename BasicJsonType>
|
template<typename BasicJsonType>
|
||||||
inline void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/)
|
inline void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/)
|
||||||
{
|
{
|
||||||
|
@@ -4885,6 +4885,54 @@ auto from_json(const BasicJsonType& j, T (&arr)[N]) // NOLINT(cppcoreguidelines
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename T, std::size_t N1, std::size_t N2>
|
||||||
|
auto from_json(const BasicJsonType& j, T (&arr)[N1][N2]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
-> decltype(j.template get<T>(), void())
|
||||||
|
{
|
||||||
|
for (std::size_t i1 = 0; i1 < N1; ++i1)
|
||||||
|
{
|
||||||
|
for (std::size_t i2 = 0; i2 < N2; ++i2)
|
||||||
|
{
|
||||||
|
arr[i1][i2] = j.at(i1).at(i2).template get<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename T, std::size_t N1, std::size_t N2, std::size_t N3>
|
||||||
|
auto from_json(const BasicJsonType& j, T (&arr)[N1][N2][N3]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
-> decltype(j.template get<T>(), void())
|
||||||
|
{
|
||||||
|
for (std::size_t i1 = 0; i1 < N1; ++i1)
|
||||||
|
{
|
||||||
|
for (std::size_t i2 = 0; i2 < N2; ++i2)
|
||||||
|
{
|
||||||
|
for (std::size_t i3 = 0; i3 < N3; ++i3)
|
||||||
|
{
|
||||||
|
arr[i1][i2][i3] = j.at(i1).at(i2).at(i3).template get<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename T, std::size_t N1, std::size_t N2, std::size_t N3, std::size_t N4>
|
||||||
|
auto from_json(const BasicJsonType& j, T (&arr)[N1][N2][N3][N4]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
-> decltype(j.template get<T>(), void())
|
||||||
|
{
|
||||||
|
for (std::size_t i1 = 0; i1 < N1; ++i1)
|
||||||
|
{
|
||||||
|
for (std::size_t i2 = 0; i2 < N2; ++i2)
|
||||||
|
{
|
||||||
|
for (std::size_t i3 = 0; i3 < N3; ++i3)
|
||||||
|
{
|
||||||
|
for (std::size_t i4 = 0; i4 < N4; ++i4)
|
||||||
|
{
|
||||||
|
arr[i1][i2][i3][i4] = j.at(i1).at(i2).at(i3).at(i4).template get<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template<typename BasicJsonType>
|
template<typename BasicJsonType>
|
||||||
inline void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/)
|
inline void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/)
|
||||||
{
|
{
|
||||||
|
@@ -369,6 +369,68 @@ TEST_CASE("value conversion")
|
|||||||
CHECK(std::equal(std::begin(nbs), std::end(nbs), std::begin(nbs2)));
|
CHECK(std::equal(std::begin(nbs), std::end(nbs), std::begin(nbs2)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECTION("built-in arrays: 2D")
|
||||||
|
{
|
||||||
|
const int nbs[][3] = {{0, 1, 2}, {3, 4, 5}}; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
int nbs2[][3] = {{0, 0, 0}, {0, 0, 0}}; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
|
||||||
|
const json j2 = nbs;
|
||||||
|
j2.get_to(nbs2);
|
||||||
|
CHECK(std::equal(std::begin(nbs[0]), std::end(nbs[1]), std::begin(nbs2[0])));
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("built-in arrays: 3D")
|
||||||
|
{
|
||||||
|
// NOLINTBEGIN(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
const int nbs[][2][3] = {\
|
||||||
|
{{0, 1, 2}, {3, 4, 5}}, \
|
||||||
|
{{10, 11, 12}, {13, 14, 15}}\
|
||||||
|
};
|
||||||
|
int nbs2[][2][3] = {\
|
||||||
|
{{0, 0, 0}, {0, 0, 0}}, \
|
||||||
|
{{0, 0, 0}, {0, 0, 0}}\
|
||||||
|
};
|
||||||
|
// NOLINTEND(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
|
||||||
|
const json j2 = nbs;
|
||||||
|
j2.get_to(nbs2);
|
||||||
|
CHECK(std::equal(std::begin(nbs[0][0]), std::end(nbs[1][1]), std::begin(nbs2[0][0])));
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("built-in arrays: 4D")
|
||||||
|
{
|
||||||
|
// NOLINTBEGIN(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
const int nbs[][2][2][3] = {\
|
||||||
|
{
|
||||||
|
\
|
||||||
|
{{0, 1, 2}, {3, 4, 5}}, \
|
||||||
|
{{10, 11, 12}, {13, 14, 15}}\
|
||||||
|
}, \
|
||||||
|
{
|
||||||
|
\
|
||||||
|
{{20, 21, 22}, {23, 24, 25}}, \
|
||||||
|
{{30, 31, 32}, {33, 34, 35}}\
|
||||||
|
}\
|
||||||
|
};
|
||||||
|
int nbs2[][2][2][3] = {\
|
||||||
|
{
|
||||||
|
\
|
||||||
|
{{0, 0, 0}, {0, 0, 0}}, \
|
||||||
|
{{0, 0, 0}, {0, 0, 0}}\
|
||||||
|
}, \
|
||||||
|
{
|
||||||
|
\
|
||||||
|
{{0, 0, 0}, {0, 0, 0}}, \
|
||||||
|
{{0, 0, 0}, {0, 0, 0}}\
|
||||||
|
}\
|
||||||
|
};
|
||||||
|
// NOLINTEND(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
|
||||||
|
const json j2 = nbs;
|
||||||
|
j2.get_to(nbs2);
|
||||||
|
CHECK(std::equal(std::begin(nbs[0][0][0]), std::end(nbs[1][1][1]), std::begin(nbs2[0][0][0])));
|
||||||
|
}
|
||||||
|
|
||||||
SECTION("std::deque<json>")
|
SECTION("std::deque<json>")
|
||||||
{
|
{
|
||||||
std::deque<json> a{"previous", "value"};
|
std::deque<json> a{"previous", "value"};
|
||||||
|
Reference in New Issue
Block a user