1f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// Copyright 2011 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#if !defined(JSON_IS_AMALGAMATION)
7f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <json/assertions.h>
8f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <json/value.h>
9f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <json/writer.h>
10f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
11f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#  include "json_batchallocator.h"
12f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif // #ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
13f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // if !defined(JSON_IS_AMALGAMATION)
14f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#include <math.h>
15f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#include <sstream>
16f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#include <utility>
17f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#include <stdexcept>
18f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#include <cstring>
19f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#include <cassert>
20f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifdef JSON_USE_CPPTL
21f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <cpptl/conststring.h>
22f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
23f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#include <cstddef>    // size_t
24f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
25f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#define JSON_ASSERT_UNREACHABLE assert( false )
26f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
27f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIInamespace Json {
28f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
29f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst Value Value::null;
30f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst Int Value::minInt = Int( ~(UInt(-1)/2) );
31f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst Int Value::maxInt = Int( UInt(-1)/2 );
32f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst UInt Value::maxUInt = UInt(-1);
33f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# if defined(JSON_HAS_INT64)
34f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst Int64 Value::minInt64 = Int64( ~(UInt64(-1)/2) );
35f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst Int64 Value::maxInt64 = Int64( UInt64(-1)/2 );
36f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst UInt64 Value::maxUInt64 = UInt64(-1);
37f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// The constant is hard-coded because some compiler have trouble
38f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// converting Value::maxUInt64 to a double correctly (AIX/xlC).
39f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// Assumes that UInt64 is a 64 bits integer.
40f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIstatic const double maxUInt64AsDouble = 18446744073709551615.0;
41f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // defined(JSON_HAS_INT64)
42f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst LargestInt Value::minLargestInt = LargestInt( ~(LargestUInt(-1)/2) );
43f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst LargestInt Value::maxLargestInt = LargestInt( LargestUInt(-1)/2 );
44f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst LargestUInt Value::maxLargestUInt = LargestUInt(-1);
45f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
46f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
47f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/// Unknown size marker
48f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIstatic const unsigned int unknown = (unsigned)-1;
49f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
50f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
51f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIItemplate <typename T, typename U>
52f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIstatic inline bool InRange(double d, T min, U max) {
53f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return d >= min && d <= max;
54f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
55f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
56f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIstatic inline double integerToDouble( Json::UInt64 value )
57f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
58f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III    return static_cast<double>( Int64(value/2) ) * 2.0 + Int64(value & 1);
59f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
60f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
61f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIItemplate<typename T>
62f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIstatic inline double integerToDouble( T value )
63f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
64f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III    return static_cast<double>( value );
65f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
66f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
67f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIItemplate <typename T, typename U>
68f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIstatic inline bool InRange(double d, T min, U max) {
69f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return d >= integerToDouble(min) && d <= integerToDouble(max);
70f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
71f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
72f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
73f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
74f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/** Duplicates the specified string value.
75f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * @param value Pointer to the string to duplicate. Must be zero-terminated if
76f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III *              length is "unknown".
77f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * @param length Length of the value. if equals to unknown, then it will be
78f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III *               computed using strlen(value).
79f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * @return Pointer on the duplicate instance of string.
80f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */
81f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIstatic inline char *
82f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIduplicateStringValue( const char *value,
83f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                      unsigned int length = unknown )
84f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
85f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( length == unknown )
86f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      length = (unsigned int)strlen(value);
87f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
88f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   // Avoid an integer overflow in the call to malloc below by limiting length
89f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   // to a sane value.
90f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if (length >= (unsigned)Value::maxInt)
91f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      length = Value::maxInt - 1;
92f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
93f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   char *newString = static_cast<char *>( malloc( length + 1 ) );
94f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT_MESSAGE( newString != 0, "Failed to allocate string value buffer" );
95f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   memcpy( newString, value, length );
96f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   newString[length] = 0;
97f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return newString;
98f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
99f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
100f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
101f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/** Free the string duplicated by duplicateStringValue().
102f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */
103f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIstatic inline void
104f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIreleaseStringValue( char *value )
105f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
106f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( value )
107f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      free( value );
108f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
109f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
110f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III} // namespace Json
111f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
112f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
113f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
114f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
115f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
116f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// ValueInternals...
117f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
118f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
119f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
120f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#if !defined(JSON_IS_AMALGAMATION)
121f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP
122f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#  include "json_internalarray.inl"
123f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#  include "json_internalmap.inl"
124f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif // JSON_VALUE_USE_INTERNAL_MAP
125f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
126f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include "json_valueiterator.inl"
127f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // if !defined(JSON_IS_AMALGAMATION)
128f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
129f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIInamespace Json {
130f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
131f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
132f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
133f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
134f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// class Value::CommentInfo
135f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
136f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
137f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
138f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
139f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
140f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::CommentInfo::CommentInfo()
141f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : comment_( 0 )
142f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
143f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
144f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
145f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::CommentInfo::~CommentInfo()
146f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
147f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( comment_ )
148f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      releaseStringValue( comment_ );
149f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
150f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
151f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
152f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIvoid
153f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::CommentInfo::setComment( const char *text )
154f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
155f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( comment_ )
156f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      releaseStringValue( comment_ );
157f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT( text != 0 );
158f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT_MESSAGE( text[0]=='\0' || text[0]=='/', "Comments must start with /");
159f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   // It seems that /**/ style comments are acceptable as well.
160f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   comment_ = duplicateStringValue( text );
161f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
162f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
163f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
164f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
165f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
166f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
167f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// class Value::CZString
168f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
169f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
170f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
171f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifndef JSON_VALUE_USE_INTERNAL_MAP
172f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
173f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// Notes: index_ indicates if the string was allocated when
174f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// a string is stored.
175f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
176f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::CZString::CZString( ArrayIndex index )
177f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : cstr_( 0 )
178f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , index_( index )
179f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
180f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
181f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
182f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::CZString::CZString( const char *cstr, DuplicationPolicy allocate )
183f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : cstr_( allocate == duplicate ? duplicateStringValue(cstr)
184f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                                  : cstr )
185f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , index_( allocate )
186f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
187f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
188f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
189f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::CZString::CZString( const CZString &other )
190f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III: cstr_( other.index_ != noDuplication &&  other.cstr_ != 0
191f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                ?  duplicateStringValue( other.cstr_ )
192f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                : other.cstr_ )
193f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , index_( other.cstr_ ? (other.index_ == noDuplication ? noDuplication : duplicate)
194f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                         : other.index_ )
195f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
196f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
197f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
198f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::CZString::~CZString()
199f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
200f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( cstr_  &&  index_ == duplicate )
201f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      releaseStringValue( const_cast<char *>( cstr_ ) );
202f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
203f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
204f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIvoid
205f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::CZString::swap( CZString &other )
206f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
207f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   std::swap( cstr_, other.cstr_ );
208f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   std::swap( index_, other.index_ );
209f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
210f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
211f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::CZString &
212f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::CZString::operator =( const CZString &other )
213f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
214f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   CZString temp( other );
215f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   swap( temp );
216f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return *this;
217f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
218f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
219f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
220f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::CZString::operator<( const CZString &other ) const
221f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
222f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( cstr_ )
223f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return strcmp( cstr_, other.cstr_ ) < 0;
224f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return index_ < other.index_;
225f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
226f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
227f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
228f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::CZString::operator==( const CZString &other ) const
229f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
230f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( cstr_ )
231f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return strcmp( cstr_, other.cstr_ ) == 0;
232f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return index_ == other.index_;
233f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
234f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
235f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
236f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIArrayIndex
237f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::CZString::index() const
238f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
239f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return index_;
240f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
241f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
242f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
243f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst char *
244f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::CZString::c_str() const
245f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
246f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return cstr_;
247f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
248f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
249f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
250f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::CZString::isStaticString() const
251f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
252f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return index_ == noDuplication;
253f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
254f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
255f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // ifndef JSON_VALUE_USE_INTERNAL_MAP
256f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
257f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
258f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
259f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
260f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
261f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// class Value::Value
262f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
263f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
264f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
265f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
266f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/*! \internal Default constructor initialization must be equivalent to:
267f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * memset( this, 0, sizeof(Value) )
268f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * This optimization is used in ValueInternalMap fast allocator.
269f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */
270f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Value( ValueType type )
271f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : type_( type )
272f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , allocated_( false )
273f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP
274f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , itemIsUsed_( 0 )
275f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
276f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , comments_( 0 )
277f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
278f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type )
279f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
280f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case nullValue:
281f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
282f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
283f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
284f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      value_.int_ = 0;
285f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
286f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
287f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      value_.real_ = 0.0;
288f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
289f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case stringValue:
290f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      value_.string_ = 0;
291f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
292f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP
293f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
294f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
295f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      value_.map_ = new ObjectValues();
296f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
297f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
298f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
299f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      value_.array_ = arrayAllocator()->newArray();
300f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
301f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
302f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      value_.map_ = mapAllocator()->newMap();
303f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
304f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
305f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case booleanValue:
306f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      value_.bool_ = false;
307f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
308f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
309f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_ASSERT_UNREACHABLE;
310f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
311f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
312f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
313f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
314f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Value( UInt value )
315f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : type_( uintValue )
316f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , allocated_( false )
317f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP
318f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , itemIsUsed_( 0 )
319f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
320f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , comments_( 0 )
321f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
322f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   value_.uint_ = value;
323f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
324f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
325f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Value( Int value )
326f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : type_( intValue )
327f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , allocated_( false )
328f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP
329f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , itemIsUsed_( 0 )
330f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
331f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , comments_( 0 )
332f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
333f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   value_.int_ = value;
334f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
335f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
336f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
337f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# if defined(JSON_HAS_INT64)
338f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Value( Int64 value )
339f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : type_( intValue )
340f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , allocated_( false )
341f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP
342f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , itemIsUsed_( 0 )
343f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
344f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , comments_( 0 )
345f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
346f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   value_.int_ = value;
347f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
348f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
349f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
350f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Value( UInt64 value )
351f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : type_( uintValue )
352f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , allocated_( false )
353f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP
354f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , itemIsUsed_( 0 )
355f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
356f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , comments_( 0 )
357f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
358f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   value_.uint_ = value;
359f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
360f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // defined(JSON_HAS_INT64)
361f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
362f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Value( double value )
363f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : type_( realValue )
364f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , allocated_( false )
365f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP
366f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , itemIsUsed_( 0 )
367f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
368f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , comments_( 0 )
369f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
370f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   value_.real_ = value;
371f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
372f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
373f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Value( const char *value )
374f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : type_( stringValue )
375f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , allocated_( true )
376f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP
377f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , itemIsUsed_( 0 )
378f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
379f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , comments_( 0 )
380f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
381f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   value_.string_ = duplicateStringValue( value );
382f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
383f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
384f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
385f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Value( const char *beginValue,
386f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III              const char *endValue )
387f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : type_( stringValue )
388f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , allocated_( true )
389f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP
390f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , itemIsUsed_( 0 )
391f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
392f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , comments_( 0 )
393f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
394f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   value_.string_ = duplicateStringValue( beginValue,
395f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                                          (unsigned int)(endValue - beginValue) );
396f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
397f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
398f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
399f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Value( const std::string &value )
400f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : type_( stringValue )
401f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , allocated_( true )
402f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP
403f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , itemIsUsed_( 0 )
404f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
405f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , comments_( 0 )
406f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
407f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   value_.string_ = duplicateStringValue( value.c_str(),
408f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                                          (unsigned int)value.length() );
409f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
410f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
411f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
412f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Value( const StaticString &value )
413f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : type_( stringValue )
414f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , allocated_( false )
415f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP
416f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , itemIsUsed_( 0 )
417f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
418f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , comments_( 0 )
419f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
420f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   value_.string_ = const_cast<char *>( value.c_str() );
421f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
422f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
423f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
424f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_USE_CPPTL
425f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Value( const CppTL::ConstString &value )
426f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : type_( stringValue )
427f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , allocated_( true )
428f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP
429f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , itemIsUsed_( 0 )
430f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
431f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , comments_( 0 )
432f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
433f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   value_.string_ = duplicateStringValue( value, value.length() );
434f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
435f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif
436f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
437f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Value( bool value )
438f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : type_( booleanValue )
439f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , allocated_( false )
440f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP
441f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , itemIsUsed_( 0 )
442f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
443f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , comments_( 0 )
444f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
445f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   value_.bool_ = value;
446f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
447f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
448f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
449f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Value( const Value &other )
450f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : type_( other.type_ )
451f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , allocated_( false )
452f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_VALUE_USE_INTERNAL_MAP
453f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , itemIsUsed_( 0 )
454f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
455f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , comments_( 0 )
456f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
457f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
458f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
459f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case nullValue:
460f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
461f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
462f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
463f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case booleanValue:
464f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      value_ = other.value_;
465f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
466f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case stringValue:
467f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( other.value_.string_ )
468f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
469f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         value_.string_ = duplicateStringValue( other.value_.string_ );
470f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         allocated_ = true;
471f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
472f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      else
473f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         value_.string_ = 0;
474f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
475f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP
476f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
477f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
478f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      value_.map_ = new ObjectValues( *other.value_.map_ );
479f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
480f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
481f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
482f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      value_.array_ = arrayAllocator()->newArrayCopy( *other.value_.array_ );
483f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
484f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
485f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      value_.map_ = mapAllocator()->newMapCopy( *other.value_.map_ );
486f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
487f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
488f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
489f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_ASSERT_UNREACHABLE;
490f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
491f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( other.comments_ )
492f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
493f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      comments_ = new CommentInfo[numberOfCommentPlacement];
494f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      for ( int comment =0; comment < numberOfCommentPlacement; ++comment )
495f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
496f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         const CommentInfo &otherComment = other.comments_[comment];
497f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         if ( otherComment.comment_ )
498f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            comments_[comment].setComment( otherComment.comment_ );
499f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
500f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
501f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
502f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
503f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
504f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::~Value()
505f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
506f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
507f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
508f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case nullValue:
509f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
510f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
511f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
512f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case booleanValue:
513f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
514f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case stringValue:
515f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( allocated_ )
516f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         releaseStringValue( value_.string_ );
517f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
518f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP
519f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
520f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
521f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      delete value_.map_;
522f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
523f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
524f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
525f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      arrayAllocator()->destructArray( value_.array_ );
526f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
527f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
528f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      mapAllocator()->destructMap( value_.map_ );
529f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
530f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
531f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
532f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_ASSERT_UNREACHABLE;
533f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
534f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
535f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( comments_ )
536f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      delete[] comments_;
537f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
538f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
539f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue &
540f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator=( const Value &other )
541f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
542f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   Value temp( other );
543f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   swap( temp );
544f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return *this;
545f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
546f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
547f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIvoid
548f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::swap( Value &other )
549f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
550f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   ValueType temp = type_;
551f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   type_ = other.type_;
552f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   other.type_ = temp;
553f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   std::swap( value_, other.value_ );
554f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   int temp2 = allocated_;
555f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   allocated_ = other.allocated_;
556f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   other.allocated_ = temp2;
557f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
558f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
559f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValueType
560f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::type() const
561f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
562f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return type_;
563f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
564f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
565f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
566f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIint
567f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::compare( const Value &other ) const
568f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
569f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( *this < other )
570f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return -1;
571f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( *this > other )
572f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return 1;
573f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return 0;
574f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
575f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
576f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
577f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
578f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator <( const Value &other ) const
579f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
580f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   int typeDelta = type_ - other.type_;
581f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( typeDelta )
582f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return typeDelta < 0 ? true : false;
583f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
584f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
585f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case nullValue:
586f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return false;
587f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
588f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.int_ < other.value_.int_;
589f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
590f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.uint_ < other.value_.uint_;
591f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
592f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.real_ < other.value_.real_;
593f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case booleanValue:
594f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.bool_ < other.value_.bool_;
595f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case stringValue:
596f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return ( value_.string_ == 0  &&  other.value_.string_ )
597f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || ( other.value_.string_
598f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                  &&  value_.string_
599f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                  && strcmp( value_.string_, other.value_.string_ ) < 0 );
600f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP
601f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
602f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
603f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
604f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         int delta = int( value_.map_->size() - other.value_.map_->size() );
605f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         if ( delta )
606f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            return delta < 0;
607f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         return (*value_.map_) < (*other.value_.map_);
608f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
609f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
610f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
611f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.array_->compare( *(other.value_.array_) ) < 0;
612f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
613f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.map_->compare( *(other.value_.map_) ) < 0;
614f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
615f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
616f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_ASSERT_UNREACHABLE;
617f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
618f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return false;  // unreachable
619f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
620f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
621f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
622f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator <=( const Value &other ) const
623f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
624f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return !(other < *this);
625f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
626f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
627f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
628f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator >=( const Value &other ) const
629f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
630f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return !(*this < other);
631f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
632f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
633f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
634f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator >( const Value &other ) const
635f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
636f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return other < *this;
637f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
638f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
639f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
640f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator ==( const Value &other ) const
641f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
642f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   //if ( type_ != other.type_ )
643f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   // GCC 2.95.3 says:
644f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   // attempt to take address of bit-field structure member `Json::Value::type_'
645f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   // Beats me, but a temp solves the problem.
646f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   int temp = other.type_;
647f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( type_ != temp )
648f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return false;
649f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
650f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
651f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case nullValue:
652f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return true;
653f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
654f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.int_ == other.value_.int_;
655f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
656f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.uint_ == other.value_.uint_;
657f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
658f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.real_ == other.value_.real_;
659f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case booleanValue:
660f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.bool_ == other.value_.bool_;
661f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case stringValue:
662f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return ( value_.string_ == other.value_.string_ )
663f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || ( other.value_.string_
664f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                  &&  value_.string_
665f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                  && strcmp( value_.string_, other.value_.string_ ) == 0 );
666f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP
667f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
668f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
669f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.map_->size() == other.value_.map_->size()
670f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             && (*value_.map_) == (*other.value_.map_);
671f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
672f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
673f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.array_->compare( *(other.value_.array_) ) == 0;
674f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
675f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.map_->compare( *(other.value_.map_) ) == 0;
676f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
677f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
678f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_ASSERT_UNREACHABLE;
679f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
680f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return false;  // unreachable
681f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
682f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
683f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
684f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator !=( const Value &other ) const
685f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
686f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return !( *this == other );
687f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
688f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
689f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst char *
690f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::asCString() const
691f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
692f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT( type_ == stringValue );
693f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return value_.string_;
694f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
695f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
696f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
697f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIstd::string
698f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::asString() const
699f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
700f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
701f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
702f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case nullValue:
703f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return "";
704f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case stringValue:
705f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.string_ ? value_.string_ : "";
706f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case booleanValue:
707f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.bool_ ? "true" : "false";
708f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
709f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return valueToString( value_.int_ );
710f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
711f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return valueToString( value_.uint_ );
712f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
713f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return valueToString( value_.real_ );
714f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
715f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_FAIL_MESSAGE( "Type is not convertible to string" );
716f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
717f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
718f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
719f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_USE_CPPTL
720f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIICppTL::ConstString
721f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::asConstString() const
722f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
723f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return CppTL::ConstString( asString().c_str() );
724f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
725f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif
726f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
727f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
728f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Int
729f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::asInt() const
730f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
731f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
732f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
733f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
734f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range");
735f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return Int(value_.int_);
736f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
737f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_ASSERT_MESSAGE(isInt(), "LargestUInt out of Int range");
738f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return Int(value_.uint_);
739f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
740f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt, maxInt), "double out of Int range");
741f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return Int(value_.real_);
742f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case nullValue:
743f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return 0;
744f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case booleanValue:
745f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.bool_ ? 1 : 0;
746f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
747f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
748f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
749f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_FAIL_MESSAGE("Value is not convertible to Int.");
750f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
751f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
752f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
753f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::UInt
754f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::asUInt() const
755f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
756f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
757f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
758f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
759f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range");
760f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return UInt(value_.int_);
761f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
762f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_ASSERT_MESSAGE(isUInt(), "LargestUInt out of UInt range");
763f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return UInt(value_.uint_);
764f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
765f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt), "double out of UInt range");
766f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return UInt( value_.real_ );
767f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case nullValue:
768f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return 0;
769f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case booleanValue:
770f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.bool_ ? 1 : 0;
771f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
772f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
773f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
774f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_FAIL_MESSAGE("Value is not convertible to UInt.");
775f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
776f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
777f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
778f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# if defined(JSON_HAS_INT64)
779f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
780f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Int64
781f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::asInt64() const
782f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
783f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
784f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
785f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
786f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return Int64(value_.int_);
787f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
788f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_ASSERT_MESSAGE(isInt64(), "LargestUInt out of Int64 range");
789f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return Int64(value_.uint_);
790f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
791f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt64, maxInt64), "double out of Int64 range");
792f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return Int64(value_.real_);
793f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case nullValue:
794f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return 0;
795f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case booleanValue:
796f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.bool_ ? 1 : 0;
797f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
798f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
799f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
800f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_FAIL_MESSAGE("Value is not convertible to Int64.");
801f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
802f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
803f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
804f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::UInt64
805f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::asUInt64() const
806f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
807f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
808f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
809f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
810f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range");
811f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return UInt64(value_.int_);
812f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
813f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return UInt64(value_.uint_);
814f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
815f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt64), "double out of UInt64 range");
816f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return UInt64( value_.real_ );
817f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case nullValue:
818f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return 0;
819f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case booleanValue:
820f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.bool_ ? 1 : 0;
821f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
822f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
823f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
824f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_FAIL_MESSAGE("Value is not convertible to UInt64.");
825f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
826f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif // if defined(JSON_HAS_INT64)
827f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
828f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
829f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIILargestInt
830f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::asLargestInt() const
831f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
832f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#if defined(JSON_NO_INT64)
833f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III    return asInt();
834f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
835f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III    return asInt64();
836f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
837f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
838f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
839f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
840f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIILargestUInt
841f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::asLargestUInt() const
842f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
843f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#if defined(JSON_NO_INT64)
844f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III    return asUInt();
845f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
846f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III    return asUInt64();
847f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
848f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
849f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
850f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
851f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIdouble
852f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::asDouble() const
853f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
854f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
855f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
856f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
857f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return static_cast<double>( value_.int_ );
858f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
859f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
860f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return static_cast<double>( value_.uint_ );
861f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
862f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return integerToDouble( value_.uint_ );
863f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
864f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
865f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.real_;
866f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case nullValue:
867f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return 0.0;
868f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case booleanValue:
869f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.bool_ ? 1.0 : 0.0;
870f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
871f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
872f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
873f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_FAIL_MESSAGE("Value is not convertible to double.");
874f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
875f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
876f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIfloat
877f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::asFloat() const
878f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
879f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
880f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
881f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
882f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return static_cast<float>( value_.int_ );
883f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
884f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
885f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return static_cast<float>( value_.uint_ );
886f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
887f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return integerToDouble( value_.uint_ );
888f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
889f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
890f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return static_cast<float>( value_.real_ );
891f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case nullValue:
892f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return 0.0;
893f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case booleanValue:
894f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.bool_ ? 1.0f : 0.0f;
895f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
896f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
897f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
898f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_FAIL_MESSAGE("Value is not convertible to float.");
899f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
900f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
901f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
902f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::asBool() const
903f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
904f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
905f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
906f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case booleanValue:
907f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.bool_;
908f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case nullValue:
909f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return false;
910f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
911f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.int_ ? true : false;
912f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
913f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.uint_ ? true : false;
914f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
915f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.real_ ? true : false;
916f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
917f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
918f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
919f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_FAIL_MESSAGE("Value is not convertible to bool.");
920f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
921f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
922f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
923f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
924f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isConvertibleTo( ValueType other ) const
925f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
926f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( other )
927f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
928f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case nullValue:
929f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return ( isNumeric() && asDouble() == 0.0 )
930f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || ( type_ == booleanValue && value_.bool_ == false )
931f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || ( type_ == stringValue && asString() == "" )
932f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || ( type_ == arrayValue && value_.map_->size() == 0 )
933f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || ( type_ == objectValue && value_.map_->size() == 0 )
934f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || type_ == nullValue;
935f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
936f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return isInt()
937f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || (type_ == realValue && InRange(value_.real_, minInt, maxInt))
938f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || type_ == booleanValue
939f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || type_ == nullValue;
940f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
941f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return isUInt()
942f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || (type_ == realValue && InRange(value_.real_, 0, maxUInt))
943f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || type_ == booleanValue
944f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || type_ == nullValue;
945f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
946f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return isNumeric()
947f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || type_ == booleanValue
948f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || type_ == nullValue;
949f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case booleanValue:
950f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return isNumeric()
951f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || type_ == booleanValue
952f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || type_ == nullValue;
953f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case stringValue:
954f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return isNumeric()
955f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || type_ == booleanValue
956f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || type_ == stringValue
957f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || type_ == nullValue;
958f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
959f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return type_ == arrayValue
960f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || type_ == nullValue;
961f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
962f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return type_ == objectValue
963f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             || type_ == nullValue;
964f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
965f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT_UNREACHABLE;
966f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return false;
967f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
968f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
969f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
970f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/// Number of values in array or object
971f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIArrayIndex
972f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::size() const
973f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
974f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
975f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
976f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case nullValue:
977f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
978f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
979f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
980f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case booleanValue:
981f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case stringValue:
982f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return 0;
983f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP
984f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:  // size of the array is highest index + 1
985f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( !value_.map_->empty() )
986f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
987f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         ObjectValues::const_iterator itLast = value_.map_->end();
988f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         --itLast;
989f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         return (*itLast).first.index()+1;
990f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
991f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return 0;
992f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
993f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return ArrayIndex( value_.map_->size() );
994f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
995f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
996f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return Int( value_.array_->size() );
997f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
998f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return Int( value_.map_->size() );
999f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
1000f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1001f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT_UNREACHABLE;
1002f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return 0; // unreachable;
1003f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1004f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1005f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1006f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1007f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::empty() const
1008f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1009f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( isNull() || isArray() || isObject() )
1010f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return size() == 0u;
1011f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   else
1012f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return false;
1013f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1014f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1015f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1016f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1017f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator!() const
1018f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1019f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return isNull();
1020f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1021f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1022f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1023f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIvoid
1024f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::clear()
1025f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1026f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue  || type_ == objectValue );
1027f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1028f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
1029f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1030f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP
1031f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
1032f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
1033f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      value_.map_->clear();
1034f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1035f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
1036f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
1037f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      value_.array_->clear();
1038f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1039f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
1040f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      value_.map_->clear();
1041f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1042f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
1043f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
1044f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1045f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1046f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1047f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1048f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIvoid
1049f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::resize( ArrayIndex newSize )
1050f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1051f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue );
1052f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( type_ == nullValue )
1053f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      *this = Value( arrayValue );
1054f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP
1055f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   ArrayIndex oldSize = size();
1056f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( newSize == 0 )
1057f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      clear();
1058f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   else if ( newSize > oldSize )
1059f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      (*this)[ newSize - 1 ];
1060f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   else
1061f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1062f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      for ( ArrayIndex index = newSize; index < oldSize; ++index )
1063f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1064f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         value_.map_->erase( index );
1065f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1066f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      assert( size() == newSize );
1067f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1068f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
1069f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   value_.array_->resize( newSize );
1070f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
1071f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1072f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1073f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1074f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue &
1075f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator[]( ArrayIndex index )
1076f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1077f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue );
1078f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( type_ == nullValue )
1079f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      *this = Value( arrayValue );
1080f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP
1081f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   CZString key( index );
1082f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   ObjectValues::iterator it = value_.map_->lower_bound( key );
1083f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( it != value_.map_->end()  &&  (*it).first == key )
1084f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return (*it).second;
1085f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1086f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   ObjectValues::value_type defaultValue( key, null );
1087f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   it = value_.map_->insert( it, defaultValue );
1088f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return (*it).second;
1089f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
1090f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return value_.array_->resolveReference( index );
1091f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
1092f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1093f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1094f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1095f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue &
1096f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator[]( int index )
1097f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1098f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT( index >= 0 );
1099f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return (*this)[ ArrayIndex(index) ];
1100f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1101f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1102f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1103f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst Value &
1104f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator[]( ArrayIndex index ) const
1105f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1106f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue );
1107f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( type_ == nullValue )
1108f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return null;
1109f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP
1110f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   CZString key( index );
1111f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   ObjectValues::const_iterator it = value_.map_->find( key );
1112f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( it == value_.map_->end() )
1113f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return null;
1114f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return (*it).second;
1115f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
1116f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   Value *value = value_.array_->find( index );
1117f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return value ? *value : null;
1118f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
1119f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1120f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1121f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1122f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst Value &
1123f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator[]( int index ) const
1124f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1125f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT( index >= 0 );
1126f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return (*this)[ ArrayIndex(index) ];
1127f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1128f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1129f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1130f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue &
1131f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator[]( const char *key )
1132f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1133f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return resolveReference( key, false );
1134f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1135f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1136f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1137f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue &
1138f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::resolveReference( const char *key,
1139f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                         bool isStatic )
1140f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1141f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
1142f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( type_ == nullValue )
1143f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      *this = Value( objectValue );
1144f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP
1145f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   CZString actualKey( key, isStatic ? CZString::noDuplication
1146f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                                     : CZString::duplicateOnCopy );
1147f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   ObjectValues::iterator it = value_.map_->lower_bound( actualKey );
1148f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( it != value_.map_->end()  &&  (*it).first == actualKey )
1149f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return (*it).second;
1150f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1151f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   ObjectValues::value_type defaultValue( actualKey, null );
1152f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   it = value_.map_->insert( it, defaultValue );
1153f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   Value &value = (*it).second;
1154f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return value;
1155f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
1156f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return value_.map_->resolveReference( key, isStatic );
1157f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
1158f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1159f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1160f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1161f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue
1162f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::get( ArrayIndex index,
1163f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            const Value &defaultValue ) const
1164f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1165f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   const Value *value = &((*this)[index]);
1166f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return value == &null ? defaultValue : *value;
1167f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1168f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1169f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1170f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1171f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isValidIndex( ArrayIndex index ) const
1172f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1173f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return index < size();
1174f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1175f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1176f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1177f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1178f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst Value &
1179f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator[]( const char *key ) const
1180f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1181f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
1182f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( type_ == nullValue )
1183f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return null;
1184f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP
1185f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   CZString actualKey( key, CZString::noDuplication );
1186f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   ObjectValues::const_iterator it = value_.map_->find( actualKey );
1187f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( it == value_.map_->end() )
1188f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return null;
1189f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return (*it).second;
1190f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
1191f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   const Value *value = value_.map_->find( key );
1192f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return value ? *value : null;
1193f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
1194f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1195f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1196f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1197f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue &
1198f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator[]( const std::string &key )
1199f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1200f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return (*this)[ key.c_str() ];
1201f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1202f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1203f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1204f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst Value &
1205f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator[]( const std::string &key ) const
1206f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1207f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return (*this)[ key.c_str() ];
1208f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1209f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1210f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue &
1211f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator[]( const StaticString &key )
1212f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1213f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return resolveReference( key, true );
1214f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1215f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1216f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1217f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_USE_CPPTL
1218f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue &
1219f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator[]( const CppTL::ConstString &key )
1220f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1221f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return (*this)[ key.c_str() ];
1222f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1223f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1224f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1225f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst Value &
1226f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::operator[]( const CppTL::ConstString &key ) const
1227f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1228f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return (*this)[ key.c_str() ];
1229f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1230f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif
1231f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1232f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1233f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue &
1234f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::append( const Value &value )
1235f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1236f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return (*this)[size()] = value;
1237f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1238f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1239f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1240f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue
1241f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::get( const char *key,
1242f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            const Value &defaultValue ) const
1243f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1244f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   const Value *value = &((*this)[key]);
1245f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return value == &null ? defaultValue : *value;
1246f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1247f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1248f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1249f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue
1250f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::get( const std::string &key,
1251f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            const Value &defaultValue ) const
1252f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1253f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return get( key.c_str(), defaultValue );
1254f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1255f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1256f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue
1257f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::removeMember( const char* key )
1258f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1259f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
1260f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( type_ == nullValue )
1261f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return null;
1262f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP
1263f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   CZString actualKey( key, CZString::noDuplication );
1264f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   ObjectValues::iterator it = value_.map_->find( actualKey );
1265f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( it == value_.map_->end() )
1266f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return null;
1267f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   Value old(it->second);
1268f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   value_.map_->erase(it);
1269f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return old;
1270f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
1271f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   Value *value = value_.map_->find( key );
1272f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if (value){
1273f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      Value old(*value);
1274f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      value_.map_.remove( key );
1275f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return old;
1276f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   } else {
1277f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return null;
1278f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1279f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
1280f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1281f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1282f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue
1283f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::removeMember( const std::string &key )
1284f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1285f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return removeMember( key.c_str() );
1286f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1287f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1288f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_USE_CPPTL
1289f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue
1290f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::get( const CppTL::ConstString &key,
1291f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            const Value &defaultValue ) const
1292f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1293f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return get( key.c_str(), defaultValue );
1294f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1295f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif
1296f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1297f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1298f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isMember( const char *key ) const
1299f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1300f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   const Value *value = &((*this)[key]);
1301f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return value != &null;
1302f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1303f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1304f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1305f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1306f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isMember( const std::string &key ) const
1307f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1308f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return isMember( key.c_str() );
1309f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1310f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1311f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1312f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# ifdef JSON_USE_CPPTL
1313f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1314f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isMember( const CppTL::ConstString &key ) const
1315f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1316f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return isMember( key.c_str() );
1317f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1318f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
1319f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1320f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::Members
1321f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::getMemberNames() const
1322f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1323f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
1324f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( type_ == nullValue )
1325f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III       return Value::Members();
1326f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   Members members;
1327f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   members.reserve( value_.map_->size() );
1328f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSON_VALUE_USE_INTERNAL_MAP
1329f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   ObjectValues::const_iterator it = value_.map_->begin();
1330f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   ObjectValues::const_iterator itEnd = value_.map_->end();
1331f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   for ( ; it != itEnd; ++it )
1332f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      members.push_back( std::string( (*it).first.c_str() ) );
1333f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
1334f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   ValueInternalMap::IteratorState it;
1335f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   ValueInternalMap::IteratorState itEnd;
1336f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   value_.map_->makeBeginIterator( it );
1337f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   value_.map_->makeEndIterator( itEnd );
1338f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   for ( ; !ValueInternalMap::equals( it, itEnd ); ValueInternalMap::increment(it) )
1339f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      members.push_back( std::string( ValueInternalMap::key( it ) ) );
1340f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
1341f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return members;
1342f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1343f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//
1344f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//# ifdef JSON_USE_CPPTL
1345f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//EnumMemberNames
1346f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//Value::enumMemberNames() const
1347f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//{
1348f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//   if ( type_ == objectValue )
1349f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//   {
1350f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//      return CppTL::Enum::any(  CppTL::Enum::transform(
1351f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//         CppTL::Enum::keys( *(value_.map_), CppTL::Type<const CZString &>() ),
1352f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//         MemberNamesTransform() ) );
1353f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//   }
1354f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//   return EnumMemberNames();
1355f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//}
1356f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//
1357f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//
1358f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//EnumValues
1359f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//Value::enumValues() const
1360f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//{
1361f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//   if ( type_ == objectValue  ||  type_ == arrayValue )
1362f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//      return CppTL::Enum::anyValues( *(value_.map_),
1363f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//                                     CppTL::Type<const Value &>() );
1364f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//   return EnumValues();
1365f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//}
1366f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//
1367f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III//# endif
1368f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1369f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIstatic bool IsIntegral(double d) {
1370f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III  double integral_part;
1371f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III  return modf(d, &integral_part) == 0.0;
1372f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1373f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1374f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1375f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1376f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isNull() const
1377f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1378f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return type_ == nullValue;
1379f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1380f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1381f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1382f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1383f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isBool() const
1384f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1385f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return type_ == booleanValue;
1386f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1387f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1388f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1389f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1390f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isInt() const
1391f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1392f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
1393f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1394f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
1395f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.int_ >= minInt  &&  value_.int_ <= maxInt;
1396f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
1397f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.uint_ <= UInt(maxInt);
1398f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
1399f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.real_ >= minInt &&
1400f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             value_.real_ <= maxInt &&
1401f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             IsIntegral(value_.real_);
1402f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
1403f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1404f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1405f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return false;
1406f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1407f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1408f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1409f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1410f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isUInt() const
1411f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1412f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
1413f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1414f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
1415f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.int_ >= 0 && LargestUInt(value_.int_) <= LargestUInt(maxUInt);
1416f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
1417f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.uint_ <= maxUInt;
1418f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
1419f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.real_ >= 0 &&
1420f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             value_.real_ <= maxUInt &&
1421f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             IsIntegral(value_.real_);
1422f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
1423f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1424f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1425f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return false;
1426f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1427f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1428f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1429f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isInt64() const
1430f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1431f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# if defined(JSON_HAS_INT64)
1432f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
1433f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1434f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
1435f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III     return true;
1436f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
1437f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.uint_ <= UInt64(maxInt64);
1438f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
1439f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      // Note that maxInt64 (= 2^63 - 1) is not exactly representable as a
1440f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      // double, so double(maxInt64) will be rounded up to 2^63. Therefore we
1441f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      // require the value to be strictly less than the limit.
1442f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.real_ >= double(minInt64) &&
1443f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             value_.real_ < double(maxInt64) &&
1444f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             IsIntegral(value_.real_);
1445f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
1446f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1447f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1448f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif  // JSON_HAS_INT64
1449f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return false;
1450f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1451f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1452f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1453f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isUInt64() const
1454f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1455f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# if defined(JSON_HAS_INT64)
1456f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
1457f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1458f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case intValue:
1459f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III     return value_.int_ >= 0;
1460f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case uintValue:
1461f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return true;
1462f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case realValue:
1463f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a
1464f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we
1465f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      // require the value to be strictly less than the limit.
1466f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return value_.real_ >= 0 &&
1467f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             value_.real_ < maxUInt64AsDouble &&
1468f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III             IsIntegral(value_.real_);
1469f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
1470f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1471f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1472f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# endif  // JSON_HAS_INT64
1473f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return false;
1474f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1475f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1476f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1477f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1478f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isIntegral() const
1479f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1480f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#if defined(JSON_HAS_INT64)
1481f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III  return isInt64() || isUInt64();
1482f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
1483f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III  return isInt() || isUInt();
1484f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
1485f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1486f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1487f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1488f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1489f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isDouble() const
1490f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1491f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return type_ == realValue || isIntegral();
1492f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1493f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1494f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1495f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1496f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isNumeric() const
1497f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1498f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return isIntegral() || isDouble();
1499f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1500f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1501f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1502f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1503f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isString() const
1504f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1505f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return type_ == stringValue;
1506f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1507f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1508f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1509f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1510f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isArray() const
1511f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1512f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return type_ == arrayValue;
1513f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1514f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1515f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1516f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1517f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::isObject() const
1518f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1519f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return type_ == objectValue;
1520f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1521f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1522f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1523f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIvoid
1524f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::setComment( const char *comment,
1525f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                   CommentPlacement placement )
1526f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1527f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( !comments_ )
1528f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      comments_ = new CommentInfo[numberOfCommentPlacement];
1529f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   comments_[placement].setComment( comment );
1530f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1531f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1532f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1533f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIvoid
1534f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::setComment( const std::string &comment,
1535f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                   CommentPlacement placement )
1536f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1537f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   setComment( comment.c_str(), placement );
1538f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1539f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1540f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1541f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIbool
1542f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::hasComment( CommentPlacement placement ) const
1543f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1544f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return comments_ != 0  &&  comments_[placement].comment_ != 0;
1545f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1546f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1547f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIstd::string
1548f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::getComment( CommentPlacement placement ) const
1549f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1550f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( hasComment(placement) )
1551f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      return comments_[placement].comment_;
1552f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return "";
1553f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1554f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1555f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1556f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIstd::string
1557f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::toStyledString() const
1558f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1559f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   StyledWriter writer;
1560f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return writer.write( *this );
1561f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1562f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1563f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1564f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::const_iterator
1565f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::begin() const
1566f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1567f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
1568f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1569f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifdef JSON_VALUE_USE_INTERNAL_MAP
1570f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
1571f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( value_.array_ )
1572f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1573f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         ValueInternalArray::IteratorState it;
1574f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         value_.array_->makeBeginIterator( it );
1575f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         return const_iterator( it );
1576f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1577f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1578f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
1579f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( value_.map_ )
1580f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1581f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         ValueInternalMap::IteratorState it;
1582f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         value_.map_->makeBeginIterator( it );
1583f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         return const_iterator( it );
1584f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1585f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1586f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
1587f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
1588f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
1589f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( value_.map_ )
1590f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         return const_iterator( value_.map_->begin() );
1591f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1592f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
1593f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
1594f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1595f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1596f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return const_iterator();
1597f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1598f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1599f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::const_iterator
1600f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::end() const
1601f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1602f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
1603f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1604f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifdef JSON_VALUE_USE_INTERNAL_MAP
1605f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
1606f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( value_.array_ )
1607f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1608f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         ValueInternalArray::IteratorState it;
1609f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         value_.array_->makeEndIterator( it );
1610f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         return const_iterator( it );
1611f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1612f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1613f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
1614f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( value_.map_ )
1615f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1616f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         ValueInternalMap::IteratorState it;
1617f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         value_.map_->makeEndIterator( it );
1618f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         return const_iterator( it );
1619f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1620f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1621f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
1622f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
1623f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
1624f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( value_.map_ )
1625f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         return const_iterator( value_.map_->end() );
1626f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1627f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
1628f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
1629f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1630f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1631f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return const_iterator();
1632f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1633f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1634f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1635f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::iterator
1636f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::begin()
1637f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1638f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
1639f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1640f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifdef JSON_VALUE_USE_INTERNAL_MAP
1641f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
1642f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( value_.array_ )
1643f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1644f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         ValueInternalArray::IteratorState it;
1645f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         value_.array_->makeBeginIterator( it );
1646f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         return iterator( it );
1647f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1648f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1649f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
1650f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( value_.map_ )
1651f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1652f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         ValueInternalMap::IteratorState it;
1653f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         value_.map_->makeBeginIterator( it );
1654f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         return iterator( it );
1655f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1656f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1657f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
1658f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
1659f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
1660f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( value_.map_ )
1661f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         return iterator( value_.map_->begin() );
1662f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1663f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
1664f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
1665f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1666f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1667f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return iterator();
1668f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1669f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1670f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::iterator
1671f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue::end()
1672f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1673f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   switch ( type_ )
1674f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1675f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifdef JSON_VALUE_USE_INTERNAL_MAP
1676f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
1677f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( value_.array_ )
1678f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1679f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         ValueInternalArray::IteratorState it;
1680f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         value_.array_->makeEndIterator( it );
1681f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         return iterator( it );
1682f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1683f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1684f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
1685f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( value_.map_ )
1686f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1687f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         ValueInternalMap::IteratorState it;
1688f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         value_.map_->makeEndIterator( it );
1689f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         return iterator( it );
1690f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1691f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1692f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#else
1693f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case arrayValue:
1694f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   case objectValue:
1695f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( value_.map_ )
1696f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         return iterator( value_.map_->end() );
1697f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1698f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif
1699f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   default:
1700f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      break;
1701f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1702f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return iterator();
1703f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1704f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1705f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1706f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// class PathArgument
1707f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
1708f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1709f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIPathArgument::PathArgument()
1710f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : key_()
1711f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , index_()
1712f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , kind_( kindNone )
1713f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1714f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1715f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1716f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1717f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIPathArgument::PathArgument( ArrayIndex index )
1718f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : key_()
1719f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , index_( index )
1720f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , kind_( kindIndex )
1721f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1722f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1723f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1724f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1725f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIPathArgument::PathArgument( const char *key )
1726f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : key_( key )
1727f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , index_()
1728f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , kind_( kindKey )
1729f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1730f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1731f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1732f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1733f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIPathArgument::PathArgument( const std::string &key )
1734f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   : key_( key.c_str() )
1735f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , index_()
1736f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   , kind_( kindKey )
1737f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1738f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1739f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1740f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// class Path
1741f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// //////////////////////////////////////////////////////////////////
1742f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1743f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIPath::Path( const std::string &path,
1744f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            const PathArgument &a1,
1745f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            const PathArgument &a2,
1746f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            const PathArgument &a3,
1747f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            const PathArgument &a4,
1748f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            const PathArgument &a5 )
1749f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1750f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   InArgs in;
1751f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   in.push_back( &a1 );
1752f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   in.push_back( &a2 );
1753f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   in.push_back( &a3 );
1754f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   in.push_back( &a4 );
1755f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   in.push_back( &a5 );
1756f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   makePath( path, in );
1757f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1758f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1759f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1760f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIvoid
1761f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIPath::makePath( const std::string &path,
1762f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                const InArgs &in )
1763f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1764f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   const char *current = path.c_str();
1765f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   const char *end = current + path.length();
1766f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   InArgs::const_iterator itInArg = in.begin();
1767f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   while ( current != end )
1768f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1769f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( *current == '[' )
1770f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1771f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         ++current;
1772f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         if ( *current == '%' )
1773f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            addPathInArg( path, in, itInArg, PathArgument::kindIndex );
1774f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         else
1775f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         {
1776f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            ArrayIndex index = 0;
1777f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            for ( ; current != end && *current >= '0'  &&  *current <= '9'; ++current )
1778f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III               index = index * 10 + ArrayIndex(*current - '0');
1779f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            args_.push_back( index );
1780f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         }
1781f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         if ( current == end  ||  *current++ != ']' )
1782f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            invalidPath( path, int(current - path.c_str()) );
1783f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1784f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      else if ( *current == '%' )
1785f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1786f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         addPathInArg( path, in, itInArg, PathArgument::kindKey );
1787f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         ++current;
1788f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1789f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      else if ( *current == '.' )
1790f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1791f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         ++current;
1792f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1793f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      else
1794f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1795f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         const char *beginName = current;
1796f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         while ( current != end  &&  !strchr( "[.", *current ) )
1797f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            ++current;
1798f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         args_.push_back( std::string( beginName, current ) );
1799f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1800f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1801f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1802f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1803f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1804f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIvoid
1805f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIPath::addPathInArg( const std::string &path,
1806f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                    const InArgs &in,
1807f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                    InArgs::const_iterator &itInArg,
1808f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                    PathArgument::Kind kind )
1809f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1810f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   if ( itInArg == in.end() )
1811f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1812f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      // Error: missing argument %d
1813f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1814f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   else if ( (*itInArg)->kind_ != kind )
1815f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1816f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      // Error: bad argument type
1817f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1818f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   else
1819f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1820f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      args_.push_back( **itInArg );
1821f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1822f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1823f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1824f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1825f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIvoid
1826f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIPath::invalidPath( const std::string &path,
1827f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                   int location )
1828f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1829f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   // Error: invalid path.
1830f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1831f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1832f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1833f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIconst Value &
1834f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIPath::resolve( const Value &root ) const
1835f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1836f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   const Value *node = &root;
1837f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
1838f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1839f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      const PathArgument &arg = *it;
1840f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( arg.kind_ == PathArgument::kindIndex )
1841f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1842f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         if ( !node->isArray()  ||  !node->isValidIndex( arg.index_ ) )
1843f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         {
1844f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            // Error: unable to resolve path (array value expected at position...
1845f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         }
1846f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         node = &((*node)[arg.index_]);
1847f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1848f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      else if ( arg.kind_ == PathArgument::kindKey )
1849f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1850f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         if ( !node->isObject() )
1851f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         {
1852f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            // Error: unable to resolve path (object value expected at position...)
1853f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         }
1854f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         node = &((*node)[arg.key_]);
1855f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         if ( node == &Value::null )
1856f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         {
1857f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            // Error: unable to resolve path (object has no member named '' at position...)
1858f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         }
1859f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1860f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1861f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return *node;
1862f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1863f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1864f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1865f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue
1866f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIPath::resolve( const Value &root,
1867f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III               const Value &defaultValue ) const
1868f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1869f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   const Value *node = &root;
1870f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
1871f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1872f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      const PathArgument &arg = *it;
1873f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( arg.kind_ == PathArgument::kindIndex )
1874f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1875f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         if ( !node->isArray()  ||  !node->isValidIndex( arg.index_ ) )
1876f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            return defaultValue;
1877f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         node = &((*node)[arg.index_]);
1878f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1879f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      else if ( arg.kind_ == PathArgument::kindKey )
1880f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1881f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         if ( !node->isObject() )
1882f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            return defaultValue;
1883f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         node = &((*node)[arg.key_]);
1884f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         if ( node == &Value::null )
1885f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            return defaultValue;
1886f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1887f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1888f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return *node;
1889f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1890f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1891f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1892f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIValue &
1893f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIPath::make( Value &root ) const
1894f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{
1895f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   Value *node = &root;
1896f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
1897f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   {
1898f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      const PathArgument &arg = *it;
1899f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      if ( arg.kind_ == PathArgument::kindIndex )
1900f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1901f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         if ( !node->isArray() )
1902f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         {
1903f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            // Error: node is not an array at position ...
1904f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         }
1905f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         node = &((*node)[arg.index_]);
1906f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1907f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      else if ( arg.kind_ == PathArgument::kindKey )
1908f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      {
1909f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         if ( !node->isObject() )
1910f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         {
1911f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III            // Error: node is not an object at position...
1912f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         }
1913f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III         node = &((*node)[arg.key_]);
1914f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      }
1915f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   }
1916f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III   return *node;
1917f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}
1918f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1919f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III
1920f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III} // namespace Json
1921