1f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// Copyright 2007-2010 Baptiste Lepilleur 2f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// Distributed under MIT license, or public domain if desired and 3f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// recognized in your jurisdiction. 4f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE 5f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 6f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef CPPTL_JSON_H_INCLUDED 7f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# define CPPTL_JSON_H_INCLUDED 8f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 9f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#if !defined(JSON_IS_AMALGAMATION) 10f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include "forwards.h" 11f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // if !defined(JSON_IS_AMALGAMATION) 12f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <string> 13f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <vector> 14f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 15f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifndef JSON_USE_CPPTL_SMALLMAP 16f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <map> 17f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# else 18f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <cpptl/smallmap.h> 19f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif 20f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_USE_CPPTL 21f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <cpptl/forwards.h> 22f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif 23f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 24f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/** \brief JSON (JavaScript Object Notation). 25f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 26f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIInamespace Json { 27f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 28f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Type of the value held by a Value object. 29f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 30f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III enum ValueType 31f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 32f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III nullValue = 0, ///< 'null' value 33f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III intValue, ///< signed integer value 34f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III uintValue, ///< unsigned integer value 35f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III realValue, ///< double value 36f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III stringValue, ///< UTF-8 string value 37f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III booleanValue, ///< bool value 38f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III arrayValue, ///< array value (ordered list) 39f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III objectValue ///< object value (collection of name/value pairs). 40f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 41f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 42f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III enum CommentPlacement 43f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 44f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III commentBefore = 0, ///< a comment placed on the line before a value 45f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III commentAfterOnSameLine, ///< a comment just after a value on the same line 46f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III commentAfter, ///< a comment on the line after a value (only make sense for root value) 47f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III numberOfCommentPlacement 48f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 49f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 50f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//# ifdef JSON_USE_CPPTL 51f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// typedef CppTL::AnyEnumerator<const char *> EnumMemberNames; 52f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// typedef CppTL::AnyEnumerator<const Value &> EnumValues; 53f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//# endif 54f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 55f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Lightweight wrapper to tag static string. 56f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * 57f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Value constructor and objectValue member assignement takes advantage of the 58f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * StaticString and avoid the cost of string duplication when storing the 59f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * string or the member name. 60f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * 61f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Example of usage: 62f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \code 63f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Json::Value aValue( StaticString("some text") ); 64f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Json::Value object; 65f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * static const StaticString code("code"); 66f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * object[code] = 1234; 67f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \endcode 68f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 69f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class JSON_API StaticString 70f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 71f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 72f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III explicit StaticString( const char *czstring ) 73f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III : str_( czstring ) 74f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 75f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 76f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 77f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III operator const char *() const 78f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 79f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return str_; 80f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 81f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 82f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const char *c_str() const 83f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 84f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return str_; 85f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 86f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 87f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 88f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const char *str_; 89f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 90f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 91f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Represents a <a HREF="http://www.json.org">JSON</a> value. 92f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * 93f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * This class is a discriminated union wrapper that can represents a: 94f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - signed integer [range: Value::minInt - Value::maxInt] 95f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - unsigned integer (range: 0 - Value::maxUInt) 96f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - double 97f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - UTF-8 string 98f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - boolean 99f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - 'null' 100f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - an ordered list of Value 101f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - collection of name/value pairs (javascript object) 102f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * 103f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * The type of the held value is represented by a #ValueType and 104f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * can be obtained using type(). 105f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * 106f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * values of an #objectValue or #arrayValue can be accessed using operator[]() methods. 107f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Non const methods will automatically create the a #nullValue element 108f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * if it does not exist. 109f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * The sequence of an #arrayValue will be automatically resize and initialized 110f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue. 111f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * 112f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * The get() methods can be used to obtanis default value in the case the required element 113f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * does not exist. 114f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * 115f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * It is possible to iterate over the list of a #objectValue values using 116f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * the getMemberNames() method. 117f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 118f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class JSON_API Value 119f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 120f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III friend class ValueIteratorBase; 121f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP 122f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III friend class ValueInternalLink; 123f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III friend class ValueInternalMap; 124f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif 125f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 126f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef std::vector<std::string> Members; 127f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef ValueIterator iterator; 128f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef ValueConstIterator const_iterator; 129f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef Json::UInt UInt; 130f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef Json::Int Int; 131f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# if defined(JSON_HAS_INT64) 132f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef Json::UInt64 UInt64; 133f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef Json::Int64 Int64; 134f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // defined(JSON_HAS_INT64) 135f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef Json::LargestInt LargestInt; 136f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef Json::LargestUInt LargestUInt; 137f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef Json::ArrayIndex ArrayIndex; 138f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 139f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static const Value null; 140f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Minimum signed integer value that can be stored in a Json::Value. 141f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static const LargestInt minLargestInt; 142f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Maximum signed integer value that can be stored in a Json::Value. 143f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static const LargestInt maxLargestInt; 144f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Maximum unsigned integer value that can be stored in a Json::Value. 145f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static const LargestUInt maxLargestUInt; 146f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 147f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Minimum signed int value that can be stored in a Json::Value. 148f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static const Int minInt; 149f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Maximum signed int value that can be stored in a Json::Value. 150f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static const Int maxInt; 151f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Maximum unsigned int value that can be stored in a Json::Value. 152f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static const UInt maxUInt; 153f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 154f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# if defined(JSON_HAS_INT64) 155f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Minimum signed 64 bits int value that can be stored in a Json::Value. 156f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static const Int64 minInt64; 157f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Maximum signed 64 bits int value that can be stored in a Json::Value. 158f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static const Int64 maxInt64; 159f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Maximum unsigned 64 bits int value that can be stored in a Json::Value. 160f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static const UInt64 maxUInt64; 161f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // defined(JSON_HAS_INT64) 162f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 163f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 164f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 165f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifndef JSON_VALUE_USE_INTERNAL_MAP 166f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class CZString 167f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 168f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 169f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III enum DuplicationPolicy 170f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 171f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III noDuplication = 0, 172f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III duplicate, 173f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III duplicateOnCopy 174f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 175f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III CZString( ArrayIndex index ); 176f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III CZString( const char *cstr, DuplicationPolicy allocate ); 177f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III CZString( const CZString &other ); 178f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ~CZString(); 179f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III CZString &operator =( const CZString &other ); 180f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool operator<( const CZString &other ) const; 181f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool operator==( const CZString &other ) const; 182f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ArrayIndex index() const; 183f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const char *c_str() const; 184f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isStaticString() const; 185f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 186f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void swap( CZString &other ); 187f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const char *cstr_; 188f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ArrayIndex index_; 189f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 190f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 191f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 192f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifndef JSON_USE_CPPTL_SMALLMAP 193f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef std::map<CZString, Value> ObjectValues; 194f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# else 195f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef CppTL::SmallMap<CZString, Value> ObjectValues; 196f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif // ifndef JSON_USE_CPPTL_SMALLMAP 197f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif // ifndef JSON_VALUE_USE_INTERNAL_MAP 198f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 199f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 200f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 201f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Create a default Value of the given type. 202f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 203f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III This is a very useful constructor. 204f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III To create an empty array, pass arrayValue. 205f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III To create an empty object, pass objectValue. 206f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Another Value can then be set to this one by assignment. 207f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III This is useful since clear() and resize() will not alter types. 208f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 209f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Examples: 210f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III \code 211f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Json::Value null_value; // null 212f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Json::Value arr_value(Json::arrayValue); // [] 213f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Json::Value obj_value(Json::objectValue); // {} 214f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III \endcode 215f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 216f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value( ValueType type = nullValue ); 217f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value( Int value ); 218f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value( UInt value ); 219f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#if defined(JSON_HAS_INT64) 220f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value( Int64 value ); 221f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value( UInt64 value ); 222f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // if defined(JSON_HAS_INT64) 223f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value( double value ); 224f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value( const char *value ); 225f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value( const char *beginValue, const char *endValue ); 226f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Constructs a value from a static string. 227f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 228f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Like other value string constructor but do not duplicate the string for 229f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * internal storage. The given string must remain alive after the call to this 230f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * constructor. 231f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Example of usage: 232f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \code 233f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Json::Value aValue( StaticString("some text") ); 234f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \endcode 235f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 236f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value( const StaticString &value ); 237f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value( const std::string &value ); 238f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_USE_CPPTL 239f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value( const CppTL::ConstString &value ); 240f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif 241f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value( bool value ); 242f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value( const Value &other ); 243f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ~Value(); 244f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 245f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &operator=( const Value &other ); 246f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Swap values. 247f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \note Currently, comments are intentionally not swapped, for 248f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// both logic and efficiency. 249f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void swap( Value &other ); 250f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 251f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueType type() const; 252f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 253f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool operator <( const Value &other ) const; 254f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool operator <=( const Value &other ) const; 255f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool operator >=( const Value &other ) const; 256f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool operator >( const Value &other ) const; 257f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 258f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool operator ==( const Value &other ) const; 259f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool operator !=( const Value &other ) const; 260f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 261f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III int compare( const Value &other ) const; 262f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 263f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const char *asCString() const; 264f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string asString() const; 265f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_USE_CPPTL 266f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III CppTL::ConstString asConstString() const; 267f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif 268f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Int asInt() const; 269f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III UInt asUInt() const; 270f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#if defined(JSON_HAS_INT64) 271f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Int64 asInt64() const; 272f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III UInt64 asUInt64() const; 273f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // if defined(JSON_HAS_INT64) 274f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III LargestInt asLargestInt() const; 275f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III LargestUInt asLargestUInt() const; 276f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III float asFloat() const; 277f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III double asDouble() const; 278f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool asBool() const; 279f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 280f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isNull() const; 281f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isBool() const; 282f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isInt() const; 283f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isInt64() const; 284f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isUInt() const; 285f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isUInt64() const; 286f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isIntegral() const; 287f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isDouble() const; 288f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isNumeric() const; 289f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isString() const; 290f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isArray() const; 291f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isObject() const; 292f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 293f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isConvertibleTo( ValueType other ) const; 294f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 295f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Number of values in array or object 296f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ArrayIndex size() const; 297f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 298f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \brief Return true if empty array, empty object, or null; 299f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// otherwise, false. 300f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool empty() const; 301f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 302f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Return isNull() 303f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool operator!() const; 304f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 305f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Remove all object members and array elements. 306f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \pre type() is arrayValue, objectValue, or nullValue 307f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \post type() is unchanged 308f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void clear(); 309f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 310f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Resize the array to size elements. 311f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// New elements are initialized to null. 312f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// May only be called on nullValue or arrayValue. 313f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \pre type() is arrayValue or nullValue 314f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \post type() is arrayValue 315f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void resize( ArrayIndex size ); 316f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 317f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Access an array element (zero based index ). 318f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// If the array contains less than index element, then null value are inserted 319f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// in the array so that its size is index+1. 320f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// (You may need to say 'value[0u]' to get your compiler to distinguish 321f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// this from the operator[] which takes a string.) 322f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &operator[]( ArrayIndex index ); 323f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 324f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Access an array element (zero based index ). 325f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// If the array contains less than index element, then null value are inserted 326f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// in the array so that its size is index+1. 327f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// (You may need to say 'value[0u]' to get your compiler to distinguish 328f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// this from the operator[] which takes a string.) 329f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &operator[]( int index ); 330f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 331f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Access an array element (zero based index ) 332f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// (You may need to say 'value[0u]' to get your compiler to distinguish 333f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// this from the operator[] which takes a string.) 334f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const Value &operator[]( ArrayIndex index ) const; 335f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 336f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Access an array element (zero based index ) 337f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// (You may need to say 'value[0u]' to get your compiler to distinguish 338f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// this from the operator[] which takes a string.) 339f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const Value &operator[]( int index ) const; 340f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 341f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// If the array contains at least index+1 elements, returns the element value, 342f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// otherwise returns defaultValue. 343f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value get( ArrayIndex index, 344f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const Value &defaultValue ) const; 345f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Return true if index < size(). 346f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isValidIndex( ArrayIndex index ) const; 347f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \brief Append value to array at the end. 348f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// 349f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Equivalent to jsonvalue[jsonvalue.size()] = value; 350f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &append( const Value &value ); 351f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 352f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Access an object value by name, create a null member if it does not exist. 353f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &operator[]( const char *key ); 354f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Access an object value by name, returns null if there is no member with that name. 355f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const Value &operator[]( const char *key ) const; 356f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Access an object value by name, create a null member if it does not exist. 357f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &operator[]( const std::string &key ); 358f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Access an object value by name, returns null if there is no member with that name. 359f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const Value &operator[]( const std::string &key ) const; 360f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Access an object value by name, create a null member if it does not exist. 361f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 362f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * If the object as no entry for that name, then the member name used to store 363f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * the new entry is not duplicated. 364f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Example of use: 365f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \code 366f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Json::Value object; 367f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * static const StaticString code("code"); 368f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * object[code] = 1234; 369f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \endcode 370f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 371f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &operator[]( const StaticString &key ); 372f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_USE_CPPTL 373f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Access an object value by name, create a null member if it does not exist. 374f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &operator[]( const CppTL::ConstString &key ); 375f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Access an object value by name, returns null if there is no member with that name. 376f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const Value &operator[]( const CppTL::ConstString &key ) const; 377f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif 378f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Return the member named key if it exist, defaultValue otherwise. 379f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value get( const char *key, 380f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const Value &defaultValue ) const; 381f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Return the member named key if it exist, defaultValue otherwise. 382f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value get( const std::string &key, 383f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const Value &defaultValue ) const; 384f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_USE_CPPTL 385f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Return the member named key if it exist, defaultValue otherwise. 386f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value get( const CppTL::ConstString &key, 387f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const Value &defaultValue ) const; 388f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif 389f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \brief Remove and return the named member. 390f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// 391f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Do nothing if it did not exist. 392f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \return the removed Value, or null. 393f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \pre type() is objectValue or nullValue 394f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \post type() is unchanged 395f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value removeMember( const char* key ); 396f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Same as removeMember(const char*) 397f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value removeMember( const std::string &key ); 398f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 399f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Return true if the object has a member named key. 400f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isMember( const char *key ) const; 401f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Return true if the object has a member named key. 402f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isMember( const std::string &key ) const; 403f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_USE_CPPTL 404f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Return true if the object has a member named key. 405f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isMember( const CppTL::ConstString &key ) const; 406f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif 407f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 408f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \brief Return a list of the member names. 409f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// 410f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// If null, return an empty list. 411f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \pre type() is objectValue or nullValue 412f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \post if type() was nullValue, it remains nullValue 413f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Members getMemberNames() const; 414f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 415f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//# ifdef JSON_USE_CPPTL 416f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// EnumMemberNames enumMemberNames() const; 417f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// EnumValues enumValues() const; 418f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//# endif 419f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 420f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Comments must be //... or /* ... */ 421f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void setComment( const char *comment, 422f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III CommentPlacement placement ); 423f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Comments must be //... or /* ... */ 424f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void setComment( const std::string &comment, 425f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III CommentPlacement placement ); 426f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool hasComment( CommentPlacement placement ) const; 427f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Include delimiters and embedded newlines. 428f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string getComment( CommentPlacement placement ) const; 429f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 430f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string toStyledString() const; 431f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 432f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const_iterator begin() const; 433f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const_iterator end() const; 434f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 435f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III iterator begin(); 436f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III iterator end(); 437f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 438f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 439f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &resolveReference( const char *key, 440f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isStatic ); 441f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 442f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP 443f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III inline bool isItemAvailable() const 444f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 445f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return itemIsUsed_ == 0; 446f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 447f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 448f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III inline void setItemUsed( bool isUsed = true ) 449f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 450f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III itemIsUsed_ = isUsed ? 1 : 0; 451f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 452f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 453f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III inline bool isMemberNameStatic() const 454f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 455f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return memberNameIsStatic_ == 0; 456f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 457f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 458f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III inline void setMemberNameIsStatic( bool isStatic ) 459f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 460f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III memberNameIsStatic_ = isStatic ? 1 : 0; 461f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 462f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif // # ifdef JSON_VALUE_USE_INTERNAL_MAP 463f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 464f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 465f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III struct CommentInfo 466f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 467f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III CommentInfo(); 468f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ~CommentInfo(); 469f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 470f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void setComment( const char *text ); 471f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 472f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III char *comment_; 473f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 474f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 475f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III //struct MemberNamesTransform 476f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III //{ 477f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III // typedef const char *result_type; 478f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III // const char *operator()( const CZString &name ) const 479f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III // { 480f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III // return name.c_str(); 481f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III // } 482f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III //}; 483f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 484f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III union ValueHolder 485f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 486f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III LargestInt int_; 487f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III LargestUInt uint_; 488f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III double real_; 489f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool bool_; 490f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III char *string_; 491f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP 492f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalArray *array_; 493f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalMap *map_; 494f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else 495f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ObjectValues *map_; 496f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif 497f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } value_; 498f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueType type_ : 8; 499f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III int allocated_ : 1; // Notes: if declared as bool, bitfield is useless. 500f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP 501f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III unsigned int itemIsUsed_ : 1; // used by the ValueInternalMap container. 502f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III int memberNameIsStatic_ : 1; // used by the ValueInternalMap container. 503f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif 504f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III CommentInfo *comments_; 505f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 506f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 507f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 508f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Experimental and untested: represents an element of the "path" to access a node. 509f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 510f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class PathArgument 511f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 512f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 513f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III friend class Path; 514f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 515f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III PathArgument(); 516f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III PathArgument( ArrayIndex index ); 517f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III PathArgument( const char *key ); 518f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III PathArgument( const std::string &key ); 519f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 520f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 521f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III enum Kind 522f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 523f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III kindNone = 0, 524f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III kindIndex, 525f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III kindKey 526f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 527f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string key_; 528f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ArrayIndex index_; 529f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Kind kind_; 530f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 531f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 532f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Experimental and untested: represents a "path" to access a node. 533f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * 534f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Syntax: 535f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - "." => root node 536f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - ".[n]" => elements at index 'n' of root node (an array value) 537f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - ".name" => member named 'name' of root node (an object value) 538f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - ".name1.name2.name3" 539f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - ".[0][1][2].name1[3]" 540f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - ".%" => member name is provided as parameter 541f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - ".[%]" => index is provied as parameter 542f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 543f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class Path 544f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 545f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 546f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Path( const std::string &path, 547f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const PathArgument &a1 = PathArgument(), 548f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const PathArgument &a2 = PathArgument(), 549f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const PathArgument &a3 = PathArgument(), 550f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const PathArgument &a4 = PathArgument(), 551f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const PathArgument &a5 = PathArgument() ); 552f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 553f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const Value &resolve( const Value &root ) const; 554f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value resolve( const Value &root, 555f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const Value &defaultValue ) const; 556f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Creates the "path" to access the specified node and returns a reference on the node. 557f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &make( Value &root ) const; 558f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 559f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 560f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef std::vector<const PathArgument *> InArgs; 561f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef std::vector<PathArgument> Args; 562f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 563f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void makePath( const std::string &path, 564f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const InArgs &in ); 565f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void addPathInArg( const std::string &path, 566f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const InArgs &in, 567f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III InArgs::const_iterator &itInArg, 568f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III PathArgument::Kind kind ); 569f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void invalidPath( const std::string &path, 570f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III int location ); 571f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 572f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Args args_; 573f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 574f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 575f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 576f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 577f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifdef JSON_VALUE_USE_INTERNAL_MAP 578f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Allocator to customize Value internal map. 579f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Below is an example of a simple implementation (default implementation actually 580f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * use memory pool for speed). 581f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \code 582f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class DefaultValueMapAllocator : public ValueMapAllocator 583f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 584f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: // overridden from ValueMapAllocator 585f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ValueInternalMap *newMap() 586f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 587f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return new ValueInternalMap(); 588f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 589f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 590f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) 591f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 592f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return new ValueInternalMap( other ); 593f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 594f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 595f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void destructMap( ValueInternalMap *map ) 596f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 597f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III delete map; 598f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 599f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 600f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) 601f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 602f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return new ValueInternalLink[size]; 603f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 604f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 605f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void releaseMapBuckets( ValueInternalLink *links ) 606f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 607f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III delete [] links; 608f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 609f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 610f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ValueInternalLink *allocateMapLink() 611f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 612f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return new ValueInternalLink(); 613f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 614f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 615f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void releaseMapLink( ValueInternalLink *link ) 616f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 617f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III delete link; 618f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 619f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 620f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \endcode 621f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 622f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class JSON_API ValueMapAllocator 623f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 624f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 625f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ~ValueMapAllocator(); 626f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ValueInternalMap *newMap() = 0; 627f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) = 0; 628f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void destructMap( ValueInternalMap *map ) = 0; 629f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) = 0; 630f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void releaseMapBuckets( ValueInternalLink *links ) = 0; 631f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ValueInternalLink *allocateMapLink() = 0; 632f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void releaseMapLink( ValueInternalLink *link ) = 0; 633f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 634f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 635f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief ValueInternalMap hash-map bucket chain link (for internal use only). 636f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \internal previous_ & next_ allows for bidirectional traversal. 637f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 638f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class JSON_API ValueInternalLink 639f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 640f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 641f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III enum { itemPerLink = 6 }; // sizeof(ValueInternalLink) = 128 on 32 bits architecture. 642f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III enum InternalFlags { 643f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III flagAvailable = 0, 644f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III flagUsed = 1 645f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 646f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 647f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalLink(); 648f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 649f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ~ValueInternalLink(); 650f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 651f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value items_[itemPerLink]; 652f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III char *keys_[itemPerLink]; 653f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalLink *previous_; 654f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalLink *next_; 655f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 656f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 657f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 658f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief A linked page based hash-table implementation used internally by Value. 659f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \internal ValueInternalMap is a tradional bucket based hash-table, with a linked 660f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * list in each bucket to handle collision. There is an addional twist in that 661f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * each node of the collision linked list is a page containing a fixed amount of 662f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * value. This provides a better compromise between memory usage and speed. 663f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * 664f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Each bucket is made up of a chained list of ValueInternalLink. The last 665f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * link of a given bucket can be found in the 'previous_' field of the following bucket. 666f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * The last link of the last bucket is stored in tailLink_ as it has no following bucket. 667f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Only the last link of a bucket may contains 'available' item. The last link always 668f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * contains at least one element unless is it the bucket one very first link. 669f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 670f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class JSON_API ValueInternalMap 671f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 672f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III friend class ValueIteratorBase; 673f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III friend class Value; 674f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 675f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef unsigned int HashKey; 676f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef unsigned int BucketIndex; 677f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 678f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 679f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III struct IteratorState 680f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 681f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III IteratorState() 682f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III : map_(0) 683f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III , link_(0) 684f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III , itemIndex_(0) 685f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III , bucketIndex_(0) 686f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 687f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 688f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalMap *map_; 689f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalLink *link_; 690f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III BucketIndex itemIndex_; 691f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III BucketIndex bucketIndex_; 692f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 693f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 694f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 695f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalMap(); 696f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalMap( const ValueInternalMap &other ); 697f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalMap &operator =( const ValueInternalMap &other ); 698f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ~ValueInternalMap(); 699f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 700f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void swap( ValueInternalMap &other ); 701f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 702f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III BucketIndex size() const; 703f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 704f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void clear(); 705f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 706f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool reserveDelta( BucketIndex growth ); 707f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 708f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool reserve( BucketIndex newItemCount ); 709f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 710f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const Value *find( const char *key ) const; 711f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 712f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value *find( const char *key ); 713f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 714f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &resolveReference( const char *key, 715f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isStatic ); 716f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 717f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void remove( const char *key ); 718f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 719f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void doActualRemove( ValueInternalLink *link, 720f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III BucketIndex index, 721f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III BucketIndex bucketIndex ); 722f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 723f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalLink *&getLastLinkInBucket( BucketIndex bucketIndex ); 724f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 725f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &setNewItem( const char *key, 726f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isStatic, 727f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalLink *link, 728f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III BucketIndex index ); 729f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 730f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &unsafeAdd( const char *key, 731f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isStatic, 732f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III HashKey hashedKey ); 733f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 734f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III HashKey hash( const char *key ) const; 735f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 736f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III int compare( const ValueInternalMap &other ) const; 737f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 738f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 739f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void makeBeginIterator( IteratorState &it ) const; 740f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void makeEndIterator( IteratorState &it ) const; 741f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static bool equals( const IteratorState &x, const IteratorState &other ); 742f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static void increment( IteratorState &iterator ); 743f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static void incrementBucket( IteratorState &iterator ); 744f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static void decrement( IteratorState &iterator ); 745f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static const char *key( const IteratorState &iterator ); 746f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static const char *key( const IteratorState &iterator, bool &isStatic ); 747f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static Value &value( const IteratorState &iterator ); 748f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static int distance( const IteratorState &x, const IteratorState &y ); 749f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 750f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 751f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalLink *buckets_; 752f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalLink *tailLink_; 753f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III BucketIndex bucketsSize_; 754f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III BucketIndex itemCount_; 755f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 756f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 757f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief A simplified deque implementation used internally by Value. 758f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \internal 759f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * It is based on a list of fixed "page", each page contains a fixed number of items. 760f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Instead of using a linked-list, a array of pointer is used for fast item look-up. 761f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Look-up for an element is as follow: 762f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - compute page index: pageIndex = itemIndex / itemsPerPage 763f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * - look-up item in page: pages_[pageIndex][itemIndex % itemsPerPage] 764f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * 765f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Insertion is amortized constant time (only the array containing the index of pointers 766f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * need to be reallocated when items are appended). 767f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 768f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class JSON_API ValueInternalArray 769f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 770f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III friend class Value; 771f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III friend class ValueIteratorBase; 772f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 773f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III enum { itemsPerPage = 8 }; // should be a power of 2 for fast divide and modulo. 774f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef Value::ArrayIndex ArrayIndex; 775f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef unsigned int PageIndex; 776f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 777f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 778f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III struct IteratorState // Must be a POD 779f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 780f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III IteratorState() 781f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III : array_(0) 782f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III , currentPageIndex_(0) 783f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III , currentItemIndex_(0) 784f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 785f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 786f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalArray *array_; 787f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value **currentPageIndex_; 788f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III unsigned int currentItemIndex_; 789f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 790f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 791f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 792f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalArray(); 793f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalArray( const ValueInternalArray &other ); 794f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalArray &operator =( const ValueInternalArray &other ); 795f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ~ValueInternalArray(); 796f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void swap( ValueInternalArray &other ); 797f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 798f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void clear(); 799f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void resize( ArrayIndex newSize ); 800f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 801f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &resolveReference( ArrayIndex index ); 802f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 803f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value *find( ArrayIndex index ) const; 804f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 805f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ArrayIndex size() const; 806f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 807f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III int compare( const ValueInternalArray &other ) const; 808f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 809f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 810f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static bool equals( const IteratorState &x, const IteratorState &other ); 811f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static void increment( IteratorState &iterator ); 812f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static void decrement( IteratorState &iterator ); 813f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static Value &dereference( const IteratorState &iterator ); 814f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static Value &unsafeDereference( const IteratorState &iterator ); 815f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static int distance( const IteratorState &x, const IteratorState &y ); 816f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static ArrayIndex indexOf( const IteratorState &iterator ); 817f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void makeBeginIterator( IteratorState &it ) const; 818f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void makeEndIterator( IteratorState &it ) const; 819f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void makeIterator( IteratorState &it, ArrayIndex index ) const; 820f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 821f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void makeIndexValid( ArrayIndex index ); 822f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 823f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value **pages_; 824f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ArrayIndex size_; 825f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III PageIndex pageCount_; 826f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 827f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 828f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Experimental: do not use. Allocator to customize Value internal array. 829f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Below is an example of a simple implementation (actual implementation use 830f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * memory pool). 831f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III \code 832f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIclass DefaultValueArrayAllocator : public ValueArrayAllocator 833f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{ 834f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIpublic: // overridden from ValueArrayAllocator 835f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ~DefaultValueArrayAllocator() 836f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 837f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 838f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 839f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ValueInternalArray *newArray() 840f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 841f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return new ValueInternalArray(); 842f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 843f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 844f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) 845f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 846f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return new ValueInternalArray( other ); 847f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 848f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 849f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void destruct( ValueInternalArray *array ) 850f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 851f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III delete array; 852f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 853f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 854f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void reallocateArrayPageIndex( Value **&indexes, 855f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalArray::PageIndex &indexCount, 856f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalArray::PageIndex minNewIndexCount ) 857f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 858f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1; 859f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III if ( minNewIndexCount > newIndexCount ) 860f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III newIndexCount = minNewIndexCount; 861f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount ); 862f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III if ( !newIndexes ) 863f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III throw std::bad_alloc(); 864f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III indexCount = newIndexCount; 865f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III indexes = static_cast<Value **>( newIndexes ); 866f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 867f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void releaseArrayPageIndex( Value **indexes, 868f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalArray::PageIndex indexCount ) 869f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 870f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III if ( indexes ) 871f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III free( indexes ); 872f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 873f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 874f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual Value *allocateArrayPage() 875f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 876f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return static_cast<Value *>( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) ); 877f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 878f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 879f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void releaseArrayPage( Value *value ) 880f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 881f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III if ( value ) 882f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III free( value ); 883f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 884f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}; 885f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III \endcode 886f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 887f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class JSON_API ValueArrayAllocator 888f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 889f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 890f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ~ValueArrayAllocator(); 891f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ValueInternalArray *newArray() = 0; 892f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) = 0; 893f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void destructArray( ValueInternalArray *array ) = 0; 894f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Reallocate array page index. 895f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Reallocates an array of pointer on each page. 896f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \param indexes [input] pointer on the current index. May be \c NULL. 897f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * [output] pointer on the new index of at least 898f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \a minNewIndexCount pages. 899f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \param indexCount [input] current number of pages in the index. 900f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * [output] number of page the reallocated index can handle. 901f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \b MUST be >= \a minNewIndexCount. 902f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \param minNewIndexCount Minimum number of page the new index must be able to 903f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * handle. 904f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 905f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void reallocateArrayPageIndex( Value **&indexes, 906f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalArray::PageIndex &indexCount, 907f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalArray::PageIndex minNewIndexCount ) = 0; 908f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void releaseArrayPageIndex( Value **indexes, 909f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalArray::PageIndex indexCount ) = 0; 910f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual Value *allocateArrayPage() = 0; 911f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void releaseArrayPage( Value *value ) = 0; 912f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 913f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP 914f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 915f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 916f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief base class for Value iterators. 917f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * 918f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 919f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class ValueIteratorBase 920f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 921f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 922f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef unsigned int size_t; 923f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef int difference_type; 924f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef ValueIteratorBase SelfType; 925f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 926f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueIteratorBase(); 927f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP 928f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III explicit ValueIteratorBase( const Value::ObjectValues::iterator ¤t ); 929f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else 930f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueIteratorBase( const ValueInternalArray::IteratorState &state ); 931f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueIteratorBase( const ValueInternalMap::IteratorState &state ); 932f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif 933f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 934f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool operator ==( const SelfType &other ) const 935f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 936f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return isEqual( other ); 937f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 938f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 939f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool operator !=( const SelfType &other ) const 940f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 941f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return !isEqual( other ); 942f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 943f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 944f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III difference_type operator -( const SelfType &other ) const 945f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 946f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return computeDistance( other ); 947f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 948f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 949f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Return either the index or the member name of the referenced value as a Value. 950f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value key() const; 951f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 952f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Return the index of the referenced Value. -1 if it is not an arrayValue. 953f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III UInt index() const; 954f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 955f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Return the member name of the referenced Value. "" if it is not an objectValue. 956f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const char *memberName() const; 957f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 958f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III protected: 959f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &deref() const; 960f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 961f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void increment(); 962f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 963f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void decrement(); 964f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 965f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III difference_type computeDistance( const SelfType &other ) const; 966f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 967f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isEqual( const SelfType &other ) const; 968f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 969f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void copy( const SelfType &other ); 970f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 971f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 972f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP 973f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value::ObjectValues::iterator current_; 974f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III // Indicates that iterator is for a null value. 975f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isNull_; 976f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else 977f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III union 978f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 979f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalArray::IteratorState array_; 980f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueInternalMap::IteratorState map_; 981f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } iterator_; 982f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool isArray_; 983f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif 984f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 985f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 986f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief const iterator for object and array value. 987f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * 988f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 989f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class ValueConstIterator : public ValueIteratorBase 990f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 991f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III friend class Value; 992f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 993f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef unsigned int size_t; 994f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef int difference_type; 995f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef const Value &reference; 996f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef const Value *pointer; 997f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef ValueConstIterator SelfType; 998f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 999f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueConstIterator(); 1000f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 1001f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /*! \internal Use by Value to create an iterator. 1002f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 1003f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP 1004f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III explicit ValueConstIterator( const Value::ObjectValues::iterator ¤t ); 1005f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else 1006f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueConstIterator( const ValueInternalArray::IteratorState &state ); 1007f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueConstIterator( const ValueInternalMap::IteratorState &state ); 1008f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif 1009f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 1010f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III SelfType &operator =( const ValueIteratorBase &other ); 1011f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1012f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III SelfType operator++( int ) 1013f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 1014f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III SelfType temp( *this ); 1015f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ++*this; 1016f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return temp; 1017f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 1018f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1019f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III SelfType operator--( int ) 1020f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 1021f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III SelfType temp( *this ); 1022f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III --*this; 1023f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return temp; 1024f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 1025f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1026f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III SelfType &operator--() 1027f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 1028f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III decrement(); 1029f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return *this; 1030f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 1031f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1032f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III SelfType &operator++() 1033f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 1034f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III increment(); 1035f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return *this; 1036f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 1037f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1038f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III reference operator *() const 1039f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 1040f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return deref(); 1041f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 1042f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 1043f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1044f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1045f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Iterator for object and array value. 1046f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 1047f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class ValueIterator : public ValueIteratorBase 1048f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 1049f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III friend class Value; 1050f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 1051f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef unsigned int size_t; 1052f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef int difference_type; 1053f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef Value &reference; 1054f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef Value *pointer; 1055f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef ValueIterator SelfType; 1056f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1057f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueIterator(); 1058f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueIterator( const ValueConstIterator &other ); 1059f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueIterator( const ValueIterator &other ); 1060f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 1061f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /*! \internal Use by Value to create an iterator. 1062f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 1063f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP 1064f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III explicit ValueIterator( const Value::ObjectValues::iterator ¤t ); 1065f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else 1066f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueIterator( const ValueInternalArray::IteratorState &state ); 1067f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ValueIterator( const ValueInternalMap::IteratorState &state ); 1068f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif 1069f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 1070f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1071f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III SelfType &operator =( const SelfType &other ); 1072f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1073f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III SelfType operator++( int ) 1074f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 1075f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III SelfType temp( *this ); 1076f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III ++*this; 1077f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return temp; 1078f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 1079f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1080f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III SelfType operator--( int ) 1081f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 1082f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III SelfType temp( *this ); 1083f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III --*this; 1084f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return temp; 1085f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 1086f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1087f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III SelfType &operator--() 1088f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 1089f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III decrement(); 1090f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return *this; 1091f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 1092f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1093f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III SelfType &operator++() 1094f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 1095f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III increment(); 1096f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return *this; 1097f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 1098f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1099f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III reference operator *() const 1100f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 1101f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return deref(); 1102f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 1103f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 1104f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1105f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1106f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III} // namespace Json 1107f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1108f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 1109f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // CPPTL_JSON_H_INCLUDED 1110