annotate third_party/json/json_valueiterator.inl @ 0:add35537fdbb tip

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