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