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 &current );
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 &current );
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 &current );
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