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