| // 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 |
| |
| namespace Json { |
| |
| // ////////////////////////////////////////////////////////////////// |
| // ////////////////////////////////////////////////////////////////// |
| // ////////////////////////////////////////////////////////////////// |
| // 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_; |
| isNull_ = other.isNull_; |
| #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; |
| } |
| |
| } // namespace Json |