simplify destroy() function for primitive types

parent db980739
...@@ -1133,51 +1133,53 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec ...@@ -1133,51 +1133,53 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
void destroy(value_t t) noexcept void destroy(value_t t) noexcept
{ {
// flatten the current json_value to a heap-allocated stack if (t == value_t::array || t == value_t::object)
std::vector<basic_json> stack;
// move the top-level items to stack
if (t == value_t::array)
{
stack.reserve(array->size());
std::move(array->begin(), array->end(), std::back_inserter(stack));
}
else if (t == value_t::object)
{
stack.reserve(object->size());
for (auto&& it : *object)
{
stack.push_back(std::move(it.second));
}
}
while (!stack.empty())
{ {
// move the last item to local variable to be processed // flatten the current json_value to a heap-allocated stack
basic_json current_item(std::move(stack.back())); std::vector<basic_json> stack;
stack.pop_back();
// if current_item is array/object, move // move the top-level items to stack
// its children to the stack to be processed later if (t == value_t::array)
if (current_item.is_array())
{ {
std::move(current_item.m_value.array->begin(), current_item.m_value.array->end(), stack.reserve(array->size());
std::back_inserter(stack)); std::move(array->begin(), array->end(), std::back_inserter(stack));
current_item.m_value.array->clear();
} }
else if (current_item.is_object()) else
{ {
for (auto&& it : *current_item.m_value.object) stack.reserve(object->size());
for (auto&& it : *object)
{ {
stack.push_back(std::move(it.second)); stack.push_back(std::move(it.second));
} }
current_item.m_value.object->clear();
} }
// it's now safe that current_item get destructed while (!stack.empty())
// since it doesn't have any children {
// move the last item to local variable to be processed
basic_json current_item(std::move(stack.back()));
stack.pop_back();
// if current_item is array/object, move
// its children to the stack to be processed later
if (current_item.is_array())
{
std::move(current_item.m_value.array->begin(), current_item.m_value.array->end(), std::back_inserter(stack));
current_item.m_value.array->clear();
}
else if (current_item.is_object())
{
for (auto&& it : *current_item.m_value.object)
{
stack.push_back(std::move(it.second));
}
current_item.m_value.object->clear();
}
// it's now safe that current_item get destructed
// since it doesn't have any children
}
} }
switch (t) switch (t)
......
...@@ -18168,51 +18168,53 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec ...@@ -18168,51 +18168,53 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
void destroy(value_t t) noexcept void destroy(value_t t) noexcept
{ {
// flatten the current json_value to a heap-allocated stack if (t == value_t::array || t == value_t::object)
std::vector<basic_json> stack;
// move the top-level items to stack
if (t == value_t::array)
{
stack.reserve(array->size());
std::move(array->begin(), array->end(), std::back_inserter(stack));
}
else if (t == value_t::object)
{
stack.reserve(object->size());
for (auto&& it : *object)
{
stack.push_back(std::move(it.second));
}
}
while (!stack.empty())
{ {
// move the last item to local variable to be processed // flatten the current json_value to a heap-allocated stack
basic_json current_item(std::move(stack.back())); std::vector<basic_json> stack;
stack.pop_back();
// if current_item is array/object, move // move the top-level items to stack
// its children to the stack to be processed later if (t == value_t::array)
if (current_item.is_array())
{ {
std::move(current_item.m_value.array->begin(), current_item.m_value.array->end(), stack.reserve(array->size());
std::back_inserter(stack)); std::move(array->begin(), array->end(), std::back_inserter(stack));
current_item.m_value.array->clear();
} }
else if (current_item.is_object()) else
{ {
for (auto&& it : *current_item.m_value.object) stack.reserve(object->size());
for (auto&& it : *object)
{ {
stack.push_back(std::move(it.second)); stack.push_back(std::move(it.second));
} }
current_item.m_value.object->clear();
} }
// it's now safe that current_item get destructed while (!stack.empty())
// since it doesn't have any children {
// move the last item to local variable to be processed
basic_json current_item(std::move(stack.back()));
stack.pop_back();
// if current_item is array/object, move
// its children to the stack to be processed later
if (current_item.is_array())
{
std::move(current_item.m_value.array->begin(), current_item.m_value.array->end(), std::back_inserter(stack));
current_item.m_value.array->clear();
}
else if (current_item.is_object())
{
for (auto&& it : *current_item.m_value.object)
{
stack.push_back(std::move(it.second));
}
current_item.m_value.object->clear();
}
// it's now safe that current_item get destructed
// since it doesn't have any children
}
} }
switch (t) switch (t)
......
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