1// Copyright 2007-2010 Baptiste Lepilleur 2// Distributed under MIT license, or public domain if desired and 3// recognized in your jurisdiction. 4// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE 5 6// included by json_value.cpp 7 8namespace Json { 9 10// ////////////////////////////////////////////////////////////////// 11// ////////////////////////////////////////////////////////////////// 12// ////////////////////////////////////////////////////////////////// 13// class ValueIteratorBase 14// ////////////////////////////////////////////////////////////////// 15// ////////////////////////////////////////////////////////////////// 16// ////////////////////////////////////////////////////////////////// 17 18ValueIteratorBase::ValueIteratorBase() 19#ifndef JSON_VALUE_USE_INTERNAL_MAP 20 : current_() 21 , isNull_( true ) 22{ 23} 24#else 25 : isArray_( true ) 26 , isNull_( true ) 27{ 28 iterator_.array_ = ValueInternalArray::IteratorState(); 29} 30#endif 31 32 33#ifndef JSON_VALUE_USE_INTERNAL_MAP 34ValueIteratorBase::ValueIteratorBase( const Value::ObjectValues::iterator ¤t ) 35 : current_( current ) 36 , isNull_( false ) 37{ 38} 39#else 40ValueIteratorBase::ValueIteratorBase( const ValueInternalArray::IteratorState &state ) 41 : isArray_( true ) 42{ 43 iterator_.array_ = state; 44} 45 46 47ValueIteratorBase::ValueIteratorBase( const ValueInternalMap::IteratorState &state ) 48 : isArray_( false ) 49{ 50 iterator_.map_ = state; 51} 52#endif 53 54Value & 55ValueIteratorBase::deref() const 56{ 57#ifndef JSON_VALUE_USE_INTERNAL_MAP 58 return current_->second; 59#else 60 if ( isArray_ ) 61 return ValueInternalArray::dereference( iterator_.array_ ); 62 return ValueInternalMap::value( iterator_.map_ ); 63#endif 64} 65 66 67void 68ValueIteratorBase::increment() 69{ 70#ifndef JSON_VALUE_USE_INTERNAL_MAP 71 ++current_; 72#else 73 if ( isArray_ ) 74 ValueInternalArray::increment( iterator_.array_ ); 75 ValueInternalMap::increment( iterator_.map_ ); 76#endif 77} 78 79 80void 81ValueIteratorBase::decrement() 82{ 83#ifndef JSON_VALUE_USE_INTERNAL_MAP 84 --current_; 85#else 86 if ( isArray_ ) 87 ValueInternalArray::decrement( iterator_.array_ ); 88 ValueInternalMap::decrement( iterator_.map_ ); 89#endif 90} 91 92 93ValueIteratorBase::difference_type 94ValueIteratorBase::computeDistance( const SelfType &other ) const 95{ 96#ifndef JSON_VALUE_USE_INTERNAL_MAP 97# ifdef JSON_USE_CPPTL_SMALLMAP 98 return current_ - other.current_; 99# else 100 // Iterator for null value are initialized using the default 101 // constructor, which initialize current_ to the default 102 // std::map::iterator. As begin() and end() are two instance 103 // of the default std::map::iterator, they can not be compared. 104 // To allow this, we handle this comparison specifically. 105 if ( isNull_ && other.isNull_ ) 106 { 107 return 0; 108 } 109 110 111 // Usage of std::distance is not portable (does not compile with Sun Studio 12 RogueWave STL, 112 // which is the one used by default). 113 // Using a portable hand-made version for non random iterator instead: 114 // return difference_type( std::distance( current_, other.current_ ) ); 115 difference_type myDistance = 0; 116 for ( Value::ObjectValues::iterator it = current_; it != other.current_; ++it ) 117 { 118 ++myDistance; 119 } 120 return myDistance; 121# endif 122#else 123 if ( isArray_ ) 124 return ValueInternalArray::distance( iterator_.array_, other.iterator_.array_ ); 125 return ValueInternalMap::distance( iterator_.map_, other.iterator_.map_ ); 126#endif 127} 128 129 130bool 131ValueIteratorBase::isEqual( const SelfType &other ) const 132{ 133#ifndef JSON_VALUE_USE_INTERNAL_MAP 134 if ( isNull_ ) 135 { 136 return other.isNull_; 137 } 138 return current_ == other.current_; 139#else 140 if ( isArray_ ) 141 return ValueInternalArray::equals( iterator_.array_, other.iterator_.array_ ); 142 return ValueInternalMap::equals( iterator_.map_, other.iterator_.map_ ); 143#endif 144} 145 146 147void 148ValueIteratorBase::copy( const SelfType &other ) 149{ 150#ifndef JSON_VALUE_USE_INTERNAL_MAP 151 current_ = other.current_; 152#else 153 if ( isArray_ ) 154 iterator_.array_ = other.iterator_.array_; 155 iterator_.map_ = other.iterator_.map_; 156#endif 157} 158 159 160Value 161ValueIteratorBase::key() const 162{ 163#ifndef JSON_VALUE_USE_INTERNAL_MAP 164 const Value::CZString czstring = (*current_).first; 165 if ( czstring.c_str() ) 166 { 167 if ( czstring.isStaticString() ) 168 return Value( StaticString( czstring.c_str() ) ); 169 return Value( czstring.c_str() ); 170 } 171 return Value( czstring.index() ); 172#else 173 if ( isArray_ ) 174 return Value( ValueInternalArray::indexOf( iterator_.array_ ) ); 175 bool isStatic; 176 const char *memberName = ValueInternalMap::key( iterator_.map_, isStatic ); 177 if ( isStatic ) 178 return Value( StaticString( memberName ) ); 179 return Value( memberName ); 180#endif 181} 182 183 184UInt 185ValueIteratorBase::index() const 186{ 187#ifndef JSON_VALUE_USE_INTERNAL_MAP 188 const Value::CZString czstring = (*current_).first; 189 if ( !czstring.c_str() ) 190 return czstring.index(); 191 return Value::UInt( -1 ); 192#else 193 if ( isArray_ ) 194 return Value::UInt( ValueInternalArray::indexOf( iterator_.array_ ) ); 195 return Value::UInt( -1 ); 196#endif 197} 198 199 200const char * 201ValueIteratorBase::memberName() const 202{ 203#ifndef JSON_VALUE_USE_INTERNAL_MAP 204 const char *name = (*current_).first.c_str(); 205 return name ? name : ""; 206#else 207 if ( !isArray_ ) 208 return ValueInternalMap::key( iterator_.map_ ); 209 return ""; 210#endif 211} 212 213 214// ////////////////////////////////////////////////////////////////// 215// ////////////////////////////////////////////////////////////////// 216// ////////////////////////////////////////////////////////////////// 217// class ValueConstIterator 218// ////////////////////////////////////////////////////////////////// 219// ////////////////////////////////////////////////////////////////// 220// ////////////////////////////////////////////////////////////////// 221 222ValueConstIterator::ValueConstIterator() 223{ 224} 225 226 227#ifndef JSON_VALUE_USE_INTERNAL_MAP 228ValueConstIterator::ValueConstIterator( const Value::ObjectValues::iterator ¤t ) 229 : ValueIteratorBase( current ) 230{ 231} 232#else 233ValueConstIterator::ValueConstIterator( const ValueInternalArray::IteratorState &state ) 234 : ValueIteratorBase( state ) 235{ 236} 237 238ValueConstIterator::ValueConstIterator( const ValueInternalMap::IteratorState &state ) 239 : ValueIteratorBase( state ) 240{ 241} 242#endif 243 244ValueConstIterator & 245ValueConstIterator::operator =( const ValueIteratorBase &other ) 246{ 247 copy( other ); 248 return *this; 249} 250 251 252// ////////////////////////////////////////////////////////////////// 253// ////////////////////////////////////////////////////////////////// 254// ////////////////////////////////////////////////////////////////// 255// class ValueIterator 256// ////////////////////////////////////////////////////////////////// 257// ////////////////////////////////////////////////////////////////// 258// ////////////////////////////////////////////////////////////////// 259 260ValueIterator::ValueIterator() 261{ 262} 263 264 265#ifndef JSON_VALUE_USE_INTERNAL_MAP 266ValueIterator::ValueIterator( const Value::ObjectValues::iterator ¤t ) 267 : ValueIteratorBase( current ) 268{ 269} 270#else 271ValueIterator::ValueIterator( const ValueInternalArray::IteratorState &state ) 272 : ValueIteratorBase( state ) 273{ 274} 275 276ValueIterator::ValueIterator( const ValueInternalMap::IteratorState &state ) 277 : ValueIteratorBase( state ) 278{ 279} 280#endif 281 282ValueIterator::ValueIterator( const ValueConstIterator &other ) 283 : ValueIteratorBase( other ) 284{ 285} 286 287ValueIterator::ValueIterator( const ValueIterator &other ) 288 : ValueIteratorBase( other ) 289{ 290} 291 292ValueIterator & 293ValueIterator::operator =( const SelfType &other ) 294{ 295 copy( other ); 296 return *this; 297} 298 299} // namespace Json 300