mirror of
https://github.com/nlohmann/json.git
synced 2026-10-01 12:10:32 +00:00
Use the reserve_array helper in the initializer_list insert fix
The previous commit called array_t::reserve() directly on the
temporary buffer used to copy an ilist's values before inserting.
std::deque, a documented ArrayType (tests/src/unit-custom-array-type.cpp),
has no reserve(), so insert(pos, initializer_list) no longer compiled
for it. Use the existing detail::reserve_array() SFINAE helper (already
used by the SAX DOM parser) instead, which leaves array types without
reserve() untouched.
Added a regression check that deque_json::insert(pos, {...}) compiles
and handles the aliasing case from #5656.
Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
@@ -4154,7 +4154,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
||||
|
||||
// copy the values first: ilist may refer to elements of this array
|
||||
array_t values;
|
||||
values.reserve(ilist.size());
|
||||
detail::reserve_array(values, ilist.size(), detail::priority_tag<1> {});
|
||||
for (const auto& element : ilist)
|
||||
{
|
||||
values.push_back(element.moved_or_copied());
|
||||
|
||||
@@ -30235,7 +30235,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
||||
|
||||
// copy the values first: ilist may refer to elements of this array
|
||||
array_t values;
|
||||
values.reserve(ilist.size());
|
||||
detail::reserve_array(values, ilist.size(), detail::priority_tag<1> {});
|
||||
for (const auto& element : ilist)
|
||||
{
|
||||
values.push_back(element.moved_or_copied());
|
||||
|
||||
@@ -117,6 +117,22 @@ TEST_CASE("array type without capacity()")
|
||||
CHECK(nested.flatten().unflatten() == nested);
|
||||
}
|
||||
|
||||
SECTION("insert(pos, initializer_list) compiles and works without reserve()")
|
||||
{
|
||||
// std::deque has no reserve() either; insert(pos, ilist) must not
|
||||
// require it (regression test for #5656, which also covers an ilist
|
||||
// that refers to elements of the array being inserted into)
|
||||
deque_json j = deque_json::array();
|
||||
j.push_back("a");
|
||||
j.push_back("b");
|
||||
j.push_back("c");
|
||||
|
||||
const deque_json& cj = j;
|
||||
auto it = j.insert(j.begin(), {cj[0], cj[1]});
|
||||
CHECK(*it == deque_json("a"));
|
||||
CHECK(j == deque_json({"a", "b", "a", "b", "c"}));
|
||||
}
|
||||
|
||||
SECTION("references stay valid while the array grows")
|
||||
{
|
||||
deque_json j = deque_json::array();
|
||||
|
||||
Reference in New Issue
Block a user