Line data Source code
1 : /// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/).
2 : /// It is intented to be used with #include <json/json.h>
3 :
4 : // //////////////////////////////////////////////////////////////////////
5 : // Beginning of content of file: LICENSE
6 : // //////////////////////////////////////////////////////////////////////
7 :
8 : /*
9 : The JsonCpp library's source code, including accompanying documentation,
10 : tests and demonstration applications, are licensed under the following
11 : conditions...
12 :
13 : The author (Baptiste Lepilleur) explicitly disclaims copyright in all
14 : jurisdictions which recognize such a disclaimer. In such jurisdictions,
15 : this software is released into the Public Domain.
16 :
17 : In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
18 : 2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is
19 : released under the terms of the MIT License (see below).
20 :
21 : In jurisdictions which recognize Public Domain property, the user of this
22 : software may choose to accept it either as 1) Public Domain, 2) under the
23 : conditions of the MIT License (see below), or 3) under the terms of dual
24 : Public Domain/MIT License conditions described here, as they choose.
25 :
26 : The MIT License is about as close to Public Domain as a license can get, and is
27 : described in clear, concise terms at:
28 :
29 : http://en.wikipedia.org/wiki/MIT_License
30 :
31 : The full text of the MIT License follows:
32 :
33 : ========================================================================
34 : Copyright (c) 2007-2010 Baptiste Lepilleur
35 :
36 : Permission is hereby granted, free of charge, to any person
37 : obtaining a copy of this software and associated documentation
38 : files (the "Software"), to deal in the Software without
39 : restriction, including without limitation the rights to use, copy,
40 : modify, merge, publish, distribute, sublicense, and/or sell copies
41 : of the Software, and to permit persons to whom the Software is
42 : furnished to do so, subject to the following conditions:
43 :
44 : The above copyright notice and this permission notice shall be
45 : included in all copies or substantial portions of the Software.
46 :
47 : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
48 : EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
49 : MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
50 : NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
51 : BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
52 : ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
53 : CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
54 : SOFTWARE.
55 : ========================================================================
56 : (END LICENSE TEXT)
57 :
58 : The MIT license is compatible with both the GPL and commercial
59 : software, affording one all of the rights of Public Domain with the
60 : minor nuisance of being required to keep the above copyright notice
61 : and license text in the source code. Note also that by accepting the
62 : Public Domain "license" you can re-license your copy using whatever
63 : license you like.
64 :
65 : */
66 :
67 : // //////////////////////////////////////////////////////////////////////
68 : // End of content of file: LICENSE
69 : // //////////////////////////////////////////////////////////////////////
70 :
71 :
72 :
73 :
74 :
75 : #ifndef JSON_AMALGATED_H_INCLUDED
76 : # define JSON_AMALGATED_H_INCLUDED
77 : /// If defined, indicates that the source file is amalgated
78 : /// to prevent private header inclusion.
79 : #define JSON_IS_AMALGAMATION
80 :
81 : // //////////////////////////////////////////////////////////////////////
82 : // Beginning of content of file: include/json/config.h
83 : // //////////////////////////////////////////////////////////////////////
84 :
85 : // Copyright 2007-2010 Baptiste Lepilleur
86 : // Distributed under MIT license, or public domain if desired and
87 : // recognized in your jurisdiction.
88 : // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
89 :
90 : #ifndef JSON_CONFIG_H_INCLUDED
91 : # define JSON_CONFIG_H_INCLUDED
92 :
93 : /// If defined, indicates that json library is embedded in CppTL library.
94 : //# define JSON_IN_CPPTL 1
95 :
96 : /// If defined, indicates that json may leverage CppTL library
97 : //# define JSON_USE_CPPTL 1
98 : /// If defined, indicates that cpptl vector based map should be used instead of std::map
99 : /// as Value container.
100 : //# define JSON_USE_CPPTL_SMALLMAP 1
101 : /// If defined, indicates that Json specific container should be used
102 : /// (hash table & simple deque container with customizable allocator).
103 : /// THIS FEATURE IS STILL EXPERIMENTAL! There is know bugs: See #3177332
104 : //# define JSON_VALUE_USE_INTERNAL_MAP 1
105 : /// Force usage of standard new/malloc based allocator instead of memory pool based allocator.
106 : /// The memory pools allocator used optimization (initializing Value and ValueInternalLink
107 : /// as if it was a POD) that may cause some validation tool to report errors.
108 : /// Only has effects if JSON_VALUE_USE_INTERNAL_MAP is defined.
109 : //# define JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 1
110 :
111 : // If non-zero, the library uses exceptions to report bad input instead of C
112 : // assertion macros. The default is to use exceptions.
113 : # ifndef JSON_USE_EXCEPTION
114 : # define JSON_USE_EXCEPTION 1
115 : # endif
116 :
117 : /// If defined, indicates that the source file is amalgated
118 : /// to prevent private header inclusion.
119 : /// Remarks: it is automatically defined in the generated amalgated header.
120 : // #define JSON_IS_AMALGAMATION
121 :
122 :
123 : # ifdef JSON_IN_CPPTL
124 : # include <cpptl/config.h>
125 : # ifndef JSON_USE_CPPTL
126 : # define JSON_USE_CPPTL 1
127 : # endif
128 : # endif
129 :
130 : # ifdef JSON_IN_CPPTL
131 : # define JSON_API CPPTL_API
132 : # elif defined(JSON_DLL_BUILD)
133 : # define JSON_API __declspec(dllexport)
134 : # elif defined(JSON_DLL)
135 : # define JSON_API __declspec(dllimport)
136 : # else
137 : # define JSON_API
138 : # endif
139 :
140 : // If JSON_NO_INT64 is defined, then Json only support C++ "int" type for integer
141 : // Storages, and 64 bits integer support is disabled.
142 : // #define JSON_NO_INT64 1
143 :
144 : #if defined(_MSC_VER) && _MSC_VER <= 1200 // MSVC 6
145 : // Microsoft Visual Studio 6 only support conversion from __int64 to double
146 : // (no conversion from unsigned __int64).
147 : #define JSON_USE_INT64_DOUBLE_CONVERSION 1
148 : #endif // if defined(_MSC_VER) && _MSC_VER < 1200 // MSVC 6
149 :
150 : #if defined(_MSC_VER) && _MSC_VER >= 1500 // MSVC 2008
151 : /// Indicates that the following function is deprecated.
152 : # define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
153 : #endif
154 :
155 : #if !defined(JSONCPP_DEPRECATED)
156 : # define JSONCPP_DEPRECATED(message)
157 : #endif // if !defined(JSONCPP_DEPRECATED)
158 :
159 : namespace Json {
160 : typedef int Int;
161 : typedef unsigned int UInt;
162 : # if defined(JSON_NO_INT64)
163 : typedef int LargestInt;
164 : typedef unsigned int LargestUInt;
165 : # undef JSON_HAS_INT64
166 : # else // if defined(JSON_NO_INT64)
167 : // For Microsoft Visual use specific types as long long is not supported
168 : # if defined(_MSC_VER) // Microsoft Visual Studio
169 : typedef __int64 Int64;
170 : typedef unsigned __int64 UInt64;
171 : # else // if defined(_MSC_VER) // Other platforms, use long long
172 : typedef long long int Int64;
173 : typedef unsigned long long int UInt64;
174 : # endif // if defined(_MSC_VER)
175 : typedef Int64 LargestInt;
176 : typedef UInt64 LargestUInt;
177 : # define JSON_HAS_INT64
178 : # endif // if defined(JSON_NO_INT64)
179 : } // end namespace Json
180 :
181 :
182 : #endif // JSON_CONFIG_H_INCLUDED
183 :
184 : // //////////////////////////////////////////////////////////////////////
185 : // End of content of file: include/json/config.h
186 : // //////////////////////////////////////////////////////////////////////
187 :
188 :
189 :
190 :
191 :
192 :
193 : // //////////////////////////////////////////////////////////////////////
194 : // Beginning of content of file: include/json/forwards.h
195 : // //////////////////////////////////////////////////////////////////////
196 :
197 : // Copyright 2007-2010 Baptiste Lepilleur
198 : // Distributed under MIT license, or public domain if desired and
199 : // recognized in your jurisdiction.
200 : // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
201 :
202 : #ifndef JSON_FORWARDS_H_INCLUDED
203 : # define JSON_FORWARDS_H_INCLUDED
204 :
205 : #if !defined(JSON_IS_AMALGAMATION)
206 : # include "config.h"
207 : #endif // if !defined(JSON_IS_AMALGAMATION)
208 :
209 : namespace Json {
210 :
211 : // writer.h
212 : class FastWriter;
213 : class StyledWriter;
214 :
215 : // reader.h
216 : class Reader;
217 :
218 : // features.h
219 : class Features;
220 :
221 : // value.h
222 : typedef unsigned int ArrayIndex;
223 : class StaticString;
224 : class Path;
225 : class PathArgument;
226 : class Value;
227 : class ValueIteratorBase;
228 : class ValueIterator;
229 : class ValueConstIterator;
230 : #ifdef JSON_VALUE_USE_INTERNAL_MAP
231 : class ValueMapAllocator;
232 : class ValueInternalLink;
233 : class ValueInternalArray;
234 : class ValueInternalMap;
235 : #endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP
236 :
237 : } // namespace Json
238 :
239 :
240 : #endif // JSON_FORWARDS_H_INCLUDED
241 :
242 : // //////////////////////////////////////////////////////////////////////
243 : // End of content of file: include/json/forwards.h
244 : // //////////////////////////////////////////////////////////////////////
245 :
246 :
247 :
248 :
249 :
250 :
251 : // //////////////////////////////////////////////////////////////////////
252 : // Beginning of content of file: include/json/features.h
253 : // //////////////////////////////////////////////////////////////////////
254 :
255 : // Copyright 2007-2010 Baptiste Lepilleur
256 : // Distributed under MIT license, or public domain if desired and
257 : // recognized in your jurisdiction.
258 : // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
259 :
260 : #ifndef CPPTL_JSON_FEATURES_H_INCLUDED
261 : # define CPPTL_JSON_FEATURES_H_INCLUDED
262 :
263 : #if !defined(JSON_IS_AMALGAMATION)
264 : # include "forwards.h"
265 : #endif // if !defined(JSON_IS_AMALGAMATION)
266 :
267 : namespace Json {
268 :
269 : /** \brief Configuration passed to reader and writer.
270 : * This configuration object can be used to force the Reader or Writer
271 : * to behave in a standard conforming way.
272 : */
273 : class JSON_API Features
274 : {
275 : public:
276 : /** \brief A configuration that allows all features and assumes all strings are UTF-8.
277 : * - C & C++ comments are allowed
278 : * - Root object can be any JSON value
279 : * - Assumes Value strings are encoded in UTF-8
280 : */
281 : static Features all();
282 :
283 : /** \brief A configuration that is strictly compatible with the JSON specification.
284 : * - Comments are forbidden.
285 : * - Root object must be either an array or an object value.
286 : * - Assumes Value strings are encoded in UTF-8
287 : */
288 : static Features strictMode();
289 :
290 : /** \brief Initialize the configuration like JsonConfig::allFeatures;
291 : */
292 : Features();
293 :
294 : /// \c true if comments are allowed. Default: \c true.
295 : bool allowComments_;
296 :
297 : /// \c true if root must be either an array or an object value. Default: \c false.
298 : bool strictRoot_;
299 : };
300 :
301 : } // namespace Json
302 :
303 : #endif // CPPTL_JSON_FEATURES_H_INCLUDED
304 :
305 : // //////////////////////////////////////////////////////////////////////
306 : // End of content of file: include/json/features.h
307 : // //////////////////////////////////////////////////////////////////////
308 :
309 :
310 :
311 :
312 :
313 :
314 : // //////////////////////////////////////////////////////////////////////
315 : // Beginning of content of file: include/json/value.h
316 : // //////////////////////////////////////////////////////////////////////
317 :
318 : // Copyright 2007-2010 Baptiste Lepilleur
319 : // Distributed under MIT license, or public domain if desired and
320 : // recognized in your jurisdiction.
321 : // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
322 :
323 : #ifndef CPPTL_JSON_H_INCLUDED
324 : # define CPPTL_JSON_H_INCLUDED
325 :
326 : #if !defined(JSON_IS_AMALGAMATION)
327 : # include "forwards.h"
328 : #endif // if !defined(JSON_IS_AMALGAMATION)
329 : # include <string>
330 : # include <vector>
331 :
332 : # ifndef JSON_USE_CPPTL_SMALLMAP
333 : # include <map>
334 : # else
335 : # include <cpptl/smallmap.h>
336 : # endif
337 : # ifdef JSON_USE_CPPTL
338 : # include <cpptl/forwards.h>
339 : # endif
340 :
341 : /** \brief JSON (JavaScript Object Notation).
342 : */
343 : namespace Json {
344 :
345 : /** \brief Type of the value held by a Value object.
346 : */
347 : enum ValueType
348 : {
349 : nullValue = 0, ///< 'null' value
350 : intValue, ///< signed integer value
351 : uintValue, ///< unsigned integer value
352 : realValue, ///< double value
353 : stringValue, ///< UTF-8 string value
354 : booleanValue, ///< bool value
355 : arrayValue, ///< array value (ordered list)
356 : objectValue ///< object value (collection of name/value pairs).
357 : };
358 :
359 : enum CommentPlacement
360 : {
361 : commentBefore = 0, ///< a comment placed on the line before a value
362 : commentAfterOnSameLine, ///< a comment just after a value on the same line
363 : commentAfter, ///< a comment on the line after a value (only make sense for root value)
364 : numberOfCommentPlacement
365 : };
366 :
367 : //# ifdef JSON_USE_CPPTL
368 : // typedef CppTL::AnyEnumerator<const char *> EnumMemberNames;
369 : // typedef CppTL::AnyEnumerator<const Value &> EnumValues;
370 : //# endif
371 :
372 : /** \brief Lightweight wrapper to tag static string.
373 : *
374 : * Value constructor and objectValue member assignement takes advantage of the
375 : * StaticString and avoid the cost of string duplication when storing the
376 : * string or the member name.
377 : *
378 : * Example of usage:
379 : * \code
380 : * Json::Value aValue( StaticString("some text") );
381 : * Json::Value object;
382 : * static const StaticString code("code");
383 : * object[code] = 1234;
384 : * \endcode
385 : */
386 : class JSON_API StaticString
387 : {
388 : public:
389 : explicit StaticString( const char *czstring )
390 : : str_( czstring )
391 : {
392 : }
393 :
394 : operator const char *() const
395 : {
396 : return str_;
397 : }
398 :
399 : const char *c_str() const
400 : {
401 : return str_;
402 : }
403 :
404 : private:
405 : const char *str_;
406 : };
407 :
408 : /** \brief Represents a <a HREF="http://www.json.org">JSON</a> value.
409 : *
410 : * This class is a discriminated union wrapper that can represents a:
411 : * - signed integer [range: Value::minInt - Value::maxInt]
412 : * - unsigned integer (range: 0 - Value::maxUInt)
413 : * - double
414 : * - UTF-8 string
415 : * - boolean
416 : * - 'null'
417 : * - an ordered list of Value
418 : * - collection of name/value pairs (javascript object)
419 : *
420 : * The type of the held value is represented by a #ValueType and
421 : * can be obtained using type().
422 : *
423 : * values of an #objectValue or #arrayValue can be accessed using operator[]() methods.
424 : * Non const methods will automatically create the a #nullValue element
425 : * if it does not exist.
426 : * The sequence of an #arrayValue will be automatically resize and initialized
427 : * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue.
428 : *
429 : * The get() methods can be used to obtanis default value in the case the required element
430 : * does not exist.
431 : *
432 : * It is possible to iterate over the list of a #objectValue values using
433 : * the getMemberNames() method.
434 : */
435 : class JSON_API Value
436 : {
437 : friend class ValueIteratorBase;
438 : # ifdef JSON_VALUE_USE_INTERNAL_MAP
439 : friend class ValueInternalLink;
440 : friend class ValueInternalMap;
441 : # endif
442 : public:
443 : typedef std::vector<std::string> Members;
444 : typedef ValueIterator iterator;
445 : typedef ValueConstIterator const_iterator;
446 : typedef Json::UInt UInt;
447 : typedef Json::Int Int;
448 : # if defined(JSON_HAS_INT64)
449 : typedef Json::UInt64 UInt64;
450 : typedef Json::Int64 Int64;
451 : #endif // defined(JSON_HAS_INT64)
452 : typedef Json::LargestInt LargestInt;
453 : typedef Json::LargestUInt LargestUInt;
454 : typedef Json::ArrayIndex ArrayIndex;
455 :
456 : static const Value null;
457 : /// Minimum signed integer value that can be stored in a Json::Value.
458 : static const LargestInt minLargestInt;
459 : /// Maximum signed integer value that can be stored in a Json::Value.
460 : static const LargestInt maxLargestInt;
461 : /// Maximum unsigned integer value that can be stored in a Json::Value.
462 : static const LargestUInt maxLargestUInt;
463 :
464 : /// Minimum signed int value that can be stored in a Json::Value.
465 : static const Int minInt;
466 : /// Maximum signed int value that can be stored in a Json::Value.
467 : static const Int maxInt;
468 : /// Maximum unsigned int value that can be stored in a Json::Value.
469 : static const UInt maxUInt;
470 :
471 : # if defined(JSON_HAS_INT64)
472 : /// Minimum signed 64 bits int value that can be stored in a Json::Value.
473 : static const Int64 minInt64;
474 : /// Maximum signed 64 bits int value that can be stored in a Json::Value.
475 : static const Int64 maxInt64;
476 : /// Maximum unsigned 64 bits int value that can be stored in a Json::Value.
477 : static const UInt64 maxUInt64;
478 : #endif // defined(JSON_HAS_INT64)
479 :
480 : private:
481 : #ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
482 : # ifndef JSON_VALUE_USE_INTERNAL_MAP
483 : class CZString
484 : {
485 : public:
486 : enum DuplicationPolicy
487 : {
488 : noDuplication = 0,
489 : duplicate,
490 : duplicateOnCopy
491 : };
492 : CZString( ArrayIndex index );
493 : CZString( const char *cstr, DuplicationPolicy allocate );
494 : CZString( const CZString &other );
495 : ~CZString();
496 : CZString &operator =( const CZString &other );
497 : bool operator<( const CZString &other ) const;
498 : bool operator==( const CZString &other ) const;
499 : ArrayIndex index() const;
500 : const char *c_str() const;
501 : bool isStaticString() const;
502 : private:
503 : void swap( CZString &other );
504 : const char *cstr_;
505 : ArrayIndex index_;
506 : };
507 :
508 : public:
509 : # ifndef JSON_USE_CPPTL_SMALLMAP
510 : typedef std::map<CZString, Value> ObjectValues;
511 : # else
512 : typedef CppTL::SmallMap<CZString, Value> ObjectValues;
513 : # endif // ifndef JSON_USE_CPPTL_SMALLMAP
514 : # endif // ifndef JSON_VALUE_USE_INTERNAL_MAP
515 : #endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
516 :
517 : public:
518 : /** \brief Create a default Value of the given type.
519 :
520 : This is a very useful constructor.
521 : To create an empty array, pass arrayValue.
522 : To create an empty object, pass objectValue.
523 : Another Value can then be set to this one by assignment.
524 : This is useful since clear() and resize() will not alter types.
525 :
526 : Examples:
527 : \code
528 : Json::Value null_value; // null
529 : Json::Value arr_value(Json::arrayValue); // []
530 : Json::Value obj_value(Json::objectValue); // {}
531 : \endcode
532 : */
533 : Value( ValueType type = nullValue );
534 : Value( Int value );
535 : Value( UInt value );
536 : #if defined(JSON_HAS_INT64)
537 : Value( Int64 value );
538 : Value( UInt64 value );
539 : #endif // if defined(JSON_HAS_INT64)
540 : Value( double value );
541 : Value( const char *value );
542 : Value( const char *beginValue, const char *endValue );
543 : /** \brief Constructs a value from a static string.
544 :
545 : * Like other value string constructor but do not duplicate the string for
546 : * internal storage. The given string must remain alive after the call to this
547 : * constructor.
548 : * Example of usage:
549 : * \code
550 : * Json::Value aValue( StaticString("some text") );
551 : * \endcode
552 : */
553 : Value( const StaticString &value );
554 : Value( const std::string &value );
555 : # ifdef JSON_USE_CPPTL
556 : Value( const CppTL::ConstString &value );
557 : # endif
558 : Value( bool value );
559 : Value( const Value &other );
560 : ~Value();
561 :
562 : Value &operator=( const Value &other );
563 : /// Swap values.
564 : /// \note Currently, comments are intentionally not swapped, for
565 : /// both logic and efficiency.
566 : void swap( Value &other );
567 :
568 : ValueType type() const;
569 :
570 : bool operator <( const Value &other ) const;
571 : bool operator <=( const Value &other ) const;
572 : bool operator >=( const Value &other ) const;
573 : bool operator >( const Value &other ) const;
574 :
575 : bool operator ==( const Value &other ) const;
576 : bool operator !=( const Value &other ) const;
577 :
578 : int compare( const Value &other ) const;
579 :
580 : const char *asCString() const;
581 : std::string asString() const;
582 : # ifdef JSON_USE_CPPTL
583 : CppTL::ConstString asConstString() const;
584 : # endif
585 : Int asInt() const;
586 : UInt asUInt() const;
587 : #if defined(JSON_HAS_INT64)
588 : Int64 asInt64() const;
589 : UInt64 asUInt64() const;
590 : #endif // if defined(JSON_HAS_INT64)
591 : LargestInt asLargestInt() const;
592 : LargestUInt asLargestUInt() const;
593 : float asFloat() const;
594 : double asDouble() const;
595 : bool asBool() const;
596 :
597 : bool isNull() const;
598 : bool isBool() const;
599 : bool isInt() const;
600 : bool isInt64() const;
601 : bool isUInt() const;
602 : bool isUInt64() const;
603 : bool isIntegral() const;
604 : bool isDouble() const;
605 : bool isNumeric() const;
606 : bool isString() const;
607 : bool isArray() const;
608 : bool isObject() const;
609 :
610 : bool isConvertibleTo( ValueType other ) const;
611 :
612 : /// Number of values in array or object
613 : ArrayIndex size() const;
614 :
615 : /// \brief Return true if empty array, empty object, or null;
616 : /// otherwise, false.
617 : bool empty() const;
618 :
619 : /// Return isNull()
620 : bool operator!() const;
621 :
622 : /// Remove all object members and array elements.
623 : /// \pre type() is arrayValue, objectValue, or nullValue
624 : /// \post type() is unchanged
625 : void clear();
626 :
627 : /// Resize the array to size elements.
628 : /// New elements are initialized to null.
629 : /// May only be called on nullValue or arrayValue.
630 : /// \pre type() is arrayValue or nullValue
631 : /// \post type() is arrayValue
632 : void resize( ArrayIndex size );
633 :
634 : /// Access an array element (zero based index ).
635 : /// If the array contains less than index element, then null value are inserted
636 : /// in the array so that its size is index+1.
637 : /// (You may need to say 'value[0u]' to get your compiler to distinguish
638 : /// this from the operator[] which takes a string.)
639 : Value &operator[]( ArrayIndex index );
640 :
641 : /// Access an array element (zero based index ).
642 : /// If the array contains less than index element, then null value are inserted
643 : /// in the array so that its size is index+1.
644 : /// (You may need to say 'value[0u]' to get your compiler to distinguish
645 : /// this from the operator[] which takes a string.)
646 : Value &operator[]( int index );
647 :
648 : /// Access an array element (zero based index )
649 : /// (You may need to say 'value[0u]' to get your compiler to distinguish
650 : /// this from the operator[] which takes a string.)
651 : const Value &operator[]( ArrayIndex index ) const;
652 :
653 : /// Access an array element (zero based index )
654 : /// (You may need to say 'value[0u]' to get your compiler to distinguish
655 : /// this from the operator[] which takes a string.)
656 : const Value &operator[]( int index ) const;
657 :
658 : /// If the array contains at least index+1 elements, returns the element value,
659 : /// otherwise returns defaultValue.
660 : Value get( ArrayIndex index,
661 : const Value &defaultValue ) const;
662 : /// Return true if index < size().
663 : bool isValidIndex( ArrayIndex index ) const;
664 : /// \brief Append value to array at the end.
665 : ///
666 : /// Equivalent to jsonvalue[jsonvalue.size()] = value;
667 : Value &append( const Value &value );
668 :
669 : /// Access an object value by name, create a null member if it does not exist.
670 : Value &operator[]( const char *key );
671 : /// Access an object value by name, returns null if there is no member with that name.
672 : const Value &operator[]( const char *key ) const;
673 : /// Access an object value by name, create a null member if it does not exist.
674 : Value &operator[]( const std::string &key );
675 : /// Access an object value by name, returns null if there is no member with that name.
676 : const Value &operator[]( const std::string &key ) const;
677 : /** \brief Access an object value by name, create a null member if it does not exist.
678 :
679 : * If the object as no entry for that name, then the member name used to store
680 : * the new entry is not duplicated.
681 : * Example of use:
682 : * \code
683 : * Json::Value object;
684 : * static const StaticString code("code");
685 : * object[code] = 1234;
686 : * \endcode
687 : */
688 : Value &operator[]( const StaticString &key );
689 : # ifdef JSON_USE_CPPTL
690 : /// Access an object value by name, create a null member if it does not exist.
691 : Value &operator[]( const CppTL::ConstString &key );
692 : /// Access an object value by name, returns null if there is no member with that name.
693 : const Value &operator[]( const CppTL::ConstString &key ) const;
694 : # endif
695 : /// Return the member named key if it exist, defaultValue otherwise.
696 : Value get( const char *key,
697 : const Value &defaultValue ) const;
698 : /// Return the member named key if it exist, defaultValue otherwise.
699 : Value get( const std::string &key,
700 : const Value &defaultValue ) const;
701 : # ifdef JSON_USE_CPPTL
702 : /// Return the member named key if it exist, defaultValue otherwise.
703 : Value get( const CppTL::ConstString &key,
704 : const Value &defaultValue ) const;
705 : # endif
706 : /// \brief Remove and return the named member.
707 : ///
708 : /// Do nothing if it did not exist.
709 : /// \return the removed Value, or null.
710 : /// \pre type() is objectValue or nullValue
711 : /// \post type() is unchanged
712 : Value removeMember( const char* key );
713 : /// Same as removeMember(const char*)
714 : Value removeMember( const std::string &key );
715 :
716 : /// Return true if the object has a member named key.
717 : bool isMember( const char *key ) const;
718 : /// Return true if the object has a member named key.
719 : bool isMember( const std::string &key ) const;
720 : # ifdef JSON_USE_CPPTL
721 : /// Return true if the object has a member named key.
722 : bool isMember( const CppTL::ConstString &key ) const;
723 : # endif
724 :
725 : /// \brief Return a list of the member names.
726 : ///
727 : /// If null, return an empty list.
728 : /// \pre type() is objectValue or nullValue
729 : /// \post if type() was nullValue, it remains nullValue
730 : Members getMemberNames() const;
731 :
732 : //# ifdef JSON_USE_CPPTL
733 : // EnumMemberNames enumMemberNames() const;
734 : // EnumValues enumValues() const;
735 : //# endif
736 :
737 : /// Comments must be //... or /* ... */
738 : void setComment( const char *comment,
739 : CommentPlacement placement );
740 : /// Comments must be //... or /* ... */
741 : void setComment( const std::string &comment,
742 : CommentPlacement placement );
743 : bool hasComment( CommentPlacement placement ) const;
744 : /// Include delimiters and embedded newlines.
745 : std::string getComment( CommentPlacement placement ) const;
746 :
747 : std::string toStyledString() const;
748 :
749 : const_iterator begin() const;
750 : const_iterator end() const;
751 :
752 : iterator begin();
753 : iterator end();
754 :
755 : private:
756 : Value &resolveReference( const char *key,
757 : bool isStatic );
758 :
759 : # ifdef JSON_VALUE_USE_INTERNAL_MAP
760 : inline bool isItemAvailable() const
761 : {
762 : return itemIsUsed_ == 0;
763 : }
764 :
765 : inline void setItemUsed( bool isUsed = true )
766 : {
767 : itemIsUsed_ = isUsed ? 1 : 0;
768 : }
769 :
770 : inline bool isMemberNameStatic() const
771 : {
772 : return memberNameIsStatic_ == 0;
773 : }
774 :
775 : inline void setMemberNameIsStatic( bool isStatic )
776 : {
777 : memberNameIsStatic_ = isStatic ? 1 : 0;
778 : }
779 : # endif // # ifdef JSON_VALUE_USE_INTERNAL_MAP
780 :
781 : private:
782 : struct CommentInfo
783 : {
784 : CommentInfo();
785 : ~CommentInfo();
786 :
787 : void setComment( const char *text );
788 :
789 : char *comment_;
790 : };
791 :
792 : //struct MemberNamesTransform
793 : //{
794 : // typedef const char *result_type;
795 : // const char *operator()( const CZString &name ) const
796 : // {
797 : // return name.c_str();
798 : // }
799 : //};
800 :
801 : union ValueHolder
802 : {
803 : LargestInt int_;
804 : LargestUInt uint_;
805 : double real_;
806 : bool bool_;
807 : char *string_;
808 : # ifdef JSON_VALUE_USE_INTERNAL_MAP
809 : ValueInternalArray *array_;
810 : ValueInternalMap *map_;
811 : #else
812 : ObjectValues *map_;
813 : # endif
814 : } value_;
815 : ValueType type_ : 8;
816 : int allocated_ : 1; // Notes: if declared as bool, bitfield is useless.
817 : # ifdef JSON_VALUE_USE_INTERNAL_MAP
818 : unsigned int itemIsUsed_ : 1; // used by the ValueInternalMap container.
819 : int memberNameIsStatic_ : 1; // used by the ValueInternalMap container.
820 : # endif
821 : CommentInfo *comments_;
822 : };
823 :
824 :
825 : /** \brief Experimental and untested: represents an element of the "path" to access a node.
826 : */
827 : class PathArgument
828 : {
829 : public:
830 : friend class Path;
831 :
832 : PathArgument();
833 : PathArgument( ArrayIndex index );
834 : PathArgument( const char *key );
835 : PathArgument( const std::string &key );
836 :
837 : private:
838 : enum Kind
839 : {
840 : kindNone = 0,
841 : kindIndex,
842 : kindKey
843 : };
844 : std::string key_;
845 : ArrayIndex index_;
846 : Kind kind_;
847 : };
848 :
849 : /** \brief Experimental and untested: represents a "path" to access a node.
850 : *
851 : * Syntax:
852 : * - "." => root node
853 : * - ".[n]" => elements at index 'n' of root node (an array value)
854 : * - ".name" => member named 'name' of root node (an object value)
855 : * - ".name1.name2.name3"
856 : * - ".[0][1][2].name1[3]"
857 : * - ".%" => member name is provided as parameter
858 : * - ".[%]" => index is provied as parameter
859 : */
860 : class Path
861 : {
862 : public:
863 : Path( const std::string &path,
864 : const PathArgument &a1 = PathArgument(),
865 : const PathArgument &a2 = PathArgument(),
866 : const PathArgument &a3 = PathArgument(),
867 : const PathArgument &a4 = PathArgument(),
868 : const PathArgument &a5 = PathArgument() );
869 :
870 : const Value &resolve( const Value &root ) const;
871 : Value resolve( const Value &root,
872 : const Value &defaultValue ) const;
873 : /// Creates the "path" to access the specified node and returns a reference on the node.
874 : Value &make( Value &root ) const;
875 :
876 : private:
877 : typedef std::vector<const PathArgument *> InArgs;
878 : typedef std::vector<PathArgument> Args;
879 :
880 : void makePath( const std::string &path,
881 : const InArgs &in );
882 : void addPathInArg( const std::string &path,
883 : const InArgs &in,
884 : InArgs::const_iterator &itInArg,
885 : PathArgument::Kind kind );
886 : void invalidPath( const std::string &path,
887 : int location );
888 :
889 : Args args_;
890 : };
891 :
892 :
893 :
894 : #ifdef JSON_VALUE_USE_INTERNAL_MAP
895 : /** \brief Allocator to customize Value internal map.
896 : * Below is an example of a simple implementation (default implementation actually
897 : * use memory pool for speed).
898 : * \code
899 : class DefaultValueMapAllocator : public ValueMapAllocator
900 : {
901 : public: // overridden from ValueMapAllocator
902 : virtual ValueInternalMap *newMap()
903 : {
904 : return new ValueInternalMap();
905 : }
906 :
907 : virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other )
908 : {
909 : return new ValueInternalMap( other );
910 : }
911 :
912 : virtual void destructMap( ValueInternalMap *map )
913 : {
914 : delete map;
915 : }
916 :
917 : virtual ValueInternalLink *allocateMapBuckets( unsigned int size )
918 : {
919 : return new ValueInternalLink[size];
920 : }
921 :
922 : virtual void releaseMapBuckets( ValueInternalLink *links )
923 : {
924 : delete [] links;
925 : }
926 :
927 : virtual ValueInternalLink *allocateMapLink()
928 : {
929 : return new ValueInternalLink();
930 : }
931 :
932 : virtual void releaseMapLink( ValueInternalLink *link )
933 : {
934 : delete link;
935 : }
936 : };
937 : * \endcode
938 : */
939 : class JSON_API ValueMapAllocator
940 : {
941 : public:
942 : virtual ~ValueMapAllocator();
943 : virtual ValueInternalMap *newMap() = 0;
944 : virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) = 0;
945 : virtual void destructMap( ValueInternalMap *map ) = 0;
946 : virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) = 0;
947 : virtual void releaseMapBuckets( ValueInternalLink *links ) = 0;
948 : virtual ValueInternalLink *allocateMapLink() = 0;
949 : virtual void releaseMapLink( ValueInternalLink *link ) = 0;
950 : };
951 :
952 : /** \brief ValueInternalMap hash-map bucket chain link (for internal use only).
953 : * \internal previous_ & next_ allows for bidirectional traversal.
954 : */
955 : class JSON_API ValueInternalLink
956 : {
957 : public:
958 : enum { itemPerLink = 6 }; // sizeof(ValueInternalLink) = 128 on 32 bits architecture.
959 : enum InternalFlags {
960 : flagAvailable = 0,
961 : flagUsed = 1
962 : };
963 :
964 : ValueInternalLink();
965 :
966 : ~ValueInternalLink();
967 :
968 : Value items_[itemPerLink];
969 : char *keys_[itemPerLink];
970 : ValueInternalLink *previous_;
971 : ValueInternalLink *next_;
972 : };
973 :
974 :
975 : /** \brief A linked page based hash-table implementation used internally by Value.
976 : * \internal ValueInternalMap is a tradional bucket based hash-table, with a linked
977 : * list in each bucket to handle collision. There is an addional twist in that
978 : * each node of the collision linked list is a page containing a fixed amount of
979 : * value. This provides a better compromise between memory usage and speed.
980 : *
981 : * Each bucket is made up of a chained list of ValueInternalLink. The last
982 : * link of a given bucket can be found in the 'previous_' field of the following bucket.
983 : * The last link of the last bucket is stored in tailLink_ as it has no following bucket.
984 : * Only the last link of a bucket may contains 'available' item. The last link always
985 : * contains at least one element unless is it the bucket one very first link.
986 : */
987 : class JSON_API ValueInternalMap
988 : {
989 : friend class ValueIteratorBase;
990 : friend class Value;
991 : public:
992 : typedef unsigned int HashKey;
993 : typedef unsigned int BucketIndex;
994 :
995 : # ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
996 : struct IteratorState
997 : {
998 : IteratorState()
999 : : map_(0)
1000 : , link_(0)
1001 : , itemIndex_(0)
1002 : , bucketIndex_(0)
1003 : {
1004 : }
1005 : ValueInternalMap *map_;
1006 : ValueInternalLink *link_;
1007 : BucketIndex itemIndex_;
1008 : BucketIndex bucketIndex_;
1009 : };
1010 : # endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
1011 :
1012 : ValueInternalMap();
1013 : ValueInternalMap( const ValueInternalMap &other );
1014 : ValueInternalMap &operator =( const ValueInternalMap &other );
1015 : ~ValueInternalMap();
1016 :
1017 : void swap( ValueInternalMap &other );
1018 :
1019 : BucketIndex size() const;
1020 :
1021 : void clear();
1022 :
1023 : bool reserveDelta( BucketIndex growth );
1024 :
1025 : bool reserve( BucketIndex newItemCount );
1026 :
1027 : const Value *find( const char *key ) const;
1028 :
1029 : Value *find( const char *key );
1030 :
1031 : Value &resolveReference( const char *key,
1032 : bool isStatic );
1033 :
1034 : void remove( const char *key );
1035 :
1036 : void doActualRemove( ValueInternalLink *link,
1037 : BucketIndex index,
1038 : BucketIndex bucketIndex );
1039 :
1040 : ValueInternalLink *&getLastLinkInBucket( BucketIndex bucketIndex );
1041 :
1042 : Value &setNewItem( const char *key,
1043 : bool isStatic,
1044 : ValueInternalLink *link,
1045 : BucketIndex index );
1046 :
1047 : Value &unsafeAdd( const char *key,
1048 : bool isStatic,
1049 : HashKey hashedKey );
1050 :
1051 : HashKey hash( const char *key ) const;
1052 :
1053 : int compare( const ValueInternalMap &other ) const;
1054 :
1055 : private:
1056 : void makeBeginIterator( IteratorState &it ) const;
1057 : void makeEndIterator( IteratorState &it ) const;
1058 : static bool equals( const IteratorState &x, const IteratorState &other );
1059 : static void increment( IteratorState &iterator );
1060 : static void incrementBucket( IteratorState &iterator );
1061 : static void decrement( IteratorState &iterator );
1062 : static const char *key( const IteratorState &iterator );
1063 : static const char *key( const IteratorState &iterator, bool &isStatic );
1064 : static Value &value( const IteratorState &iterator );
1065 : static int distance( const IteratorState &x, const IteratorState &y );
1066 :
1067 : private:
1068 : ValueInternalLink *buckets_;
1069 : ValueInternalLink *tailLink_;
1070 : BucketIndex bucketsSize_;
1071 : BucketIndex itemCount_;
1072 : };
1073 :
1074 : /** \brief A simplified deque implementation used internally by Value.
1075 : * \internal
1076 : * It is based on a list of fixed "page", each page contains a fixed number of items.
1077 : * Instead of using a linked-list, a array of pointer is used for fast item look-up.
1078 : * Look-up for an element is as follow:
1079 : * - compute page index: pageIndex = itemIndex / itemsPerPage
1080 : * - look-up item in page: pages_[pageIndex][itemIndex % itemsPerPage]
1081 : *
1082 : * Insertion is amortized constant time (only the array containing the index of pointers
1083 : * need to be reallocated when items are appended).
1084 : */
1085 : class JSON_API ValueInternalArray
1086 : {
1087 : friend class Value;
1088 : friend class ValueIteratorBase;
1089 : public:
1090 : enum { itemsPerPage = 8 }; // should be a power of 2 for fast divide and modulo.
1091 : typedef Value::ArrayIndex ArrayIndex;
1092 : typedef unsigned int PageIndex;
1093 :
1094 : # ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
1095 : struct IteratorState // Must be a POD
1096 : {
1097 : IteratorState()
1098 : : array_(0)
1099 : , currentPageIndex_(0)
1100 : , currentItemIndex_(0)
1101 : {
1102 : }
1103 : ValueInternalArray *array_;
1104 : Value **currentPageIndex_;
1105 : unsigned int currentItemIndex_;
1106 : };
1107 : # endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
1108 :
1109 : ValueInternalArray();
1110 : ValueInternalArray( const ValueInternalArray &other );
1111 : ValueInternalArray &operator =( const ValueInternalArray &other );
1112 : ~ValueInternalArray();
1113 : void swap( ValueInternalArray &other );
1114 :
1115 : void clear();
1116 : void resize( ArrayIndex newSize );
1117 :
1118 : Value &resolveReference( ArrayIndex index );
1119 :
1120 : Value *find( ArrayIndex index ) const;
1121 :
1122 : ArrayIndex size() const;
1123 :
1124 : int compare( const ValueInternalArray &other ) const;
1125 :
1126 : private:
1127 : static bool equals( const IteratorState &x, const IteratorState &other );
1128 : static void increment( IteratorState &iterator );
1129 : static void decrement( IteratorState &iterator );
1130 : static Value &dereference( const IteratorState &iterator );
1131 : static Value &unsafeDereference( const IteratorState &iterator );
1132 : static int distance( const IteratorState &x, const IteratorState &y );
1133 : static ArrayIndex indexOf( const IteratorState &iterator );
1134 : void makeBeginIterator( IteratorState &it ) const;
1135 : void makeEndIterator( IteratorState &it ) const;
1136 : void makeIterator( IteratorState &it, ArrayIndex index ) const;
1137 :
1138 : void makeIndexValid( ArrayIndex index );
1139 :
1140 : Value **pages_;
1141 : ArrayIndex size_;
1142 : PageIndex pageCount_;
1143 : };
1144 :
1145 : /** \brief Experimental: do not use. Allocator to customize Value internal array.
1146 : * Below is an example of a simple implementation (actual implementation use
1147 : * memory pool).
1148 : \code
1149 : class DefaultValueArrayAllocator : public ValueArrayAllocator
1150 : {
1151 : public: // overridden from ValueArrayAllocator
1152 : virtual ~DefaultValueArrayAllocator()
1153 : {
1154 : }
1155 :
1156 : virtual ValueInternalArray *newArray()
1157 : {
1158 : return new ValueInternalArray();
1159 : }
1160 :
1161 : virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other )
1162 : {
1163 : return new ValueInternalArray( other );
1164 : }
1165 :
1166 : virtual void destruct( ValueInternalArray *array )
1167 : {
1168 : delete array;
1169 : }
1170 :
1171 : virtual void reallocateArrayPageIndex( Value **&indexes,
1172 : ValueInternalArray::PageIndex &indexCount,
1173 : ValueInternalArray::PageIndex minNewIndexCount )
1174 : {
1175 : ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1;
1176 : if ( minNewIndexCount > newIndexCount )
1177 : newIndexCount = minNewIndexCount;
1178 : void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount );
1179 : if ( !newIndexes )
1180 : throw std::bad_alloc();
1181 : indexCount = newIndexCount;
1182 : indexes = static_cast<Value **>( newIndexes );
1183 : }
1184 : virtual void releaseArrayPageIndex( Value **indexes,
1185 : ValueInternalArray::PageIndex indexCount )
1186 : {
1187 : if ( indexes )
1188 : free( indexes );
1189 : }
1190 :
1191 : virtual Value *allocateArrayPage()
1192 : {
1193 : return static_cast<Value *>( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) );
1194 : }
1195 :
1196 : virtual void releaseArrayPage( Value *value )
1197 : {
1198 : if ( value )
1199 : free( value );
1200 : }
1201 : };
1202 : \endcode
1203 : */
1204 : class JSON_API ValueArrayAllocator
1205 : {
1206 : public:
1207 : virtual ~ValueArrayAllocator();
1208 : virtual ValueInternalArray *newArray() = 0;
1209 : virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) = 0;
1210 : virtual void destructArray( ValueInternalArray *array ) = 0;
1211 : /** \brief Reallocate array page index.
1212 : * Reallocates an array of pointer on each page.
1213 : * \param indexes [input] pointer on the current index. May be \c NULL.
1214 : * [output] pointer on the new index of at least
1215 : * \a minNewIndexCount pages.
1216 : * \param indexCount [input] current number of pages in the index.
1217 : * [output] number of page the reallocated index can handle.
1218 : * \b MUST be >= \a minNewIndexCount.
1219 : * \param minNewIndexCount Minimum number of page the new index must be able to
1220 : * handle.
1221 : */
1222 : virtual void reallocateArrayPageIndex( Value **&indexes,
1223 : ValueInternalArray::PageIndex &indexCount,
1224 : ValueInternalArray::PageIndex minNewIndexCount ) = 0;
1225 : virtual void releaseArrayPageIndex( Value **indexes,
1226 : ValueInternalArray::PageIndex indexCount ) = 0;
1227 : virtual Value *allocateArrayPage() = 0;
1228 : virtual void releaseArrayPage( Value *value ) = 0;
1229 : };
1230 : #endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP
1231 :
1232 :
1233 : /** \brief base class for Value iterators.
1234 : *
1235 : */
1236 : class ValueIteratorBase
1237 : {
1238 : public:
1239 : typedef unsigned int size_t;
1240 : typedef int difference_type;
1241 : typedef ValueIteratorBase SelfType;
1242 :
1243 : ValueIteratorBase();
1244 : #ifndef JSON_VALUE_USE_INTERNAL_MAP
1245 : explicit ValueIteratorBase( const Value::ObjectValues::iterator ¤t );
1246 : #else
1247 : ValueIteratorBase( const ValueInternalArray::IteratorState &state );
1248 : ValueIteratorBase( const ValueInternalMap::IteratorState &state );
1249 : #endif
1250 :
1251 : bool operator ==( const SelfType &other ) const
1252 : {
1253 : return isEqual( other );
1254 : }
1255 :
1256 0 : bool operator !=( const SelfType &other ) const
1257 : {
1258 0 : return !isEqual( other );
1259 : }
1260 :
1261 : difference_type operator -( const SelfType &other ) const
1262 : {
1263 : return computeDistance( other );
1264 : }
1265 :
1266 : /// Return either the index or the member name of the referenced value as a Value.
1267 : Value key() const;
1268 :
1269 : /// Return the index of the referenced Value. -1 if it is not an arrayValue.
1270 : UInt index() const;
1271 :
1272 : /// Return the member name of the referenced Value. "" if it is not an objectValue.
1273 : const char *memberName() const;
1274 :
1275 : protected:
1276 : Value &deref() const;
1277 :
1278 : void increment();
1279 :
1280 : void decrement();
1281 :
1282 : difference_type computeDistance( const SelfType &other ) const;
1283 :
1284 : bool isEqual( const SelfType &other ) const;
1285 :
1286 : void copy( const SelfType &other );
1287 :
1288 : private:
1289 : #ifndef JSON_VALUE_USE_INTERNAL_MAP
1290 : Value::ObjectValues::iterator current_;
1291 : // Indicates that iterator is for a null value.
1292 : bool isNull_;
1293 : #else
1294 : union
1295 : {
1296 : ValueInternalArray::IteratorState array_;
1297 : ValueInternalMap::IteratorState map_;
1298 : } iterator_;
1299 : bool isArray_;
1300 : #endif
1301 : };
1302 :
1303 : /** \brief const iterator for object and array value.
1304 : *
1305 : */
1306 : class ValueConstIterator : public ValueIteratorBase
1307 : {
1308 : friend class Value;
1309 : public:
1310 : typedef unsigned int size_t;
1311 : typedef int difference_type;
1312 : typedef const Value &reference;
1313 : typedef const Value *pointer;
1314 : typedef ValueConstIterator SelfType;
1315 :
1316 : ValueConstIterator();
1317 : private:
1318 : /*! \internal Use by Value to create an iterator.
1319 : */
1320 : #ifndef JSON_VALUE_USE_INTERNAL_MAP
1321 : explicit ValueConstIterator( const Value::ObjectValues::iterator ¤t );
1322 : #else
1323 : ValueConstIterator( const ValueInternalArray::IteratorState &state );
1324 : ValueConstIterator( const ValueInternalMap::IteratorState &state );
1325 : #endif
1326 : public:
1327 : SelfType &operator =( const ValueIteratorBase &other );
1328 :
1329 : SelfType operator++( int )
1330 : {
1331 : SelfType temp( *this );
1332 : ++*this;
1333 : return temp;
1334 : }
1335 :
1336 : SelfType operator--( int )
1337 : {
1338 : SelfType temp( *this );
1339 : --*this;
1340 : return temp;
1341 : }
1342 :
1343 : SelfType &operator--()
1344 : {
1345 : decrement();
1346 : return *this;
1347 : }
1348 :
1349 0 : SelfType &operator++()
1350 : {
1351 0 : increment();
1352 0 : return *this;
1353 : }
1354 :
1355 0 : reference operator *() const
1356 : {
1357 0 : return deref();
1358 : }
1359 : };
1360 :
1361 :
1362 : /** \brief Iterator for object and array value.
1363 : */
1364 : class ValueIterator : public ValueIteratorBase
1365 : {
1366 : friend class Value;
1367 : public:
1368 : typedef unsigned int size_t;
1369 : typedef int difference_type;
1370 : typedef Value &reference;
1371 : typedef Value *pointer;
1372 : typedef ValueIterator SelfType;
1373 :
1374 : ValueIterator();
1375 : ValueIterator( const ValueConstIterator &other );
1376 : ValueIterator( const ValueIterator &other );
1377 : private:
1378 : /*! \internal Use by Value to create an iterator.
1379 : */
1380 : #ifndef JSON_VALUE_USE_INTERNAL_MAP
1381 : explicit ValueIterator( const Value::ObjectValues::iterator ¤t );
1382 : #else
1383 : ValueIterator( const ValueInternalArray::IteratorState &state );
1384 : ValueIterator( const ValueInternalMap::IteratorState &state );
1385 : #endif
1386 : public:
1387 :
1388 : SelfType &operator =( const SelfType &other );
1389 :
1390 : SelfType operator++( int )
1391 : {
1392 : SelfType temp( *this );
1393 : ++*this;
1394 : return temp;
1395 : }
1396 :
1397 : SelfType operator--( int )
1398 : {
1399 : SelfType temp( *this );
1400 : --*this;
1401 : return temp;
1402 : }
1403 :
1404 : SelfType &operator--()
1405 : {
1406 : decrement();
1407 : return *this;
1408 : }
1409 :
1410 : SelfType &operator++()
1411 : {
1412 : increment();
1413 : return *this;
1414 : }
1415 :
1416 : reference operator *() const
1417 : {
1418 : return deref();
1419 : }
1420 : };
1421 :
1422 :
1423 : } // namespace Json
1424 :
1425 :
1426 : #endif // CPPTL_JSON_H_INCLUDED
1427 :
1428 : // //////////////////////////////////////////////////////////////////////
1429 : // End of content of file: include/json/value.h
1430 : // //////////////////////////////////////////////////////////////////////
1431 :
1432 :
1433 :
1434 :
1435 :
1436 :
1437 : // //////////////////////////////////////////////////////////////////////
1438 : // Beginning of content of file: include/json/reader.h
1439 : // //////////////////////////////////////////////////////////////////////
1440 :
1441 : // Copyright 2007-2010 Baptiste Lepilleur
1442 : // Distributed under MIT license, or public domain if desired and
1443 : // recognized in your jurisdiction.
1444 : // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
1445 :
1446 : #ifndef CPPTL_JSON_READER_H_INCLUDED
1447 : # define CPPTL_JSON_READER_H_INCLUDED
1448 :
1449 : #if !defined(JSON_IS_AMALGAMATION)
1450 : # include "features.h"
1451 : # include "value.h"
1452 : #endif // if !defined(JSON_IS_AMALGAMATION)
1453 : # include <deque>
1454 : # include <stack>
1455 : # include <string>
1456 :
1457 : namespace Json {
1458 :
1459 : /** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a Value.
1460 : *
1461 : */
1462 0 : class JSON_API Reader
1463 : {
1464 : public:
1465 : typedef char Char;
1466 : typedef const Char *Location;
1467 :
1468 : /** \brief Constructs a Reader allowing all features
1469 : * for parsing.
1470 : */
1471 : Reader();
1472 :
1473 : /** \brief Constructs a Reader allowing the specified feature set
1474 : * for parsing.
1475 : */
1476 : Reader( const Features &features );
1477 :
1478 : /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> document.
1479 : * \param document UTF-8 encoded string containing the document to read.
1480 : * \param root [out] Contains the root value of the document if it was
1481 : * successfully parsed.
1482 : * \param collectComments \c true to collect comment and allow writing them back during
1483 : * serialization, \c false to discard comments.
1484 : * This parameter is ignored if Features::allowComments_
1485 : * is \c false.
1486 : * \return \c true if the document was successfully parsed, \c false if an error occurred.
1487 : */
1488 : bool parse( const std::string &document,
1489 : Value &root,
1490 : bool collectComments = true );
1491 :
1492 : /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> document.
1493 : * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the document to read.
1494 : * \param endDoc Pointer on the end of the UTF-8 encoded string of the document to read.
1495 : \ Must be >= beginDoc.
1496 : * \param root [out] Contains the root value of the document if it was
1497 : * successfully parsed.
1498 : * \param collectComments \c true to collect comment and allow writing them back during
1499 : * serialization, \c false to discard comments.
1500 : * This parameter is ignored if Features::allowComments_
1501 : * is \c false.
1502 : * \return \c true if the document was successfully parsed, \c false if an error occurred.
1503 : */
1504 : bool parse( const char *beginDoc, const char *endDoc,
1505 : Value &root,
1506 : bool collectComments = true );
1507 :
1508 : /// \brief Parse from input stream.
1509 : /// \see Json::operator>>(std::istream&, Json::Value&).
1510 : bool parse( std::istream &is,
1511 : Value &root,
1512 : bool collectComments = true );
1513 :
1514 : /** \brief Returns a user friendly string that list errors in the parsed document.
1515 : * \return Formatted error message with the list of errors with their location in
1516 : * the parsed document. An empty string is returned if no error occurred
1517 : * during parsing.
1518 : * \deprecated Use getFormattedErrorMessages() instead (typo fix).
1519 : */
1520 : JSONCPP_DEPRECATED("Use getFormattedErrorMessages instead")
1521 : std::string getFormatedErrorMessages() const;
1522 :
1523 : /** \brief Returns a user friendly string that list errors in the parsed document.
1524 : * \return Formatted error message with the list of errors with their location in
1525 : * the parsed document. An empty string is returned if no error occurred
1526 : * during parsing.
1527 : */
1528 : std::string getFormattedErrorMessages() const;
1529 :
1530 : private:
1531 : enum TokenType
1532 : {
1533 : tokenEndOfStream = 0,
1534 : tokenObjectBegin,
1535 : tokenObjectEnd,
1536 : tokenArrayBegin,
1537 : tokenArrayEnd,
1538 : tokenString,
1539 : tokenNumber,
1540 : tokenTrue,
1541 : tokenFalse,
1542 : tokenNull,
1543 : tokenArraySeparator,
1544 : tokenMemberSeparator,
1545 : tokenComment,
1546 : tokenError
1547 : };
1548 :
1549 : class Token
1550 : {
1551 : public:
1552 : TokenType type_;
1553 : Location start_;
1554 : Location end_;
1555 : };
1556 :
1557 0 : class ErrorInfo
1558 : {
1559 : public:
1560 : Token token_;
1561 : std::string message_;
1562 : Location extra_;
1563 : };
1564 :
1565 : typedef std::deque<ErrorInfo> Errors;
1566 :
1567 : bool expectToken( TokenType type, Token &token, const char *message );
1568 : bool readToken( Token &token );
1569 : void skipSpaces();
1570 : bool match( Location pattern,
1571 : int patternLength );
1572 : bool readComment();
1573 : bool readCStyleComment();
1574 : bool readCppStyleComment();
1575 : bool readString();
1576 : void readNumber();
1577 : bool readValue();
1578 : bool readObject( Token &token );
1579 : bool readArray( Token &token );
1580 : bool decodeNumber( Token &token );
1581 : bool decodeString( Token &token );
1582 : bool decodeString( Token &token, std::string &decoded );
1583 : bool decodeDouble( Token &token );
1584 : bool decodeUnicodeCodePoint( Token &token,
1585 : Location ¤t,
1586 : Location end,
1587 : unsigned int &unicode );
1588 : bool decodeUnicodeEscapeSequence( Token &token,
1589 : Location ¤t,
1590 : Location end,
1591 : unsigned int &unicode );
1592 : bool addError( const std::string &message,
1593 : Token &token,
1594 : Location extra = 0 );
1595 : bool recoverFromError( TokenType skipUntilToken );
1596 : bool addErrorAndRecover( const std::string &message,
1597 : Token &token,
1598 : TokenType skipUntilToken );
1599 : void skipUntilSpace();
1600 : Value ¤tValue();
1601 : Char getNextChar();
1602 : void getLocationLineAndColumn( Location location,
1603 : int &line,
1604 : int &column ) const;
1605 : std::string getLocationLineAndColumn( Location location ) const;
1606 : void addComment( Location begin,
1607 : Location end,
1608 : CommentPlacement placement );
1609 : void skipCommentTokens( Token &token );
1610 :
1611 : typedef std::stack<Value *> Nodes;
1612 : Nodes nodes_;
1613 : Errors errors_;
1614 : std::string document_;
1615 : Location begin_;
1616 : Location end_;
1617 : Location current_;
1618 : Location lastValueEnd_;
1619 : Value *lastValue_;
1620 : std::string commentsBefore_;
1621 : Features features_;
1622 : bool collectComments_;
1623 : };
1624 :
1625 : /** \brief Read from 'sin' into 'root'.
1626 :
1627 : Always keep comments from the input JSON.
1628 :
1629 : This can be used to read a file into a particular sub-object.
1630 : For example:
1631 : \code
1632 : Json::Value root;
1633 : cin >> root["dir"]["file"];
1634 : cout << root;
1635 : \endcode
1636 : Result:
1637 : \verbatim
1638 : {
1639 : "dir": {
1640 : "file": {
1641 : // The input stream JSON would be nested here.
1642 : }
1643 : }
1644 : }
1645 : \endverbatim
1646 : \throw std::exception on parse error.
1647 : \see Json::operator<<()
1648 : */
1649 : std::istream& operator>>( std::istream&, Value& );
1650 :
1651 : } // namespace Json
1652 :
1653 : #endif // CPPTL_JSON_READER_H_INCLUDED
1654 :
1655 : // //////////////////////////////////////////////////////////////////////
1656 : // End of content of file: include/json/reader.h
1657 : // //////////////////////////////////////////////////////////////////////
1658 :
1659 :
1660 :
1661 :
1662 :
1663 :
1664 : // //////////////////////////////////////////////////////////////////////
1665 : // Beginning of content of file: include/json/writer.h
1666 : // //////////////////////////////////////////////////////////////////////
1667 :
1668 : // Copyright 2007-2010 Baptiste Lepilleur
1669 : // Distributed under MIT license, or public domain if desired and
1670 : // recognized in your jurisdiction.
1671 : // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
1672 :
1673 : #ifndef JSON_WRITER_H_INCLUDED
1674 : # define JSON_WRITER_H_INCLUDED
1675 :
1676 : #if !defined(JSON_IS_AMALGAMATION)
1677 : # include "value.h"
1678 : #endif // if !defined(JSON_IS_AMALGAMATION)
1679 : # include <vector>
1680 : # include <string>
1681 :
1682 : namespace Json {
1683 :
1684 : class Value;
1685 :
1686 : /** \brief Abstract class for writers.
1687 : */
1688 : class JSON_API Writer
1689 : {
1690 : public:
1691 : virtual ~Writer();
1692 :
1693 : virtual std::string write( const Value &root ) = 0;
1694 : };
1695 :
1696 : /** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format without formatting (not human friendly).
1697 : *
1698 : * The JSON document is written in a single line. It is not intended for 'human' consumption,
1699 : * but may be usefull to support feature such as RPC where bandwith is limited.
1700 : * \sa Reader, Value
1701 : */
1702 : class JSON_API FastWriter : public Writer
1703 : {
1704 : public:
1705 : FastWriter();
1706 0 : virtual ~FastWriter(){}
1707 :
1708 : void enableYAMLCompatibility();
1709 :
1710 : /** \brief Drop the "null" string from the writer's output for nullValues.
1711 : * Strictly speaking, this is not valid JSON. But when the output is being
1712 : * fed to a browser's Javascript, it makes for smaller output and the
1713 : * browser can handle the output just fine.
1714 : */
1715 : void dropNullPlaceholders();
1716 :
1717 : public: // overridden from Writer
1718 : virtual std::string write( const Value &root );
1719 :
1720 : private:
1721 : void writeValue( const Value &value );
1722 :
1723 : std::string document_;
1724 : bool yamlCompatiblityEnabled_;
1725 : bool dropNullPlaceholders_;
1726 : };
1727 :
1728 : /** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way.
1729 : *
1730 : * The rules for line break and indent are as follow:
1731 : * - Object value:
1732 : * - if empty then print {} without indent and line break
1733 : * - if not empty the print '{', line break & indent, print one value per line
1734 : * and then unindent and line break and print '}'.
1735 : * - Array value:
1736 : * - if empty then print [] without indent and line break
1737 : * - if the array contains no object value, empty array or some other value types,
1738 : * and all the values fit on one lines, then print the array on a single line.
1739 : * - otherwise, it the values do not fit on one line, or the array contains
1740 : * object or non empty array, then print one value per line.
1741 : *
1742 : * If the Value have comments then they are outputed according to their #CommentPlacement.
1743 : *
1744 : * \sa Reader, Value, Value::setComment()
1745 : */
1746 : class JSON_API StyledWriter: public Writer
1747 : {
1748 : public:
1749 : StyledWriter();
1750 0 : virtual ~StyledWriter(){}
1751 :
1752 : public: // overridden from Writer
1753 : /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
1754 : * \param root Value to serialize.
1755 : * \return String containing the JSON document that represents the root value.
1756 : */
1757 : virtual std::string write( const Value &root );
1758 :
1759 : private:
1760 : void writeValue( const Value &value );
1761 : void writeArrayValue( const Value &value );
1762 : bool isMultineArray( const Value &value );
1763 : void pushValue( const std::string &value );
1764 : void writeIndent();
1765 : void writeWithIndent( const std::string &value );
1766 : void indent();
1767 : void unindent();
1768 : void writeCommentBeforeValue( const Value &root );
1769 : void writeCommentAfterValueOnSameLine( const Value &root );
1770 : bool hasCommentForValue( const Value &value );
1771 : static std::string normalizeEOL( const std::string &text );
1772 :
1773 : typedef std::vector<std::string> ChildValues;
1774 :
1775 : ChildValues childValues_;
1776 : std::string document_;
1777 : std::string indentString_;
1778 : int rightMargin_;
1779 : int indentSize_;
1780 : bool addChildValues_;
1781 : };
1782 :
1783 : /** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way,
1784 : to a stream rather than to a string.
1785 : *
1786 : * The rules for line break and indent are as follow:
1787 : * - Object value:
1788 : * - if empty then print {} without indent and line break
1789 : * - if not empty the print '{', line break & indent, print one value per line
1790 : * and then unindent and line break and print '}'.
1791 : * - Array value:
1792 : * - if empty then print [] without indent and line break
1793 : * - if the array contains no object value, empty array or some other value types,
1794 : * and all the values fit on one lines, then print the array on a single line.
1795 : * - otherwise, it the values do not fit on one line, or the array contains
1796 : * object or non empty array, then print one value per line.
1797 : *
1798 : * If the Value have comments then they are outputed according to their #CommentPlacement.
1799 : *
1800 : * \param indentation Each level will be indented by this amount extra.
1801 : * \sa Reader, Value, Value::setComment()
1802 : */
1803 : class JSON_API StyledStreamWriter
1804 : {
1805 : public:
1806 : StyledStreamWriter( std::string indentation="\t" );
1807 : ~StyledStreamWriter(){}
1808 :
1809 : public:
1810 : /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
1811 : * \param out Stream to write to. (Can be ostringstream, e.g.)
1812 : * \param root Value to serialize.
1813 : * \note There is no point in deriving from Writer, since write() should not return a value.
1814 : */
1815 : void write( std::ostream &out, const Value &root );
1816 :
1817 : private:
1818 : void writeValue( const Value &value );
1819 : void writeArrayValue( const Value &value );
1820 : bool isMultineArray( const Value &value );
1821 : void pushValue( const std::string &value );
1822 : void writeIndent();
1823 : void writeWithIndent( const std::string &value );
1824 : void indent();
1825 : void unindent();
1826 : void writeCommentBeforeValue( const Value &root );
1827 : void writeCommentAfterValueOnSameLine( const Value &root );
1828 : bool hasCommentForValue( const Value &value );
1829 : static std::string normalizeEOL( const std::string &text );
1830 :
1831 : typedef std::vector<std::string> ChildValues;
1832 :
1833 : ChildValues childValues_;
1834 : std::ostream* document_;
1835 : std::string indentString_;
1836 : int rightMargin_;
1837 : std::string indentation_;
1838 : bool addChildValues_;
1839 : };
1840 :
1841 : # if defined(JSON_HAS_INT64)
1842 : std::string JSON_API valueToString( Int value );
1843 : std::string JSON_API valueToString( UInt value );
1844 : # endif // if defined(JSON_HAS_INT64)
1845 : std::string JSON_API valueToString( LargestInt value );
1846 : std::string JSON_API valueToString( LargestUInt value );
1847 : std::string JSON_API valueToString( double value );
1848 : std::string JSON_API valueToString( bool value );
1849 : std::string JSON_API valueToQuotedString( const char *value );
1850 :
1851 : /// \brief Output using the StyledStreamWriter.
1852 : /// \see Json::operator>>()
1853 : std::ostream& operator<<( std::ostream&, const Value &root );
1854 :
1855 : } // namespace Json
1856 :
1857 :
1858 :
1859 : #endif // JSON_WRITER_H_INCLUDED
1860 :
1861 : // //////////////////////////////////////////////////////////////////////
1862 : // End of content of file: include/json/writer.h
1863 : // //////////////////////////////////////////////////////////////////////
1864 :
1865 :
1866 :
1867 :
1868 :
1869 :
1870 : // //////////////////////////////////////////////////////////////////////
1871 : // Beginning of content of file: include/json/assertions.h
1872 : // //////////////////////////////////////////////////////////////////////
1873 :
1874 : // Copyright 2007-2010 Baptiste Lepilleur
1875 : // Distributed under MIT license, or public domain if desired and
1876 : // recognized in your jurisdiction.
1877 : // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
1878 :
1879 : #ifndef CPPTL_JSON_ASSERTIONS_H_INCLUDED
1880 : # define CPPTL_JSON_ASSERTIONS_H_INCLUDED
1881 :
1882 : #include <stdlib.h>
1883 :
1884 : #if !defined(JSON_IS_AMALGAMATION)
1885 : # include <json/config.h>
1886 : #endif // if !defined(JSON_IS_AMALGAMATION)
1887 :
1888 : #if JSON_USE_EXCEPTION
1889 : #define JSON_ASSERT( condition ) assert( condition ); // @todo <= change this into an exception throw
1890 : #define JSON_FAIL_MESSAGE( message ) throw std::runtime_error( message );
1891 : #else // JSON_USE_EXCEPTION
1892 : #define JSON_ASSERT( condition ) assert( condition );
1893 :
1894 : // The call to assert() will show the failure message in debug builds. In
1895 : // release bugs we write to invalid memory in order to crash hard, so that a
1896 : // debugger or crash reporter gets the chance to take over. We still call exit()
1897 : // afterward in order to tell the compiler that this macro doesn't return.
1898 : #define JSON_FAIL_MESSAGE( message ) { assert(false && message); strcpy(reinterpret_cast<char*>(666), message); exit(123); }
1899 :
1900 : #endif
1901 :
1902 : #define JSON_ASSERT_MESSAGE( condition, message ) if (!( condition )) { JSON_FAIL_MESSAGE( message ) }
1903 :
1904 : #endif // CPPTL_JSON_ASSERTIONS_H_INCLUDED
1905 :
1906 : // //////////////////////////////////////////////////////////////////////
1907 : // End of content of file: include/json/assertions.h
1908 : // //////////////////////////////////////////////////////////////////////
1909 :
1910 :
1911 :
1912 :
1913 :
1914 : #endif //ifndef JSON_AMALGATED_H_INCLUDED
|