15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2011 Baptiste Lepilleur
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Distributed under MIT license, or public domain if desired and
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// recognized in your jurisdiction.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(JSON_IS_AMALGAMATION)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <json/assertions.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <json/value.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <json/writer.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  include "json_batchallocator.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif // #ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // if !defined(JSON_IS_AMALGAMATION)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <math.h>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sstream>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdexcept>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstring>
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cassert>
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef JSON_USE_CPPTL
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <cpptl/conststring.h>
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstddef>    // size_t
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define JSON_ASSERT_UNREACHABLE assert( false )
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace Json {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is a walkaround to avoid the static initialization of Value::null.
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// kNull must be word-aligned to avoid crashing on ARM.  We use an alignment of
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// 8 (instead of 4) as a bit of future-proofing.
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(__ARMEL__)
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment)))
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define ALIGNAS(byte_alignment)
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static const unsigned char ALIGNAS(8) kNull[sizeof(Value)] = {0};
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Value& Value::null = reinterpret_cast<const Value&>(kNull);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Int Value::minInt = Int( ~(UInt(-1)/2) );
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Int Value::maxInt = Int( UInt(-1)/2 );
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const UInt Value::maxUInt = UInt(-1);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(JSON_HAS_INT64)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Int64 Value::minInt64 = Int64( ~(UInt64(-1)/2) );
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Int64 Value::maxInt64 = Int64( UInt64(-1)/2 );
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const UInt64 Value::maxUInt64 = UInt64(-1);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The constant is hard-coded because some compiler have trouble
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// converting Value::maxUInt64 to a double correctly (AIX/xlC).
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assumes that UInt64 is a 64 bits integer.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const double maxUInt64AsDouble = 18446744073709551615.0;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(JSON_HAS_INT64)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const LargestInt Value::minLargestInt = LargestInt( ~(LargestUInt(-1)/2) );
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const LargestInt Value::maxLargestInt = LargestInt( LargestUInt(-1)/2 );
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const LargestUInt Value::maxLargestUInt = LargestUInt(-1);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// Unknown size marker
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const unsigned int unknown = (unsigned)-1;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T, typename U>
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline bool InRange(double d, T min, U max) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return d >= min && d <= max;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline double integerToDouble( Json::UInt64 value )
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<double>( Int64(value/2) ) * 2.0 + Int64(value & 1);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T>
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline double integerToDouble( T value )
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<double>( value );
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T, typename U>
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline bool InRange(double d, T min, U max) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return d >= integerToDouble(min) && d <= integerToDouble(max);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** Duplicates the specified string value.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param value Pointer to the string to duplicate. Must be zero-terminated if
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *              length is "unknown".
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param length Length of the value. if equals to unknown, then it will be
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *               computed using strlen(value).
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return Pointer on the duplicate instance of string.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline char *
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)duplicateStringValue( const char *value,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      unsigned int length = unknown )
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( length == unknown )
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      length = (unsigned int)strlen(value);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // Avoid an integer overflow in the call to malloc below by limiting length
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // to a sane value.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (length >= (unsigned)Value::maxInt)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      length = Value::maxInt - 1;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   char *newString = static_cast<char *>( malloc( length + 1 ) );
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT_MESSAGE( newString != 0, "Failed to allocate string value buffer" );
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memcpy( newString, value, length );
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   newString[length] = 0;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return newString;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** Free the string duplicated by duplicateStringValue().
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline void
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)releaseStringValue( char *value )
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( value )
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      free( value );
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace Json
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ValueInternals...
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(JSON_IS_AMALGAMATION)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_VALUE_USE_INTERNAL_MAP
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  include "json_internalarray.inl"
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  include "json_internalmap.inl"
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif // JSON_VALUE_USE_INTERNAL_MAP
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include "json_valueiterator.inl"
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // if !defined(JSON_IS_AMALGAMATION)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace Json {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class Value::CommentInfo
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::CommentInfo::CommentInfo()
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : comment_( 0 )
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::CommentInfo::~CommentInfo()
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( comment_ )
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      releaseStringValue( comment_ );
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::CommentInfo::setComment( const char *text )
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( comment_ )
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      releaseStringValue( comment_ );
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT( text != 0 );
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT_MESSAGE( text[0]=='\0' || text[0]=='/', "Comments must start with /");
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // It seems that /**/ style comments are acceptable as well.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   comment_ = duplicateStringValue( text );
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class Value::CZString
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifndef JSON_VALUE_USE_INTERNAL_MAP
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Notes: index_ indicates if the string was allocated when
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a string is stored.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::CZString::CZString( ArrayIndex index )
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : cstr_( 0 )
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , index_( index )
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::CZString::CZString( const char *cstr, DuplicationPolicy allocate )
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : cstr_( allocate == duplicate ? duplicateStringValue(cstr)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  : cstr )
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , index_( allocate )
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::CZString::CZString( const CZString &other )
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles): cstr_( other.index_ != noDuplication &&  other.cstr_ != 0
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ?  duplicateStringValue( other.cstr_ )
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                : other.cstr_ )
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , index_( other.cstr_ ? (other.index_ == noDuplication ? noDuplication : duplicate)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         : other.index_ )
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::CZString::~CZString()
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( cstr_  &&  index_ == duplicate )
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      releaseStringValue( const_cast<char *>( cstr_ ) );
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::CZString::swap( CZString &other )
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   std::swap( cstr_, other.cstr_ );
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   std::swap( index_, other.index_ );
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::CZString &
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::CZString::operator =( const CZString &other )
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   CZString temp( other );
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   swap( temp );
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return *this;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::CZString::operator<( const CZString &other ) const
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( cstr_ )
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return strcmp( cstr_, other.cstr_ ) < 0;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return index_ < other.index_;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::CZString::operator==( const CZString &other ) const
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( cstr_ )
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return strcmp( cstr_, other.cstr_ ) == 0;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return index_ == other.index_;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ArrayIndex
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::CZString::index() const
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return index_;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::CZString::c_str() const
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return cstr_;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::CZString::isStaticString() const
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return index_ == noDuplication;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // ifndef JSON_VALUE_USE_INTERNAL_MAP
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class Value::Value
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*! \internal Default constructor initialization must be equivalent to:
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * memset( this, 0, sizeof(Value) )
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This optimization is used in ValueInternalMap fast allocator.
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Value( ValueType type )
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : type_( type )
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , allocated_( false )
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_VALUE_USE_INTERNAL_MAP
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , itemIsUsed_( 0 )
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , comments_( 0 )
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type )
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case nullValue:
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_.int_ = 0;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_.real_ = 0.0;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case stringValue:
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_.string_ = 0;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JSON_VALUE_USE_INTERNAL_MAP
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_.map_ = new ObjectValues();
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_.array_ = arrayAllocator()->newArray();
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_.map_ = mapAllocator()->newMap();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case booleanValue:
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_.bool_ = false;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_ASSERT_UNREACHABLE;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Value( UInt value )
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : type_( uintValue )
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , allocated_( false )
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_VALUE_USE_INTERNAL_MAP
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , itemIsUsed_( 0 )
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , comments_( 0 )
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value_.uint_ = value;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Value( Int value )
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : type_( intValue )
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , allocated_( false )
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_VALUE_USE_INTERNAL_MAP
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , itemIsUsed_( 0 )
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , comments_( 0 )
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value_.int_ = value;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(JSON_HAS_INT64)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Value( Int64 value )
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : type_( intValue )
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , allocated_( false )
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_VALUE_USE_INTERNAL_MAP
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , itemIsUsed_( 0 )
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , comments_( 0 )
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value_.int_ = value;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Value( UInt64 value )
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : type_( uintValue )
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , allocated_( false )
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_VALUE_USE_INTERNAL_MAP
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , itemIsUsed_( 0 )
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , comments_( 0 )
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value_.uint_ = value;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(JSON_HAS_INT64)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Value( double value )
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : type_( realValue )
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , allocated_( false )
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_VALUE_USE_INTERNAL_MAP
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , itemIsUsed_( 0 )
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , comments_( 0 )
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value_.real_ = value;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Value( const char *value )
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : type_( stringValue )
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , allocated_( true )
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_VALUE_USE_INTERNAL_MAP
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , itemIsUsed_( 0 )
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , comments_( 0 )
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value_.string_ = duplicateStringValue( value );
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Value( const char *beginValue,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const char *endValue )
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : type_( stringValue )
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , allocated_( true )
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_VALUE_USE_INTERNAL_MAP
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , itemIsUsed_( 0 )
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , comments_( 0 )
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value_.string_ = duplicateStringValue( beginValue,
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          (unsigned int)(endValue - beginValue) );
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Value( const std::string &value )
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : type_( stringValue )
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , allocated_( true )
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_VALUE_USE_INTERNAL_MAP
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , itemIsUsed_( 0 )
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , comments_( 0 )
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value_.string_ = duplicateStringValue( value.c_str(),
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          (unsigned int)value.length() );
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Value( const StaticString &value )
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : type_( stringValue )
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , allocated_( false )
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_VALUE_USE_INTERNAL_MAP
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , itemIsUsed_( 0 )
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , comments_( 0 )
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value_.string_ = const_cast<char *>( value.c_str() );
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_USE_CPPTL
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Value( const CppTL::ConstString &value )
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : type_( stringValue )
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , allocated_( true )
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_VALUE_USE_INTERNAL_MAP
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , itemIsUsed_( 0 )
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , comments_( 0 )
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value_.string_ = duplicateStringValue( value, value.length() );
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Value( bool value )
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : type_( booleanValue )
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , allocated_( false )
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_VALUE_USE_INTERNAL_MAP
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , itemIsUsed_( 0 )
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , comments_( 0 )
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value_.bool_ = value;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Value( const Value &other )
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : type_( other.type_ )
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , allocated_( false )
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_VALUE_USE_INTERNAL_MAP
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , itemIsUsed_( 0 )
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , comments_( 0 )
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case nullValue:
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case booleanValue:
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_ = other.value_;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case stringValue:
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( other.value_.string_ )
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         value_.string_ = duplicateStringValue( other.value_.string_ );
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         allocated_ = true;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         value_.string_ = 0;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JSON_VALUE_USE_INTERNAL_MAP
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_.map_ = new ObjectValues( *other.value_.map_ );
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_.array_ = arrayAllocator()->newArrayCopy( *other.value_.array_ );
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_.map_ = mapAllocator()->newMapCopy( *other.value_.map_ );
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_ASSERT_UNREACHABLE;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( other.comments_ )
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      comments_ = new CommentInfo[numberOfCommentPlacement];
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for ( int comment =0; comment < numberOfCommentPlacement; ++comment )
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         const CommentInfo &otherComment = other.comments_[comment];
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ( otherComment.comment_ )
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            comments_[comment].setComment( otherComment.comment_ );
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::~Value()
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case nullValue:
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case booleanValue:
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case stringValue:
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( allocated_ )
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         releaseStringValue( value_.string_ );
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JSON_VALUE_USE_INTERNAL_MAP
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete value_.map_;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arrayAllocator()->destructArray( value_.array_ );
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mapAllocator()->destructMap( value_.map_ );
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_ASSERT_UNREACHABLE;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( comments_ )
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete[] comments_;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value &
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator=( const Value &other )
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Value temp( other );
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   swap( temp );
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return *this;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::swap( Value &other )
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ValueType temp = type_;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   type_ = other.type_;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   other.type_ = temp;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   std::swap( value_, other.value_ );
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int temp2 = allocated_;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   allocated_ = other.allocated_;
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   other.allocated_ = temp2;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ValueType
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::type() const
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return type_;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::compare( const Value &other ) const
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( *this < other )
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return -1;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( *this > other )
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return 0;
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator <( const Value &other ) const
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int typeDelta = type_ - other.type_;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( typeDelta )
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return typeDelta < 0 ? true : false;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case nullValue:
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.int_ < other.value_.int_;
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.uint_ < other.value_.uint_;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.real_ < other.value_.real_;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case booleanValue:
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.bool_ < other.value_.bool_;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case stringValue:
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ( value_.string_ == 0  &&  other.value_.string_ )
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || ( other.value_.string_
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  &&  value_.string_
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  && strcmp( value_.string_, other.value_.string_ ) < 0 );
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JSON_VALUE_USE_INTERNAL_MAP
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         int delta = int( value_.map_->size() - other.value_.map_->size() );
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ( delta )
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return delta < 0;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return (*value_.map_) < (*other.value_.map_);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.array_->compare( *(other.value_.array_) ) < 0;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.map_->compare( *(other.value_.map_) ) < 0;
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_ASSERT_UNREACHABLE;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return false;  // unreachable
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator <=( const Value &other ) const
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return !(other < *this);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator >=( const Value &other ) const
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return !(*this < other);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator >( const Value &other ) const
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return other < *this;
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator ==( const Value &other ) const
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   //if ( type_ != other.type_ )
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // GCC 2.95.3 says:
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // attempt to take address of bit-field structure member `Json::Value::type_'
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // Beats me, but a temp solves the problem.
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int temp = other.type_;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( type_ != temp )
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case nullValue:
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.int_ == other.value_.int_;
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.uint_ == other.value_.uint_;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.real_ == other.value_.real_;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case booleanValue:
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.bool_ == other.value_.bool_;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case stringValue:
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ( value_.string_ == other.value_.string_ )
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || ( other.value_.string_
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  &&  value_.string_
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  && strcmp( value_.string_, other.value_.string_ ) == 0 );
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JSON_VALUE_USE_INTERNAL_MAP
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.map_->size() == other.value_.map_->size()
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             && (*value_.map_) == (*other.value_.map_);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.array_->compare( *(other.value_.array_) ) == 0;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.map_->compare( *(other.value_.map_) ) == 0;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_ASSERT_UNREACHABLE;
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return false;  // unreachable
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator !=( const Value &other ) const
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return !( *this == other );
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::asCString() const
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT( type_ == stringValue );
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return value_.string_;
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::asString() const
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case nullValue:
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "";
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case stringValue:
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.string_ ? value_.string_ : "";
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case booleanValue:
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.bool_ ? "true" : "false";
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return valueToString( value_.int_ );
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return valueToString( value_.uint_ );
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return valueToString( value_.real_ );
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_FAIL_MESSAGE( "Type is not convertible to string" );
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_USE_CPPTL
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CppTL::ConstString
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::asConstString() const
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return CppTL::ConstString( asString().c_str() );
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Int
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::asInt() const
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range");
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return Int(value_.int_);
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_ASSERT_MESSAGE(isInt(), "LargestUInt out of Int range");
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return Int(value_.uint_);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt, maxInt), "double out of Int range");
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return Int(value_.real_);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case nullValue:
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case booleanValue:
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.bool_ ? 1 : 0;
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_FAIL_MESSAGE("Value is not convertible to Int.");
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::UInt
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::asUInt() const
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range");
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return UInt(value_.int_);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_ASSERT_MESSAGE(isUInt(), "LargestUInt out of UInt range");
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return UInt(value_.uint_);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt), "double out of UInt range");
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return UInt( value_.real_ );
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case nullValue:
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case booleanValue:
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.bool_ ? 1 : 0;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_FAIL_MESSAGE("Value is not convertible to UInt.");
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(JSON_HAS_INT64)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Int64
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::asInt64() const
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return Int64(value_.int_);
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_ASSERT_MESSAGE(isInt64(), "LargestUInt out of Int64 range");
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return Int64(value_.uint_);
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt64, maxInt64), "double out of Int64 range");
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return Int64(value_.real_);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case nullValue:
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case booleanValue:
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.bool_ ? 1 : 0;
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_FAIL_MESSAGE("Value is not convertible to Int64.");
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::UInt64
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::asUInt64() const
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range");
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return UInt64(value_.int_);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return UInt64(value_.uint_);
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt64), "double out of UInt64 range");
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return UInt64( value_.real_ );
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case nullValue:
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case booleanValue:
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.bool_ ? 1 : 0;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_FAIL_MESSAGE("Value is not convertible to UInt64.");
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif // if defined(JSON_HAS_INT64)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LargestInt
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::asLargestInt() const
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(JSON_NO_INT64)
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return asInt();
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return asInt64();
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LargestUInt
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::asLargestUInt() const
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(JSON_NO_INT64)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return asUInt();
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return asUInt64();
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)double
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::asDouble() const
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return static_cast<double>( value_.int_ );
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return static_cast<double>( value_.uint_ );
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return integerToDouble( value_.uint_ );
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.real_;
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case nullValue:
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0.0;
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case booleanValue:
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.bool_ ? 1.0 : 0.0;
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_FAIL_MESSAGE("Value is not convertible to double.");
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)float
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::asFloat() const
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return static_cast<float>( value_.int_ );
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return static_cast<float>( value_.uint_ );
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return integerToDouble( value_.uint_ );
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return static_cast<float>( value_.real_ );
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case nullValue:
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0.0;
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case booleanValue:
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.bool_ ? 1.0f : 0.0f;
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_FAIL_MESSAGE("Value is not convertible to float.");
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::asBool() const
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case booleanValue:
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.bool_;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case nullValue:
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.int_ ? true : false;
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.uint_ ? true : false;
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.real_ ? true : false;
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_FAIL_MESSAGE("Value is not convertible to bool.");
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isConvertibleTo( ValueType other ) const
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( other )
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case nullValue:
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ( isNumeric() && asDouble() == 0.0 )
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || ( type_ == booleanValue && value_.bool_ == false )
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || ( type_ == stringValue && asString() == "" )
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || ( type_ == arrayValue && value_.map_->size() == 0 )
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || ( type_ == objectValue && value_.map_->size() == 0 )
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || type_ == nullValue;
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return isInt()
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || (type_ == realValue && InRange(value_.real_, minInt, maxInt))
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || type_ == booleanValue
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || type_ == nullValue;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return isUInt()
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || (type_ == realValue && InRange(value_.real_, 0, maxUInt))
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || type_ == booleanValue
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || type_ == nullValue;
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return isNumeric()
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || type_ == booleanValue
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || type_ == nullValue;
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case booleanValue:
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return isNumeric()
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || type_ == booleanValue
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || type_ == nullValue;
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case stringValue:
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return isNumeric()
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || type_ == booleanValue
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || type_ == stringValue
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || type_ == nullValue;
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return type_ == arrayValue
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || type_ == nullValue;
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return type_ == objectValue
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || type_ == nullValue;
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT_UNREACHABLE;
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return false;
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// Number of values in array or object
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ArrayIndex
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::size() const
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case nullValue:
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case booleanValue:
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case stringValue:
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JSON_VALUE_USE_INTERNAL_MAP
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:  // size of the array is highest index + 1
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( !value_.map_->empty() )
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ObjectValues::const_iterator itLast = value_.map_->end();
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         --itLast;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return (*itLast).first.index()+1;
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ArrayIndex( value_.map_->size() );
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return Int( value_.array_->size() );
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return Int( value_.map_->size() );
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT_UNREACHABLE;
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return 0; // unreachable;
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::empty() const
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( isNull() || isArray() || isObject() )
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return size() == 0u;
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator!() const
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return isNull();
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::clear()
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue  || type_ == objectValue );
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JSON_VALUE_USE_INTERNAL_MAP
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_.map_->clear();
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_.array_->clear();
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_.map_->clear();
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::resize( ArrayIndex newSize )
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue );
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( type_ == nullValue )
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *this = Value( arrayValue );
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JSON_VALUE_USE_INTERNAL_MAP
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ArrayIndex oldSize = size();
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( newSize == 0 )
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      clear();
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if ( newSize > oldSize )
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*this)[ newSize - 1 ];
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for ( ArrayIndex index = newSize; index < oldSize; ++index )
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         value_.map_->erase( index );
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( size() == newSize );
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value_.array_->resize( newSize );
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value &
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator[]( ArrayIndex index )
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue );
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( type_ == nullValue )
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *this = Value( arrayValue );
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JSON_VALUE_USE_INTERNAL_MAP
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   CZString key( index );
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ObjectValues::iterator it = value_.map_->lower_bound( key );
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( it != value_.map_->end()  &&  (*it).first == key )
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (*it).second;
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ObjectValues::value_type defaultValue( key, null );
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   it = value_.map_->insert( it, defaultValue );
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (*it).second;
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return value_.array_->resolveReference( index );
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value &
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator[]( int index )
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT( index >= 0 );
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (*this)[ ArrayIndex(index) ];
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Value &
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator[]( ArrayIndex index ) const
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT( type_ == nullValue  ||  type_ == arrayValue );
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( type_ == nullValue )
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return null;
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JSON_VALUE_USE_INTERNAL_MAP
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   CZString key( index );
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ObjectValues::const_iterator it = value_.map_->find( key );
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( it == value_.map_->end() )
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return null;
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (*it).second;
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Value *value = value_.array_->find( index );
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return value ? *value : null;
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Value &
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator[]( int index ) const
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT( index >= 0 );
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (*this)[ ArrayIndex(index) ];
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value &
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator[]( const char *key )
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return resolveReference( key, false );
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value &
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::resolveReference( const char *key,
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         bool isStatic )
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( type_ == nullValue )
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *this = Value( objectValue );
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JSON_VALUE_USE_INTERNAL_MAP
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   CZString actualKey( key, isStatic ? CZString::noDuplication
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     : CZString::duplicateOnCopy );
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ObjectValues::iterator it = value_.map_->lower_bound( actualKey );
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( it != value_.map_->end()  &&  (*it).first == actualKey )
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (*it).second;
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ObjectValues::value_type defaultValue( actualKey, null );
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   it = value_.map_->insert( it, defaultValue );
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Value &value = (*it).second;
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return value;
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return value_.map_->resolveReference( key, isStatic );
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::get( ArrayIndex index,
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const Value &defaultValue ) const
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const Value *value = &((*this)[index]);
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return value == &null ? defaultValue : *value;
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isValidIndex( ArrayIndex index ) const
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return index < size();
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Value &
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator[]( const char *key ) const
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( type_ == nullValue )
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return null;
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JSON_VALUE_USE_INTERNAL_MAP
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   CZString actualKey( key, CZString::noDuplication );
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ObjectValues::const_iterator it = value_.map_->find( actualKey );
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( it == value_.map_->end() )
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return null;
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (*it).second;
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const Value *value = value_.map_->find( key );
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return value ? *value : null;
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value &
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator[]( const std::string &key )
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (*this)[ key.c_str() ];
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Value &
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator[]( const std::string &key ) const
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (*this)[ key.c_str() ];
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value &
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator[]( const StaticString &key )
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return resolveReference( key, true );
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_USE_CPPTL
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value &
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator[]( const CppTL::ConstString &key )
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (*this)[ key.c_str() ];
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Value &
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::operator[]( const CppTL::ConstString &key ) const
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (*this)[ key.c_str() ];
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value &
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::append( const Value &value )
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (*this)[size()] = value;
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::get( const char *key,
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const Value &defaultValue ) const
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const Value *value = &((*this)[key]);
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return value == &null ? defaultValue : *value;
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::get( const std::string &key,
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const Value &defaultValue ) const
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return get( key.c_str(), defaultValue );
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::removeMember( const char* key )
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( type_ == nullValue )
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return null;
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JSON_VALUE_USE_INTERNAL_MAP
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   CZString actualKey( key, CZString::noDuplication );
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ObjectValues::iterator it = value_.map_->find( actualKey );
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( it == value_.map_->end() )
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return null;
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Value old(it->second);
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value_.map_->erase(it);
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return old;
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Value *value = value_.map_->find( key );
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (value){
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Value old(*value);
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_.map_.remove( key );
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return old;
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } else {
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return null;
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::removeMember( const std::string &key )
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return removeMember( key.c_str() );
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_USE_CPPTL
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::get( const CppTL::ConstString &key,
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const Value &defaultValue ) const
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return get( key.c_str(), defaultValue );
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isMember( const char *key ) const
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const Value *value = &((*this)[key]);
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return value != &null;
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isMember( const std::string &key ) const
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return isMember( key.c_str() );
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef JSON_USE_CPPTL
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isMember( const CppTL::ConstString &key ) const
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return isMember( key.c_str() );
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Members
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::getMemberNames() const
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( type_ == nullValue )
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       return Value::Members();
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Members members;
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   members.reserve( value_.map_->size() );
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JSON_VALUE_USE_INTERNAL_MAP
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ObjectValues::const_iterator it = value_.map_->begin();
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ObjectValues::const_iterator itEnd = value_.map_->end();
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for ( ; it != itEnd; ++it )
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      members.push_back( std::string( (*it).first.c_str() ) );
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ValueInternalMap::IteratorState it;
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ValueInternalMap::IteratorState itEnd;
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value_.map_->makeBeginIterator( it );
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value_.map_->makeEndIterator( itEnd );
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for ( ; !ValueInternalMap::equals( it, itEnd ); ValueInternalMap::increment(it) )
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      members.push_back( std::string( ValueInternalMap::key( it ) ) );
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return members;
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//# ifdef JSON_USE_CPPTL
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//EnumMemberNames
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//Value::enumMemberNames() const
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//{
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   if ( type_ == objectValue )
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   {
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//      return CppTL::Enum::any(  CppTL::Enum::transform(
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         CppTL::Enum::keys( *(value_.map_), CppTL::Type<const CZString &>() ),
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         MemberNamesTransform() ) );
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   return EnumMemberNames();
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//}
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//EnumValues
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//Value::enumValues() const
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//{
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   if ( type_ == objectValue  ||  type_ == arrayValue )
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//      return CppTL::Enum::anyValues( *(value_.map_),
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                     CppTL::Type<const Value &>() );
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   return EnumValues();
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//}
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//# endif
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool IsIntegral(double d) {
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double integral_part;
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return modf(d, &integral_part) == 0.0;
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isNull() const
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return type_ == nullValue;
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isBool() const
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return type_ == booleanValue;
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isInt() const
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.int_ >= minInt  &&  value_.int_ <= maxInt;
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.uint_ <= UInt(maxInt);
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.real_ >= minInt &&
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             value_.real_ <= maxInt &&
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             IsIntegral(value_.real_);
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return false;
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isUInt() const
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.int_ >= 0 && LargestUInt(value_.int_) <= LargestUInt(maxUInt);
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.uint_ <= maxUInt;
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.real_ >= 0 &&
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             value_.real_ <= maxUInt &&
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             IsIntegral(value_.real_);
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return false;
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isInt64() const
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(JSON_HAS_INT64)
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     return true;
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.uint_ <= UInt64(maxInt64);
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Note that maxInt64 (= 2^63 - 1) is not exactly representable as a
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // double, so double(maxInt64) will be rounded up to 2^63. Therefore we
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // require the value to be strictly less than the limit.
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.real_ >= double(minInt64) &&
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             value_.real_ < double(maxInt64) &&
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             IsIntegral(value_.real_);
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif  // JSON_HAS_INT64
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return false;
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isUInt64() const
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(JSON_HAS_INT64)
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case intValue:
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     return value_.int_ >= 0;
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case uintValue:
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case realValue:
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // require the value to be strictly less than the limit.
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value_.real_ >= 0 &&
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             value_.real_ < maxUInt64AsDouble &&
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             IsIntegral(value_.real_);
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif  // JSON_HAS_INT64
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return false;
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isIntegral() const
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(JSON_HAS_INT64)
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return isInt64() || isUInt64();
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return isInt() || isUInt();
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isDouble() const
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return type_ == realValue || isIntegral();
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isNumeric() const
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return isIntegral() || isDouble();
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isString() const
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return type_ == stringValue;
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isArray() const
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return type_ == arrayValue;
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::isObject() const
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return type_ == objectValue;
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::setComment( const char *comment,
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   CommentPlacement placement )
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( !comments_ )
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      comments_ = new CommentInfo[numberOfCommentPlacement];
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   comments_[placement].setComment( comment );
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::setComment( const std::string &comment,
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   CommentPlacement placement )
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   setComment( comment.c_str(), placement );
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::hasComment( CommentPlacement placement ) const
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return comments_ != 0  &&  comments_[placement].comment_ != 0;
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::getComment( CommentPlacement placement ) const
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( hasComment(placement) )
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return comments_[placement].comment_;
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return "";
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::toStyledString() const
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   StyledWriter writer;
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return writer.write( *this );
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::const_iterator
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::begin() const
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef JSON_VALUE_USE_INTERNAL_MAP
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( value_.array_ )
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ValueInternalArray::IteratorState it;
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         value_.array_->makeBeginIterator( it );
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return const_iterator( it );
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( value_.map_ )
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ValueInternalMap::IteratorState it;
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         value_.map_->makeBeginIterator( it );
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return const_iterator( it );
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( value_.map_ )
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return const_iterator( value_.map_->begin() );
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return const_iterator();
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::const_iterator
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::end() const
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef JSON_VALUE_USE_INTERNAL_MAP
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( value_.array_ )
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ValueInternalArray::IteratorState it;
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         value_.array_->makeEndIterator( it );
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return const_iterator( it );
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( value_.map_ )
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ValueInternalMap::IteratorState it;
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         value_.map_->makeEndIterator( it );
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return const_iterator( it );
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( value_.map_ )
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return const_iterator( value_.map_->end() );
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return const_iterator();
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::iterator
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::begin()
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef JSON_VALUE_USE_INTERNAL_MAP
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( value_.array_ )
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ValueInternalArray::IteratorState it;
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         value_.array_->makeBeginIterator( it );
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return iterator( it );
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( value_.map_ )
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ValueInternalMap::IteratorState it;
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         value_.map_->makeBeginIterator( it );
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return iterator( it );
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( value_.map_ )
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return iterator( value_.map_->begin() );
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return iterator();
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::iterator
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::end()
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch ( type_ )
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef JSON_VALUE_USE_INTERNAL_MAP
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( value_.array_ )
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ValueInternalArray::IteratorState it;
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         value_.array_->makeEndIterator( it );
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return iterator( it );
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( value_.map_ )
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ValueInternalMap::IteratorState it;
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         value_.map_->makeEndIterator( it );
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return iterator( it );
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case arrayValue:
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case objectValue:
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( value_.map_ )
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return iterator( value_.map_->end() );
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return iterator();
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class PathArgument
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PathArgument::PathArgument()
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : key_()
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , index_()
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , kind_( kindNone )
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PathArgument::PathArgument( ArrayIndex index )
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : key_()
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , index_( index )
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , kind_( kindIndex )
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PathArgument::PathArgument( const char *key )
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : key_( key )
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , index_()
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , kind_( kindKey )
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PathArgument::PathArgument( const std::string &key )
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : key_( key.c_str() )
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , index_()
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   , kind_( kindKey )
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class Path
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// //////////////////////////////////////////////////////////////////
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Path::Path( const std::string &path,
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const PathArgument &a1,
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const PathArgument &a2,
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const PathArgument &a3,
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const PathArgument &a4,
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const PathArgument &a5 )
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   InArgs in;
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   in.push_back( &a1 );
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   in.push_back( &a2 );
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   in.push_back( &a3 );
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   in.push_back( &a4 );
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   in.push_back( &a5 );
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   makePath( path, in );
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Path::makePath( const std::string &path,
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const InArgs &in )
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const char *current = path.c_str();
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const char *end = current + path.length();
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   InArgs::const_iterator itInArg = in.begin();
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   while ( current != end )
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( *current == '[' )
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++current;
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ( *current == '%' )
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            addPathInArg( path, in, itInArg, PathArgument::kindIndex );
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         else
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ArrayIndex index = 0;
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for ( ; current != end && *current >= '0'  &&  *current <= '9'; ++current )
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               index = index * 10 + ArrayIndex(*current - '0');
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            args_.push_back( index );
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ( current == end  ||  *current++ != ']' )
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            invalidPath( path, int(current - path.c_str()) );
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if ( *current == '%' )
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         addPathInArg( path, in, itInArg, PathArgument::kindKey );
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++current;
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if ( *current == '.' )
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++current;
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         const char *beginName = current;
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         while ( current != end  &&  !strchr( "[.", *current ) )
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ++current;
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         args_.push_back( std::string( beginName, current ) );
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Path::addPathInArg( const std::string &path,
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const InArgs &in,
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    InArgs::const_iterator &itInArg,
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    PathArgument::Kind kind )
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ( itInArg == in.end() )
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Error: missing argument %d
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if ( (*itInArg)->kind_ != kind )
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Error: bad argument type
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      args_.push_back( **itInArg );
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Path::invalidPath( const std::string &path,
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   int location )
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // Error: invalid path.
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Value &
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Path::resolve( const Value &root ) const
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const Value *node = &root;
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PathArgument &arg = *it;
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( arg.kind_ == PathArgument::kindIndex )
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ( !node->isArray()  ||  !node->isValidIndex( arg.index_ ) )
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Error: unable to resolve path (array value expected at position...
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         node = &((*node)[arg.index_]);
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if ( arg.kind_ == PathArgument::kindKey )
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ( !node->isObject() )
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Error: unable to resolve path (object value expected at position...)
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         node = &((*node)[arg.key_]);
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ( node == &Value::null )
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Error: unable to resolve path (object has no member named '' at position...)
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return *node;
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Path::resolve( const Value &root,
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const Value &defaultValue ) const
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const Value *node = &root;
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PathArgument &arg = *it;
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( arg.kind_ == PathArgument::kindIndex )
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ( !node->isArray()  ||  !node->isValidIndex( arg.index_ ) )
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return defaultValue;
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         node = &((*node)[arg.index_]);
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if ( arg.kind_ == PathArgument::kindKey )
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ( !node->isObject() )
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return defaultValue;
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         node = &((*node)[arg.key_]);
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ( node == &Value::null )
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return defaultValue;
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return *node;
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value &
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Path::make( Value &root ) const
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Value *node = &root;
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PathArgument &arg = *it;
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ( arg.kind_ == PathArgument::kindIndex )
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ( !node->isArray() )
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Error: node is not an array at position ...
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         node = &((*node)[arg.index_]);
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if ( arg.kind_ == PathArgument::kindKey )
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ( !node->isObject() )
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Error: node is not an object at position...
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         node = &((*node)[arg.key_]);
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return *node;
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace Json
1931