mirror of
				https://github.com/hyperion-project/hyperion.ng.git
				synced 2025-03-01 10:33:28 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			300 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			300 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // 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_;
 | |
| #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
 |