blob: ae111fbbb0e95bd795642bc6e9aacb437495d051 [file] [log] [blame]
Devin Jeanpierre59e4d352017-07-21 03:44:36 -07001// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
Baptiste Lepilleur7469f1d2010-04-20 21:35:19 +00002// Distributed under MIT license, or public domain if desired and
3// recognized in your jurisdiction.
4// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
5
Christopher Dunn6d135cb2007-06-13 15:51:04 +00006#ifndef CPPTL_JSON_H_INCLUDED
Aaron Jacobs9fa4e842014-07-01 08:48:54 +10007#define CPPTL_JSON_H_INCLUDED
Christopher Dunn6d135cb2007-06-13 15:51:04 +00008
Baptiste Lepilleureadc4782011-05-02 21:09:30 +00009#if !defined(JSON_IS_AMALGAMATION)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100010#include "forwards.h"
Baptiste Lepilleureadc4782011-05-02 21:09:30 +000011#endif // if !defined(JSON_IS_AMALGAMATION)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100012#include <string>
13#include <vector>
Christopher Dunn75279cc2015-03-08 12:20:06 -050014#include <exception>
Christopher Dunn6d135cb2007-06-13 15:51:04 +000015
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100016#ifndef JSON_USE_CPPTL_SMALLMAP
17#include <map>
18#else
19#include <cpptl/smallmap.h>
20#endif
21#ifdef JSON_USE_CPPTL
22#include <cpptl/forwards.h>
23#endif
Christopher Dunn6d135cb2007-06-13 15:51:04 +000024
Gauravd97ea5b2016-03-16 11:15:09 +053025//Conditional NORETURN attribute on the throw functions would:
Dhruv Paranjape8996c372017-07-08 17:27:07 +053026// a) suppress false positives from static code analysis
Gauravd97ea5b2016-03-16 11:15:09 +053027// b) possibly improve optimization opportunities.
28#if !defined(JSONCPP_NORETURN)
29# if defined(_MSC_VER)
30# define JSONCPP_NORETURN __declspec(noreturn)
31# elif defined(__GNUC__)
32# define JSONCPP_NORETURN __attribute__ ((__noreturn__))
33# else
34# define JSONCPP_NORETURN
35# endif
36#endif
37
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100038// Disable warning C4251: <data member>: <type> needs to have dll-interface to
39// be used by...
Baptiste Lepilleureafd7022013-05-08 20:21:11 +000040#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100041#pragma warning(push)
42#pragma warning(disable : 4251)
Baptiste Lepilleureafd7022013-05-08 20:21:11 +000043#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
44
Sergiy80d6e666f2016-12-03 22:29:14 +020045#pragma pack(push, 8)
46
Christopher Dunn6d135cb2007-06-13 15:51:04 +000047/** \brief JSON (JavaScript Object Notation).
48 */
49namespace Json {
50
Christopher Dunn75279cc2015-03-08 12:20:06 -050051/** Base class for all exceptions we throw.
Christopher Dunn4e30c4f2015-03-08 12:56:32 -050052 *
53 * We use nothing but these internally. Of course, STL can throw others.
Christopher Dunn75279cc2015-03-08 12:20:06 -050054 */
Christopher Dunn949babd2015-07-23 00:19:12 -050055class JSON_API Exception : public std::exception {
56public:
Christopher Dunnde5b7922016-03-06 11:19:46 -060057 Exception(JSONCPP_STRING const& msg);
Omkar Wagh91c1d232016-11-07 13:57:00 -050058 ~Exception() JSONCPP_NOEXCEPT JSONCPP_OVERRIDE;
59 char const* what() const JSONCPP_NOEXCEPT JSONCPP_OVERRIDE;
Christopher Dunn949babd2015-07-23 00:19:12 -050060protected:
Christopher Dunnde5b7922016-03-06 11:19:46 -060061 JSONCPP_STRING msg_;
Christopher Dunn949babd2015-07-23 00:19:12 -050062};
63
Christopher Dunn53837942015-03-08 12:31:00 -050064/** Exceptions which the user cannot easily avoid.
65 *
Christopher Dunn4e30c4f2015-03-08 12:56:32 -050066 * E.g. out-of-memory (when we use malloc), stack-overflow, malicious input
Dhruv Paranjape8996c372017-07-08 17:27:07 +053067 *
Christopher Dunn4e30c4f2015-03-08 12:56:32 -050068 * \remark derived from Json::Exception
Christopher Dunn53837942015-03-08 12:31:00 -050069 */
Christopher Dunn949babd2015-07-23 00:19:12 -050070class JSON_API RuntimeError : public Exception {
71public:
Christopher Dunnde5b7922016-03-06 11:19:46 -060072 RuntimeError(JSONCPP_STRING const& msg);
Christopher Dunn949babd2015-07-23 00:19:12 -050073};
74
Christopher Dunn4e30c4f2015-03-08 12:56:32 -050075/** Exceptions thrown by JSON_ASSERT/JSON_FAIL macros.
Christopher Dunn53837942015-03-08 12:31:00 -050076 *
77 * These are precondition-violations (user bugs) and internal errors (our bugs).
Dhruv Paranjape8996c372017-07-08 17:27:07 +053078 *
Christopher Dunn4e30c4f2015-03-08 12:56:32 -050079 * \remark derived from Json::Exception
Christopher Dunn53837942015-03-08 12:31:00 -050080 */
Christopher Dunn949babd2015-07-23 00:19:12 -050081class JSON_API LogicError : public Exception {
82public:
Christopher Dunnde5b7922016-03-06 11:19:46 -060083 LogicError(JSONCPP_STRING const& msg);
Christopher Dunn949babd2015-07-23 00:19:12 -050084};
Christopher Dunn53837942015-03-08 12:31:00 -050085
Christopher Dunn4e30c4f2015-03-08 12:56:32 -050086/// used internally
Gauravd97ea5b2016-03-16 11:15:09 +053087JSONCPP_NORETURN void throwRuntimeError(JSONCPP_STRING const& msg);
Christopher Dunn4e30c4f2015-03-08 12:56:32 -050088/// used internally
Gauravd97ea5b2016-03-16 11:15:09 +053089JSONCPP_NORETURN void throwLogicError(JSONCPP_STRING const& msg);
Christopher Dunn75279cc2015-03-08 12:20:06 -050090
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100091/** \brief Type of the value held by a Value object.
92 */
93enum ValueType {
94 nullValue = 0, ///< 'null' value
95 intValue, ///< signed integer value
96 uintValue, ///< unsigned integer value
97 realValue, ///< double value
98 stringValue, ///< UTF-8 string value
99 booleanValue, ///< bool value
100 arrayValue, ///< array value (ordered list)
101 objectValue ///< object value (collection of name/value pairs).
102};
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000103
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000104enum CommentPlacement {
105 commentBefore = 0, ///< a comment placed on the line before a value
106 commentAfterOnSameLine, ///< a comment just after a value on the same line
107 commentAfter, ///< a comment on the line after a value (only make sense for
Aaron Jacobs3a0c4fc2014-07-01 09:20:48 +1000108 /// root value)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000109 numberOfCommentPlacement
110};
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000111
112//# ifdef JSON_USE_CPPTL
113// typedef CppTL::AnyEnumerator<const char *> EnumMemberNames;
114// typedef CppTL::AnyEnumerator<const Value &> EnumValues;
115//# endif
116
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000117/** \brief Lightweight wrapper to tag static string.
118 *
119 * Value constructor and objectValue member assignement takes advantage of the
120 * StaticString and avoid the cost of string duplication when storing the
121 * string or the member name.
122 *
123 * Example of usage:
124 * \code
125 * Json::Value aValue( StaticString("some text") );
126 * Json::Value object;
127 * static const StaticString code("code");
128 * object[code] = 1234;
129 * \endcode
130 */
131class JSON_API StaticString {
132public:
Christopher Dunnff617522015-03-06 10:31:46 -0600133 explicit StaticString(const char* czstring) : c_str_(czstring) {}
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000134
Christopher Dunnff617522015-03-06 10:31:46 -0600135 operator const char*() const { return c_str_; }
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000136
Christopher Dunnff617522015-03-06 10:31:46 -0600137 const char* c_str() const { return c_str_; }
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000138
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000139private:
Christopher Dunnff617522015-03-06 10:31:46 -0600140 const char* c_str_;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000141};
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000142
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000143/** \brief Represents a <a HREF="http://www.json.org">JSON</a> value.
144 *
145 * This class is a discriminated union wrapper that can represents a:
146 * - signed integer [range: Value::minInt - Value::maxInt]
147 * - unsigned integer (range: 0 - Value::maxUInt)
148 * - double
149 * - UTF-8 string
150 * - boolean
151 * - 'null'
152 * - an ordered list of Value
153 * - collection of name/value pairs (javascript object)
154 *
155 * The type of the held value is represented by a #ValueType and
156 * can be obtained using type().
157 *
Christopher Dunnc28610f2015-02-21 11:44:16 -0600158 * Values of an #objectValue or #arrayValue can be accessed using operator[]()
159 * methods.
160 * Non-const methods will automatically create the a #nullValue element
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000161 * if it does not exist.
Christopher Dunnc28610f2015-02-21 11:44:16 -0600162 * The sequence of an #arrayValue will be automatically resized and initialized
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000163 * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue.
164 *
Christopher Dunnc28610f2015-02-21 11:44:16 -0600165 * The get() methods can be used to obtain default value in the case the
166 * required element does not exist.
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000167 *
168 * It is possible to iterate over the list of a #objectValue values using
169 * the getMemberNames() method.
Christopher Dunn25342ba2015-03-02 18:05:26 -0600170 *
Christopher Dunnc28610f2015-02-21 11:44:16 -0600171 * \note #Value string-length fit in size_t, but keys must be < 2^30.
172 * (The reason is an implementation detail.) A #CharReader will raise an
Christopher Dunn25342ba2015-03-02 18:05:26 -0600173 * exception if a bound is exceeded to avoid security holes in your app,
174 * but the Value API does *not* check bounds. That is the responsibility
175 * of the caller.
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000176 */
177class JSON_API Value {
178 friend class ValueIteratorBase;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000179public:
Christopher Dunnde5b7922016-03-06 11:19:46 -0600180 typedef std::vector<JSONCPP_STRING> Members;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000181 typedef ValueIterator iterator;
182 typedef ValueConstIterator const_iterator;
183 typedef Json::UInt UInt;
184 typedef Json::Int Int;
185#if defined(JSON_HAS_INT64)
186 typedef Json::UInt64 UInt64;
187 typedef Json::Int64 Int64;
Baptiste Lepilleur842e9ac2010-12-27 17:45:23 +0000188#endif // defined(JSON_HAS_INT64)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000189 typedef Json::LargestInt LargestInt;
190 typedef Json::LargestUInt LargestUInt;
191 typedef Json::ArrayIndex ArrayIndex;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000192
Wolfram Röslerff6b4492017-09-14 09:31:36 +0200193 // Required for boost integration, e. g. BOOST_TEST
194 typedef std::string value_type;
195
Christopher Dunn8a702972015-03-03 10:38:27 -0600196 static const Value& null; ///< We regret this reference to a global instance; prefer the simpler Value().
197 static const Value& nullRef; ///< just a kludge for binary-compatibility; same as null
Christopher Dunn0f288ae2016-06-26 18:47:43 -0500198 static Value const& nullSingleton(); ///< Prefer this to null or nullRef.
199
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000200 /// Minimum signed integer value that can be stored in a Json::Value.
201 static const LargestInt minLargestInt;
202 /// Maximum signed integer value that can be stored in a Json::Value.
203 static const LargestInt maxLargestInt;
204 /// Maximum unsigned integer value that can be stored in a Json::Value.
205 static const LargestUInt maxLargestUInt;
Baptiste Lepilleur842e9ac2010-12-27 17:45:23 +0000206
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000207 /// Minimum signed int value that can be stored in a Json::Value.
208 static const Int minInt;
209 /// Maximum signed int value that can be stored in a Json::Value.
210 static const Int maxInt;
211 /// Maximum unsigned int value that can be stored in a Json::Value.
212 static const UInt maxUInt;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000213
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000214#if defined(JSON_HAS_INT64)
215 /// Minimum signed 64 bits int value that can be stored in a Json::Value.
216 static const Int64 minInt64;
217 /// Maximum signed 64 bits int value that can be stored in a Json::Value.
218 static const Int64 maxInt64;
219 /// Maximum unsigned 64 bits int value that can be stored in a Json::Value.
220 static const UInt64 maxUInt64;
Aaron Jacobsf1053e72011-05-24 03:18:02 +0000221#endif // defined(JSON_HAS_INT64)
Baptiste Lepilleur842e9ac2010-12-27 17:45:23 +0000222
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000223private:
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000224#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000225 class CZString {
226 public:
227 enum DuplicationPolicy {
228 noDuplication = 0,
229 duplicate,
230 duplicateOnCopy
231 };
232 CZString(ArrayIndex index);
Christopher Dunnc28610f2015-02-21 11:44:16 -0600233 CZString(char const* str, unsigned length, DuplicationPolicy allocate);
234 CZString(CZString const& other);
Motti2b008912015-04-20 17:44:47 +0300235#if JSON_HAS_RVALUE_REFERENCES
236 CZString(CZString&& other);
237#endif
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000238 ~CZString();
Dhruv Paranjape0ba8bd72017-07-08 17:47:13 +0530239 CZString& operator=(const CZString& other);
240
241#if JSON_HAS_RVALUE_REFERENCES
242 CZString& operator=(CZString&& other);
243#endif
244
Christopher Dunnc28610f2015-02-21 11:44:16 -0600245 bool operator<(CZString const& other) const;
246 bool operator==(CZString const& other) const;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000247 ArrayIndex index() const;
Christopher Dunnc28610f2015-02-21 11:44:16 -0600248 //const char* c_str() const; ///< \deprecated
249 char const* data() const;
250 unsigned length() const;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000251 bool isStaticString() const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000252
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000253 private:
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000254 void swap(CZString& other);
Christopher Dunnc28610f2015-02-21 11:44:16 -0600255
Christopher Dunn57ad0512015-03-02 12:10:35 -0600256 struct StringStorage {
Dan Liufcbab022015-04-27 05:20:05 +0100257 unsigned policy_: 2;
Christopher Dunn57ad0512015-03-02 12:10:35 -0600258 unsigned length_: 30; // 1GB max
259 };
260
Christopher Dunnc28610f2015-02-21 11:44:16 -0600261 char const* cstr_; // actually, a prefixed string, unless policy is noDup
Christopher Dunn57ad0512015-03-02 12:10:35 -0600262 union {
263 ArrayIndex index_;
264 StringStorage storage_;
265 };
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000266 };
267
268public:
269#ifndef JSON_USE_CPPTL_SMALLMAP
270 typedef std::map<CZString, Value> ObjectValues;
271#else
272 typedef CppTL::SmallMap<CZString, Value> ObjectValues;
273#endif // ifndef JSON_USE_CPPTL_SMALLMAP
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000274#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
275
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000276public:
277 /** \brief Create a default Value of the given type.
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000278
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000279 This is a very useful constructor.
280 To create an empty array, pass arrayValue.
281 To create an empty object, pass objectValue.
282 Another Value can then be set to this one by assignment.
283This is useful since clear() and resize() will not alter types.
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000284
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000285 Examples:
286\code
287Json::Value null_value; // null
288Json::Value arr_value(Json::arrayValue); // []
289Json::Value obj_value(Json::objectValue); // {}
290\endcode
291 */
292 Value(ValueType type = nullValue);
293 Value(Int value);
294 Value(UInt value);
Baptiste Lepilleur842e9ac2010-12-27 17:45:23 +0000295#if defined(JSON_HAS_INT64)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000296 Value(Int64 value);
297 Value(UInt64 value);
Baptiste Lepilleur842e9ac2010-12-27 17:45:23 +0000298#endif // if defined(JSON_HAS_INT64)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000299 Value(double value);
Christopher Dunn8a702972015-03-03 10:38:27 -0600300 Value(const char* value); ///< Copy til first 0. (NULL causes to seg-fault.)
Christopher Dunn89704032015-07-11 12:09:59 -0500301 Value(const char* begin, const char* end); ///< Copy all, incl zeroes.
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000302 /** \brief Constructs a value from a static string.
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000303
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000304 * Like other value string constructor but do not duplicate the string for
305 * internal storage. The given string must remain alive after the call to this
306 * constructor.
Christopher Dunnc28610f2015-02-21 11:44:16 -0600307 * \note This works only for null-terminated strings. (We cannot change the
308 * size of this class, so we have nowhere to store the length,
309 * which might be computed later for various operations.)
310 *
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000311 * Example of usage:
312 * \code
Christopher Dunnc28610f2015-02-21 11:44:16 -0600313 * static StaticString foo("some text");
314 * Json::Value aValue(foo);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000315 * \endcode
316 */
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000317 Value(const StaticString& value);
Christopher Dunnde5b7922016-03-06 11:19:46 -0600318 Value(const JSONCPP_STRING& value); ///< Copy data() til size(). Embedded zeroes too.
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000319#ifdef JSON_USE_CPPTL
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000320 Value(const CppTL::ConstString& value);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000321#endif
322 Value(bool value);
Christopher Dunn66eb72f2015-01-20 11:02:22 -0600323 /// Deep copy.
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000324 Value(const Value& other);
Motti2b008912015-04-20 17:44:47 +0300325#if JSON_HAS_RVALUE_REFERENCES
326 /// Move constructor
327 Value(Value&& other);
328#endif
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000329 ~Value();
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000330
Christopher Dunn7f439f42015-03-06 09:22:57 -0600331 /// Deep copy, then swap(other).
332 /// \note Over-write existing comments. To preserve comments, use #swapPayload().
Александр Малинин6a15ca62017-07-31 15:29:02 +0300333 Value& operator=(Value other);
Dhruv Paranjape8996c372017-07-08 17:27:07 +0530334
Christopher Dunn66eb72f2015-01-20 11:02:22 -0600335 /// Swap everything.
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000336 void swap(Value& other);
Christopher Dunn66eb72f2015-01-20 11:02:22 -0600337 /// Swap values but leave comments and source offsets in place.
338 void swapPayload(Value& other);
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000339
Dhruv Paranjape8996c372017-07-08 17:27:07 +0530340 /// copy everything.
341 void copy(const Value& other);
342 /// copy values but leave comments and source offsets in place.
343 void copyPayload(const Value& other);
344
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000345 ValueType type() const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000346
Christopher Dunn66eb72f2015-01-20 11:02:22 -0600347 /// Compare payload only, not comments etc.
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000348 bool operator<(const Value& other) const;
349 bool operator<=(const Value& other) const;
350 bool operator>=(const Value& other) const;
351 bool operator>(const Value& other) const;
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000352 bool operator==(const Value& other) const;
353 bool operator!=(const Value& other) const;
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000354 int compare(const Value& other) const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000355
Christopher Dunn8a702972015-03-03 10:38:27 -0600356 const char* asCString() const; ///< Embedded zeroes could cause you trouble!
dawescae564652016-03-14 19:11:02 -0500357#if JSONCPP_USING_SECURE_MEMORY
358 unsigned getCStringLength() const; //Allows you to understand the length of the CString
359#endif
Christopher Dunnde5b7922016-03-06 11:19:46 -0600360 JSONCPP_STRING asString() const; ///< Embedded zeroes are possible.
Christopher Dunnc28610f2015-02-21 11:44:16 -0600361 /** Get raw char* of string-value.
362 * \return false if !string. (Seg-fault if str or end are NULL.)
363 */
364 bool getString(
Christopher Dunn89704032015-07-11 12:09:59 -0500365 char const** begin, char const** end) const;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000366#ifdef JSON_USE_CPPTL
367 CppTL::ConstString asConstString() const;
368#endif
369 Int asInt() const;
370 UInt asUInt() const;
Aaron Jacobsf1053e72011-05-24 03:18:02 +0000371#if defined(JSON_HAS_INT64)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000372 Int64 asInt64() const;
373 UInt64 asUInt64() const;
Aaron Jacobsf1053e72011-05-24 03:18:02 +0000374#endif // if defined(JSON_HAS_INT64)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000375 LargestInt asLargestInt() const;
376 LargestUInt asLargestUInt() const;
377 float asFloat() const;
378 double asDouble() const;
379 bool asBool() const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000380
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000381 bool isNull() const;
382 bool isBool() const;
383 bool isInt() const;
384 bool isInt64() const;
385 bool isUInt() const;
386 bool isUInt64() const;
387 bool isIntegral() const;
388 bool isDouble() const;
389 bool isNumeric() const;
390 bool isString() const;
391 bool isArray() const;
392 bool isObject() const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000393
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000394 bool isConvertibleTo(ValueType other) const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000395
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000396 /// Number of values in array or object
397 ArrayIndex size() const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000398
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000399 /// \brief Return true if empty array, empty object, or null;
400 /// otherwise, false.
401 bool empty() const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000402
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000403 /// Return isNull()
404 bool operator!() const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000405
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000406 /// Remove all object members and array elements.
407 /// \pre type() is arrayValue, objectValue, or nullValue
408 /// \post type() is unchanged
409 void clear();
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000410
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000411 /// Resize the array to size elements.
412 /// New elements are initialized to null.
413 /// May only be called on nullValue or arrayValue.
414 /// \pre type() is arrayValue or nullValue
415 /// \post type() is arrayValue
416 void resize(ArrayIndex size);
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000417
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000418 /// Access an array element (zero based index ).
419 /// If the array contains less than index element, then null value are
420 /// inserted
421 /// in the array so that its size is index+1.
422 /// (You may need to say 'value[0u]' to get your compiler to distinguish
423 /// this from the operator[] which takes a string.)
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000424 Value& operator[](ArrayIndex index);
Baptiste Lepilleurfa130ef2010-12-24 12:47:14 +0000425
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000426 /// Access an array element (zero based index ).
427 /// If the array contains less than index element, then null value are
428 /// inserted
429 /// in the array so that its size is index+1.
430 /// (You may need to say 'value[0u]' to get your compiler to distinguish
431 /// this from the operator[] which takes a string.)
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000432 Value& operator[](int index);
Baptiste Lepilleurfa130ef2010-12-24 12:47:14 +0000433
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000434 /// Access an array element (zero based index )
435 /// (You may need to say 'value[0u]' to get your compiler to distinguish
436 /// this from the operator[] which takes a string.)
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000437 const Value& operator[](ArrayIndex index) const;
Baptiste Lepilleurfa130ef2010-12-24 12:47:14 +0000438
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000439 /// Access an array element (zero based index )
440 /// (You may need to say 'value[0u]' to get your compiler to distinguish
441 /// this from the operator[] which takes a string.)
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000442 const Value& operator[](int index) const;
Baptiste Lepilleurfa130ef2010-12-24 12:47:14 +0000443
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000444 /// If the array contains at least index+1 elements, returns the element
445 /// value,
446 /// otherwise returns defaultValue.
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000447 Value get(ArrayIndex index, const Value& defaultValue) const;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000448 /// Return true if index < size().
449 bool isValidIndex(ArrayIndex index) const;
450 /// \brief Append value to array at the end.
451 ///
452 /// Equivalent to jsonvalue[jsonvalue.size()] = value;
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000453 Value& append(const Value& value);
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000454
Dhruv Paranjape0ba8bd72017-07-08 17:47:13 +0530455#if JSON_HAS_RVALUE_REFERENCES
Dhruv Paranjape23c44d92017-07-08 17:30:47 +0530456 Value& append(Value&& value);
457#endif
458
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000459 /// Access an object value by name, create a null member if it does not exist.
Christopher Dunn25342ba2015-03-02 18:05:26 -0600460 /// \note Because of our implementation, keys are limited to 2^30 -1 chars.
461 /// Exceeding that will cause an exception.
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000462 Value& operator[](const char* key);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000463 /// Access an object value by name, returns null if there is no member with
464 /// that name.
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000465 const Value& operator[](const char* key) const;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000466 /// Access an object value by name, create a null member if it does not exist.
Christopher Dunn25342ba2015-03-02 18:05:26 -0600467 /// \param key may contain embedded nulls.
Christopher Dunnde5b7922016-03-06 11:19:46 -0600468 Value& operator[](const JSONCPP_STRING& key);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000469 /// Access an object value by name, returns null if there is no member with
470 /// that name.
Christopher Dunn25342ba2015-03-02 18:05:26 -0600471 /// \param key may contain embedded nulls.
Christopher Dunnde5b7922016-03-06 11:19:46 -0600472 const Value& operator[](const JSONCPP_STRING& key) const;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000473 /** \brief Access an object value by name, create a null member if it does not
474 exist.
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000475
Christopher Dunn25342ba2015-03-02 18:05:26 -0600476 * If the object has no entry for that name, then the member name used to store
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000477 * the new entry is not duplicated.
478 * Example of use:
479 * \code
480 * Json::Value object;
481 * static const StaticString code("code");
482 * object[code] = 1234;
483 * \endcode
484 */
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000485 Value& operator[](const StaticString& key);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000486#ifdef JSON_USE_CPPTL
487 /// Access an object value by name, create a null member if it does not exist.
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000488 Value& operator[](const CppTL::ConstString& key);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000489 /// Access an object value by name, returns null if there is no member with
490 /// that name.
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000491 const Value& operator[](const CppTL::ConstString& key) const;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000492#endif
493 /// Return the member named key if it exist, defaultValue otherwise.
Christopher Dunn0fd28752015-03-05 16:38:43 -0600494 /// \note deep copy
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000495 Value get(const char* key, const Value& defaultValue) const;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000496 /// Return the member named key if it exist, defaultValue otherwise.
Christopher Dunn0fd28752015-03-05 16:38:43 -0600497 /// \note deep copy
Christopher Dunn89704032015-07-11 12:09:59 -0500498 /// \note key may contain embedded nulls.
499 Value get(const char* begin, const char* end, const Value& defaultValue) const;
Christopher Dunn25342ba2015-03-02 18:05:26 -0600500 /// Return the member named key if it exist, defaultValue otherwise.
Christopher Dunn0fd28752015-03-05 16:38:43 -0600501 /// \note deep copy
Christopher Dunn25342ba2015-03-02 18:05:26 -0600502 /// \param key may contain embedded nulls.
Christopher Dunnde5b7922016-03-06 11:19:46 -0600503 Value get(const JSONCPP_STRING& key, const Value& defaultValue) const;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000504#ifdef JSON_USE_CPPTL
505 /// Return the member named key if it exist, defaultValue otherwise.
Christopher Dunn0fd28752015-03-05 16:38:43 -0600506 /// \note deep copy
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000507 Value get(const CppTL::ConstString& key, const Value& defaultValue) const;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000508#endif
Christopher Dunn25342ba2015-03-02 18:05:26 -0600509 /// Most general and efficient version of isMember()const, get()const,
510 /// and operator[]const
Christopher Dunn89704032015-07-11 12:09:59 -0500511 /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30
512 Value const* find(char const* begin, char const* end) const;
Christopher Dunnc28610f2015-02-21 11:44:16 -0600513 /// Most general and efficient version of object-mutators.
Christopher Dunn89704032015-07-11 12:09:59 -0500514 /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30
Christopher Dunnc28610f2015-02-21 11:44:16 -0600515 /// \return non-zero, but JSON_ASSERT if this is neither object nor nullValue.
Christopher Dunn89704032015-07-11 12:09:59 -0500516 Value const* demand(char const* begin, char const* end);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000517 /// \brief Remove and return the named member.
518 ///
519 /// Do nothing if it did not exist.
520 /// \return the removed Value, or null.
521 /// \pre type() is objectValue or nullValue
522 /// \post type() is unchanged
Christopher Dunn76746b02015-01-21 16:01:30 -0600523 /// \deprecated
damiramef16a352017-08-02 22:44:42 -0700524 JSONCPP_DEPRECATED("")
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000525 Value removeMember(const char* key);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000526 /// Same as removeMember(const char*)
Christopher Dunn25342ba2015-03-02 18:05:26 -0600527 /// \param key may contain embedded nulls.
Christopher Dunn76746b02015-01-21 16:01:30 -0600528 /// \deprecated
damiramef16a352017-08-02 22:44:42 -0700529 JSONCPP_DEPRECATED("")
Christopher Dunnde5b7922016-03-06 11:19:46 -0600530 Value removeMember(const JSONCPP_STRING& key);
Christopher Dunn89704032015-07-11 12:09:59 -0500531 /// Same as removeMember(const char* begin, const char* end, Value* removed),
Christopher Dunn25342ba2015-03-02 18:05:26 -0600532 /// but 'key' is null-terminated.
533 bool removeMember(const char* key, Value* removed);
Christopher Dunn76746b02015-01-21 16:01:30 -0600534 /** \brief Remove the named map member.
535
536 Update 'removed' iff removed.
Christopher Dunn25342ba2015-03-02 18:05:26 -0600537 \param key may contain embedded nulls.
Christopher Dunn76746b02015-01-21 16:01:30 -0600538 \return true iff removed (no exceptions)
539 */
Christopher Dunnde5b7922016-03-06 11:19:46 -0600540 bool removeMember(JSONCPP_STRING const& key, Value* removed);
541 /// Same as removeMember(JSONCPP_STRING const& key, Value* removed)
Christopher Dunn89704032015-07-11 12:09:59 -0500542 bool removeMember(const char* begin, const char* end, Value* removed);
Christopher Dunn9de2c2d2015-01-20 16:15:40 -0600543 /** \brief Remove the indexed array element.
544
545 O(n) expensive operations.
546 Update 'removed' iff removed.
Christopher Dunne87e41c2015-01-20 16:24:11 -0600547 \return true iff removed (no exceptions)
Christopher Dunn9de2c2d2015-01-20 16:15:40 -0600548 */
549 bool removeIndex(ArrayIndex i, Value* removed);
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000550
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000551 /// Return true if the object has a member named key.
Christopher Dunnc28610f2015-02-21 11:44:16 -0600552 /// \note 'key' must be null-terminated.
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000553 bool isMember(const char* key) const;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000554 /// Return true if the object has a member named key.
Christopher Dunn25342ba2015-03-02 18:05:26 -0600555 /// \param key may contain embedded nulls.
Christopher Dunnde5b7922016-03-06 11:19:46 -0600556 bool isMember(const JSONCPP_STRING& key) const;
557 /// Same as isMember(JSONCPP_STRING const& key)const
Christopher Dunn89704032015-07-11 12:09:59 -0500558 bool isMember(const char* begin, const char* end) const;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000559#ifdef JSON_USE_CPPTL
560 /// Return true if the object has a member named key.
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000561 bool isMember(const CppTL::ConstString& key) const;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000562#endif
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000563
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000564 /// \brief Return a list of the member names.
565 ///
566 /// If null, return an empty list.
567 /// \pre type() is objectValue or nullValue
568 /// \post if type() was nullValue, it remains nullValue
569 Members getMemberNames() const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000570
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000571 //# ifdef JSON_USE_CPPTL
572 // EnumMemberNames enumMemberNames() const;
573 // EnumValues enumValues() const;
574 //# endif
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000575
Christopher Dunn1e3149a2015-01-25 14:16:13 -0600576 /// \deprecated Always pass len.
Christopher Dunnde5b7922016-03-06 11:19:46 -0600577 JSONCPP_DEPRECATED("Use setComment(JSONCPP_STRING const&) instead.")
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000578 void setComment(const char* comment, CommentPlacement placement);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000579 /// Comments must be //... or /* ... */
Christopher Dunn1e3149a2015-01-25 14:16:13 -0600580 void setComment(const char* comment, size_t len, CommentPlacement placement);
581 /// Comments must be //... or /* ... */
Christopher Dunnde5b7922016-03-06 11:19:46 -0600582 void setComment(const JSONCPP_STRING& comment, CommentPlacement placement);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000583 bool hasComment(CommentPlacement placement) const;
584 /// Include delimiters and embedded newlines.
Christopher Dunnde5b7922016-03-06 11:19:46 -0600585 JSONCPP_STRING getComment(CommentPlacement placement) const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000586
Christopher Dunnde5b7922016-03-06 11:19:46 -0600587 JSONCPP_STRING toStyledString() const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000588
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000589 const_iterator begin() const;
590 const_iterator end() const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000591
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000592 iterator begin();
593 iterator end();
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000594
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000595 // Accessors for the [start, limit) range of bytes within the JSON text from
596 // which this value was parsed, if any.
Christopher Dunnd4513fc2016-02-06 09:25:20 -0600597 void setOffsetStart(ptrdiff_t start);
598 void setOffsetLimit(ptrdiff_t limit);
599 ptrdiff_t getOffsetStart() const;
600 ptrdiff_t getOffsetLimit() const;
Aaron Jacobs68db6552014-04-23 23:41:12 +0000601
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000602private:
Billy Donahue8eb5d892014-11-10 01:35:42 -0500603 void initBasic(ValueType type, bool allocated = false);
604
Christopher Dunnc28610f2015-02-21 11:44:16 -0600605 Value& resolveReference(const char* key);
606 Value& resolveReference(const char* key, const char* end);
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000607
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000608 struct CommentInfo {
609 CommentInfo();
610 ~CommentInfo();
611
Christopher Dunn1e3149a2015-01-25 14:16:13 -0600612 void setComment(const char* text, size_t len);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000613
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000614 char* comment_;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000615 };
616
617 // struct MemberNamesTransform
618 //{
619 // typedef const char *result_type;
620 // const char *operator()( const CZString &name ) const
621 // {
622 // return name.c_str();
623 // }
624 //};
625
626 union ValueHolder {
627 LargestInt int_;
628 LargestUInt uint_;
629 double real_;
630 bool bool_;
Christopher Dunnc28610f2015-02-21 11:44:16 -0600631 char* string_; // actually ptr to unsigned, followed by str, unless !allocated_
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000632 ObjectValues* map_;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000633 } value_;
634 ValueType type_ : 8;
Christopher Dunn2bc61372015-01-24 13:42:37 -0600635 unsigned int allocated_ : 1; // Notes: if declared as bool, bitfield is useless.
Christopher Dunnc28610f2015-02-21 11:44:16 -0600636 // If not allocated_, string_ must be null-terminated.
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000637 CommentInfo* comments_;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000638
639 // [start, limit) byte offsets in the source JSON text from which this Value
640 // was extracted.
Christopher Dunnd4513fc2016-02-06 09:25:20 -0600641 ptrdiff_t start_;
642 ptrdiff_t limit_;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000643};
644
645/** \brief Experimental and untested: represents an element of the "path" to
646 * access a node.
647 */
648class JSON_API PathArgument {
649public:
650 friend class Path;
651
652 PathArgument();
653 PathArgument(ArrayIndex index);
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000654 PathArgument(const char* key);
Christopher Dunnde5b7922016-03-06 11:19:46 -0600655 PathArgument(const JSONCPP_STRING& key);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000656
657private:
658 enum Kind {
659 kindNone = 0,
660 kindIndex,
661 kindKey
662 };
Christopher Dunnde5b7922016-03-06 11:19:46 -0600663 JSONCPP_STRING key_;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000664 ArrayIndex index_;
665 Kind kind_;
666};
667
668/** \brief Experimental and untested: represents a "path" to access a node.
669 *
670 * Syntax:
671 * - "." => root node
672 * - ".[n]" => elements at index 'n' of root node (an array value)
673 * - ".name" => member named 'name' of root node (an object value)
674 * - ".name1.name2.name3"
675 * - ".[0][1][2].name1[3]"
676 * - ".%" => member name is provided as parameter
677 * - ".[%]" => index is provied as parameter
678 */
679class JSON_API Path {
680public:
Christopher Dunnde5b7922016-03-06 11:19:46 -0600681 Path(const JSONCPP_STRING& path,
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000682 const PathArgument& a1 = PathArgument(),
683 const PathArgument& a2 = PathArgument(),
684 const PathArgument& a3 = PathArgument(),
685 const PathArgument& a4 = PathArgument(),
686 const PathArgument& a5 = PathArgument());
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000687
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000688 const Value& resolve(const Value& root) const;
689 Value resolve(const Value& root, const Value& defaultValue) const;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000690 /// Creates the "path" to access the specified node and returns a reference on
691 /// the node.
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000692 Value& make(Value& root) const;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000693
694private:
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000695 typedef std::vector<const PathArgument*> InArgs;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000696 typedef std::vector<PathArgument> Args;
697
Christopher Dunnde5b7922016-03-06 11:19:46 -0600698 void makePath(const JSONCPP_STRING& path, const InArgs& in);
699 void addPathInArg(const JSONCPP_STRING& path,
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000700 const InArgs& in,
701 InArgs::const_iterator& itInArg,
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000702 PathArgument::Kind kind);
Christopher Dunnde5b7922016-03-06 11:19:46 -0600703 void invalidPath(const JSONCPP_STRING& path, int location);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000704
705 Args args_;
706};
707
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000708/** \brief base class for Value iterators.
709 *
710 */
711class JSON_API ValueIteratorBase {
712public:
713 typedef std::bidirectional_iterator_tag iterator_category;
714 typedef unsigned int size_t;
715 typedef int difference_type;
716 typedef ValueIteratorBase SelfType;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000717
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000718 bool operator==(const SelfType& other) const { return isEqual(other); }
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000719
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000720 bool operator!=(const SelfType& other) const { return !isEqual(other); }
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000721
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000722 difference_type operator-(const SelfType& other) const {
Kevin Grant4c5832a2015-02-14 20:53:35 -0800723 return other.computeDistance(*this);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000724 }
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000725
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000726 /// Return either the index or the member name of the referenced value as a
727 /// Value.
728 Value key() const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000729
Christopher Dunned495ed2015-03-08 14:01:28 -0500730 /// Return the index of the referenced Value, or -1 if it is not an arrayValue.
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000731 UInt index() const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000732
Christopher Dunned495ed2015-03-08 14:01:28 -0500733 /// Return the member name of the referenced Value, or "" if it is not an
734 /// objectValue.
735 /// \note Avoid `c_str()` on result, as embedded zeroes are possible.
Christopher Dunnde5b7922016-03-06 11:19:46 -0600736 JSONCPP_STRING name() const;
Christopher Dunned495ed2015-03-08 14:01:28 -0500737
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000738 /// Return the member name of the referenced Value. "" if it is not an
739 /// objectValue.
Christopher Dunnc28610f2015-02-21 11:44:16 -0600740 /// \deprecated This cannot be used for UTF-8 strings, since there can be embedded nulls.
Christopher Dunned495ed2015-03-08 14:01:28 -0500741 JSONCPP_DEPRECATED("Use `key = name();` instead.")
Christopher Dunnc28610f2015-02-21 11:44:16 -0600742 char const* memberName() const;
743 /// Return the member name of the referenced Value, or NULL if it is not an
744 /// objectValue.
Christopher Dunned495ed2015-03-08 14:01:28 -0500745 /// \note Better version than memberName(). Allows embedded nulls.
Christopher Dunnc28610f2015-02-21 11:44:16 -0600746 char const* memberName(char const** end) const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000747
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000748protected:
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000749 Value& deref() const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000750
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000751 void increment();
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000752
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000753 void decrement();
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000754
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000755 difference_type computeDistance(const SelfType& other) const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000756
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000757 bool isEqual(const SelfType& other) const;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000758
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000759 void copy(const SelfType& other);
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000760
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000761private:
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000762 Value::ObjectValues::iterator current_;
763 // Indicates that iterator is for a null value.
764 bool isNull_;
Christopher Dunn2a10f4a2015-04-28 04:55:12 +0100765
766public:
767 // For some reason, BORLAND needs these at the end, rather
768 // than earlier. No idea why.
769 ValueIteratorBase();
770 explicit ValueIteratorBase(const Value::ObjectValues::iterator& current);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000771};
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000772
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000773/** \brief const iterator for object and array value.
774 *
775 */
776class JSON_API ValueConstIterator : public ValueIteratorBase {
777 friend class Value;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000778
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000779public:
780 typedef const Value value_type;
Christopher Dunnc28610f2015-02-21 11:44:16 -0600781 //typedef unsigned int size_t;
782 //typedef int difference_type;
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000783 typedef const Value& reference;
784 typedef const Value* pointer;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000785 typedef ValueConstIterator SelfType;
786
787 ValueConstIterator();
ycqiuc8a8cfc2015-10-06 16:46:19 +0800788 ValueConstIterator(ValueIterator const& other);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000789
790private:
791/*! \internal Use by Value to create an iterator.
792 */
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000793 explicit ValueConstIterator(const Value::ObjectValues::iterator& current);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000794public:
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000795 SelfType& operator=(const ValueIteratorBase& other);
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000796
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000797 SelfType operator++(int) {
798 SelfType temp(*this);
799 ++*this;
800 return temp;
801 }
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000802
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000803 SelfType operator--(int) {
804 SelfType temp(*this);
805 --*this;
806 return temp;
807 }
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000808
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000809 SelfType& operator--() {
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000810 decrement();
811 return *this;
812 }
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000813
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000814 SelfType& operator++() {
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000815 increment();
816 return *this;
817 }
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000818
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000819 reference operator*() const { return deref(); }
Braden McDorman540db3b2014-09-14 02:31:23 -0500820
821 pointer operator->() const { return &deref(); }
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000822};
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000823
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000824/** \brief Iterator for object and array value.
825 */
826class JSON_API ValueIterator : public ValueIteratorBase {
827 friend class Value;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000828
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000829public:
830 typedef Value value_type;
831 typedef unsigned int size_t;
832 typedef int difference_type;
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000833 typedef Value& reference;
834 typedef Value* pointer;
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000835 typedef ValueIterator SelfType;
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000836
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000837 ValueIterator();
ycqiuc8a8cfc2015-10-06 16:46:19 +0800838 explicit ValueIterator(const ValueConstIterator& other);
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000839 ValueIterator(const ValueIterator& other);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000840
841private:
842/*! \internal Use by Value to create an iterator.
843 */
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000844 explicit ValueIterator(const Value::ObjectValues::iterator& current);
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000845public:
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000846 SelfType& operator=(const SelfType& other);
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000847
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000848 SelfType operator++(int) {
849 SelfType temp(*this);
850 ++*this;
851 return temp;
852 }
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000853
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000854 SelfType operator--(int) {
855 SelfType temp(*this);
856 --*this;
857 return temp;
858 }
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000859
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000860 SelfType& operator--() {
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000861 decrement();
862 return *this;
863 }
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000864
Aaron Jacobs11086dd2014-09-15 10:15:29 +1000865 SelfType& operator++() {
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000866 increment();
867 return *this;
868 }
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000869
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000870 reference operator*() const { return deref(); }
Braden McDorman540db3b2014-09-14 02:31:23 -0500871
872 pointer operator->() const { return &deref(); }
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000873};
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000874
875} // namespace Json
876
datadiode9454e682015-01-20 15:25:04 -0600877
878namespace std {
879/// Specialize std::swap() for Json::Value.
880template<>
881inline void swap(Json::Value& a, Json::Value& b) { a.swap(b); }
882}
883
Sergiy80d6e666f2016-12-03 22:29:14 +0200884#pragma pack(pop)
datadiode9454e682015-01-20 15:25:04 -0600885
Baptiste Lepilleureafd7022013-05-08 20:21:11 +0000886#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000887#pragma warning(pop)
Baptiste Lepilleureafd7022013-05-08 20:21:11 +0000888#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
889
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000890#endif // CPPTL_JSON_H_INCLUDED