mirror of
https://github.com/open-source-parsers/jsoncpp.git
synced 2025-01-14 18:07:56 +08:00
Fixed iteration bug over null values.
This commit is contained in:
parent
2814f6e95b
commit
a1d6c9e66a
@ -917,6 +917,8 @@ public: // overridden from ValueArrayAllocator
|
||||
private:
|
||||
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
||||
Value::ObjectValues::iterator current_;
|
||||
// Indicates that iterator is for a null value.
|
||||
bool isNull_;
|
||||
#else
|
||||
union
|
||||
{
|
||||
|
@ -13,6 +13,7 @@
|
||||
ValueIteratorBase::ValueIteratorBase()
|
||||
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
||||
: current_()
|
||||
, isNull_( true )
|
||||
#else
|
||||
# error fix me // Need to handle uninitialized iterator comparison for experimental maps
|
||||
#endif
|
||||
@ -23,6 +24,7 @@ ValueIteratorBase::ValueIteratorBase()
|
||||
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
||||
ValueIteratorBase::ValueIteratorBase( const Value::ObjectValues::iterator ¤t )
|
||||
: current_( current )
|
||||
, isNull_( false )
|
||||
{
|
||||
}
|
||||
#else
|
||||
@ -86,6 +88,15 @@ ValueIteratorBase::computeDistance( const SelfType &other ) const
|
||||
# ifdef JSON_USE_CPPTL_SMALLMAP
|
||||
return current_ - other.current_;
|
||||
# else
|
||||
// Iterator for null value are initialized using the default
|
||||
// constructor, which initialize current_ to the default
|
||||
// std::map::iterator. As begin() and end() are two instance
|
||||
// of the default std::map::iterator, they can not be compared.
|
||||
// To allow this, we handle this comparison specifically.
|
||||
if ( isNull_ && other.isNull_ )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return difference_type( std::distance( current_, other.current_ ) );
|
||||
# endif
|
||||
#else
|
||||
@ -100,6 +111,10 @@ bool
|
||||
ValueIteratorBase::isEqual( const SelfType &other ) const
|
||||
{
|
||||
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
||||
if ( isNull_ )
|
||||
{
|
||||
return other.isNull_;
|
||||
}
|
||||
return current_ == other.current_;
|
||||
#else
|
||||
if ( isArray_ )
|
||||
|
Loading…
x
Reference in New Issue
Block a user