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 8 namespace Json { 9 10 // ////////////////////////////////////////////////////////////////// 11 // ////////////////////////////////////////////////////////////////// 12 // ////////////////////////////////////////////////////////////////// 13 // class ValueIteratorBase 14 // ////////////////////////////////////////////////////////////////// 15 // ////////////////////////////////////////////////////////////////// 16 // ////////////////////////////////////////////////////////////////// 17 18 ValueIteratorBase::ValueIteratorBase() 19 #ifndef JSON_VALUE_USE_INTERNAL_MAP 20 : current_(), isNull_(true) { 21 } 22 #else 23 : isArray_(true), isNull_(true) { 24 iterator_.array_ = ValueInternalArray::IteratorState(); 25 } 26 #endif 27 28 #ifndef JSON_VALUE_USE_INTERNAL_MAP 29 ValueIteratorBase::ValueIteratorBase( 30 const Value::ObjectValues::iterator& current) 31 : current_(current), isNull_(false) {} 32 #else 33 ValueIteratorBase::ValueIteratorBase( 34 const ValueInternalArray::IteratorState& state) 35 : isArray_(true) { 36 iterator_.array_ = state; 37 } 38 39 ValueIteratorBase::ValueIteratorBase( 40 const ValueInternalMap::IteratorState& state) 41 : isArray_(false) { 42 iterator_.map_ = state; 43 } 44 #endif 45 46 Value& ValueIteratorBase::deref() const { 47 #ifndef JSON_VALUE_USE_INTERNAL_MAP 48 return current_->second; 49 #else 50 if (isArray_) 51 return ValueInternalArray::dereference(iterator_.array_); 52 return ValueInternalMap::value(iterator_.map_); 53 #endif 54 } 55 56 void ValueIteratorBase::increment() { 57 #ifndef JSON_VALUE_USE_INTERNAL_MAP 58 ++current_; 59 #else 60 if (isArray_) 61 ValueInternalArray::increment(iterator_.array_); 62 ValueInternalMap::increment(iterator_.map_); 63 #endif 64 } 65 66 void ValueIteratorBase::decrement() { 67 #ifndef JSON_VALUE_USE_INTERNAL_MAP 68 --current_; 69 #else 70 if (isArray_) 71 ValueInternalArray::decrement(iterator_.array_); 72 ValueInternalMap::decrement(iterator_.map_); 73 #endif 74 } 75 76 ValueIteratorBase::difference_type 77 ValueIteratorBase::computeDistance(const SelfType& other) const { 78 #ifndef JSON_VALUE_USE_INTERNAL_MAP 79 #ifdef JSON_USE_CPPTL_SMALLMAP 80 return current_ - other.current_; 81 #else 82 // Iterator for null value are initialized using the default 83 // constructor, which initialize current_ to the default 84 // std::map::iterator. As begin() and end() are two instance 85 // of the default std::map::iterator, they can not be compared. 86 // To allow this, we handle this comparison specifically. 87 if (isNull_ && other.isNull_) { 88 return 0; 89 } 90 91 // Usage of std::distance is not portable (does not compile with Sun Studio 12 92 // RogueWave STL, 93 // which is the one used by default). 94 // Using a portable hand-made version for non random iterator instead: 95 // return difference_type( std::distance( current_, other.current_ ) ); 96 difference_type myDistance = 0; 97 for (Value::ObjectValues::iterator it = current_; it != other.current_; 98 ++it) { 99 ++myDistance; 100 } 101 return myDistance; 102 #endif 103 #else 104 if (isArray_) 105 return ValueInternalArray::distance(iterator_.array_, 106 other.iterator_.array_); 107 return ValueInternalMap::distance(iterator_.map_, other.iterator_.map_); 108 #endif 109 } 110 111 bool ValueIteratorBase::isEqual(const SelfType& other) const { 112 #ifndef JSON_VALUE_USE_INTERNAL_MAP 113 if (isNull_) { 114 return other.isNull_; 115 } 116 return current_ == other.current_; 117 #else 118 if (isArray_) 119 return ValueInternalArray::equals(iterator_.array_, other.iterator_.array_); 120 return ValueInternalMap::equals(iterator_.map_, other.iterator_.map_); 121 #endif 122 } 123 124 void ValueIteratorBase::copy(const SelfType& other) { 125 #ifndef JSON_VALUE_USE_INTERNAL_MAP 126 current_ = other.current_; 127 isNull_ = other.isNull_; 128 #else 129 if (isArray_) 130 iterator_.array_ = other.iterator_.array_; 131 iterator_.map_ = other.iterator_.map_; 132 #endif 133 } 134 135 Value ValueIteratorBase::key() const { 136 #ifndef JSON_VALUE_USE_INTERNAL_MAP 137 const Value::CZString czstring = (*current_).first; 138 if (czstring.c_str()) { 139 if (czstring.isStaticString()) 140 return Value(StaticString(czstring.c_str())); 141 return Value(czstring.c_str()); 142 } 143 return Value(czstring.index()); 144 #else 145 if (isArray_) 146 return Value(ValueInternalArray::indexOf(iterator_.array_)); 147 bool isStatic; 148 const char* memberName = ValueInternalMap::key(iterator_.map_, isStatic); 149 if (isStatic) 150 return Value(StaticString(memberName)); 151 return Value(memberName); 152 #endif 153 } 154 155 UInt ValueIteratorBase::index() const { 156 #ifndef JSON_VALUE_USE_INTERNAL_MAP 157 const Value::CZString czstring = (*current_).first; 158 if (!czstring.c_str()) 159 return czstring.index(); 160 return Value::UInt(-1); 161 #else 162 if (isArray_) 163 return Value::UInt(ValueInternalArray::indexOf(iterator_.array_)); 164 return Value::UInt(-1); 165 #endif 166 } 167 168 const char* ValueIteratorBase::memberName() const { 169 #ifndef JSON_VALUE_USE_INTERNAL_MAP 170 const char* name = (*current_).first.c_str(); 171 return name ? name : ""; 172 #else 173 if (!isArray_) 174 return ValueInternalMap::key(iterator_.map_); 175 return ""; 176 #endif 177 } 178 179 // ////////////////////////////////////////////////////////////////// 180 // ////////////////////////////////////////////////////////////////// 181 // ////////////////////////////////////////////////////////////////// 182 // class ValueConstIterator 183 // ////////////////////////////////////////////////////////////////// 184 // ////////////////////////////////////////////////////////////////// 185 // ////////////////////////////////////////////////////////////////// 186 187 ValueConstIterator::ValueConstIterator() {} 188 189 #ifndef JSON_VALUE_USE_INTERNAL_MAP 190 ValueConstIterator::ValueConstIterator( 191 const Value::ObjectValues::iterator& current) 192 : ValueIteratorBase(current) {} 193 #else 194 ValueConstIterator::ValueConstIterator( 195 const ValueInternalArray::IteratorState& state) 196 : ValueIteratorBase(state) {} 197 198 ValueConstIterator::ValueConstIterator( 199 const ValueInternalMap::IteratorState& state) 200 : ValueIteratorBase(state) {} 201 #endif 202 203 ValueConstIterator& ValueConstIterator:: 204 operator=(const ValueIteratorBase& other) { 205 copy(other); 206 return *this; 207 } 208 209 // ////////////////////////////////////////////////////////////////// 210 // ////////////////////////////////////////////////////////////////// 211 // ////////////////////////////////////////////////////////////////// 212 // class ValueIterator 213 // ////////////////////////////////////////////////////////////////// 214 // ////////////////////////////////////////////////////////////////// 215 // ////////////////////////////////////////////////////////////////// 216 217 ValueIterator::ValueIterator() {} 218 219 #ifndef JSON_VALUE_USE_INTERNAL_MAP 220 ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current) 221 : ValueIteratorBase(current) {} 222 #else 223 ValueIterator::ValueIterator(const ValueInternalArray::IteratorState& state) 224 : ValueIteratorBase(state) {} 225 226 ValueIterator::ValueIterator(const ValueInternalMap::IteratorState& state) 227 : ValueIteratorBase(state) {} 228 #endif 229 230 ValueIterator::ValueIterator(const ValueConstIterator& other) 231 : ValueIteratorBase(other) {} 232 233 ValueIterator::ValueIterator(const ValueIterator& other) 234 : ValueIteratorBase(other) {} 235 236 ValueIterator& ValueIterator::operator=(const SelfType& other) { 237 copy(other); 238 return *this; 239 } 240 241 } // namespace Json 242