18fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III// Copyright 2007-2010 Baptiste Lepilleur 28fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III// Distributed under MIT license, or public domain if desired and 38fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III// recognized in your jurisdiction. 48fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE 58fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 68fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#ifndef CPPTL_JSON_H_INCLUDED 78fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# define CPPTL_JSON_H_INCLUDED 88fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 98fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#if !defined(JSON_IS_AMALGAMATION) 108fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# include "json/forwards.h" 118fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#endif // if !defined(JSON_IS_AMALGAMATION) 128fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# include <string> 138fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# include <vector> 148fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 158fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# ifndef JSON_USE_CPPTL_SMALLMAP 168fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# include <map> 178fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# else 188fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# include <cpptl/smallmap.h> 198fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# endif 208fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# ifdef JSON_USE_CPPTL 218fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# include <cpptl/forwards.h> 228fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# endif 238fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 248fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III/** \brief JSON (JavaScript Object Notation). 258fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 268fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins IIInamespace Json { 278fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 288fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief Type of the value held by a Value object. 298fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 308fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III enum ValueType 318fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 328fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III nullValue = 0, ///< 'null' value 338fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III intValue, ///< signed integer value 348fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III uintValue, ///< unsigned integer value 358fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III realValue, ///< double value 368fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III stringValue, ///< UTF-8 string value 378fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III booleanValue, ///< bool value 388fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III arrayValue, ///< array value (ordered list) 398fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III objectValue ///< object value (collection of name/value pairs). 408fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 418fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 428fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III enum CommentPlacement 438fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 448fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III commentBefore = 0, ///< a comment placed on the line before a value 458fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III commentAfterOnSameLine, ///< a comment just after a value on the same line 468fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III commentAfter, ///< a comment on the line after a value (only make sense for root value) 478fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III numberOfCommentPlacement 488fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 498fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 508fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III//# ifdef JSON_USE_CPPTL 518fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III// typedef CppTL::AnyEnumerator<const char *> EnumMemberNames; 528fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III// typedef CppTL::AnyEnumerator<const Value &> EnumValues; 538fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III//# endif 548fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 558fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief Lightweight wrapper to tag static string. 568fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * 578fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Value constructor and objectValue member assignement takes advantage of the 588fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * StaticString and avoid the cost of string duplication when storing the 598fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * string or the member name. 608fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * 618fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Example of usage: 628fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \code 638fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Json::Value aValue( StaticString("some text") ); 648fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Json::Value object; 658fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * static const StaticString code("code"); 668fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * object[code] = 1234; 678fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \endcode 688fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 698fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III class JSON_API StaticString 708fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 718fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 728fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III explicit StaticString( const char *czstring ) 738fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III : str_( czstring ) 748fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 758fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 768fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 778fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III operator const char *() const 788fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 798fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return str_; 808fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 818fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 828fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const char *c_str() const 838fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 848fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return str_; 858fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 868fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 878fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III private: 888fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const char *str_; 898fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 908fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 918fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief Represents a <a HREF="http://www.json.org">JSON</a> value. 928fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * 938fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * This class is a discriminated union wrapper that can represents a: 948fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - signed integer [range: Value::minInt - Value::maxInt] 958fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - unsigned integer (range: 0 - Value::maxUInt) 968fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - double 978fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - UTF-8 string 988fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - boolean 998fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - 'null' 1008fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - an ordered list of Value 1018fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - collection of name/value pairs (javascript object) 1028fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * 1038fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * The type of the held value is represented by a #ValueType and 1048fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * can be obtained using type(). 1058fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * 1068fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * values of an #objectValue or #arrayValue can be accessed using operator[]() methods. 1078fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Non const methods will automatically create the a #nullValue element 1088fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * if it does not exist. 1098fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * The sequence of an #arrayValue will be automatically resize and initialized 1108fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue. 1118fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * 1128fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * The get() methods can be used to obtanis default value in the case the required element 1138fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * does not exist. 1148fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * 1158fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * It is possible to iterate over the list of a #objectValue values using 1168fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * the getMemberNames() method. 1178fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 1188fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III class JSON_API Value 1198fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 1208fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III friend class ValueIteratorBase; 1218fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP 1228fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III friend class ValueInternalLink; 1238fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III friend class ValueInternalMap; 1248fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# endif 1258fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 1268fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef std::vector<std::string> Members; 1278fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef ValueIterator iterator; 1288fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef ValueConstIterator const_iterator; 1298fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef Json::UInt UInt; 1308fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef Json::Int Int; 1318fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# if defined(JSON_HAS_INT64) 1328fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef Json::UInt64 UInt64; 1338fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef Json::Int64 Int64; 1348fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#endif // defined(JSON_HAS_INT64) 1358fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef Json::LargestInt LargestInt; 1368fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef Json::LargestUInt LargestUInt; 1378fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef Json::ArrayIndex ArrayIndex; 1388fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 1398fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static const Value& null; 1408fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Minimum signed integer value that can be stored in a Json::Value. 1418fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static const LargestInt minLargestInt; 1428fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Maximum signed integer value that can be stored in a Json::Value. 1438fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static const LargestInt maxLargestInt; 1448fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Maximum unsigned integer value that can be stored in a Json::Value. 1458fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static const LargestUInt maxLargestUInt; 1468fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 1478fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Minimum signed int value that can be stored in a Json::Value. 1488fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static const Int minInt; 1498fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Maximum signed int value that can be stored in a Json::Value. 1508fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static const Int maxInt; 1518fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Maximum unsigned int value that can be stored in a Json::Value. 1528fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static const UInt maxUInt; 1538fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 1548fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# if defined(JSON_HAS_INT64) 1558fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Minimum signed 64 bits int value that can be stored in a Json::Value. 1568fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static const Int64 minInt64; 1578fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Maximum signed 64 bits int value that can be stored in a Json::Value. 1588fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static const Int64 maxInt64; 1598fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Maximum unsigned 64 bits int value that can be stored in a Json::Value. 1608fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static const UInt64 maxUInt64; 1618fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#endif // defined(JSON_HAS_INT64) 1628fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 1638fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III private: 1648fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 1658fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# ifndef JSON_VALUE_USE_INTERNAL_MAP 1668fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III class CZString 1678fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 1688fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 1698fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III enum DuplicationPolicy 1708fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 1718fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III noDuplication = 0, 1728fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III duplicate, 1738fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III duplicateOnCopy 1748fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 1758fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III CZString( ArrayIndex index ); 1768fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III CZString( const char *cstr, DuplicationPolicy allocate ); 1778fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III CZString( const CZString &other ); 1788fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ~CZString(); 1798fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III CZString &operator =( const CZString &other ); 1808fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool operator<( const CZString &other ) const; 1818fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool operator==( const CZString &other ) const; 1828fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ArrayIndex index() const; 1838fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const char *c_str() const; 1848fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isStaticString() const; 1858fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III private: 1868fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void swap( CZString &other ); 1878fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const char *cstr_; 1888fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ArrayIndex index_; 1898fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 1908fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 1918fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 1928fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# ifndef JSON_USE_CPPTL_SMALLMAP 1938fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef std::map<CZString, Value> ObjectValues; 1948fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# else 1958fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef CppTL::SmallMap<CZString, Value> ObjectValues; 1968fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# endif // ifndef JSON_USE_CPPTL_SMALLMAP 1978fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# endif // ifndef JSON_VALUE_USE_INTERNAL_MAP 1988fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 1998fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 2008fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 2018fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief Create a default Value of the given type. 2028fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 2038fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III This is a very useful constructor. 2048fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III To create an empty array, pass arrayValue. 2058fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III To create an empty object, pass objectValue. 2068fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Another Value can then be set to this one by assignment. 2078fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III This is useful since clear() and resize() will not alter types. 2088fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 2098fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Examples: 2108fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III \code 2118fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Json::Value null_value; // null 2128fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Json::Value arr_value(Json::arrayValue); // [] 2138fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Json::Value obj_value(Json::objectValue); // {} 2148fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III \endcode 2158fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 2168fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value( ValueType type = nullValue ); 2178fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value( Int value ); 2188fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value( UInt value ); 2198fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#if defined(JSON_HAS_INT64) 2208fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value( Int64 value ); 2218fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value( UInt64 value ); 2228fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#endif // if defined(JSON_HAS_INT64) 2238fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value( double value ); 2248fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value( const char *value ); 2258fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value( const char *beginValue, const char *endValue ); 2268fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief Constructs a value from a static string. 2278fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 2288fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Like other value string constructor but do not duplicate the string for 2298fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * internal storage. The given string must remain alive after the call to this 2308fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * constructor. 2318fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Example of usage: 2328fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \code 2338fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Json::Value aValue( StaticString("some text") ); 2348fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \endcode 2358fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 2368fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value( const StaticString &value ); 2378fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value( const std::string &value ); 2388fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# ifdef JSON_USE_CPPTL 2398fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value( const CppTL::ConstString &value ); 2408fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# endif 2418fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value( bool value ); 2428fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value( const Value &other ); 2438fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ~Value(); 2448fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 2458fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value &operator=( const Value &other ); 2468fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Swap values. 2478fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// \note Currently, comments are intentionally not swapped, for 2488fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// both logic and efficiency. 2498fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void swap( Value &other ); 2508fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 2518fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueType type() const; 2528fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 2538fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool operator <( const Value &other ) const; 2548fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool operator <=( const Value &other ) const; 2558fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool operator >=( const Value &other ) const; 2568fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool operator >( const Value &other ) const; 2578fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 2588fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool operator ==( const Value &other ) const; 2598fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool operator !=( const Value &other ) const; 2608fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 2618fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III int compare( const Value &other ) const; 2628fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 2638fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const char *asCString() const; 2648fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III std::string asString() const; 2658fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# ifdef JSON_USE_CPPTL 2668fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III CppTL::ConstString asConstString() const; 2678fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# endif 2688fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Int asInt() const; 2698fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III UInt asUInt() const; 2708fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#if defined(JSON_HAS_INT64) 2718fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Int64 asInt64() const; 2728fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III UInt64 asUInt64() const; 2738fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#endif // if defined(JSON_HAS_INT64) 2748fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III LargestInt asLargestInt() const; 2758fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III LargestUInt asLargestUInt() const; 2768fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III float asFloat() const; 2778fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III double asDouble() const; 2788fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool asBool() const; 2798fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 2808fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isNull() const; 2818fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isBool() const; 2828fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isInt() const; 2838fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isInt64() const; 2848fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isUInt() const; 2858fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isUInt64() const; 2868fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isIntegral() const; 2878fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isDouble() const; 2888fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isNumeric() const; 2898fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isString() const; 2908fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isArray() const; 2918fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isObject() const; 2928fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 2938fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isConvertibleTo( ValueType other ) const; 2948fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 2958fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Number of values in array or object 2968fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ArrayIndex size() const; 2978fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 2988fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// \brief Return true if empty array, empty object, or null; 2998fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// otherwise, false. 3008fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool empty() const; 3018fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 3028fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Return isNull() 3038fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool operator!() const; 3048fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 3058fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Remove all object members and array elements. 3068fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// \pre type() is arrayValue, objectValue, or nullValue 3078fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// \post type() is unchanged 3088fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void clear(); 3098fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 3108fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Resize the array to size elements. 3118fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// New elements are initialized to null. 3128fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// May only be called on nullValue or arrayValue. 3138fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// \pre type() is arrayValue or nullValue 3148fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// \post type() is arrayValue 3158fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void resize( ArrayIndex size ); 3168fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 3178fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Access an array element (zero based index ). 3188fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// If the array contains less than index element, then null value are inserted 3198fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// in the array so that its size is index+1. 3208fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// (You may need to say 'value[0u]' to get your compiler to distinguish 3218fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// this from the operator[] which takes a string.) 3228fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value &operator[]( ArrayIndex index ); 3238fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 3248fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Access an array element (zero based index ). 3258fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// If the array contains less than index element, then null value are inserted 3268fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// in the array so that its size is index+1. 3278fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// (You may need to say 'value[0u]' to get your compiler to distinguish 3288fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// this from the operator[] which takes a string.) 3298fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value &operator[]( int index ); 3308fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 3318fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Access an array element (zero based index ) 3328fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// (You may need to say 'value[0u]' to get your compiler to distinguish 3338fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// this from the operator[] which takes a string.) 3348fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const Value &operator[]( ArrayIndex index ) const; 3358fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 3368fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Access an array element (zero based index ) 3378fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// (You may need to say 'value[0u]' to get your compiler to distinguish 3388fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// this from the operator[] which takes a string.) 3398fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const Value &operator[]( int index ) const; 3408fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 3418fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// If the array contains at least index+1 elements, returns the element value, 3428fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// otherwise returns defaultValue. 3438fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value get( ArrayIndex index, 3448fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const Value &defaultValue ) const; 3458fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Return true if index < size(). 3468fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isValidIndex( ArrayIndex index ) const; 3478fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// \brief Append value to array at the end. 3488fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// 3498fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Equivalent to jsonvalue[jsonvalue.size()] = value; 3508fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value &append( const Value &value ); 3518fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 3528fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Access an object value by name, create a null member if it does not exist. 3538fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value &operator[]( const char *key ); 3548fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Access an object value by name, returns null if there is no member with that name. 3558fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const Value &operator[]( const char *key ) const; 3568fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Access an object value by name, create a null member if it does not exist. 3578fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value &operator[]( const std::string &key ); 3588fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Access an object value by name, returns null if there is no member with that name. 3598fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const Value &operator[]( const std::string &key ) const; 3608fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief Access an object value by name, create a null member if it does not exist. 3618fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 3628fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * If the object as no entry for that name, then the member name used to store 3638fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * the new entry is not duplicated. 3648fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Example of use: 3658fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \code 3668fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Json::Value object; 3678fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * static const StaticString code("code"); 3688fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * object[code] = 1234; 3698fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \endcode 3708fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 3718fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value &operator[]( const StaticString &key ); 3728fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# ifdef JSON_USE_CPPTL 3738fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Access an object value by name, create a null member if it does not exist. 3748fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value &operator[]( const CppTL::ConstString &key ); 3758fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Access an object value by name, returns null if there is no member with that name. 3768fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const Value &operator[]( const CppTL::ConstString &key ) const; 3778fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# endif 3788fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Return the member named key if it exist, defaultValue otherwise. 3798fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value get( const char *key, 3808fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const Value &defaultValue ) const; 3818fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Return the member named key if it exist, defaultValue otherwise. 3828fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value get( const std::string &key, 3838fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const Value &defaultValue ) const; 3848fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# ifdef JSON_USE_CPPTL 3858fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Return the member named key if it exist, defaultValue otherwise. 3868fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value get( const CppTL::ConstString &key, 3878fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const Value &defaultValue ) const; 3888fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# endif 3898fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// \brief Remove and return the named member. 3908fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// 3918fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Do nothing if it did not exist. 3928fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// \return the removed Value, or null. 3938fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// \pre type() is objectValue or nullValue 3948fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// \post type() is unchanged 3958fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value removeMember( const char* key ); 3968fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Same as removeMember(const char*) 3978fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value removeMember( const std::string &key ); 3988fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 3998fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Return true if the object has a member named key. 4008fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isMember( const char *key ) const; 4018fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Return true if the object has a member named key. 4028fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isMember( const std::string &key ) const; 4038fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# ifdef JSON_USE_CPPTL 4048fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Return true if the object has a member named key. 4058fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isMember( const CppTL::ConstString &key ) const; 4068fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# endif 4078fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4088fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// \brief Return a list of the member names. 4098fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// 4108fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// If null, return an empty list. 4118fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// \pre type() is objectValue or nullValue 4128fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// \post if type() was nullValue, it remains nullValue 4138fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Members getMemberNames() const; 4148fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4158fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III//# ifdef JSON_USE_CPPTL 4168fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III// EnumMemberNames enumMemberNames() const; 4178fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III// EnumValues enumValues() const; 4188fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III//# endif 4198fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4208fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Comments must be //... or /* ... */ 4218fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void setComment( const char *comment, 4228fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III CommentPlacement placement ); 4238fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Comments must be //... or /* ... */ 4248fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void setComment( const std::string &comment, 4258fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III CommentPlacement placement ); 4268fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool hasComment( CommentPlacement placement ) const; 4278fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Include delimiters and embedded newlines. 4288fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III std::string getComment( CommentPlacement placement ) const; 4298fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4308fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III std::string toStyledString() const; 4318fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4328fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const_iterator begin() const; 4338fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const_iterator end() const; 4348fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4358fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III iterator begin(); 4368fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III iterator end(); 4378fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4388fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III private: 4398fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value &resolveReference( const char *key, 4408fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isStatic ); 4418fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4428fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP 4438fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III inline bool isItemAvailable() const 4448fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 4458fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return itemIsUsed_ == 0; 4468fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 4478fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4488fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III inline void setItemUsed( bool isUsed = true ) 4498fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 4508fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III itemIsUsed_ = isUsed ? 1 : 0; 4518fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 4528fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4538fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III inline bool isMemberNameStatic() const 4548fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 4558fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return memberNameIsStatic_ == 0; 4568fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 4578fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4588fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III inline void setMemberNameIsStatic( bool isStatic ) 4598fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 4608fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III memberNameIsStatic_ = isStatic ? 1 : 0; 4618fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 4628fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# endif // # ifdef JSON_VALUE_USE_INTERNAL_MAP 4638fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4648fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III private: 4658fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III struct CommentInfo 4668fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 4678fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III CommentInfo(); 4688fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ~CommentInfo(); 4698fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4708fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void setComment( const char *text ); 4718fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4728fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III char *comment_; 4738fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 4748fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4758fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III //struct MemberNamesTransform 4768fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III //{ 4778fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III // typedef const char *result_type; 4788fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III // const char *operator()( const CZString &name ) const 4798fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III // { 4808fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III // return name.c_str(); 4818fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III // } 4828fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III //}; 4838fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 4848fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III union ValueHolder 4858fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 4868fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III LargestInt int_; 4878fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III LargestUInt uint_; 4888fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III double real_; 4898fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool bool_; 4908fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III char *string_; 4918fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP 4928fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalArray *array_; 4938fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalMap *map_; 4948fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#else 4958fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ObjectValues *map_; 4968fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# endif 4978fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } value_; 4988fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueType type_ : 8; 4998fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III int allocated_ : 1; // Notes: if declared as bool, bitfield is useless. 5008fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP 5018fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III unsigned int itemIsUsed_ : 1; // used by the ValueInternalMap container. 5028fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III int memberNameIsStatic_ : 1; // used by the ValueInternalMap container. 5038fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# endif 5048fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III CommentInfo *comments_; 5058fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 5068fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 5078fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 5088fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief Experimental and untested: represents an element of the "path" to access a node. 5098fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 5108fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III class PathArgument 5118fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 5128fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 5138fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III friend class Path; 5148fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 5158fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III PathArgument(); 5168fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III PathArgument( ArrayIndex index ); 5178fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III PathArgument( const char *key ); 5188fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III PathArgument( const std::string &key ); 5198fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 5208fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III private: 5218fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III enum Kind 5228fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 5238fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III kindNone = 0, 5248fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III kindIndex, 5258fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III kindKey 5268fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 5278fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III std::string key_; 5288fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ArrayIndex index_; 5298fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Kind kind_; 5308fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 5318fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 5328fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief Experimental and untested: represents a "path" to access a node. 5338fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * 5348fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Syntax: 5358fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - "." => root node 5368fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - ".[n]" => elements at index 'n' of root node (an array value) 5378fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - ".name" => member named 'name' of root node (an object value) 5388fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - ".name1.name2.name3" 5398fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - ".[0][1][2].name1[3]" 5408fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - ".%" => member name is provided as parameter 5418fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - ".[%]" => index is provied as parameter 5428fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 5438fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III class Path 5448fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 5458fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 5468fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Path( const std::string &path, 5478fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const PathArgument &a1 = PathArgument(), 5488fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const PathArgument &a2 = PathArgument(), 5498fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const PathArgument &a3 = PathArgument(), 5508fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const PathArgument &a4 = PathArgument(), 5518fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const PathArgument &a5 = PathArgument() ); 5528fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 5538fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const Value &resolve( const Value &root ) const; 5548fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value resolve( const Value &root, 5558fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const Value &defaultValue ) const; 5568fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Creates the "path" to access the specified node and returns a reference on the node. 5578fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value &make( Value &root ) const; 5588fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 5598fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III private: 5608fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef std::vector<const PathArgument *> InArgs; 5618fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef std::vector<PathArgument> Args; 5628fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 5638fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void makePath( const std::string &path, 5648fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const InArgs &in ); 5658fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void addPathInArg( const std::string &path, 5668fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const InArgs &in, 5678fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III InArgs::const_iterator &itInArg, 5688fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III PathArgument::Kind kind ); 5698fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void invalidPath( const std::string &path, 5708fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III int location ); 5718fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 5728fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Args args_; 5738fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 5748fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 5758fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 5768fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 5778fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#ifdef JSON_VALUE_USE_INTERNAL_MAP 5788fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief Allocator to customize Value internal map. 5798fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Below is an example of a simple implementation (default implementation actually 5808fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * use memory pool for speed). 5818fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \code 5828fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III class DefaultValueMapAllocator : public ValueMapAllocator 5838fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 5848fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: // overridden from ValueMapAllocator 5858fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual ValueInternalMap *newMap() 5868fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 5878fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return new ValueInternalMap(); 5888fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 5898fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 5908fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) 5918fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 5928fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return new ValueInternalMap( other ); 5938fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 5948fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 5958fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual void destructMap( ValueInternalMap *map ) 5968fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 5978fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III delete map; 5988fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 5998fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 6008fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) 6018fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 6028fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return new ValueInternalLink[size]; 6038fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 6048fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 6058fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual void releaseMapBuckets( ValueInternalLink *links ) 6068fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 6078fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III delete [] links; 6088fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 6098fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 6108fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual ValueInternalLink *allocateMapLink() 6118fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 6128fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return new ValueInternalLink(); 6138fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 6148fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 6158fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual void releaseMapLink( ValueInternalLink *link ) 6168fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 6178fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III delete link; 6188fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 6198fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 6208fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \endcode 6218fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 6228fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III class JSON_API ValueMapAllocator 6238fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 6248fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 6258fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual ~ValueMapAllocator(); 6268fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual ValueInternalMap *newMap() = 0; 6278fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) = 0; 6288fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual void destructMap( ValueInternalMap *map ) = 0; 6298fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) = 0; 6308fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual void releaseMapBuckets( ValueInternalLink *links ) = 0; 6318fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual ValueInternalLink *allocateMapLink() = 0; 6328fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual void releaseMapLink( ValueInternalLink *link ) = 0; 6338fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 6348fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 6358fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief ValueInternalMap hash-map bucket chain link (for internal use only). 6368fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \internal previous_ & next_ allows for bidirectional traversal. 6378fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 6388fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III class JSON_API ValueInternalLink 6398fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 6408fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 6418fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III enum { itemPerLink = 6 }; // sizeof(ValueInternalLink) = 128 on 32 bits architecture. 6428fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III enum InternalFlags { 6438fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III flagAvailable = 0, 6448fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III flagUsed = 1 6458fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 6468fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 6478fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalLink(); 6488fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 6498fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ~ValueInternalLink(); 6508fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 6518fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value items_[itemPerLink]; 6528fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III char *keys_[itemPerLink]; 6538fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalLink *previous_; 6548fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalLink *next_; 6558fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 6568fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 6578fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 6588fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief A linked page based hash-table implementation used internally by Value. 6598fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \internal ValueInternalMap is a tradional bucket based hash-table, with a linked 6608fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * list in each bucket to handle collision. There is an addional twist in that 6618fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * each node of the collision linked list is a page containing a fixed amount of 6628fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * value. This provides a better compromise between memory usage and speed. 6638fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * 6648fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Each bucket is made up of a chained list of ValueInternalLink. The last 6658fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * link of a given bucket can be found in the 'previous_' field of the following bucket. 6668fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * The last link of the last bucket is stored in tailLink_ as it has no following bucket. 6678fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Only the last link of a bucket may contains 'available' item. The last link always 6688fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * contains at least one element unless is it the bucket one very first link. 6698fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 6708fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III class JSON_API ValueInternalMap 6718fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 6728fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III friend class ValueIteratorBase; 6738fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III friend class Value; 6748fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 6758fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef unsigned int HashKey; 6768fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef unsigned int BucketIndex; 6778fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 6788fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 6798fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III struct IteratorState 6808fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 6818fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III IteratorState() 6828fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III : map_(0) 6838fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III , link_(0) 6848fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III , itemIndex_(0) 6858fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III , bucketIndex_(0) 6868fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 6878fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 6888fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalMap *map_; 6898fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalLink *link_; 6908fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III BucketIndex itemIndex_; 6918fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III BucketIndex bucketIndex_; 6928fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 6938fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 6948fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 6958fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalMap(); 6968fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalMap( const ValueInternalMap &other ); 6978fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalMap &operator =( const ValueInternalMap &other ); 6988fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ~ValueInternalMap(); 6998fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7008fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void swap( ValueInternalMap &other ); 7018fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7028fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III BucketIndex size() const; 7038fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7048fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void clear(); 7058fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7068fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool reserveDelta( BucketIndex growth ); 7078fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7088fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool reserve( BucketIndex newItemCount ); 7098fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7108fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const Value *find( const char *key ) const; 7118fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7128fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value *find( const char *key ); 7138fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7148fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value &resolveReference( const char *key, 7158fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isStatic ); 7168fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7178fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void remove( const char *key ); 7188fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7198fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void doActualRemove( ValueInternalLink *link, 7208fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III BucketIndex index, 7218fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III BucketIndex bucketIndex ); 7228fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7238fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalLink *&getLastLinkInBucket( BucketIndex bucketIndex ); 7248fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7258fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value &setNewItem( const char *key, 7268fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isStatic, 7278fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalLink *link, 7288fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III BucketIndex index ); 7298fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7308fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value &unsafeAdd( const char *key, 7318fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isStatic, 7328fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III HashKey hashedKey ); 7338fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7348fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III HashKey hash( const char *key ) const; 7358fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7368fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III int compare( const ValueInternalMap &other ) const; 7378fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7388fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III private: 7398fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void makeBeginIterator( IteratorState &it ) const; 7408fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void makeEndIterator( IteratorState &it ) const; 7418fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static bool equals( const IteratorState &x, const IteratorState &other ); 7428fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static void increment( IteratorState &iterator ); 7438fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static void incrementBucket( IteratorState &iterator ); 7448fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static void decrement( IteratorState &iterator ); 7458fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static const char *key( const IteratorState &iterator ); 7468fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static const char *key( const IteratorState &iterator, bool &isStatic ); 7478fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static Value &value( const IteratorState &iterator ); 7488fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static int distance( const IteratorState &x, const IteratorState &y ); 7498fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7508fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III private: 7518fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalLink *buckets_; 7528fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalLink *tailLink_; 7538fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III BucketIndex bucketsSize_; 7548fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III BucketIndex itemCount_; 7558fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 7568fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7578fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief A simplified deque implementation used internally by Value. 7588fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \internal 7598fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * It is based on a list of fixed "page", each page contains a fixed number of items. 7608fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Instead of using a linked-list, a array of pointer is used for fast item look-up. 7618fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Look-up for an element is as follow: 7628fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - compute page index: pageIndex = itemIndex / itemsPerPage 7638fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * - look-up item in page: pages_[pageIndex][itemIndex % itemsPerPage] 7648fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * 7658fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Insertion is amortized constant time (only the array containing the index of pointers 7668fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * need to be reallocated when items are appended). 7678fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 7688fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III class JSON_API ValueInternalArray 7698fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 7708fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III friend class Value; 7718fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III friend class ValueIteratorBase; 7728fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 7738fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III enum { itemsPerPage = 8 }; // should be a power of 2 for fast divide and modulo. 7748fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef Value::ArrayIndex ArrayIndex; 7758fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef unsigned int PageIndex; 7768fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7778fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 7788fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III struct IteratorState // Must be a POD 7798fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 7808fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III IteratorState() 7818fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III : array_(0) 7828fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III , currentPageIndex_(0) 7838fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III , currentItemIndex_(0) 7848fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 7858fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 7868fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalArray *array_; 7878fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value **currentPageIndex_; 7888fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III unsigned int currentItemIndex_; 7898fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 7908fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 7918fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7928fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalArray(); 7938fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalArray( const ValueInternalArray &other ); 7948fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalArray &operator =( const ValueInternalArray &other ); 7958fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ~ValueInternalArray(); 7968fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void swap( ValueInternalArray &other ); 7978fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 7988fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void clear(); 7998fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void resize( ArrayIndex newSize ); 8008fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 8018fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value &resolveReference( ArrayIndex index ); 8028fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 8038fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value *find( ArrayIndex index ) const; 8048fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 8058fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ArrayIndex size() const; 8068fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 8078fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III int compare( const ValueInternalArray &other ) const; 8088fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 8098fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III private: 8108fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static bool equals( const IteratorState &x, const IteratorState &other ); 8118fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static void increment( IteratorState &iterator ); 8128fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static void decrement( IteratorState &iterator ); 8138fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static Value &dereference( const IteratorState &iterator ); 8148fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static Value &unsafeDereference( const IteratorState &iterator ); 8158fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static int distance( const IteratorState &x, const IteratorState &y ); 8168fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III static ArrayIndex indexOf( const IteratorState &iterator ); 8178fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void makeBeginIterator( IteratorState &it ) const; 8188fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void makeEndIterator( IteratorState &it ) const; 8198fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void makeIterator( IteratorState &it, ArrayIndex index ) const; 8208fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 8218fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void makeIndexValid( ArrayIndex index ); 8228fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 8238fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value **pages_; 8248fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ArrayIndex size_; 8258fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III PageIndex pageCount_; 8268fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 8278fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 8288fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief Experimental: do not use. Allocator to customize Value internal array. 8298fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Below is an example of a simple implementation (actual implementation use 8308fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * memory pool). 8318fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III \code 8328fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins IIIclass DefaultValueArrayAllocator : public ValueArrayAllocator 8338fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III{ 8348fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins IIIpublic: // overridden from ValueArrayAllocator 8358fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual ~DefaultValueArrayAllocator() 8368fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 8378fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 8388fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 8398fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual ValueInternalArray *newArray() 8408fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 8418fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return new ValueInternalArray(); 8428fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 8438fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 8448fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) 8458fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 8468fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return new ValueInternalArray( other ); 8478fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 8488fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 8498fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual void destruct( ValueInternalArray *array ) 8508fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 8518fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III delete array; 8528fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 8538fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 8548fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual void reallocateArrayPageIndex( Value **&indexes, 8558fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalArray::PageIndex &indexCount, 8568fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalArray::PageIndex minNewIndexCount ) 8578fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 8588fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1; 8598fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III if ( minNewIndexCount > newIndexCount ) 8608fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III newIndexCount = minNewIndexCount; 8618fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount ); 8628fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III if ( !newIndexes ) 8638fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III throw std::bad_alloc(); 8648fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III indexCount = newIndexCount; 8658fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III indexes = static_cast<Value **>( newIndexes ); 8668fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 8678fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual void releaseArrayPageIndex( Value **indexes, 8688fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalArray::PageIndex indexCount ) 8698fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 8708fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III if ( indexes ) 8718fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III free( indexes ); 8728fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 8738fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 8748fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual Value *allocateArrayPage() 8758fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 8768fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return static_cast<Value *>( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) ); 8778fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 8788fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 8798fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual void releaseArrayPage( Value *value ) 8808fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 8818fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III if ( value ) 8828fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III free( value ); 8838fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 8848fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III}; 8858fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III \endcode 8868fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 8878fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III class JSON_API ValueArrayAllocator 8888fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 8898fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 8908fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual ~ValueArrayAllocator(); 8918fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual ValueInternalArray *newArray() = 0; 8928fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) = 0; 8938fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual void destructArray( ValueInternalArray *array ) = 0; 8948fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief Reallocate array page index. 8958fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * Reallocates an array of pointer on each page. 8968fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \param indexes [input] pointer on the current index. May be \c NULL. 8978fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * [output] pointer on the new index of at least 8988fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \a minNewIndexCount pages. 8998fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \param indexCount [input] current number of pages in the index. 9008fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * [output] number of page the reallocated index can handle. 9018fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \b MUST be >= \a minNewIndexCount. 9028fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * \param minNewIndexCount Minimum number of page the new index must be able to 9038fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * handle. 9048fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 9058fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual void reallocateArrayPageIndex( Value **&indexes, 9068fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalArray::PageIndex &indexCount, 9078fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalArray::PageIndex minNewIndexCount ) = 0; 9088fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual void releaseArrayPageIndex( Value **indexes, 9098fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalArray::PageIndex indexCount ) = 0; 9108fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual Value *allocateArrayPage() = 0; 9118fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III virtual void releaseArrayPage( Value *value ) = 0; 9128fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 9138fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP 9148fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9158fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9168fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief base class for Value iterators. 9178fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * 9188fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 9198fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III class ValueIteratorBase 9208fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 9218fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 9228fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef unsigned int size_t; 9238fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef int difference_type; 9248fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef ValueIteratorBase SelfType; 9258fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9268fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueIteratorBase(); 9278fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP 9288fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III explicit ValueIteratorBase( const Value::ObjectValues::iterator ¤t ); 9298fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#else 9308fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueIteratorBase( const ValueInternalArray::IteratorState &state ); 9318fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueIteratorBase( const ValueInternalMap::IteratorState &state ); 9328fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#endif 9338fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9348fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool operator ==( const SelfType &other ) const 9358fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 9368fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return isEqual( other ); 9378fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 9388fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9398fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool operator !=( const SelfType &other ) const 9408fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 9418fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return !isEqual( other ); 9428fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 9438fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9448fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III difference_type operator -( const SelfType &other ) const 9458fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 9468fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return computeDistance( other ); 9478fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 9488fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9498fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Return either the index or the member name of the referenced value as a Value. 9508fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value key() const; 9518fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9528fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Return the index of the referenced Value. -1 if it is not an arrayValue. 9538fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III UInt index() const; 9548fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9558fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /// Return the member name of the referenced Value. "" if it is not an objectValue. 9568fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III const char *memberName() const; 9578fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9588fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III protected: 9598fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value &deref() const; 9608fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9618fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void increment(); 9628fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9638fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void decrement(); 9648fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9658fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III difference_type computeDistance( const SelfType &other ) const; 9668fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9678fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isEqual( const SelfType &other ) const; 9688fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9698fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III void copy( const SelfType &other ); 9708fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9718fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III private: 9728fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP 9738fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III Value::ObjectValues::iterator current_; 9748fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III // Indicates that iterator is for a null value. 9758fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isNull_; 9768fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#else 9778fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III union 9788fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 9798fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalArray::IteratorState array_; 9808fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueInternalMap::IteratorState map_; 9818fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } iterator_; 9828fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III bool isArray_; 9838fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#endif 9848fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 9858fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9868fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief const iterator for object and array value. 9878fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III * 9888fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 9898fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III class ValueConstIterator : public ValueIteratorBase 9908fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 9918fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III friend class Value; 9928fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 9938fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef unsigned int size_t; 9948fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef int difference_type; 9958fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef const Value &reference; 9968fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef const Value *pointer; 9978fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef ValueConstIterator SelfType; 9988fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 9998fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueConstIterator(); 10008fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III private: 10018fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /*! \internal Use by Value to create an iterator. 10028fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 10038fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP 10048fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III explicit ValueConstIterator( const Value::ObjectValues::iterator ¤t ); 10058fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#else 10068fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueConstIterator( const ValueInternalArray::IteratorState &state ); 10078fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueConstIterator( const ValueInternalMap::IteratorState &state ); 10088fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#endif 10098fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 10108fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III SelfType &operator =( const ValueIteratorBase &other ); 10118fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 10128fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III SelfType operator++( int ) 10138fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 10148fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III SelfType temp( *this ); 10158fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ++*this; 10168fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return temp; 10178fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 10188fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 10198fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III SelfType operator--( int ) 10208fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 10218fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III SelfType temp( *this ); 10228fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III --*this; 10238fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return temp; 10248fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 10258fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 10268fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III SelfType &operator--() 10278fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 10288fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III decrement(); 10298fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return *this; 10308fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 10318fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 10328fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III SelfType &operator++() 10338fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 10348fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III increment(); 10358fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return *this; 10368fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 10378fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 10388fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III reference operator *() const 10398fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 10408fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return deref(); 10418fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 10428fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 10438fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 10448fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 10458fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /** \brief Iterator for object and array value. 10468fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 10478fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III class ValueIterator : public ValueIteratorBase 10488fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 10498fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III friend class Value; 10508fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 10518fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef unsigned int size_t; 10528fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef int difference_type; 10538fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef Value &reference; 10548fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef Value *pointer; 10558fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III typedef ValueIterator SelfType; 10568fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 10578fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueIterator(); 10588fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueIterator( const ValueConstIterator &other ); 10598fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueIterator( const ValueIterator &other ); 10608fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III private: 10618fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III /*! \internal Use by Value to create an iterator. 10628fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III */ 10638fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP 10648fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III explicit ValueIterator( const Value::ObjectValues::iterator ¤t ); 10658fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#else 10668fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueIterator( const ValueInternalArray::IteratorState &state ); 10678fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ValueIterator( const ValueInternalMap::IteratorState &state ); 10688fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#endif 10698fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III public: 10708fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 10718fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III SelfType &operator =( const SelfType &other ); 10728fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 10738fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III SelfType operator++( int ) 10748fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 10758fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III SelfType temp( *this ); 10768fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III ++*this; 10778fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return temp; 10788fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 10798fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 10808fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III SelfType operator--( int ) 10818fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 10828fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III SelfType temp( *this ); 10838fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III --*this; 10848fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return temp; 10858fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 10868fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 10878fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III SelfType &operator--() 10888fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 10898fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III decrement(); 10908fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return *this; 10918fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 10928fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 10938fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III SelfType &operator++() 10948fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 10958fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III increment(); 10968fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return *this; 10978fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 10988fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 10998fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III reference operator *() const 11008fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III { 11018fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III return deref(); 11028fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III } 11038fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III }; 11048fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 11058fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 11068fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III} // namespace Json 11078fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 11088fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III 11098fc19824ce3d55b7292fe7bdb7c77945f21aac85Leon Scroggins III#endif // CPPTL_JSON_H_INCLUDED 1110