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 ¤t )
|
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 ¤t )
|
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 ¤t )
|
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
|