refactored generic iterator into a new class primitive_iterator_t
This commit is contained in:
parent
82a6995306
commit
2bc5d893c8
3 changed files with 236 additions and 130 deletions
147
src/json.hpp
147
src/json.hpp
|
@ -1139,7 +1139,7 @@ class basic_json
|
||||||
case value_t::boolean:
|
case value_t::boolean:
|
||||||
case value_t::string:
|
case value_t::string:
|
||||||
{
|
{
|
||||||
if (first.m_it.generic_iterator != 0 or last.m_it.generic_iterator != 1)
|
if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())
|
||||||
{
|
{
|
||||||
throw std::out_of_range("iterators out of range");
|
throw std::out_of_range("iterators out of range");
|
||||||
}
|
}
|
||||||
|
@ -2572,7 +2572,7 @@ class basic_json
|
||||||
case value_t::boolean:
|
case value_t::boolean:
|
||||||
case value_t::string:
|
case value_t::string:
|
||||||
{
|
{
|
||||||
if (pos.m_it.generic_iterator != 0)
|
if (not pos.m_it.primitive_iterator.is_begin())
|
||||||
{
|
{
|
||||||
throw std::out_of_range("iterator out of range");
|
throw std::out_of_range("iterator out of range");
|
||||||
}
|
}
|
||||||
|
@ -2665,7 +2665,7 @@ class basic_json
|
||||||
case value_t::boolean:
|
case value_t::boolean:
|
||||||
case value_t::string:
|
case value_t::string:
|
||||||
{
|
{
|
||||||
if (first.m_it.generic_iterator != 0 or last.m_it.generic_iterator != 1)
|
if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())
|
||||||
{
|
{
|
||||||
throw std::out_of_range("iterators out of range");
|
throw std::out_of_range("iterators out of range");
|
||||||
}
|
}
|
||||||
|
@ -3198,10 +3198,10 @@ class basic_json
|
||||||
defined as follows:
|
defined as follows:
|
||||||
Value type | return value
|
Value type | return value
|
||||||
----------- | -------------
|
----------- | -------------
|
||||||
null | @c 0
|
null | @c 0 (same as size())
|
||||||
boolean | @c 1
|
boolean | @c 1 (same as size())
|
||||||
string | @c 1
|
string | @c 1 (same as size())
|
||||||
number | @c 1
|
number | @c 1 (same as size())
|
||||||
object | result of function object_t::max_size()
|
object | result of function object_t::max_size()
|
||||||
array | result of function array_t::max_size()
|
array | result of function array_t::max_size()
|
||||||
|
|
||||||
|
@ -3223,11 +3223,6 @@ class basic_json
|
||||||
{
|
{
|
||||||
switch (m_type)
|
switch (m_type)
|
||||||
{
|
{
|
||||||
case (value_t::null):
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
case (value_t::array):
|
case (value_t::array):
|
||||||
{
|
{
|
||||||
return m_value.array->max_size();
|
return m_value.array->max_size();
|
||||||
|
@ -3240,8 +3235,8 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
// all other types have max_size 1
|
// all other types have max_size() == size()
|
||||||
return 1;
|
return size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3974,7 +3969,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (c >= 0 and c <= 0x1f)
|
if (c >= 0x00 and c <= 0x1f)
|
||||||
{
|
{
|
||||||
// control characters (everything between 0x00 and 0x1f)
|
// control characters (everything between 0x00 and 0x1f)
|
||||||
// -> create four-digit hex representation
|
// -> create four-digit hex representation
|
||||||
|
@ -4162,6 +4157,64 @@ class basic_json
|
||||||
// iterators //
|
// iterators //
|
||||||
///////////////
|
///////////////
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief an iterator for primitive JSON types
|
||||||
|
|
||||||
|
This class models an iterator for primitive JSON types (boolean, number,
|
||||||
|
string). It's only purpose is to allow the iterator/const_iterator classes
|
||||||
|
to "iterate" over primitive values. Internally, the iterator is modeled by
|
||||||
|
a `difference_type` variable. Value begin_value (`0`) models the begin,
|
||||||
|
end_value (`1`) models past the end.
|
||||||
|
*/
|
||||||
|
class primitive_iterator_t
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
primitive_iterator_t() = default;
|
||||||
|
|
||||||
|
/// set iterator to a defined beginning
|
||||||
|
void set_begin()
|
||||||
|
{
|
||||||
|
m_it = begin_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// set iterator to a defined past the end
|
||||||
|
void set_end()
|
||||||
|
{
|
||||||
|
m_it = end_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return whether the iterator can be dereferenced
|
||||||
|
bool is_begin() const
|
||||||
|
{
|
||||||
|
return (m_it == begin_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return whether the iterator is at end
|
||||||
|
bool is_end() const
|
||||||
|
{
|
||||||
|
return (m_it == end_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return reference to the value to change and compare
|
||||||
|
operator difference_type& ()
|
||||||
|
{
|
||||||
|
return m_it;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return value to compare
|
||||||
|
operator const difference_type& () const
|
||||||
|
{
|
||||||
|
return m_it;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static constexpr difference_type begin_value = 0;
|
||||||
|
static constexpr difference_type end_value = begin_value + 1;
|
||||||
|
|
||||||
|
/// iterator as signed integer type
|
||||||
|
difference_type m_it = std::numeric_limits<std::ptrdiff_t>::min();
|
||||||
|
};
|
||||||
|
|
||||||
/// an iterator value
|
/// an iterator value
|
||||||
union internal_iterator
|
union internal_iterator
|
||||||
{
|
{
|
||||||
|
@ -4170,10 +4223,10 @@ class basic_json
|
||||||
/// iterator for JSON arrays
|
/// iterator for JSON arrays
|
||||||
typename array_t::iterator array_iterator;
|
typename array_t::iterator array_iterator;
|
||||||
/// generic iterator for all other types
|
/// generic iterator for all other types
|
||||||
difference_type generic_iterator;
|
primitive_iterator_t primitive_iterator;
|
||||||
|
|
||||||
/// default constructor
|
// leave the union un-initialized
|
||||||
internal_iterator() : generic_iterator(-1) {}
|
internal_iterator() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -4215,7 +4268,7 @@ class basic_json
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator = -1;
|
m_it.primitive_iterator = primitive_iterator_t();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4260,13 +4313,13 @@ class basic_json
|
||||||
case (basic_json::value_t::null):
|
case (basic_json::value_t::null):
|
||||||
{
|
{
|
||||||
// set to end so begin()==end() is true: null is empty
|
// set to end so begin()==end() is true: null is empty
|
||||||
m_it.generic_iterator = 1;
|
m_it.primitive_iterator.set_end();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator = 0;
|
m_it.primitive_iterator.set_begin();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4291,7 +4344,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator = 1;
|
m_it.primitive_iterator.set_end();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4320,7 +4373,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (m_it.generic_iterator == 0)
|
if (m_it.primitive_iterator.is_begin())
|
||||||
{
|
{
|
||||||
return *m_object;
|
return *m_object;
|
||||||
}
|
}
|
||||||
|
@ -4354,7 +4407,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (m_it.generic_iterator == 0)
|
if (m_it.primitive_iterator.is_begin())
|
||||||
{
|
{
|
||||||
return m_object;
|
return m_object;
|
||||||
}
|
}
|
||||||
|
@ -4387,7 +4440,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator++;
|
m_it.primitive_iterator++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4414,7 +4467,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
++m_it.generic_iterator;
|
++m_it.primitive_iterator;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4443,7 +4496,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator--;
|
m_it.primitive_iterator--;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4470,7 +4523,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
--m_it.generic_iterator;
|
--m_it.primitive_iterator;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4501,7 +4554,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return (m_it.generic_iterator == other.m_it.generic_iterator);
|
return (m_it.primitive_iterator == other.m_it.primitive_iterator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4535,7 +4588,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return (m_it.generic_iterator < other.m_it.generic_iterator);
|
return (m_it.primitive_iterator < other.m_it.primitive_iterator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4576,7 +4629,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator += i;
|
m_it.primitive_iterator += i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4624,7 +4677,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return m_it.generic_iterator - other.m_it.generic_iterator;
|
return m_it.primitive_iterator - other.m_it.primitive_iterator;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4651,7 +4704,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (m_it.generic_iterator == -n)
|
if (m_it.primitive_iterator == -n)
|
||||||
{
|
{
|
||||||
return *m_object;
|
return *m_object;
|
||||||
}
|
}
|
||||||
|
@ -4731,7 +4784,7 @@ class basic_json
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator = -1;
|
m_it.primitive_iterator = primitive_iterator_t();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4756,7 +4809,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator = other.m_it.generic_iterator;
|
m_it.primitive_iterator = other.m_it.primitive_iterator;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4801,13 +4854,13 @@ class basic_json
|
||||||
case (basic_json::value_t::null):
|
case (basic_json::value_t::null):
|
||||||
{
|
{
|
||||||
// set to end so begin()==end() is true: null is empty
|
// set to end so begin()==end() is true: null is empty
|
||||||
m_it.generic_iterator = 1;
|
m_it.primitive_iterator.set_end();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator = 0;
|
m_it.primitive_iterator.set_begin();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4832,7 +4885,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator = 1;
|
m_it.primitive_iterator.set_end();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4861,7 +4914,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (m_it.generic_iterator == 0)
|
if (m_it.primitive_iterator.is_begin())
|
||||||
{
|
{
|
||||||
return *m_object;
|
return *m_object;
|
||||||
}
|
}
|
||||||
|
@ -4890,7 +4943,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (m_it.generic_iterator == 0)
|
if (m_it.primitive_iterator.is_begin())
|
||||||
{
|
{
|
||||||
return m_object;
|
return m_object;
|
||||||
}
|
}
|
||||||
|
@ -4930,7 +4983,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
++m_it.generic_iterator;
|
++m_it.primitive_iterator;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4966,7 +5019,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
--m_it.generic_iterator;
|
--m_it.primitive_iterator;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4997,7 +5050,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return (m_it.generic_iterator == other.m_it.generic_iterator);
|
return (m_it.primitive_iterator == other.m_it.primitive_iterator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5031,7 +5084,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return (m_it.generic_iterator < other.m_it.generic_iterator);
|
return (m_it.primitive_iterator < other.m_it.primitive_iterator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5072,7 +5125,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator += i;
|
m_it.primitive_iterator += i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5119,7 +5172,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return m_it.generic_iterator - other.m_it.generic_iterator;
|
return m_it.primitive_iterator - other.m_it.primitive_iterator;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5146,7 +5199,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (m_it.generic_iterator == -n)
|
if (m_it.primitive_iterator == -n)
|
||||||
{
|
{
|
||||||
return *m_object;
|
return *m_object;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1139,7 +1139,7 @@ class basic_json
|
||||||
case value_t::boolean:
|
case value_t::boolean:
|
||||||
case value_t::string:
|
case value_t::string:
|
||||||
{
|
{
|
||||||
if (first.m_it.generic_iterator != 0 or last.m_it.generic_iterator != 1)
|
if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())
|
||||||
{
|
{
|
||||||
throw std::out_of_range("iterators out of range");
|
throw std::out_of_range("iterators out of range");
|
||||||
}
|
}
|
||||||
|
@ -2572,7 +2572,7 @@ class basic_json
|
||||||
case value_t::boolean:
|
case value_t::boolean:
|
||||||
case value_t::string:
|
case value_t::string:
|
||||||
{
|
{
|
||||||
if (pos.m_it.generic_iterator != 0)
|
if (not pos.m_it.primitive_iterator.is_begin())
|
||||||
{
|
{
|
||||||
throw std::out_of_range("iterator out of range");
|
throw std::out_of_range("iterator out of range");
|
||||||
}
|
}
|
||||||
|
@ -2665,7 +2665,7 @@ class basic_json
|
||||||
case value_t::boolean:
|
case value_t::boolean:
|
||||||
case value_t::string:
|
case value_t::string:
|
||||||
{
|
{
|
||||||
if (first.m_it.generic_iterator != 0 or last.m_it.generic_iterator != 1)
|
if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())
|
||||||
{
|
{
|
||||||
throw std::out_of_range("iterators out of range");
|
throw std::out_of_range("iterators out of range");
|
||||||
}
|
}
|
||||||
|
@ -3198,10 +3198,10 @@ class basic_json
|
||||||
defined as follows:
|
defined as follows:
|
||||||
Value type | return value
|
Value type | return value
|
||||||
----------- | -------------
|
----------- | -------------
|
||||||
null | @c 0
|
null | @c 0 (same as size())
|
||||||
boolean | @c 1
|
boolean | @c 1 (same as size())
|
||||||
string | @c 1
|
string | @c 1 (same as size())
|
||||||
number | @c 1
|
number | @c 1 (same as size())
|
||||||
object | result of function object_t::max_size()
|
object | result of function object_t::max_size()
|
||||||
array | result of function array_t::max_size()
|
array | result of function array_t::max_size()
|
||||||
|
|
||||||
|
@ -3223,11 +3223,6 @@ class basic_json
|
||||||
{
|
{
|
||||||
switch (m_type)
|
switch (m_type)
|
||||||
{
|
{
|
||||||
case (value_t::null):
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
case (value_t::array):
|
case (value_t::array):
|
||||||
{
|
{
|
||||||
return m_value.array->max_size();
|
return m_value.array->max_size();
|
||||||
|
@ -3240,8 +3235,8 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
// all other types have max_size 1
|
// all other types have max_size() == size()
|
||||||
return 1;
|
return size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3974,7 +3969,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (c >= 0 and c <= 0x1f)
|
if (c >= 0x00 and c <= 0x1f)
|
||||||
{
|
{
|
||||||
// control characters (everything between 0x00 and 0x1f)
|
// control characters (everything between 0x00 and 0x1f)
|
||||||
// -> create four-digit hex representation
|
// -> create four-digit hex representation
|
||||||
|
@ -4162,6 +4157,64 @@ class basic_json
|
||||||
// iterators //
|
// iterators //
|
||||||
///////////////
|
///////////////
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief an iterator for primitive JSON types
|
||||||
|
|
||||||
|
This class models an iterator for primitive JSON types (boolean, number,
|
||||||
|
string). It's only purpose is to allow the iterator/const_iterator classes
|
||||||
|
to "iterate" over primitive values. Internally, the iterator is modeled by
|
||||||
|
a `difference_type` variable. Value begin_value (`0`) models the begin,
|
||||||
|
end_value (`1`) models past the end.
|
||||||
|
*/
|
||||||
|
class primitive_iterator_t
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
primitive_iterator_t() = default;
|
||||||
|
|
||||||
|
/// set iterator to a defined beginning
|
||||||
|
void set_begin()
|
||||||
|
{
|
||||||
|
m_it = begin_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// set iterator to a defined past the end
|
||||||
|
void set_end()
|
||||||
|
{
|
||||||
|
m_it = end_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return whether the iterator can be dereferenced
|
||||||
|
bool is_begin() const
|
||||||
|
{
|
||||||
|
return (m_it == begin_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return whether the iterator is at end
|
||||||
|
bool is_end() const
|
||||||
|
{
|
||||||
|
return (m_it == end_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return reference to the value to change and compare
|
||||||
|
operator difference_type& ()
|
||||||
|
{
|
||||||
|
return m_it;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return value to compare
|
||||||
|
operator const difference_type () const
|
||||||
|
{
|
||||||
|
return m_it;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static constexpr difference_type begin_value = 0;
|
||||||
|
static constexpr difference_type end_value = begin_value + 1;
|
||||||
|
|
||||||
|
/// iterator as signed integer type
|
||||||
|
difference_type m_it = std::numeric_limits<std::ptrdiff_t>::min();
|
||||||
|
};
|
||||||
|
|
||||||
/// an iterator value
|
/// an iterator value
|
||||||
union internal_iterator
|
union internal_iterator
|
||||||
{
|
{
|
||||||
|
@ -4170,10 +4223,10 @@ class basic_json
|
||||||
/// iterator for JSON arrays
|
/// iterator for JSON arrays
|
||||||
typename array_t::iterator array_iterator;
|
typename array_t::iterator array_iterator;
|
||||||
/// generic iterator for all other types
|
/// generic iterator for all other types
|
||||||
difference_type generic_iterator;
|
primitive_iterator_t primitive_iterator;
|
||||||
|
|
||||||
/// default constructor
|
// leave the union un-initialized
|
||||||
internal_iterator() : generic_iterator(-1) {}
|
internal_iterator() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -4215,7 +4268,7 @@ class basic_json
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator = -1;
|
m_it.primitive_iterator = primitive_iterator_t();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4260,13 +4313,13 @@ class basic_json
|
||||||
case (basic_json::value_t::null):
|
case (basic_json::value_t::null):
|
||||||
{
|
{
|
||||||
// set to end so begin()==end() is true: null is empty
|
// set to end so begin()==end() is true: null is empty
|
||||||
m_it.generic_iterator = 1;
|
m_it.primitive_iterator.set_end();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator = 0;
|
m_it.primitive_iterator.set_begin();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4291,7 +4344,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator = 1;
|
m_it.primitive_iterator.set_end();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4320,7 +4373,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (m_it.generic_iterator == 0)
|
if (m_it.primitive_iterator.is_begin())
|
||||||
{
|
{
|
||||||
return *m_object;
|
return *m_object;
|
||||||
}
|
}
|
||||||
|
@ -4354,7 +4407,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (m_it.generic_iterator == 0)
|
if (m_it.primitive_iterator.is_begin())
|
||||||
{
|
{
|
||||||
return m_object;
|
return m_object;
|
||||||
}
|
}
|
||||||
|
@ -4387,7 +4440,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator++;
|
m_it.primitive_iterator++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4414,7 +4467,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
++m_it.generic_iterator;
|
++m_it.primitive_iterator;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4443,7 +4496,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator--;
|
m_it.primitive_iterator--;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4470,7 +4523,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
--m_it.generic_iterator;
|
--m_it.primitive_iterator;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4501,7 +4554,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return (m_it.generic_iterator == other.m_it.generic_iterator);
|
return (m_it.primitive_iterator == other.m_it.primitive_iterator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4535,7 +4588,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return (m_it.generic_iterator < other.m_it.generic_iterator);
|
return (m_it.primitive_iterator < other.m_it.primitive_iterator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4576,7 +4629,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator += i;
|
m_it.primitive_iterator += i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4624,7 +4677,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return m_it.generic_iterator - other.m_it.generic_iterator;
|
return m_it.primitive_iterator - other.m_it.primitive_iterator;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4651,7 +4704,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (m_it.generic_iterator == -n)
|
if (m_it.primitive_iterator == -n)
|
||||||
{
|
{
|
||||||
return *m_object;
|
return *m_object;
|
||||||
}
|
}
|
||||||
|
@ -4731,7 +4784,7 @@ class basic_json
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator = -1;
|
m_it.primitive_iterator = primitive_iterator_t();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4756,7 +4809,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator = other.m_it.generic_iterator;
|
m_it.primitive_iterator = other.m_it.primitive_iterator;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4801,13 +4854,13 @@ class basic_json
|
||||||
case (basic_json::value_t::null):
|
case (basic_json::value_t::null):
|
||||||
{
|
{
|
||||||
// set to end so begin()==end() is true: null is empty
|
// set to end so begin()==end() is true: null is empty
|
||||||
m_it.generic_iterator = 1;
|
m_it.primitive_iterator.set_end();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator = 0;
|
m_it.primitive_iterator.set_begin();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4832,7 +4885,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator = 1;
|
m_it.primitive_iterator.set_end();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4861,7 +4914,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (m_it.generic_iterator == 0)
|
if (m_it.primitive_iterator.is_begin())
|
||||||
{
|
{
|
||||||
return *m_object;
|
return *m_object;
|
||||||
}
|
}
|
||||||
|
@ -4890,7 +4943,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (m_it.generic_iterator == 0)
|
if (m_it.primitive_iterator.is_begin())
|
||||||
{
|
{
|
||||||
return m_object;
|
return m_object;
|
||||||
}
|
}
|
||||||
|
@ -4930,7 +4983,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
++m_it.generic_iterator;
|
++m_it.primitive_iterator;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4966,7 +5019,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
--m_it.generic_iterator;
|
--m_it.primitive_iterator;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4997,7 +5050,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return (m_it.generic_iterator == other.m_it.generic_iterator);
|
return (m_it.primitive_iterator == other.m_it.primitive_iterator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5031,7 +5084,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return (m_it.generic_iterator < other.m_it.generic_iterator);
|
return (m_it.primitive_iterator < other.m_it.primitive_iterator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5072,7 +5125,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
m_it.generic_iterator += i;
|
m_it.primitive_iterator += i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5119,7 +5172,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return m_it.generic_iterator - other.m_it.generic_iterator;
|
return m_it.primitive_iterator - other.m_it.primitive_iterator;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5146,7 +5199,7 @@ class basic_json
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (m_it.generic_iterator == -n)
|
if (m_it.primitive_iterator == -n)
|
||||||
{
|
{
|
||||||
return *m_object;
|
return *m_object;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6798,20 +6798,20 @@ TEST_CASE("iterator class")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::iterator it = j.begin();
|
json::iterator it = j.begin();
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
it++;
|
it++;
|
||||||
CHECK((it.m_it.generic_iterator != 0 and it.m_it.generic_iterator != 1));
|
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::iterator it = j.begin();
|
json::iterator it = j.begin();
|
||||||
CHECK(it.m_it.generic_iterator == 0);
|
CHECK(it.m_it.primitive_iterator == 0);
|
||||||
it++;
|
it++;
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
it++;
|
it++;
|
||||||
CHECK((it.m_it.generic_iterator != 0 and it.m_it.generic_iterator != 1));
|
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
|
@ -6849,20 +6849,20 @@ TEST_CASE("iterator class")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::iterator it = j.begin();
|
json::iterator it = j.begin();
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
++it;
|
++it;
|
||||||
CHECK((it.m_it.generic_iterator != 0 and it.m_it.generic_iterator != 1));
|
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::iterator it = j.begin();
|
json::iterator it = j.begin();
|
||||||
CHECK(it.m_it.generic_iterator == 0);
|
CHECK(it.m_it.primitive_iterator == 0);
|
||||||
++it;
|
++it;
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
++it;
|
++it;
|
||||||
CHECK((it.m_it.generic_iterator != 0 and it.m_it.generic_iterator != 1));
|
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
|
@ -6900,18 +6900,18 @@ TEST_CASE("iterator class")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::iterator it = j.end();
|
json::iterator it = j.end();
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::iterator it = j.end();
|
json::iterator it = j.end();
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
it--;
|
it--;
|
||||||
CHECK(it.m_it.generic_iterator == 0);
|
CHECK(it.m_it.primitive_iterator == 0);
|
||||||
it--;
|
it--;
|
||||||
CHECK((it.m_it.generic_iterator != 0 and it.m_it.generic_iterator != 1));
|
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
|
@ -6949,18 +6949,18 @@ TEST_CASE("iterator class")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::iterator it = j.end();
|
json::iterator it = j.end();
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::iterator it = j.end();
|
json::iterator it = j.end();
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
--it;
|
--it;
|
||||||
CHECK(it.m_it.generic_iterator == 0);
|
CHECK(it.m_it.primitive_iterator == 0);
|
||||||
--it;
|
--it;
|
||||||
CHECK((it.m_it.generic_iterator != 0 and it.m_it.generic_iterator != 1));
|
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
|
@ -7162,20 +7162,20 @@ TEST_CASE("const_iterator class")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
it++;
|
it++;
|
||||||
CHECK((it.m_it.generic_iterator != 0 and it.m_it.generic_iterator != 1));
|
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK(it.m_it.generic_iterator == 0);
|
CHECK(it.m_it.primitive_iterator == 0);
|
||||||
it++;
|
it++;
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
it++;
|
it++;
|
||||||
CHECK((it.m_it.generic_iterator != 0 and it.m_it.generic_iterator != 1));
|
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
|
@ -7213,20 +7213,20 @@ TEST_CASE("const_iterator class")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
++it;
|
++it;
|
||||||
CHECK((it.m_it.generic_iterator != 0 and it.m_it.generic_iterator != 1));
|
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK(it.m_it.generic_iterator == 0);
|
CHECK(it.m_it.primitive_iterator == 0);
|
||||||
++it;
|
++it;
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
++it;
|
++it;
|
||||||
CHECK((it.m_it.generic_iterator != 0 and it.m_it.generic_iterator != 1));
|
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
|
@ -7264,18 +7264,18 @@ TEST_CASE("const_iterator class")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
it--;
|
it--;
|
||||||
CHECK(it.m_it.generic_iterator == 0);
|
CHECK(it.m_it.primitive_iterator == 0);
|
||||||
it--;
|
it--;
|
||||||
CHECK((it.m_it.generic_iterator != 0 and it.m_it.generic_iterator != 1));
|
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
|
@ -7313,18 +7313,18 @@ TEST_CASE("const_iterator class")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK(it.m_it.generic_iterator == 1);
|
CHECK(it.m_it.primitive_iterator == 1);
|
||||||
--it;
|
--it;
|
||||||
CHECK(it.m_it.generic_iterator == 0);
|
CHECK(it.m_it.primitive_iterator == 0);
|
||||||
--it;
|
--it;
|
||||||
CHECK((it.m_it.generic_iterator != 0 and it.m_it.generic_iterator != 1));
|
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
|
|
Loading…
Reference in a new issue