2013-06-06 12:02:54 +08:00
|
|
|
// Copyright 2007-2010 Baptiste Lepilleur
|
|
|
|
// Distributed under MIT license, or public domain if desired and
|
|
|
|
// recognized in your jurisdiction.
|
|
|
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
|
|
|
|
|
|
|
// included by json_value.cpp
|
|
|
|
|
2013-06-09 10:50:03 +08:00
|
|
|
namespace CSJson {
|
2013-06-06 12:02:54 +08:00
|
|
|
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
// class ValueIteratorBase
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
ValueIteratorBase::ValueIteratorBase()
|
|
|
|
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
|
|
|
: current_()
|
|
|
|
, isNull_( true )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
: isArray_( true )
|
|
|
|
, isNull_( true )
|
|
|
|
{
|
|
|
|
iterator_.array_ = ValueInternalArray::IteratorState();
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
|
|
|
ValueIteratorBase::ValueIteratorBase( const Value::ObjectValues::iterator ¤t )
|
|
|
|
: current_( current )
|
|
|
|
, isNull_( false )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
ValueIteratorBase::ValueIteratorBase( const ValueInternalArray::IteratorState &state )
|
|
|
|
: isArray_( true )
|
|
|
|
{
|
|
|
|
iterator_.array_ = state;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ValueIteratorBase::ValueIteratorBase( const ValueInternalMap::IteratorState &state )
|
|
|
|
: isArray_( false )
|
|
|
|
{
|
|
|
|
iterator_.map_ = state;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
Value &
|
|
|
|
ValueIteratorBase::deref() const
|
|
|
|
{
|
|
|
|
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
|
|
|
return current_->second;
|
|
|
|
#else
|
|
|
|
if ( isArray_ )
|
|
|
|
return ValueInternalArray::dereference( iterator_.array_ );
|
|
|
|
return ValueInternalMap::value( iterator_.map_ );
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
ValueIteratorBase::increment()
|
|
|
|
{
|
|
|
|
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
|
|
|
++current_;
|
|
|
|
#else
|
|
|
|
if ( isArray_ )
|
|
|
|
ValueInternalArray::increment( iterator_.array_ );
|
|
|
|
ValueInternalMap::increment( iterator_.map_ );
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
ValueIteratorBase::decrement()
|
|
|
|
{
|
|
|
|
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
|
|
|
--current_;
|
|
|
|
#else
|
|
|
|
if ( isArray_ )
|
|
|
|
ValueInternalArray::decrement( iterator_.array_ );
|
|
|
|
ValueInternalMap::decrement( iterator_.map_ );
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ValueIteratorBase::difference_type
|
|
|
|
ValueIteratorBase::computeDistance( const SelfType &other ) const
|
|
|
|
{
|
|
|
|
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
|
|
|
# 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;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Usage of std::distance is not portable (does not compile with Sun Studio 12 RogueWave STL,
|
|
|
|
// which is the one used by default).
|
|
|
|
// Using a portable hand-made version for non random iterator instead:
|
|
|
|
// return difference_type( std::distance( current_, other.current_ ) );
|
|
|
|
difference_type myDistance = 0;
|
|
|
|
for ( Value::ObjectValues::iterator it = current_; it != other.current_; ++it )
|
|
|
|
{
|
|
|
|
++myDistance;
|
|
|
|
}
|
|
|
|
return myDistance;
|
|
|
|
# endif
|
|
|
|
#else
|
|
|
|
if ( isArray_ )
|
|
|
|
return ValueInternalArray::distance( iterator_.array_, other.iterator_.array_ );
|
|
|
|
return ValueInternalMap::distance( iterator_.map_, other.iterator_.map_ );
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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_ )
|
|
|
|
return ValueInternalArray::equals( iterator_.array_, other.iterator_.array_ );
|
|
|
|
return ValueInternalMap::equals( iterator_.map_, other.iterator_.map_ );
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
ValueIteratorBase::copy( const SelfType &other )
|
|
|
|
{
|
|
|
|
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
|
|
|
current_ = other.current_;
|
|
|
|
#else
|
|
|
|
if ( isArray_ )
|
|
|
|
iterator_.array_ = other.iterator_.array_;
|
|
|
|
iterator_.map_ = other.iterator_.map_;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Value
|
|
|
|
ValueIteratorBase::key() const
|
|
|
|
{
|
|
|
|
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
|
|
|
const Value::CZString czstring = (*current_).first;
|
|
|
|
if ( czstring.c_str() )
|
|
|
|
{
|
|
|
|
if ( czstring.isStaticString() )
|
|
|
|
return Value( StaticString( czstring.c_str() ) );
|
|
|
|
return Value( czstring.c_str() );
|
|
|
|
}
|
|
|
|
return Value( czstring.index() );
|
|
|
|
#else
|
|
|
|
if ( isArray_ )
|
|
|
|
return Value( ValueInternalArray::indexOf( iterator_.array_ ) );
|
|
|
|
bool isStatic;
|
|
|
|
const char *memberName = ValueInternalMap::key( iterator_.map_, isStatic );
|
|
|
|
if ( isStatic )
|
|
|
|
return Value( StaticString( memberName ) );
|
|
|
|
return Value( memberName );
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UInt
|
|
|
|
ValueIteratorBase::index() const
|
|
|
|
{
|
|
|
|
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
|
|
|
const Value::CZString czstring = (*current_).first;
|
|
|
|
if ( !czstring.c_str() )
|
|
|
|
return czstring.index();
|
|
|
|
return Value::UInt( -1 );
|
|
|
|
#else
|
|
|
|
if ( isArray_ )
|
|
|
|
return Value::UInt( ValueInternalArray::indexOf( iterator_.array_ ) );
|
|
|
|
return Value::UInt( -1 );
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const char *
|
|
|
|
ValueIteratorBase::memberName() const
|
|
|
|
{
|
|
|
|
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
|
|
|
const char *name = (*current_).first.c_str();
|
|
|
|
return name ? name : "";
|
|
|
|
#else
|
|
|
|
if ( !isArray_ )
|
|
|
|
return ValueInternalMap::key( iterator_.map_ );
|
|
|
|
return "";
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
// class ValueConstIterator
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
ValueConstIterator::ValueConstIterator()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
|
|
|
ValueConstIterator::ValueConstIterator( const Value::ObjectValues::iterator ¤t )
|
|
|
|
: ValueIteratorBase( current )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
ValueConstIterator::ValueConstIterator( const ValueInternalArray::IteratorState &state )
|
|
|
|
: ValueIteratorBase( state )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
ValueConstIterator::ValueConstIterator( const ValueInternalMap::IteratorState &state )
|
|
|
|
: ValueIteratorBase( state )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
ValueConstIterator &
|
|
|
|
ValueConstIterator::operator =( const ValueIteratorBase &other )
|
|
|
|
{
|
|
|
|
copy( other );
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
// class ValueIterator
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
// //////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
ValueIterator::ValueIterator()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef JSON_VALUE_USE_INTERNAL_MAP
|
|
|
|
ValueIterator::ValueIterator( const Value::ObjectValues::iterator ¤t )
|
|
|
|
: ValueIteratorBase( current )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
ValueIterator::ValueIterator( const ValueInternalArray::IteratorState &state )
|
|
|
|
: ValueIteratorBase( state )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
ValueIterator::ValueIterator( const ValueInternalMap::IteratorState &state )
|
|
|
|
: ValueIteratorBase( state )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
ValueIterator::ValueIterator( const ValueConstIterator &other )
|
|
|
|
: ValueIteratorBase( other )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
ValueIterator::ValueIterator( const ValueIterator &other )
|
|
|
|
: ValueIteratorBase( other )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
ValueIterator &
|
|
|
|
ValueIterator::operator =( const SelfType &other )
|
|
|
|
{
|
|
|
|
copy( other );
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2013-06-09 10:50:03 +08:00
|
|
|
} // namespace CSJson
|