ian@0: // Copyright 2007-2010 Baptiste Lepilleur ian@0: // Distributed under MIT license, or public domain if desired and ian@0: // recognized in your jurisdiction. ian@0: // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE ian@0: ian@0: // included by json_value.cpp ian@0: ian@0: namespace Json { ian@0: ian@0: // ////////////////////////////////////////////////////////////////// ian@0: // ////////////////////////////////////////////////////////////////// ian@0: // ////////////////////////////////////////////////////////////////// ian@0: // class ValueIteratorBase ian@0: // ////////////////////////////////////////////////////////////////// ian@0: // ////////////////////////////////////////////////////////////////// ian@0: // ////////////////////////////////////////////////////////////////// ian@0: ian@0: ValueIteratorBase::ValueIteratorBase() ian@0: #ifndef JSON_VALUE_USE_INTERNAL_MAP ian@0: : current_() ian@0: , isNull_( true ) ian@0: { ian@0: } ian@0: #else ian@0: : isArray_( true ) ian@0: , isNull_( true ) ian@0: { ian@0: iterator_.array_ = ValueInternalArray::IteratorState(); ian@0: } ian@0: #endif ian@0: ian@0: ian@0: #ifndef JSON_VALUE_USE_INTERNAL_MAP ian@0: ValueIteratorBase::ValueIteratorBase( const Value::ObjectValues::iterator ¤t ) ian@0: : current_( current ) ian@0: , isNull_( false ) ian@0: { ian@0: } ian@0: #else ian@0: ValueIteratorBase::ValueIteratorBase( const ValueInternalArray::IteratorState &state ) ian@0: : isArray_( true ) ian@0: { ian@0: iterator_.array_ = state; ian@0: } ian@0: ian@0: ian@0: ValueIteratorBase::ValueIteratorBase( const ValueInternalMap::IteratorState &state ) ian@0: : isArray_( false ) ian@0: { ian@0: iterator_.map_ = state; ian@0: } ian@0: #endif ian@0: ian@0: Value & ian@0: ValueIteratorBase::deref() const ian@0: { ian@0: #ifndef JSON_VALUE_USE_INTERNAL_MAP ian@0: return current_->second; ian@0: #else ian@0: if ( isArray_ ) ian@0: return ValueInternalArray::dereference( iterator_.array_ ); ian@0: return ValueInternalMap::value( iterator_.map_ ); ian@0: #endif ian@0: } ian@0: ian@0: ian@0: void ian@0: ValueIteratorBase::increment() ian@0: { ian@0: #ifndef JSON_VALUE_USE_INTERNAL_MAP ian@0: ++current_; ian@0: #else ian@0: if ( isArray_ ) ian@0: ValueInternalArray::increment( iterator_.array_ ); ian@0: ValueInternalMap::increment( iterator_.map_ ); ian@0: #endif ian@0: } ian@0: ian@0: ian@0: void ian@0: ValueIteratorBase::decrement() ian@0: { ian@0: #ifndef JSON_VALUE_USE_INTERNAL_MAP ian@0: --current_; ian@0: #else ian@0: if ( isArray_ ) ian@0: ValueInternalArray::decrement( iterator_.array_ ); ian@0: ValueInternalMap::decrement( iterator_.map_ ); ian@0: #endif ian@0: } ian@0: ian@0: ian@0: ValueIteratorBase::difference_type ian@0: ValueIteratorBase::computeDistance( const SelfType &other ) const ian@0: { ian@0: #ifndef JSON_VALUE_USE_INTERNAL_MAP ian@0: # ifdef JSON_USE_CPPTL_SMALLMAP ian@0: return current_ - other.current_; ian@0: # else ian@0: // Iterator for null value are initialized using the default ian@0: // constructor, which initialize current_ to the default ian@0: // std::map::iterator. As begin() and end() are two instance ian@0: // of the default std::map::iterator, they can not be compared. ian@0: // To allow this, we handle this comparison specifically. ian@0: if ( isNull_ && other.isNull_ ) ian@0: { ian@0: return 0; ian@0: } ian@0: ian@0: ian@0: // Usage of std::distance is not portable (does not compile with Sun Studio 12 RogueWave STL, ian@0: // which is the one used by default). ian@0: // Using a portable hand-made version for non random iterator instead: ian@0: // return difference_type( std::distance( current_, other.current_ ) ); ian@0: difference_type myDistance = 0; ian@0: for ( Value::ObjectValues::iterator it = current_; it != other.current_; ++it ) ian@0: { ian@0: ++myDistance; ian@0: } ian@0: return myDistance; ian@0: # endif ian@0: #else ian@0: if ( isArray_ ) ian@0: return ValueInternalArray::distance( iterator_.array_, other.iterator_.array_ ); ian@0: return ValueInternalMap::distance( iterator_.map_, other.iterator_.map_ ); ian@0: #endif ian@0: } ian@0: ian@0: ian@0: bool ian@0: ValueIteratorBase::isEqual( const SelfType &other ) const ian@0: { ian@0: #ifndef JSON_VALUE_USE_INTERNAL_MAP ian@0: if ( isNull_ ) ian@0: { ian@0: return other.isNull_; ian@0: } ian@0: return current_ == other.current_; ian@0: #else ian@0: if ( isArray_ ) ian@0: return ValueInternalArray::equals( iterator_.array_, other.iterator_.array_ ); ian@0: return ValueInternalMap::equals( iterator_.map_, other.iterator_.map_ ); ian@0: #endif ian@0: } ian@0: ian@0: ian@0: void ian@0: ValueIteratorBase::copy( const SelfType &other ) ian@0: { ian@0: #ifndef JSON_VALUE_USE_INTERNAL_MAP ian@0: current_ = other.current_; ian@0: #else ian@0: if ( isArray_ ) ian@0: iterator_.array_ = other.iterator_.array_; ian@0: iterator_.map_ = other.iterator_.map_; ian@0: #endif ian@0: } ian@0: ian@0: ian@0: Value ian@0: ValueIteratorBase::key() const ian@0: { ian@0: #ifndef JSON_VALUE_USE_INTERNAL_MAP ian@0: const Value::CZString czstring = (*current_).first; ian@0: if ( czstring.c_str() ) ian@0: { ian@0: if ( czstring.isStaticString() ) ian@0: return Value( StaticString( czstring.c_str() ) ); ian@0: return Value( czstring.c_str() ); ian@0: } ian@0: return Value( czstring.index() ); ian@0: #else ian@0: if ( isArray_ ) ian@0: return Value( ValueInternalArray::indexOf( iterator_.array_ ) ); ian@0: bool isStatic; ian@0: const char *memberName = ValueInternalMap::key( iterator_.map_, isStatic ); ian@0: if ( isStatic ) ian@0: return Value( StaticString( memberName ) ); ian@0: return Value( memberName ); ian@0: #endif ian@0: } ian@0: ian@0: ian@0: UInt ian@0: ValueIteratorBase::index() const ian@0: { ian@0: #ifndef JSON_VALUE_USE_INTERNAL_MAP ian@0: const Value::CZString czstring = (*current_).first; ian@0: if ( !czstring.c_str() ) ian@0: return czstring.index(); ian@0: return Value::UInt( -1 ); ian@0: #else ian@0: if ( isArray_ ) ian@0: return Value::UInt( ValueInternalArray::indexOf( iterator_.array_ ) ); ian@0: return Value::UInt( -1 ); ian@0: #endif ian@0: } ian@0: ian@0: ian@0: const char * ian@0: ValueIteratorBase::memberName() const ian@0: { ian@0: #ifndef JSON_VALUE_USE_INTERNAL_MAP ian@0: const char *name = (*current_).first.c_str(); ian@0: return name ? name : ""; ian@0: #else ian@0: if ( !isArray_ ) ian@0: return ValueInternalMap::key( iterator_.map_ ); ian@0: return ""; ian@0: #endif ian@0: } ian@0: ian@0: ian@0: // ////////////////////////////////////////////////////////////////// ian@0: // ////////////////////////////////////////////////////////////////// ian@0: // ////////////////////////////////////////////////////////////////// ian@0: // class ValueConstIterator ian@0: // ////////////////////////////////////////////////////////////////// ian@0: // ////////////////////////////////////////////////////////////////// ian@0: // ////////////////////////////////////////////////////////////////// ian@0: ian@0: ValueConstIterator::ValueConstIterator() ian@0: { ian@0: } ian@0: ian@0: ian@0: #ifndef JSON_VALUE_USE_INTERNAL_MAP ian@0: ValueConstIterator::ValueConstIterator( const Value::ObjectValues::iterator ¤t ) ian@0: : ValueIteratorBase( current ) ian@0: { ian@0: } ian@0: #else ian@0: ValueConstIterator::ValueConstIterator( const ValueInternalArray::IteratorState &state ) ian@0: : ValueIteratorBase( state ) ian@0: { ian@0: } ian@0: ian@0: ValueConstIterator::ValueConstIterator( const ValueInternalMap::IteratorState &state ) ian@0: : ValueIteratorBase( state ) ian@0: { ian@0: } ian@0: #endif ian@0: ian@0: ValueConstIterator & ian@0: ValueConstIterator::operator =( const ValueIteratorBase &other ) ian@0: { ian@0: copy( other ); ian@0: return *this; ian@0: } ian@0: ian@0: ian@0: // ////////////////////////////////////////////////////////////////// ian@0: // ////////////////////////////////////////////////////////////////// ian@0: // ////////////////////////////////////////////////////////////////// ian@0: // class ValueIterator ian@0: // ////////////////////////////////////////////////////////////////// ian@0: // ////////////////////////////////////////////////////////////////// ian@0: // ////////////////////////////////////////////////////////////////// ian@0: ian@0: ValueIterator::ValueIterator() ian@0: { ian@0: } ian@0: ian@0: ian@0: #ifndef JSON_VALUE_USE_INTERNAL_MAP ian@0: ValueIterator::ValueIterator( const Value::ObjectValues::iterator ¤t ) ian@0: : ValueIteratorBase( current ) ian@0: { ian@0: } ian@0: #else ian@0: ValueIterator::ValueIterator( const ValueInternalArray::IteratorState &state ) ian@0: : ValueIteratorBase( state ) ian@0: { ian@0: } ian@0: ian@0: ValueIterator::ValueIterator( const ValueInternalMap::IteratorState &state ) ian@0: : ValueIteratorBase( state ) ian@0: { ian@0: } ian@0: #endif ian@0: ian@0: ValueIterator::ValueIterator( const ValueConstIterator &other ) ian@0: : ValueIteratorBase( other ) ian@0: { ian@0: } ian@0: ian@0: ValueIterator::ValueIterator( const ValueIterator &other ) ian@0: : ValueIteratorBase( other ) ian@0: { ian@0: } ian@0: ian@0: ValueIterator & ian@0: ValueIterator::operator =( const SelfType &other ) ian@0: { ian@0: copy( other ); ian@0: return *this; ian@0: } ian@0: ian@0: } // namespace Json