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