🔨 adding destroy function to discard values

This commit is contained in:
Niels Lohmann 2017-07-22 22:57:22 +02:00
parent 5b5f0090a1
commit 18e0430bfe
No known key found for this signature in database
GPG key ID: 7F3CEA63AE251B69

View file

@ -3172,6 +3172,7 @@ class parser
// start with a discarded value // start with a discarded value
if (not result.is_discarded()) if (not result.is_discarded())
{ {
result.m_value.destroy(result.m_type);
result.m_type = value_t::discarded; result.m_type = value_t::discarded;
} }
@ -3194,6 +3195,7 @@ class parser
{ {
if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) if (keep and callback and not callback(--depth, parse_event_t::object_end, result))
{ {
result.m_value.destroy(result.m_type);
result.m_type = value_t::discarded; result.m_type = value_t::discarded;
} }
break; break;
@ -3227,7 +3229,8 @@ class parser
// parse and add value // parse and add value
get_token(); get_token();
value = value_t::discarded; value.m_value.destroy(value.m_type);
value.m_type = value_t::discarded;
parse_internal(keep, value); parse_internal(keep, value);
if (keep and keep_tag and not value.is_discarded()) if (keep and keep_tag and not value.is_discarded())
{ {
@ -3249,6 +3252,7 @@ class parser
if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) if (keep and callback and not callback(--depth, parse_event_t::object_end, result))
{ {
result.m_value.destroy(result.m_type);
result.m_type = value_t::discarded; result.m_type = value_t::discarded;
} }
break; break;
@ -3271,6 +3275,7 @@ class parser
{ {
if (callback and not callback(--depth, parse_event_t::array_end, result)) if (callback and not callback(--depth, parse_event_t::array_end, result))
{ {
result.m_value.destroy(result.m_type);
result.m_type = value_t::discarded; result.m_type = value_t::discarded;
} }
break; break;
@ -3281,7 +3286,8 @@ class parser
while (true) while (true)
{ {
// parse value // parse value
value = value_t::discarded; value.m_value.destroy(value.m_type);
value.m_type = value_t::discarded;
parse_internal(keep, value); parse_internal(keep, value);
if (keep and not value.is_discarded()) if (keep and not value.is_discarded())
{ {
@ -3303,6 +3309,7 @@ class parser
if (keep and callback and not callback(--depth, parse_event_t::array_end, result)) if (keep and callback and not callback(--depth, parse_event_t::array_end, result))
{ {
result.m_value.destroy(result.m_type);
result.m_type = value_t::discarded; result.m_type = value_t::discarded;
} }
break; break;
@ -8278,6 +8285,41 @@ class basic_json
{ {
array = create<array_t>(value); array = create<array_t>(value);
} }
void destroy(value_t t)
{
switch (t)
{
case value_t::object:
{
AllocatorType<object_t> alloc;
alloc.destroy(object);
alloc.deallocate(object, 1);
break;
}
case value_t::array:
{
AllocatorType<array_t> alloc;
alloc.destroy(array);
alloc.deallocate(array, 1);
break;
}
case value_t::string:
{
AllocatorType<string_t> alloc;
alloc.destroy(string);
alloc.deallocate(string, 1);
break;
}
default:
{
break;
}
}
}
}; };
/*! /*!
@ -9026,39 +9068,7 @@ class basic_json
~basic_json() ~basic_json()
{ {
assert_invariant(); assert_invariant();
m_value.destroy(m_type);
switch (m_type)
{
case value_t::object:
{
AllocatorType<object_t> alloc;
alloc.destroy(m_value.object);
alloc.deallocate(m_value.object, 1);
break;
}
case value_t::array:
{
AllocatorType<array_t> alloc;
alloc.destroy(m_value.array);
alloc.deallocate(m_value.array, 1);
break;
}
case value_t::string:
{
AllocatorType<string_t> alloc;
alloc.destroy(m_value.string);
alloc.deallocate(m_value.string, 1);
break;
}
default:
{
// all other types need no specific destructor
break;
}
}
} }
/// @} /// @}