Fixed iteration bug over null values.

This commit is contained in:
Baptiste Lepilleur 2009-11-23 22:33:30 +00:00
parent 2814f6e95b
commit a1d6c9e66a
3 changed files with 46 additions and 29 deletions

View File

@ -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
{

View File

@ -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 &current )
: 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_ )