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