all repos — mgba @ 9197e5a1fbc8574ca26ce9d73b575cdeaebedccb

mGBA Game Boy Advance Emulator

src/third-party/discord-rpc/include/rapidjson/document.h (view raw)

   1// Tencent is pleased to support the open source community by making RapidJSON available.
   2// 
   3// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
   4//
   5// Licensed under the MIT License (the "License"); you may not use this file except
   6// in compliance with the License. You may obtain a copy of the License at
   7//
   8// http://opensource.org/licenses/MIT
   9//
  10// Unless required by applicable law or agreed to in writing, software distributed 
  11// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 
  12// CONDITIONS OF ANY KIND, either express or implied. See the License for the 
  13// specific language governing permissions and limitations under the License.
  14
  15#ifndef RAPIDJSON_DOCUMENT_H_
  16#define RAPIDJSON_DOCUMENT_H_
  17
  18/*! \file document.h */
  19
  20#include "reader.h"
  21#include "internal/meta.h"
  22#include "internal/strfunc.h"
  23#include "memorystream.h"
  24#include "encodedstream.h"
  25#include <new>      // placement new
  26#include <limits>
  27
  28RAPIDJSON_DIAG_PUSH
  29#ifdef _MSC_VER
  30RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant
  31RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible loss of data
  32#endif
  33
  34#ifdef __clang__
  35RAPIDJSON_DIAG_OFF(padded)
  36RAPIDJSON_DIAG_OFF(switch-enum)
  37RAPIDJSON_DIAG_OFF(c++98-compat)
  38#endif
  39
  40#ifdef __GNUC__
  41RAPIDJSON_DIAG_OFF(effc++)
  42#if __GNUC__ >= 6
  43RAPIDJSON_DIAG_OFF(terminate) // ignore throwing RAPIDJSON_ASSERT in RAPIDJSON_NOEXCEPT functions
  44#endif
  45#endif // __GNUC__
  46
  47#ifndef RAPIDJSON_NOMEMBERITERATORCLASS
  48#include <iterator> // std::iterator, std::random_access_iterator_tag
  49#endif
  50
  51#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
  52#include <utility> // std::move
  53#endif
  54
  55RAPIDJSON_NAMESPACE_BEGIN
  56
  57// Forward declaration.
  58template <typename Encoding, typename Allocator>
  59class GenericValue;
  60
  61template <typename Encoding, typename Allocator, typename StackAllocator>
  62class GenericDocument;
  63
  64//! Name-value pair in a JSON object value.
  65/*!
  66    This class was internal to GenericValue. It used to be a inner struct.
  67    But a compiler (IBM XL C/C++ for AIX) have reported to have problem with that so it moved as a namespace scope struct.
  68    https://code.google.com/p/rapidjson/issues/detail?id=64
  69*/
  70template <typename Encoding, typename Allocator> 
  71struct GenericMember { 
  72    GenericValue<Encoding, Allocator> name;     //!< name of member (must be a string)
  73    GenericValue<Encoding, Allocator> value;    //!< value of member.
  74};
  75
  76///////////////////////////////////////////////////////////////////////////////
  77// GenericMemberIterator
  78
  79#ifndef RAPIDJSON_NOMEMBERITERATORCLASS
  80
  81//! (Constant) member iterator for a JSON object value
  82/*!
  83    \tparam Const Is this a constant iterator?
  84    \tparam Encoding    Encoding of the value. (Even non-string values need to have the same encoding in a document)
  85    \tparam Allocator   Allocator type for allocating memory of object, array and string.
  86
  87    This class implements a Random Access Iterator for GenericMember elements
  88    of a GenericValue, see ISO/IEC 14882:2003(E) C++ standard, 24.1 [lib.iterator.requirements].
  89
  90    \note This iterator implementation is mainly intended to avoid implicit
  91        conversions from iterator values to \c NULL,
  92        e.g. from GenericValue::FindMember.
  93
  94    \note Define \c RAPIDJSON_NOMEMBERITERATORCLASS to fall back to a
  95        pointer-based implementation, if your platform doesn't provide
  96        the C++ <iterator> header.
  97
  98    \see GenericMember, GenericValue::MemberIterator, GenericValue::ConstMemberIterator
  99 */
 100template <bool Const, typename Encoding, typename Allocator>
 101class GenericMemberIterator
 102    : public std::iterator<std::random_access_iterator_tag
 103        , typename internal::MaybeAddConst<Const,GenericMember<Encoding,Allocator> >::Type> {
 104
 105    friend class GenericValue<Encoding,Allocator>;
 106    template <bool, typename, typename> friend class GenericMemberIterator;
 107
 108    typedef GenericMember<Encoding,Allocator> PlainType;
 109    typedef typename internal::MaybeAddConst<Const,PlainType>::Type ValueType;
 110    typedef std::iterator<std::random_access_iterator_tag,ValueType> BaseType;
 111
 112public:
 113    //! Iterator type itself
 114    typedef GenericMemberIterator Iterator;
 115    //! Constant iterator type
 116    typedef GenericMemberIterator<true,Encoding,Allocator>  ConstIterator;
 117    //! Non-constant iterator type
 118    typedef GenericMemberIterator<false,Encoding,Allocator> NonConstIterator;
 119
 120    //! Pointer to (const) GenericMember
 121    typedef typename BaseType::pointer         Pointer;
 122    //! Reference to (const) GenericMember
 123    typedef typename BaseType::reference       Reference;
 124    //! Signed integer type (e.g. \c ptrdiff_t)
 125    typedef typename BaseType::difference_type DifferenceType;
 126
 127    //! Default constructor (singular value)
 128    /*! Creates an iterator pointing to no element.
 129        \note All operations, except for comparisons, are undefined on such values.
 130     */
 131    GenericMemberIterator() : ptr_() {}
 132
 133    //! Iterator conversions to more const
 134    /*!
 135        \param it (Non-const) iterator to copy from
 136
 137        Allows the creation of an iterator from another GenericMemberIterator
 138        that is "less const".  Especially, creating a non-constant iterator
 139        from a constant iterator are disabled:
 140        \li const -> non-const (not ok)
 141        \li const -> const (ok)
 142        \li non-const -> const (ok)
 143        \li non-const -> non-const (ok)
 144
 145        \note If the \c Const template parameter is already \c false, this
 146            constructor effectively defines a regular copy-constructor.
 147            Otherwise, the copy constructor is implicitly defined.
 148    */
 149    GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {}
 150    Iterator& operator=(const NonConstIterator & it) { ptr_ = it.ptr_; return *this; }
 151
 152    //! @name stepping
 153    //@{
 154    Iterator& operator++(){ ++ptr_; return *this; }
 155    Iterator& operator--(){ --ptr_; return *this; }
 156    Iterator  operator++(int){ Iterator old(*this); ++ptr_; return old; }
 157    Iterator  operator--(int){ Iterator old(*this); --ptr_; return old; }
 158    //@}
 159
 160    //! @name increment/decrement
 161    //@{
 162    Iterator operator+(DifferenceType n) const { return Iterator(ptr_+n); }
 163    Iterator operator-(DifferenceType n) const { return Iterator(ptr_-n); }
 164
 165    Iterator& operator+=(DifferenceType n) { ptr_+=n; return *this; }
 166    Iterator& operator-=(DifferenceType n) { ptr_-=n; return *this; }
 167    //@}
 168
 169    //! @name relations
 170    //@{
 171    bool operator==(ConstIterator that) const { return ptr_ == that.ptr_; }
 172    bool operator!=(ConstIterator that) const { return ptr_ != that.ptr_; }
 173    bool operator<=(ConstIterator that) const { return ptr_ <= that.ptr_; }
 174    bool operator>=(ConstIterator that) const { return ptr_ >= that.ptr_; }
 175    bool operator< (ConstIterator that) const { return ptr_ < that.ptr_; }
 176    bool operator> (ConstIterator that) const { return ptr_ > that.ptr_; }
 177    //@}
 178
 179    //! @name dereference
 180    //@{
 181    Reference operator*() const { return *ptr_; }
 182    Pointer   operator->() const { return ptr_; }
 183    Reference operator[](DifferenceType n) const { return ptr_[n]; }
 184    //@}
 185
 186    //! Distance
 187    DifferenceType operator-(ConstIterator that) const { return ptr_-that.ptr_; }
 188
 189private:
 190    //! Internal constructor from plain pointer
 191    explicit GenericMemberIterator(Pointer p) : ptr_(p) {}
 192
 193    Pointer ptr_; //!< raw pointer
 194};
 195
 196#else // RAPIDJSON_NOMEMBERITERATORCLASS
 197
 198// class-based member iterator implementation disabled, use plain pointers
 199
 200template <bool Const, typename Encoding, typename Allocator>
 201struct GenericMemberIterator;
 202
 203//! non-const GenericMemberIterator
 204template <typename Encoding, typename Allocator>
 205struct GenericMemberIterator<false,Encoding,Allocator> {
 206    //! use plain pointer as iterator type
 207    typedef GenericMember<Encoding,Allocator>* Iterator;
 208};
 209//! const GenericMemberIterator
 210template <typename Encoding, typename Allocator>
 211struct GenericMemberIterator<true,Encoding,Allocator> {
 212    //! use plain const pointer as iterator type
 213    typedef const GenericMember<Encoding,Allocator>* Iterator;
 214};
 215
 216#endif // RAPIDJSON_NOMEMBERITERATORCLASS
 217
 218///////////////////////////////////////////////////////////////////////////////
 219// GenericStringRef
 220
 221//! Reference to a constant string (not taking a copy)
 222/*!
 223    \tparam CharType character type of the string
 224
 225    This helper class is used to automatically infer constant string
 226    references for string literals, especially from \c const \b (!)
 227    character arrays.
 228
 229    The main use is for creating JSON string values without copying the
 230    source string via an \ref Allocator.  This requires that the referenced
 231    string pointers have a sufficient lifetime, which exceeds the lifetime
 232    of the associated GenericValue.
 233
 234    \b Example
 235    \code
 236    Value v("foo");   // ok, no need to copy & calculate length
 237    const char foo[] = "foo";
 238    v.SetString(foo); // ok
 239
 240    const char* bar = foo;
 241    // Value x(bar); // not ok, can't rely on bar's lifetime
 242    Value x(StringRef(bar)); // lifetime explicitly guaranteed by user
 243    Value y(StringRef(bar, 3));  // ok, explicitly pass length
 244    \endcode
 245
 246    \see StringRef, GenericValue::SetString
 247*/
 248template<typename CharType>
 249struct GenericStringRef {
 250    typedef CharType Ch; //!< character type of the string
 251
 252    //! Create string reference from \c const character array
 253#ifndef __clang__ // -Wdocumentation
 254    /*!
 255        This constructor implicitly creates a constant string reference from
 256        a \c const character array.  It has better performance than
 257        \ref StringRef(const CharType*) by inferring the string \ref length
 258        from the array length, and also supports strings containing null
 259        characters.
 260
 261        \tparam N length of the string, automatically inferred
 262
 263        \param str Constant character array, lifetime assumed to be longer
 264            than the use of the string in e.g. a GenericValue
 265
 266        \post \ref s == str
 267
 268        \note Constant complexity.
 269        \note There is a hidden, private overload to disallow references to
 270            non-const character arrays to be created via this constructor.
 271            By this, e.g. function-scope arrays used to be filled via
 272            \c snprintf are excluded from consideration.
 273            In such cases, the referenced string should be \b copied to the
 274            GenericValue instead.
 275     */
 276#endif
 277    template<SizeType N>
 278    GenericStringRef(const CharType (&str)[N]) RAPIDJSON_NOEXCEPT
 279        : s(str), length(N-1) {}
 280
 281    //! Explicitly create string reference from \c const character pointer
 282#ifndef __clang__ // -Wdocumentation
 283    /*!
 284        This constructor can be used to \b explicitly  create a reference to
 285        a constant string pointer.
 286
 287        \see StringRef(const CharType*)
 288
 289        \param str Constant character pointer, lifetime assumed to be longer
 290            than the use of the string in e.g. a GenericValue
 291
 292        \post \ref s == str
 293
 294        \note There is a hidden, private overload to disallow references to
 295            non-const character arrays to be created via this constructor.
 296            By this, e.g. function-scope arrays used to be filled via
 297            \c snprintf are excluded from consideration.
 298            In such cases, the referenced string should be \b copied to the
 299            GenericValue instead.
 300     */
 301#endif
 302    explicit GenericStringRef(const CharType* str)
 303        : s(str), length(internal::StrLen(str)){ RAPIDJSON_ASSERT(s != 0); }
 304
 305    //! Create constant string reference from pointer and length
 306#ifndef __clang__ // -Wdocumentation
 307    /*! \param str constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue
 308        \param len length of the string, excluding the trailing NULL terminator
 309
 310        \post \ref s == str && \ref length == len
 311        \note Constant complexity.
 312     */
 313#endif
 314    GenericStringRef(const CharType* str, SizeType len)
 315        : s(str), length(len) { RAPIDJSON_ASSERT(s != 0); }
 316
 317    GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {}
 318
 319    GenericStringRef& operator=(const GenericStringRef& rhs) { s = rhs.s; length = rhs.length; }
 320
 321    //! implicit conversion to plain CharType pointer
 322    operator const Ch *() const { return s; }
 323
 324    const Ch* const s; //!< plain CharType pointer
 325    const SizeType length; //!< length of the string (excluding the trailing NULL terminator)
 326
 327private:
 328    //! Disallow construction from non-const array
 329    template<SizeType N>
 330    GenericStringRef(CharType (&str)[N]) /* = delete */;
 331};
 332
 333//! Mark a character pointer as constant string
 334/*! Mark a plain character pointer as a "string literal".  This function
 335    can be used to avoid copying a character string to be referenced as a
 336    value in a JSON GenericValue object, if the string's lifetime is known
 337    to be valid long enough.
 338    \tparam CharType Character type of the string
 339    \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue
 340    \return GenericStringRef string reference object
 341    \relatesalso GenericStringRef
 342
 343    \see GenericValue::GenericValue(StringRefType), GenericValue::operator=(StringRefType), GenericValue::SetString(StringRefType), GenericValue::PushBack(StringRefType, Allocator&), GenericValue::AddMember
 344*/
 345template<typename CharType>
 346inline GenericStringRef<CharType> StringRef(const CharType* str) {
 347    return GenericStringRef<CharType>(str, internal::StrLen(str));
 348}
 349
 350//! Mark a character pointer as constant string
 351/*! Mark a plain character pointer as a "string literal".  This function
 352    can be used to avoid copying a character string to be referenced as a
 353    value in a JSON GenericValue object, if the string's lifetime is known
 354    to be valid long enough.
 355
 356    This version has better performance with supplied length, and also
 357    supports string containing null characters.
 358
 359    \tparam CharType character type of the string
 360    \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue
 361    \param length The length of source string.
 362    \return GenericStringRef string reference object
 363    \relatesalso GenericStringRef
 364*/
 365template<typename CharType>
 366inline GenericStringRef<CharType> StringRef(const CharType* str, size_t length) {
 367    return GenericStringRef<CharType>(str, SizeType(length));
 368}
 369
 370#if RAPIDJSON_HAS_STDSTRING
 371//! Mark a string object as constant string
 372/*! Mark a string object (e.g. \c std::string) as a "string literal".
 373    This function can be used to avoid copying a string to be referenced as a
 374    value in a JSON GenericValue object, if the string's lifetime is known
 375    to be valid long enough.
 376
 377    \tparam CharType character type of the string
 378    \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue
 379    \return GenericStringRef string reference object
 380    \relatesalso GenericStringRef
 381    \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING.
 382*/
 383template<typename CharType>
 384inline GenericStringRef<CharType> StringRef(const std::basic_string<CharType>& str) {
 385    return GenericStringRef<CharType>(str.data(), SizeType(str.size()));
 386}
 387#endif
 388
 389///////////////////////////////////////////////////////////////////////////////
 390// GenericValue type traits
 391namespace internal {
 392
 393template <typename T, typename Encoding = void, typename Allocator = void>
 394struct IsGenericValueImpl : FalseType {};
 395
 396// select candidates according to nested encoding and allocator types
 397template <typename T> struct IsGenericValueImpl<T, typename Void<typename T::EncodingType>::Type, typename Void<typename T::AllocatorType>::Type>
 398    : IsBaseOf<GenericValue<typename T::EncodingType, typename T::AllocatorType>, T>::Type {};
 399
 400// helper to match arbitrary GenericValue instantiations, including derived classes
 401template <typename T> struct IsGenericValue : IsGenericValueImpl<T>::Type {};
 402
 403} // namespace internal
 404
 405///////////////////////////////////////////////////////////////////////////////
 406// TypeHelper
 407
 408namespace internal {
 409
 410template <typename ValueType, typename T>
 411struct TypeHelper {};
 412
 413template<typename ValueType> 
 414struct TypeHelper<ValueType, bool> {
 415    static bool Is(const ValueType& v) { return v.IsBool(); }
 416    static bool Get(const ValueType& v) { return v.GetBool(); }
 417    static ValueType& Set(ValueType& v, bool data) { return v.SetBool(data); }
 418    static ValueType& Set(ValueType& v, bool data, typename ValueType::AllocatorType&) { return v.SetBool(data); }
 419};
 420
 421template<typename ValueType> 
 422struct TypeHelper<ValueType, int> {
 423    static bool Is(const ValueType& v) { return v.IsInt(); }
 424    static int Get(const ValueType& v) { return v.GetInt(); }
 425    static ValueType& Set(ValueType& v, int data) { return v.SetInt(data); }
 426    static ValueType& Set(ValueType& v, int data, typename ValueType::AllocatorType&) { return v.SetInt(data); }
 427};
 428
 429template<typename ValueType> 
 430struct TypeHelper<ValueType, unsigned> {
 431    static bool Is(const ValueType& v) { return v.IsUint(); }
 432    static unsigned Get(const ValueType& v) { return v.GetUint(); }
 433    static ValueType& Set(ValueType& v, unsigned data) { return v.SetUint(data); }
 434    static ValueType& Set(ValueType& v, unsigned data, typename ValueType::AllocatorType&) { return v.SetUint(data); }
 435};
 436
 437template<typename ValueType> 
 438struct TypeHelper<ValueType, int64_t> {
 439    static bool Is(const ValueType& v) { return v.IsInt64(); }
 440    static int64_t Get(const ValueType& v) { return v.GetInt64(); }
 441    static ValueType& Set(ValueType& v, int64_t data) { return v.SetInt64(data); }
 442    static ValueType& Set(ValueType& v, int64_t data, typename ValueType::AllocatorType&) { return v.SetInt64(data); }
 443};
 444
 445template<typename ValueType> 
 446struct TypeHelper<ValueType, uint64_t> {
 447    static bool Is(const ValueType& v) { return v.IsUint64(); }
 448    static uint64_t Get(const ValueType& v) { return v.GetUint64(); }
 449    static ValueType& Set(ValueType& v, uint64_t data) { return v.SetUint64(data); }
 450    static ValueType& Set(ValueType& v, uint64_t data, typename ValueType::AllocatorType&) { return v.SetUint64(data); }
 451};
 452
 453template<typename ValueType> 
 454struct TypeHelper<ValueType, double> {
 455    static bool Is(const ValueType& v) { return v.IsDouble(); }
 456    static double Get(const ValueType& v) { return v.GetDouble(); }
 457    static ValueType& Set(ValueType& v, double data) { return v.SetDouble(data); }
 458    static ValueType& Set(ValueType& v, double data, typename ValueType::AllocatorType&) { return v.SetDouble(data); }
 459};
 460
 461template<typename ValueType> 
 462struct TypeHelper<ValueType, float> {
 463    static bool Is(const ValueType& v) { return v.IsFloat(); }
 464    static float Get(const ValueType& v) { return v.GetFloat(); }
 465    static ValueType& Set(ValueType& v, float data) { return v.SetFloat(data); }
 466    static ValueType& Set(ValueType& v, float data, typename ValueType::AllocatorType&) { return v.SetFloat(data); }
 467};
 468
 469template<typename ValueType> 
 470struct TypeHelper<ValueType, const typename ValueType::Ch*> {
 471    typedef const typename ValueType::Ch* StringType;
 472    static bool Is(const ValueType& v) { return v.IsString(); }
 473    static StringType Get(const ValueType& v) { return v.GetString(); }
 474    static ValueType& Set(ValueType& v, const StringType data) { return v.SetString(typename ValueType::StringRefType(data)); }
 475    static ValueType& Set(ValueType& v, const StringType data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); }
 476};
 477
 478#if RAPIDJSON_HAS_STDSTRING
 479template<typename ValueType> 
 480struct TypeHelper<ValueType, std::basic_string<typename ValueType::Ch> > {
 481    typedef std::basic_string<typename ValueType::Ch> StringType;
 482    static bool Is(const ValueType& v) { return v.IsString(); }
 483    static StringType Get(const ValueType& v) { return StringType(v.GetString(), v.GetStringLength()); }
 484    static ValueType& Set(ValueType& v, const StringType& data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); }
 485};
 486#endif
 487
 488template<typename ValueType> 
 489struct TypeHelper<ValueType, typename ValueType::Array> {
 490    typedef typename ValueType::Array ArrayType;
 491    static bool Is(const ValueType& v) { return v.IsArray(); }
 492    static ArrayType Get(ValueType& v) { return v.GetArray(); }
 493    static ValueType& Set(ValueType& v, ArrayType data) { return v = data; }
 494    static ValueType& Set(ValueType& v, ArrayType data, typename ValueType::AllocatorType&) { return v = data; }
 495};
 496
 497template<typename ValueType> 
 498struct TypeHelper<ValueType, typename ValueType::ConstArray> {
 499    typedef typename ValueType::ConstArray ArrayType;
 500    static bool Is(const ValueType& v) { return v.IsArray(); }
 501    static ArrayType Get(const ValueType& v) { return v.GetArray(); }
 502};
 503
 504template<typename ValueType> 
 505struct TypeHelper<ValueType, typename ValueType::Object> {
 506    typedef typename ValueType::Object ObjectType;
 507    static bool Is(const ValueType& v) { return v.IsObject(); }
 508    static ObjectType Get(ValueType& v) { return v.GetObject(); }
 509    static ValueType& Set(ValueType& v, ObjectType data) { return v = data; }
 510    static ValueType& Set(ValueType& v, ObjectType data, typename ValueType::AllocatorType&) { v = data; }
 511};
 512
 513template<typename ValueType> 
 514struct TypeHelper<ValueType, typename ValueType::ConstObject> {
 515    typedef typename ValueType::ConstObject ObjectType;
 516    static bool Is(const ValueType& v) { return v.IsObject(); }
 517    static ObjectType Get(const ValueType& v) { return v.GetObject(); }
 518};
 519
 520} // namespace internal
 521
 522// Forward declarations
 523template <bool, typename> class GenericArray;
 524template <bool, typename> class GenericObject;
 525
 526///////////////////////////////////////////////////////////////////////////////
 527// GenericValue
 528
 529//! Represents a JSON value. Use Value for UTF8 encoding and default allocator.
 530/*!
 531    A JSON value can be one of 7 types. This class is a variant type supporting
 532    these types.
 533
 534    Use the Value if UTF8 and default allocator
 535
 536    \tparam Encoding    Encoding of the value. (Even non-string values need to have the same encoding in a document)
 537    \tparam Allocator   Allocator type for allocating memory of object, array and string.
 538*/
 539template <typename Encoding, typename Allocator = MemoryPoolAllocator<> > 
 540class GenericValue {
 541public:
 542    //! Name-value pair in an object.
 543    typedef GenericMember<Encoding, Allocator> Member;
 544    typedef Encoding EncodingType;                  //!< Encoding type from template parameter.
 545    typedef Allocator AllocatorType;                //!< Allocator type from template parameter.
 546    typedef typename Encoding::Ch Ch;               //!< Character type derived from Encoding.
 547    typedef GenericStringRef<Ch> StringRefType;     //!< Reference to a constant string
 548    typedef typename GenericMemberIterator<false,Encoding,Allocator>::Iterator MemberIterator;  //!< Member iterator for iterating in object.
 549    typedef typename GenericMemberIterator<true,Encoding,Allocator>::Iterator ConstMemberIterator;  //!< Constant member iterator for iterating in object.
 550    typedef GenericValue* ValueIterator;            //!< Value iterator for iterating in array.
 551    typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array.
 552    typedef GenericValue<Encoding, Allocator> ValueType;    //!< Value type of itself.
 553    typedef GenericArray<false, ValueType> Array;
 554    typedef GenericArray<true, ValueType> ConstArray;
 555    typedef GenericObject<false, ValueType> Object;
 556    typedef GenericObject<true, ValueType> ConstObject;
 557
 558    //!@name Constructors and destructor.
 559    //@{
 560
 561    //! Default constructor creates a null value.
 562    GenericValue() RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; }
 563
 564#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
 565    //! Move constructor in C++11
 566    GenericValue(GenericValue&& rhs) RAPIDJSON_NOEXCEPT : data_(rhs.data_) {
 567        rhs.data_.f.flags = kNullFlag; // give up contents
 568    }
 569#endif
 570
 571private:
 572    //! Copy constructor is not permitted.
 573    GenericValue(const GenericValue& rhs);
 574
 575#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
 576    //! Moving from a GenericDocument is not permitted.
 577    template <typename StackAllocator>
 578    GenericValue(GenericDocument<Encoding,Allocator,StackAllocator>&& rhs);
 579
 580    //! Move assignment from a GenericDocument is not permitted.
 581    template <typename StackAllocator>
 582    GenericValue& operator=(GenericDocument<Encoding,Allocator,StackAllocator>&& rhs);
 583#endif
 584
 585public:
 586
 587    //! Constructor with JSON value type.
 588    /*! This creates a Value of specified type with default content.
 589        \param type Type of the value.
 590        \note Default content for number is zero.
 591    */
 592    explicit GenericValue(Type type) RAPIDJSON_NOEXCEPT : data_() {
 593        static const uint16_t defaultFlags[7] = {
 594            kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag,
 595            kNumberAnyFlag
 596        };
 597        RAPIDJSON_ASSERT(type <= kNumberType);
 598        data_.f.flags = defaultFlags[type];
 599
 600        // Use ShortString to store empty string.
 601        if (type == kStringType)
 602            data_.ss.SetLength(0);
 603    }
 604
 605    //! Explicit copy constructor (with allocator)
 606    /*! Creates a copy of a Value by using the given Allocator
 607        \tparam SourceAllocator allocator of \c rhs
 608        \param rhs Value to copy from (read-only)
 609        \param allocator Allocator for allocating copied elements and buffers. Commonly use GenericDocument::GetAllocator().
 610        \see CopyFrom()
 611    */
 612    template< typename SourceAllocator >
 613    GenericValue(const GenericValue<Encoding, SourceAllocator>& rhs, Allocator & allocator);
 614
 615    //! Constructor for boolean value.
 616    /*! \param b Boolean value
 617        \note This constructor is limited to \em real boolean values and rejects
 618            implicitly converted types like arbitrary pointers.  Use an explicit cast
 619            to \c bool, if you want to construct a boolean JSON value in such cases.
 620     */
 621#ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen
 622    template <typename T>
 623    explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame<bool, T>))) RAPIDJSON_NOEXCEPT  // See #472
 624#else
 625    explicit GenericValue(bool b) RAPIDJSON_NOEXCEPT
 626#endif
 627        : data_() {
 628            // safe-guard against failing SFINAE
 629            RAPIDJSON_STATIC_ASSERT((internal::IsSame<bool,T>::Value));
 630            data_.f.flags = b ? kTrueFlag : kFalseFlag;
 631    }
 632
 633    //! Constructor for int value.
 634    explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_() {
 635        data_.n.i64 = i;
 636        data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag;
 637    }
 638
 639    //! Constructor for unsigned value.
 640    explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_() {
 641        data_.n.u64 = u; 
 642        data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag);
 643    }
 644
 645    //! Constructor for int64_t value.
 646    explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_() {
 647        data_.n.i64 = i64;
 648        data_.f.flags = kNumberInt64Flag;
 649        if (i64 >= 0) {
 650            data_.f.flags |= kNumberUint64Flag;
 651            if (!(static_cast<uint64_t>(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000)))
 652                data_.f.flags |= kUintFlag;
 653            if (!(static_cast<uint64_t>(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))
 654                data_.f.flags |= kIntFlag;
 655        }
 656        else if (i64 >= static_cast<int64_t>(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))
 657            data_.f.flags |= kIntFlag;
 658    }
 659
 660    //! Constructor for uint64_t value.
 661    explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_() {
 662        data_.n.u64 = u64;
 663        data_.f.flags = kNumberUint64Flag;
 664        if (!(u64 & RAPIDJSON_UINT64_C2(0x80000000, 0x00000000)))
 665            data_.f.flags |= kInt64Flag;
 666        if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000)))
 667            data_.f.flags |= kUintFlag;
 668        if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))
 669            data_.f.flags |= kIntFlag;
 670    }
 671
 672    //! Constructor for double value.
 673    explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; }
 674
 675    //! Constructor for constant string (i.e. do not make a copy of string)
 676    GenericValue(const Ch* s, SizeType length) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(StringRef(s, length)); }
 677
 678    //! Constructor for constant string (i.e. do not make a copy of string)
 679    explicit GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(s); }
 680
 681    //! Constructor for copy-string (i.e. do make a copy of string)
 682    GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_() { SetStringRaw(StringRef(s, length), allocator); }
 683
 684    //! Constructor for copy-string (i.e. do make a copy of string)
 685    GenericValue(const Ch*s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); }
 686
 687#if RAPIDJSON_HAS_STDSTRING
 688    //! Constructor for copy-string from a string object (i.e. do make a copy of string)
 689    /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING.
 690     */
 691    GenericValue(const std::basic_string<Ch>& s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); }
 692#endif
 693
 694    //! Constructor for Array.
 695    /*!
 696        \param a An array obtained by \c GetArray().
 697        \note \c Array is always pass-by-value.
 698        \note the source array is moved into this value and the sourec array becomes empty.
 699    */
 700    GenericValue(Array a) RAPIDJSON_NOEXCEPT : data_(a.value_.data_) {
 701        a.value_.data_ = Data();
 702        a.value_.data_.f.flags = kArrayFlag;
 703    }
 704
 705    //! Constructor for Object.
 706    /*!
 707        \param o An object obtained by \c GetObject().
 708        \note \c Object is always pass-by-value.
 709        \note the source object is moved into this value and the sourec object becomes empty.
 710    */
 711    GenericValue(Object o) RAPIDJSON_NOEXCEPT : data_(o.value_.data_) {
 712        o.value_.data_ = Data();
 713        o.value_.data_.f.flags = kObjectFlag;
 714    }
 715
 716    //! Destructor.
 717    /*! Need to destruct elements of array, members of object, or copy-string.
 718    */
 719    ~GenericValue() {
 720        if (Allocator::kNeedFree) { // Shortcut by Allocator's trait
 721            switch(data_.f.flags) {
 722            case kArrayFlag:
 723                {
 724                    GenericValue* e = GetElementsPointer();
 725                    for (GenericValue* v = e; v != e + data_.a.size; ++v)
 726                        v->~GenericValue();
 727                    Allocator::Free(e);
 728                }
 729                break;
 730
 731            case kObjectFlag:
 732                for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m)
 733                    m->~Member();
 734                Allocator::Free(GetMembersPointer());
 735                break;
 736
 737            case kCopyStringFlag:
 738                Allocator::Free(const_cast<Ch*>(GetStringPointer()));
 739                break;
 740
 741            default:
 742                break;  // Do nothing for other types.
 743            }
 744        }
 745    }
 746
 747    //@}
 748
 749    //!@name Assignment operators
 750    //@{
 751
 752    //! Assignment with move semantics.
 753    /*! \param rhs Source of the assignment. It will become a null value after assignment.
 754    */
 755    GenericValue& operator=(GenericValue& rhs) RAPIDJSON_NOEXCEPT {
 756        RAPIDJSON_ASSERT(this != &rhs);
 757        this->~GenericValue();
 758        RawAssign(rhs);
 759        return *this;
 760    }
 761
 762#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
 763    //! Move assignment in C++11
 764    GenericValue& operator=(GenericValue&& rhs) RAPIDJSON_NOEXCEPT {
 765        return *this = rhs.Move();
 766    }
 767#endif
 768
 769    //! Assignment of constant string reference (no copy)
 770    /*! \param str Constant string reference to be assigned
 771        \note This overload is needed to avoid clashes with the generic primitive type assignment overload below.
 772        \see GenericStringRef, operator=(T)
 773    */
 774    GenericValue& operator=(StringRefType str) RAPIDJSON_NOEXCEPT {
 775        GenericValue s(str);
 776        return *this = s;
 777    }
 778
 779    //! Assignment with primitive types.
 780    /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t
 781        \param value The value to be assigned.
 782
 783        \note The source type \c T explicitly disallows all pointer types,
 784            especially (\c const) \ref Ch*.  This helps avoiding implicitly
 785            referencing character strings with insufficient lifetime, use
 786            \ref SetString(const Ch*, Allocator&) (for copying) or
 787            \ref StringRef() (to explicitly mark the pointer as constant) instead.
 788            All other pointer types would implicitly convert to \c bool,
 789            use \ref SetBool() instead.
 790    */
 791    template <typename T>
 792    RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer<T>), (GenericValue&))
 793    operator=(T value) {
 794        GenericValue v(value);
 795        return *this = v;
 796    }
 797
 798    //! Deep-copy assignment from Value
 799    /*! Assigns a \b copy of the Value to the current Value object
 800        \tparam SourceAllocator Allocator type of \c rhs
 801        \param rhs Value to copy from (read-only)
 802        \param allocator Allocator to use for copying
 803     */
 804    template <typename SourceAllocator>
 805    GenericValue& CopyFrom(const GenericValue<Encoding, SourceAllocator>& rhs, Allocator& allocator) {
 806        RAPIDJSON_ASSERT(static_cast<void*>(this) != static_cast<void const*>(&rhs));
 807        this->~GenericValue();
 808        new (this) GenericValue(rhs, allocator);
 809        return *this;
 810    }
 811
 812    //! Exchange the contents of this value with those of other.
 813    /*!
 814        \param other Another value.
 815        \note Constant complexity.
 816    */
 817    GenericValue& Swap(GenericValue& other) RAPIDJSON_NOEXCEPT {
 818        GenericValue temp;
 819        temp.RawAssign(*this);
 820        RawAssign(other);
 821        other.RawAssign(temp);
 822        return *this;
 823    }
 824
 825    //! free-standing swap function helper
 826    /*!
 827        Helper function to enable support for common swap implementation pattern based on \c std::swap:
 828        \code
 829        void swap(MyClass& a, MyClass& b) {
 830            using std::swap;
 831            swap(a.value, b.value);
 832            // ...
 833        }
 834        \endcode
 835        \see Swap()
 836     */
 837    friend inline void swap(GenericValue& a, GenericValue& b) RAPIDJSON_NOEXCEPT { a.Swap(b); }
 838
 839    //! Prepare Value for move semantics
 840    /*! \return *this */
 841    GenericValue& Move() RAPIDJSON_NOEXCEPT { return *this; }
 842    //@}
 843
 844    //!@name Equal-to and not-equal-to operators
 845    //@{
 846    //! Equal-to operator
 847    /*!
 848        \note If an object contains duplicated named member, comparing equality with any object is always \c false.
 849        \note Linear time complexity (number of all values in the subtree and total lengths of all strings).
 850    */
 851    template <typename SourceAllocator>
 852    bool operator==(const GenericValue<Encoding, SourceAllocator>& rhs) const {
 853        typedef GenericValue<Encoding, SourceAllocator> RhsType;
 854        if (GetType() != rhs.GetType())
 855            return false;
 856
 857        switch (GetType()) {
 858        case kObjectType: // Warning: O(n^2) inner-loop
 859            if (data_.o.size != rhs.data_.o.size)
 860                return false;           
 861            for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) {
 862                typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name);
 863                if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value)
 864                    return false;
 865            }
 866            return true;
 867            
 868        case kArrayType:
 869            if (data_.a.size != rhs.data_.a.size)
 870                return false;
 871            for (SizeType i = 0; i < data_.a.size; i++)
 872                if ((*this)[i] != rhs[i])
 873                    return false;
 874            return true;
 875
 876        case kStringType:
 877            return StringEqual(rhs);
 878
 879        case kNumberType:
 880            if (IsDouble() || rhs.IsDouble()) {
 881                double a = GetDouble();     // May convert from integer to double.
 882                double b = rhs.GetDouble(); // Ditto
 883                return a >= b && a <= b;    // Prevent -Wfloat-equal
 884            }
 885            else
 886                return data_.n.u64 == rhs.data_.n.u64;
 887
 888        default:
 889            return true;
 890        }
 891    }
 892
 893    //! Equal-to operator with const C-string pointer
 894    bool operator==(const Ch* rhs) const { return *this == GenericValue(StringRef(rhs)); }
 895
 896#if RAPIDJSON_HAS_STDSTRING
 897    //! Equal-to operator with string object
 898    /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING.
 899     */
 900    bool operator==(const std::basic_string<Ch>& rhs) const { return *this == GenericValue(StringRef(rhs)); }
 901#endif
 902
 903    //! Equal-to operator with primitive types
 904    /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c true, \c false
 905    */
 906    template <typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>,internal::IsGenericValue<T> >), (bool)) operator==(const T& rhs) const { return *this == GenericValue(rhs); }
 907
 908    //! Not-equal-to operator
 909    /*! \return !(*this == rhs)
 910     */
 911    template <typename SourceAllocator>
 912    bool operator!=(const GenericValue<Encoding, SourceAllocator>& rhs) const { return !(*this == rhs); }
 913
 914    //! Not-equal-to operator with const C-string pointer
 915    bool operator!=(const Ch* rhs) const { return !(*this == rhs); }
 916
 917    //! Not-equal-to operator with arbitrary types
 918    /*! \return !(*this == rhs)
 919     */
 920    template <typename T> RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (bool)) operator!=(const T& rhs) const { return !(*this == rhs); }
 921
 922    //! Equal-to operator with arbitrary types (symmetric version)
 923    /*! \return (rhs == lhs)
 924     */
 925    template <typename T> friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (bool)) operator==(const T& lhs, const GenericValue& rhs) { return rhs == lhs; }
 926
 927    //! Not-Equal-to operator with arbitrary types (symmetric version)
 928    /*! \return !(rhs == lhs)
 929     */
 930    template <typename T> friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (bool)) operator!=(const T& lhs, const GenericValue& rhs) { return !(rhs == lhs); }
 931    //@}
 932
 933    //!@name Type
 934    //@{
 935
 936    Type GetType()  const { return static_cast<Type>(data_.f.flags & kTypeMask); }
 937    bool IsNull()   const { return data_.f.flags == kNullFlag; }
 938    bool IsFalse()  const { return data_.f.flags == kFalseFlag; }
 939    bool IsTrue()   const { return data_.f.flags == kTrueFlag; }
 940    bool IsBool()   const { return (data_.f.flags & kBoolFlag) != 0; }
 941    bool IsObject() const { return data_.f.flags == kObjectFlag; }
 942    bool IsArray()  const { return data_.f.flags == kArrayFlag; }
 943    bool IsNumber() const { return (data_.f.flags & kNumberFlag) != 0; }
 944    bool IsInt()    const { return (data_.f.flags & kIntFlag) != 0; }
 945    bool IsUint()   const { return (data_.f.flags & kUintFlag) != 0; }
 946    bool IsInt64()  const { return (data_.f.flags & kInt64Flag) != 0; }
 947    bool IsUint64() const { return (data_.f.flags & kUint64Flag) != 0; }
 948    bool IsDouble() const { return (data_.f.flags & kDoubleFlag) != 0; }
 949    bool IsString() const { return (data_.f.flags & kStringFlag) != 0; }
 950
 951    // Checks whether a number can be losslessly converted to a double.
 952    bool IsLosslessDouble() const {
 953        if (!IsNumber()) return false;
 954        if (IsUint64()) {
 955            uint64_t u = GetUint64();
 956            volatile double d = static_cast<double>(u);
 957            return (d >= 0.0)
 958                && (d < static_cast<double>(std::numeric_limits<uint64_t>::max()))
 959                && (u == static_cast<uint64_t>(d));
 960        }
 961        if (IsInt64()) {
 962            int64_t i = GetInt64();
 963            volatile double d = static_cast<double>(i);
 964            return (d >= static_cast<double>(std::numeric_limits<int64_t>::min()))
 965                && (d < static_cast<double>(std::numeric_limits<int64_t>::max()))
 966                && (i == static_cast<int64_t>(d));
 967        }
 968        return true; // double, int, uint are always lossless
 969    }
 970
 971    // Checks whether a number is a float (possible lossy).
 972    bool IsFloat() const  {
 973        if ((data_.f.flags & kDoubleFlag) == 0)
 974            return false;
 975        double d = GetDouble();
 976        return d >= -3.4028234e38 && d <= 3.4028234e38;
 977    }
 978    // Checks whether a number can be losslessly converted to a float.
 979    bool IsLosslessFloat() const {
 980        if (!IsNumber()) return false;
 981        double a = GetDouble();
 982        if (a < static_cast<double>(-std::numeric_limits<float>::max())
 983                || a > static_cast<double>(std::numeric_limits<float>::max()))
 984            return false;
 985        double b = static_cast<double>(static_cast<float>(a));
 986        return a >= b && a <= b;    // Prevent -Wfloat-equal
 987    }
 988
 989    //@}
 990
 991    //!@name Null
 992    //@{
 993
 994    GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; }
 995
 996    //@}
 997
 998    //!@name Bool
 999    //@{
1000
1001    bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return data_.f.flags == kTrueFlag; }
1002    //!< Set boolean value
1003    /*! \post IsBool() == true */
1004    GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; }
1005
1006    //@}
1007
1008    //!@name Object
1009    //@{
1010
1011    //! Set this value as an empty object.
1012    /*! \post IsObject() == true */
1013    GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; }
1014
1015    //! Get the number of members in the object.
1016    SizeType MemberCount() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size; }
1017
1018    //! Check whether the object is empty.
1019    bool ObjectEmpty() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; }
1020
1021    //! Get a value from an object associated with the name.
1022    /*! \pre IsObject() == true
1023        \tparam T Either \c Ch or \c const \c Ch (template used for disambiguation with \ref operator[](SizeType))
1024        \note In version 0.1x, if the member is not found, this function returns a null value. This makes issue 7.
1025        Since 0.2, if the name is not correct, it will assert.
1026        If user is unsure whether a member exists, user should use HasMember() first.
1027        A better approach is to use FindMember().
1028        \note Linear time complexity.
1029    */
1030    template <typename T>
1031    RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr<internal::IsSame<typename internal::RemoveConst<T>::Type, Ch> >),(GenericValue&)) operator[](T* name) {
1032        GenericValue n(StringRef(name));
1033        return (*this)[n];
1034    }
1035    template <typename T>
1036    RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr<internal::IsSame<typename internal::RemoveConst<T>::Type, Ch> >),(const GenericValue&)) operator[](T* name) const { return const_cast<GenericValue&>(*this)[name]; }
1037
1038    //! Get a value from an object associated with the name.
1039    /*! \pre IsObject() == true
1040        \tparam SourceAllocator Allocator of the \c name value
1041
1042        \note Compared to \ref operator[](T*), this version is faster because it does not need a StrLen().
1043        And it can also handle strings with embedded null characters.
1044
1045        \note Linear time complexity.
1046    */
1047    template <typename SourceAllocator>
1048    GenericValue& operator[](const GenericValue<Encoding, SourceAllocator>& name) {
1049        MemberIterator member = FindMember(name);
1050        if (member != MemberEnd())
1051            return member->value;
1052        else {
1053            RAPIDJSON_ASSERT(false);    // see above note
1054
1055            // This will generate -Wexit-time-destructors in clang
1056            // static GenericValue NullValue;
1057            // return NullValue;
1058
1059            // Use static buffer and placement-new to prevent destruction
1060            static char buffer[sizeof(GenericValue)];
1061            return *new (buffer) GenericValue();
1062        }
1063    }
1064    template <typename SourceAllocator>
1065    const GenericValue& operator[](const GenericValue<Encoding, SourceAllocator>& name) const { return const_cast<GenericValue&>(*this)[name]; }
1066
1067#if RAPIDJSON_HAS_STDSTRING
1068    //! Get a value from an object associated with name (string object).
1069    GenericValue& operator[](const std::basic_string<Ch>& name) { return (*this)[GenericValue(StringRef(name))]; }
1070    const GenericValue& operator[](const std::basic_string<Ch>& name) const { return (*this)[GenericValue(StringRef(name))]; }
1071#endif
1072
1073    //! Const member iterator
1074    /*! \pre IsObject() == true */
1075    ConstMemberIterator MemberBegin() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer()); }
1076    //! Const \em past-the-end member iterator
1077    /*! \pre IsObject() == true */
1078    ConstMemberIterator MemberEnd() const   { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer() + data_.o.size); }
1079    //! Member iterator
1080    /*! \pre IsObject() == true */
1081    MemberIterator MemberBegin()            { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer()); }
1082    //! \em Past-the-end member iterator
1083    /*! \pre IsObject() == true */
1084    MemberIterator MemberEnd()              { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer() + data_.o.size); }
1085
1086    //! Check whether a member exists in the object.
1087    /*!
1088        \param name Member name to be searched.
1089        \pre IsObject() == true
1090        \return Whether a member with that name exists.
1091        \note It is better to use FindMember() directly if you need the obtain the value as well.
1092        \note Linear time complexity.
1093    */
1094    bool HasMember(const Ch* name) const { return FindMember(name) != MemberEnd(); }
1095
1096#if RAPIDJSON_HAS_STDSTRING
1097    //! Check whether a member exists in the object with string object.
1098    /*!
1099        \param name Member name to be searched.
1100        \pre IsObject() == true
1101        \return Whether a member with that name exists.
1102        \note It is better to use FindMember() directly if you need the obtain the value as well.
1103        \note Linear time complexity.
1104    */
1105    bool HasMember(const std::basic_string<Ch>& name) const { return FindMember(name) != MemberEnd(); }
1106#endif
1107
1108    //! Check whether a member exists in the object with GenericValue name.
1109    /*!
1110        This version is faster because it does not need a StrLen(). It can also handle string with null character.
1111        \param name Member name to be searched.
1112        \pre IsObject() == true
1113        \return Whether a member with that name exists.
1114        \note It is better to use FindMember() directly if you need the obtain the value as well.
1115        \note Linear time complexity.
1116    */
1117    template <typename SourceAllocator>
1118    bool HasMember(const GenericValue<Encoding, SourceAllocator>& name) const { return FindMember(name) != MemberEnd(); }
1119
1120    //! Find member by name.
1121    /*!
1122        \param name Member name to be searched.
1123        \pre IsObject() == true
1124        \return Iterator to member, if it exists.
1125            Otherwise returns \ref MemberEnd().
1126
1127        \note Earlier versions of Rapidjson returned a \c NULL pointer, in case
1128            the requested member doesn't exist. For consistency with e.g.
1129            \c std::map, this has been changed to MemberEnd() now.
1130        \note Linear time complexity.
1131    */
1132    MemberIterator FindMember(const Ch* name) {
1133        GenericValue n(StringRef(name));
1134        return FindMember(n);
1135    }
1136
1137    ConstMemberIterator FindMember(const Ch* name) const { return const_cast<GenericValue&>(*this).FindMember(name); }
1138
1139    //! Find member by name.
1140    /*!
1141        This version is faster because it does not need a StrLen(). It can also handle string with null character.
1142        \param name Member name to be searched.
1143        \pre IsObject() == true
1144        \return Iterator to member, if it exists.
1145            Otherwise returns \ref MemberEnd().
1146
1147        \note Earlier versions of Rapidjson returned a \c NULL pointer, in case
1148            the requested member doesn't exist. For consistency with e.g.
1149            \c std::map, this has been changed to MemberEnd() now.
1150        \note Linear time complexity.
1151    */
1152    template <typename SourceAllocator>
1153    MemberIterator FindMember(const GenericValue<Encoding, SourceAllocator>& name) {
1154        RAPIDJSON_ASSERT(IsObject());
1155        RAPIDJSON_ASSERT(name.IsString());
1156        MemberIterator member = MemberBegin();
1157        for ( ; member != MemberEnd(); ++member)
1158            if (name.StringEqual(member->name))
1159                break;
1160        return member;
1161    }
1162    template <typename SourceAllocator> ConstMemberIterator FindMember(const GenericValue<Encoding, SourceAllocator>& name) const { return const_cast<GenericValue&>(*this).FindMember(name); }
1163
1164#if RAPIDJSON_HAS_STDSTRING
1165    //! Find member by string object name.
1166    /*!
1167        \param name Member name to be searched.
1168        \pre IsObject() == true
1169        \return Iterator to member, if it exists.
1170            Otherwise returns \ref MemberEnd().
1171    */
1172    MemberIterator FindMember(const std::basic_string<Ch>& name) { return FindMember(GenericValue(StringRef(name))); }
1173    ConstMemberIterator FindMember(const std::basic_string<Ch>& name) const { return FindMember(GenericValue(StringRef(name))); }
1174#endif
1175
1176    //! Add a member (name-value pair) to the object.
1177    /*! \param name A string value as name of member.
1178        \param value Value of any type.
1179        \param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1180        \return The value itself for fluent API.
1181        \note The ownership of \c name and \c value will be transferred to this object on success.
1182        \pre  IsObject() && name.IsString()
1183        \post name.IsNull() && value.IsNull()
1184        \note Amortized Constant time complexity.
1185    */
1186    GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) {
1187        RAPIDJSON_ASSERT(IsObject());
1188        RAPIDJSON_ASSERT(name.IsString());
1189
1190        ObjectData& o = data_.o;
1191        if (o.size >= o.capacity) {
1192            if (o.capacity == 0) {
1193                o.capacity = kDefaultObjectCapacity;
1194                SetMembersPointer(reinterpret_cast<Member*>(allocator.Malloc(o.capacity * sizeof(Member))));
1195            }
1196            else {
1197                SizeType oldCapacity = o.capacity;
1198                o.capacity += (oldCapacity + 1) / 2; // grow by factor 1.5
1199                SetMembersPointer(reinterpret_cast<Member*>(allocator.Realloc(GetMembersPointer(), oldCapacity * sizeof(Member), o.capacity * sizeof(Member))));
1200            }
1201        }
1202        Member* members = GetMembersPointer();
1203        members[o.size].name.RawAssign(name);
1204        members[o.size].value.RawAssign(value);
1205        o.size++;
1206        return *this;
1207    }
1208
1209    //! Add a constant string value as member (name-value pair) to the object.
1210    /*! \param name A string value as name of member.
1211        \param value constant string reference as value of member.
1212        \param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1213        \return The value itself for fluent API.
1214        \pre  IsObject()
1215        \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below.
1216        \note Amortized Constant time complexity.
1217    */
1218    GenericValue& AddMember(GenericValue& name, StringRefType value, Allocator& allocator) {
1219        GenericValue v(value);
1220        return AddMember(name, v, allocator);
1221    }
1222
1223#if RAPIDJSON_HAS_STDSTRING
1224    //! Add a string object as member (name-value pair) to the object.
1225    /*! \param name A string value as name of member.
1226        \param value constant string reference as value of member.
1227        \param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1228        \return The value itself for fluent API.
1229        \pre  IsObject()
1230        \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below.
1231        \note Amortized Constant time complexity.
1232    */
1233    GenericValue& AddMember(GenericValue& name, std::basic_string<Ch>& value, Allocator& allocator) {
1234        GenericValue v(value, allocator);
1235        return AddMember(name, v, allocator);
1236    }
1237#endif
1238
1239    //! Add any primitive value as member (name-value pair) to the object.
1240    /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t
1241        \param name A string value as name of member.
1242        \param value Value of primitive type \c T as value of member
1243        \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator().
1244        \return The value itself for fluent API.
1245        \pre  IsObject()
1246
1247        \note The source type \c T explicitly disallows all pointer types,
1248            especially (\c const) \ref Ch*.  This helps avoiding implicitly
1249            referencing character strings with insufficient lifetime, use
1250            \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref
1251            AddMember(StringRefType, StringRefType, Allocator&).
1252            All other pointer types would implicitly convert to \c bool,
1253            use an explicit cast instead, if needed.
1254        \note Amortized Constant time complexity.
1255    */
1256    template <typename T>
1257    RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&))
1258    AddMember(GenericValue& name, T value, Allocator& allocator) {
1259        GenericValue v(value);
1260        return AddMember(name, v, allocator);
1261    }
1262
1263#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
1264    GenericValue& AddMember(GenericValue&& name, GenericValue&& value, Allocator& allocator) {
1265        return AddMember(name, value, allocator);
1266    }
1267    GenericValue& AddMember(GenericValue&& name, GenericValue& value, Allocator& allocator) {
1268        return AddMember(name, value, allocator);
1269    }
1270    GenericValue& AddMember(GenericValue& name, GenericValue&& value, Allocator& allocator) {
1271        return AddMember(name, value, allocator);
1272    }
1273    GenericValue& AddMember(StringRefType name, GenericValue&& value, Allocator& allocator) {
1274        GenericValue n(name);
1275        return AddMember(n, value, allocator);
1276    }
1277#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
1278
1279
1280    //! Add a member (name-value pair) to the object.
1281    /*! \param name A constant string reference as name of member.
1282        \param value Value of any type.
1283        \param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1284        \return The value itself for fluent API.
1285        \note The ownership of \c value will be transferred to this object on success.
1286        \pre  IsObject()
1287        \post value.IsNull()
1288        \note Amortized Constant time complexity.
1289    */
1290    GenericValue& AddMember(StringRefType name, GenericValue& value, Allocator& allocator) {
1291        GenericValue n(name);
1292        return AddMember(n, value, allocator);
1293    }
1294
1295    //! Add a constant string value as member (name-value pair) to the object.
1296    /*! \param name A constant string reference as name of member.
1297        \param value constant string reference as value of member.
1298        \param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1299        \return The value itself for fluent API.
1300        \pre  IsObject()
1301        \note This overload is needed to avoid clashes with the generic primitive type AddMember(StringRefType,T,Allocator&) overload below.
1302        \note Amortized Constant time complexity.
1303    */
1304    GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) {
1305        GenericValue v(value);
1306        return AddMember(name, v, allocator);
1307    }
1308
1309    //! Add any primitive value as member (name-value pair) to the object.
1310    /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t
1311        \param name A constant string reference as name of member.
1312        \param value Value of primitive type \c T as value of member
1313        \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator().
1314        \return The value itself for fluent API.
1315        \pre  IsObject()
1316
1317        \note The source type \c T explicitly disallows all pointer types,
1318            especially (\c const) \ref Ch*.  This helps avoiding implicitly
1319            referencing character strings with insufficient lifetime, use
1320            \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref
1321            AddMember(StringRefType, StringRefType, Allocator&).
1322            All other pointer types would implicitly convert to \c bool,
1323            use an explicit cast instead, if needed.
1324        \note Amortized Constant time complexity.
1325    */
1326    template <typename T>
1327    RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&))
1328    AddMember(StringRefType name, T value, Allocator& allocator) {
1329        GenericValue n(name);
1330        return AddMember(n, value, allocator);
1331    }
1332
1333    //! Remove all members in the object.
1334    /*! This function do not deallocate memory in the object, i.e. the capacity is unchanged.
1335        \note Linear time complexity.
1336    */
1337    void RemoveAllMembers() {
1338        RAPIDJSON_ASSERT(IsObject()); 
1339        for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m)
1340            m->~Member();
1341        data_.o.size = 0;
1342    }
1343
1344    //! Remove a member in object by its name.
1345    /*! \param name Name of member to be removed.
1346        \return Whether the member existed.
1347        \note This function may reorder the object members. Use \ref
1348            EraseMember(ConstMemberIterator) if you need to preserve the
1349            relative order of the remaining members.
1350        \note Linear time complexity.
1351    */
1352    bool RemoveMember(const Ch* name) {
1353        GenericValue n(StringRef(name));
1354        return RemoveMember(n);
1355    }
1356
1357#if RAPIDJSON_HAS_STDSTRING
1358    bool RemoveMember(const std::basic_string<Ch>& name) { return RemoveMember(GenericValue(StringRef(name))); }
1359#endif
1360
1361    template <typename SourceAllocator>
1362    bool RemoveMember(const GenericValue<Encoding, SourceAllocator>& name) {
1363        MemberIterator m = FindMember(name);
1364        if (m != MemberEnd()) {
1365            RemoveMember(m);
1366            return true;
1367        }
1368        else
1369            return false;
1370    }
1371
1372    //! Remove a member in object by iterator.
1373    /*! \param m member iterator (obtained by FindMember() or MemberBegin()).
1374        \return the new iterator after removal.
1375        \note This function may reorder the object members. Use \ref
1376            EraseMember(ConstMemberIterator) if you need to preserve the
1377            relative order of the remaining members.
1378        \note Constant time complexity.
1379    */
1380    MemberIterator RemoveMember(MemberIterator m) {
1381        RAPIDJSON_ASSERT(IsObject());
1382        RAPIDJSON_ASSERT(data_.o.size > 0);
1383        RAPIDJSON_ASSERT(GetMembersPointer() != 0);
1384        RAPIDJSON_ASSERT(m >= MemberBegin() && m < MemberEnd());
1385
1386        MemberIterator last(GetMembersPointer() + (data_.o.size - 1));
1387        if (data_.o.size > 1 && m != last)
1388            *m = *last; // Move the last one to this place
1389        else
1390            m->~Member(); // Only one left, just destroy
1391        --data_.o.size;
1392        return m;
1393    }
1394
1395    //! Remove a member from an object by iterator.
1396    /*! \param pos iterator to the member to remove
1397        \pre IsObject() == true && \ref MemberBegin() <= \c pos < \ref MemberEnd()
1398        \return Iterator following the removed element.
1399            If the iterator \c pos refers to the last element, the \ref MemberEnd() iterator is returned.
1400        \note This function preserves the relative order of the remaining object
1401            members. If you do not need this, use the more efficient \ref RemoveMember(MemberIterator).
1402        \note Linear time complexity.
1403    */
1404    MemberIterator EraseMember(ConstMemberIterator pos) {
1405        return EraseMember(pos, pos +1);
1406    }
1407
1408    //! Remove members in the range [first, last) from an object.
1409    /*! \param first iterator to the first member to remove
1410        \param last  iterator following the last member to remove
1411        \pre IsObject() == true && \ref MemberBegin() <= \c first <= \c last <= \ref MemberEnd()
1412        \return Iterator following the last removed element.
1413        \note This function preserves the relative order of the remaining object
1414            members.
1415        \note Linear time complexity.
1416    */
1417    MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) {
1418        RAPIDJSON_ASSERT(IsObject());
1419        RAPIDJSON_ASSERT(data_.o.size > 0);
1420        RAPIDJSON_ASSERT(GetMembersPointer() != 0);
1421        RAPIDJSON_ASSERT(first >= MemberBegin());
1422        RAPIDJSON_ASSERT(first <= last);
1423        RAPIDJSON_ASSERT(last <= MemberEnd());
1424
1425        MemberIterator pos = MemberBegin() + (first - MemberBegin());
1426        for (MemberIterator itr = pos; itr != last; ++itr)
1427            itr->~Member();
1428        std::memmove(&*pos, &*last, static_cast<size_t>(MemberEnd() - last) * sizeof(Member));
1429        data_.o.size -= static_cast<SizeType>(last - first);
1430        return pos;
1431    }
1432
1433    //! Erase a member in object by its name.
1434    /*! \param name Name of member to be removed.
1435        \return Whether the member existed.
1436        \note Linear time complexity.
1437    */
1438    bool EraseMember(const Ch* name) {
1439        GenericValue n(StringRef(name));
1440        return EraseMember(n);
1441    }
1442
1443#if RAPIDJSON_HAS_STDSTRING
1444    bool EraseMember(const std::basic_string<Ch>& name) { return EraseMember(GenericValue(StringRef(name))); }
1445#endif
1446
1447    template <typename SourceAllocator>
1448    bool EraseMember(const GenericValue<Encoding, SourceAllocator>& name) {
1449        MemberIterator m = FindMember(name);
1450        if (m != MemberEnd()) {
1451            EraseMember(m);
1452            return true;
1453        }
1454        else
1455            return false;
1456    }
1457
1458    Object GetObject() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); }
1459    ConstObject GetObject() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); }
1460
1461    //@}
1462
1463    //!@name Array
1464    //@{
1465
1466    //! Set this value as an empty array.
1467    /*! \post IsArray == true */
1468    GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; }
1469
1470    //! Get the number of elements in array.
1471    SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; }
1472
1473    //! Get the capacity of array.
1474    SizeType Capacity() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; }
1475
1476    //! Check whether the array is empty.
1477    bool Empty() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; }
1478
1479    //! Remove all elements in the array.
1480    /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged.
1481        \note Linear time complexity.
1482    */
1483    void Clear() {
1484        RAPIDJSON_ASSERT(IsArray()); 
1485        GenericValue* e = GetElementsPointer();
1486        for (GenericValue* v = e; v != e + data_.a.size; ++v)
1487            v->~GenericValue();
1488        data_.a.size = 0;
1489    }
1490
1491    //! Get an element from array by index.
1492    /*! \pre IsArray() == true
1493        \param index Zero-based index of element.
1494        \see operator[](T*)
1495    */
1496    GenericValue& operator[](SizeType index) {
1497        RAPIDJSON_ASSERT(IsArray());
1498        RAPIDJSON_ASSERT(index < data_.a.size);
1499        return GetElementsPointer()[index];
1500    }
1501    const GenericValue& operator[](SizeType index) const { return const_cast<GenericValue&>(*this)[index]; }
1502
1503    //! Element iterator
1504    /*! \pre IsArray() == true */
1505    ValueIterator Begin() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer(); }
1506    //! \em Past-the-end element iterator
1507    /*! \pre IsArray() == true */
1508    ValueIterator End() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer() + data_.a.size; }
1509    //! Constant element iterator
1510    /*! \pre IsArray() == true */
1511    ConstValueIterator Begin() const { return const_cast<GenericValue&>(*this).Begin(); }
1512    //! Constant \em past-the-end element iterator
1513    /*! \pre IsArray() == true */
1514    ConstValueIterator End() const { return const_cast<GenericValue&>(*this).End(); }
1515
1516    //! Request the array to have enough capacity to store elements.
1517    /*! \param newCapacity  The capacity that the array at least need to have.
1518        \param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1519        \return The value itself for fluent API.
1520        \note Linear time complexity.
1521    */
1522    GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) {
1523        RAPIDJSON_ASSERT(IsArray());
1524        if (newCapacity > data_.a.capacity) {
1525            SetElementsPointer(reinterpret_cast<GenericValue*>(allocator.Realloc(GetElementsPointer(), data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue))));
1526            data_.a.capacity = newCapacity;
1527        }
1528        return *this;
1529    }
1530
1531    //! Append a GenericValue at the end of the array.
1532    /*! \param value        Value to be appended.
1533        \param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1534        \pre IsArray() == true
1535        \post value.IsNull() == true
1536        \return The value itself for fluent API.
1537        \note The ownership of \c value will be transferred to this array on success.
1538        \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient.
1539        \note Amortized constant time complexity.
1540    */
1541    GenericValue& PushBack(GenericValue& value, Allocator& allocator) {
1542        RAPIDJSON_ASSERT(IsArray());
1543        if (data_.a.size >= data_.a.capacity)
1544            Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator);
1545        GetElementsPointer()[data_.a.size++].RawAssign(value);
1546        return *this;
1547    }
1548
1549#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
1550    GenericValue& PushBack(GenericValue&& value, Allocator& allocator) {
1551        return PushBack(value, allocator);
1552    }
1553#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
1554
1555    //! Append a constant string reference at the end of the array.
1556    /*! \param value        Constant string reference to be appended.
1557        \param allocator    Allocator for reallocating memory. It must be the same one used previously. Commonly use GenericDocument::GetAllocator().
1558        \pre IsArray() == true
1559        \return The value itself for fluent API.
1560        \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient.
1561        \note Amortized constant time complexity.
1562        \see GenericStringRef
1563    */
1564    GenericValue& PushBack(StringRefType value, Allocator& allocator) {
1565        return (*this).template PushBack<StringRefType>(value, allocator);
1566    }
1567
1568    //! Append a primitive value at the end of the array.
1569    /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t
1570        \param value Value of primitive type T to be appended.
1571        \param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1572        \pre IsArray() == true
1573        \return The value itself for fluent API.
1574        \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient.
1575
1576        \note The source type \c T explicitly disallows all pointer types,
1577            especially (\c const) \ref Ch*.  This helps avoiding implicitly
1578            referencing character strings with insufficient lifetime, use
1579            \ref PushBack(GenericValue&, Allocator&) or \ref
1580            PushBack(StringRefType, Allocator&).
1581            All other pointer types would implicitly convert to \c bool,
1582            use an explicit cast instead, if needed.
1583        \note Amortized constant time complexity.
1584    */
1585    template <typename T>
1586    RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&))
1587    PushBack(T value, Allocator& allocator) {
1588        GenericValue v(value);
1589        return PushBack(v, allocator);
1590    }
1591
1592    //! Remove the last element in the array.
1593    /*!
1594        \note Constant time complexity.
1595    */
1596    GenericValue& PopBack() {
1597        RAPIDJSON_ASSERT(IsArray());
1598        RAPIDJSON_ASSERT(!Empty());
1599        GetElementsPointer()[--data_.a.size].~GenericValue();
1600        return *this;
1601    }
1602
1603    //! Remove an element of array by iterator.
1604    /*!
1605        \param pos iterator to the element to remove
1606        \pre IsArray() == true && \ref Begin() <= \c pos < \ref End()
1607        \return Iterator following the removed element. If the iterator pos refers to the last element, the End() iterator is returned.
1608        \note Linear time complexity.
1609    */
1610    ValueIterator Erase(ConstValueIterator pos) {
1611        return Erase(pos, pos + 1);
1612    }
1613
1614    //! Remove elements in the range [first, last) of the array.
1615    /*!
1616        \param first iterator to the first element to remove
1617        \param last  iterator following the last element to remove
1618        \pre IsArray() == true && \ref Begin() <= \c first <= \c last <= \ref End()
1619        \return Iterator following the last removed element.
1620        \note Linear time complexity.
1621    */
1622    ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) {
1623        RAPIDJSON_ASSERT(IsArray());
1624        RAPIDJSON_ASSERT(data_.a.size > 0);
1625        RAPIDJSON_ASSERT(GetElementsPointer() != 0);
1626        RAPIDJSON_ASSERT(first >= Begin());
1627        RAPIDJSON_ASSERT(first <= last);
1628        RAPIDJSON_ASSERT(last <= End());
1629        ValueIterator pos = Begin() + (first - Begin());
1630        for (ValueIterator itr = pos; itr != last; ++itr)
1631            itr->~GenericValue();       
1632        std::memmove(pos, last, static_cast<size_t>(End() - last) * sizeof(GenericValue));
1633        data_.a.size -= static_cast<SizeType>(last - first);
1634        return pos;
1635    }
1636
1637    Array GetArray() { RAPIDJSON_ASSERT(IsArray()); return Array(*this); }
1638    ConstArray GetArray() const { RAPIDJSON_ASSERT(IsArray()); return ConstArray(*this); }
1639
1640    //@}
1641
1642    //!@name Number
1643    //@{
1644
1645    int GetInt() const          { RAPIDJSON_ASSERT(data_.f.flags & kIntFlag);   return data_.n.i.i;   }
1646    unsigned GetUint() const    { RAPIDJSON_ASSERT(data_.f.flags & kUintFlag);  return data_.n.u.u;   }
1647    int64_t GetInt64() const    { RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag); return data_.n.i64; }
1648    uint64_t GetUint64() const  { RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag); return data_.n.u64; }
1649
1650    //! Get the value as double type.
1651    /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessDouble() to check whether the converison is lossless.
1652    */
1653    double GetDouble() const {
1654        RAPIDJSON_ASSERT(IsNumber());
1655        if ((data_.f.flags & kDoubleFlag) != 0)                return data_.n.d;   // exact type, no conversion.
1656        if ((data_.f.flags & kIntFlag) != 0)                   return data_.n.i.i; // int -> double
1657        if ((data_.f.flags & kUintFlag) != 0)                  return data_.n.u.u; // unsigned -> double
1658        if ((data_.f.flags & kInt64Flag) != 0)                 return static_cast<double>(data_.n.i64); // int64_t -> double (may lose precision)
1659        RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0);  return static_cast<double>(data_.n.u64); // uint64_t -> double (may lose precision)
1660    }
1661
1662    //! Get the value as float type.
1663    /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessFloat() to check whether the converison is lossless.
1664    */
1665    float GetFloat() const {
1666        return static_cast<float>(GetDouble());
1667    }
1668
1669    GenericValue& SetInt(int i)             { this->~GenericValue(); new (this) GenericValue(i);    return *this; }
1670    GenericValue& SetUint(unsigned u)       { this->~GenericValue(); new (this) GenericValue(u);    return *this; }
1671    GenericValue& SetInt64(int64_t i64)     { this->~GenericValue(); new (this) GenericValue(i64);  return *this; }
1672    GenericValue& SetUint64(uint64_t u64)   { this->~GenericValue(); new (this) GenericValue(u64);  return *this; }
1673    GenericValue& SetDouble(double d)       { this->~GenericValue(); new (this) GenericValue(d);    return *this; }
1674    GenericValue& SetFloat(float f)         { this->~GenericValue(); new (this) GenericValue(f);    return *this; }
1675
1676    //@}
1677
1678    //!@name String
1679    //@{
1680
1681    const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return (data_.f.flags & kInlineStrFlag) ? data_.ss.str : GetStringPointer(); }
1682
1683    //! Get the length of string.
1684    /*! Since rapidjson permits "\\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength().
1685    */
1686    SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return ((data_.f.flags & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); }
1687
1688    //! Set this value as a string without copying source string.
1689    /*! This version has better performance with supplied length, and also support string containing null character.
1690        \param s source string pointer. 
1691        \param length The length of source string, excluding the trailing null terminator.
1692        \return The value itself for fluent API.
1693        \post IsString() == true && GetString() == s && GetStringLength() == length
1694        \see SetString(StringRefType)
1695    */
1696    GenericValue& SetString(const Ch* s, SizeType length) { return SetString(StringRef(s, length)); }
1697
1698    //! Set this value as a string without copying source string.
1699    /*! \param s source string reference
1700        \return The value itself for fluent API.
1701        \post IsString() == true && GetString() == s && GetStringLength() == s.length
1702    */
1703    GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s); return *this; }
1704
1705    //! Set this value as a string by copying from source string.
1706    /*! This version has better performance with supplied length, and also support string containing null character.
1707        \param s source string. 
1708        \param length The length of source string, excluding the trailing null terminator.
1709        \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator().
1710        \return The value itself for fluent API.
1711        \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length
1712    */
1713    GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { this->~GenericValue(); SetStringRaw(StringRef(s, length), allocator); return *this; }
1714
1715    //! Set this value as a string by copying from source string.
1716    /*! \param s source string. 
1717        \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator().
1718        \return The value itself for fluent API.
1719        \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length
1720    */
1721    GenericValue& SetString(const Ch* s, Allocator& allocator) { return SetString(s, internal::StrLen(s), allocator); }
1722
1723#if RAPIDJSON_HAS_STDSTRING
1724    //! Set this value as a string by copying from source string.
1725    /*! \param s source string.
1726        \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator().
1727        \return The value itself for fluent API.
1728        \post IsString() == true && GetString() != s.data() && strcmp(GetString(),s.data() == 0 && GetStringLength() == s.size()
1729        \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING.
1730    */
1731    GenericValue& SetString(const std::basic_string<Ch>& s, Allocator& allocator) { return SetString(s.data(), SizeType(s.size()), allocator); }
1732#endif
1733
1734    //@}
1735
1736    //!@name Array
1737    //@{
1738
1739    //! Templated version for checking whether this value is type T.
1740    /*!
1741        \tparam T Either \c bool, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c float, \c const \c char*, \c std::basic_string<Ch>
1742    */
1743    template <typename T>
1744    bool Is() const { return internal::TypeHelper<ValueType, T>::Is(*this); }
1745
1746    template <typename T>
1747    T Get() const { return internal::TypeHelper<ValueType, T>::Get(*this); }
1748
1749    template <typename T>
1750    T Get() { return internal::TypeHelper<ValueType, T>::Get(*this); }
1751
1752    template<typename T>
1753    ValueType& Set(const T& data) { return internal::TypeHelper<ValueType, T>::Set(*this, data); }
1754
1755    template<typename T>
1756    ValueType& Set(const T& data, AllocatorType& allocator) { return internal::TypeHelper<ValueType, T>::Set(*this, data, allocator); }
1757
1758    //@}
1759
1760    //! Generate events of this value to a Handler.
1761    /*! This function adopts the GoF visitor pattern.
1762        Typical usage is to output this JSON value as JSON text via Writer, which is a Handler.
1763        It can also be used to deep clone this value via GenericDocument, which is also a Handler.
1764        \tparam Handler type of handler.
1765        \param handler An object implementing concept Handler.
1766    */
1767    template <typename Handler>
1768    bool Accept(Handler& handler) const {
1769        switch(GetType()) {
1770        case kNullType:     return handler.Null();
1771        case kFalseType:    return handler.Bool(false);
1772        case kTrueType:     return handler.Bool(true);
1773
1774        case kObjectType:
1775            if (RAPIDJSON_UNLIKELY(!handler.StartObject()))
1776                return false;
1777            for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) {
1778                RAPIDJSON_ASSERT(m->name.IsString()); // User may change the type of name by MemberIterator.
1779                if (RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0)))
1780                    return false;
1781                if (RAPIDJSON_UNLIKELY(!m->value.Accept(handler)))
1782                    return false;
1783            }
1784            return handler.EndObject(data_.o.size);
1785
1786        case kArrayType:
1787            if (RAPIDJSON_UNLIKELY(!handler.StartArray()))
1788                return false;
1789            for (const GenericValue* v = Begin(); v != End(); ++v)
1790                if (RAPIDJSON_UNLIKELY(!v->Accept(handler)))
1791                    return false;
1792            return handler.EndArray(data_.a.size);
1793    
1794        case kStringType:
1795            return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0);
1796    
1797        default:
1798            RAPIDJSON_ASSERT(GetType() == kNumberType);
1799            if (IsDouble())         return handler.Double(data_.n.d);
1800            else if (IsInt())       return handler.Int(data_.n.i.i);
1801            else if (IsUint())      return handler.Uint(data_.n.u.u);
1802            else if (IsInt64())     return handler.Int64(data_.n.i64);
1803            else                    return handler.Uint64(data_.n.u64);
1804        }
1805    }
1806
1807private:
1808    template <typename, typename> friend class GenericValue;
1809    template <typename, typename, typename> friend class GenericDocument;
1810
1811    enum {
1812        kBoolFlag       = 0x0008,
1813        kNumberFlag     = 0x0010,
1814        kIntFlag        = 0x0020,
1815        kUintFlag       = 0x0040,
1816        kInt64Flag      = 0x0080,
1817        kUint64Flag     = 0x0100,
1818        kDoubleFlag     = 0x0200,
1819        kStringFlag     = 0x0400,
1820        kCopyFlag       = 0x0800,
1821        kInlineStrFlag  = 0x1000,
1822
1823        // Initial flags of different types.
1824        kNullFlag = kNullType,
1825        kTrueFlag = kTrueType | kBoolFlag,
1826        kFalseFlag = kFalseType | kBoolFlag,
1827        kNumberIntFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag,
1828        kNumberUintFlag = kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag,
1829        kNumberInt64Flag = kNumberType | kNumberFlag | kInt64Flag,
1830        kNumberUint64Flag = kNumberType | kNumberFlag | kUint64Flag,
1831        kNumberDoubleFlag = kNumberType | kNumberFlag | kDoubleFlag,
1832        kNumberAnyFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag,
1833        kConstStringFlag = kStringType | kStringFlag,
1834        kCopyStringFlag = kStringType | kStringFlag | kCopyFlag,
1835        kShortStringFlag = kStringType | kStringFlag | kCopyFlag | kInlineStrFlag,
1836        kObjectFlag = kObjectType,
1837        kArrayFlag = kArrayType,
1838
1839        kTypeMask = 0x07
1840    };
1841
1842    static const SizeType kDefaultArrayCapacity = 16;
1843    static const SizeType kDefaultObjectCapacity = 16;
1844
1845    struct Flag {
1846#if RAPIDJSON_48BITPOINTER_OPTIMIZATION
1847        char payload[sizeof(SizeType) * 2 + 6];     // 2 x SizeType + lower 48-bit pointer
1848#elif RAPIDJSON_64BIT
1849        char payload[sizeof(SizeType) * 2 + sizeof(void*) + 6]; // 6 padding bytes
1850#else
1851        char payload[sizeof(SizeType) * 2 + sizeof(void*) + 2]; // 2 padding bytes
1852#endif
1853        uint16_t flags;
1854    };
1855
1856    struct String {
1857        SizeType length;
1858        SizeType hashcode;  //!< reserved
1859        const Ch* str;
1860    };  // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode
1861
1862    // implementation detail: ShortString can represent zero-terminated strings up to MaxSize chars
1863    // (excluding the terminating zero) and store a value to determine the length of the contained
1864    // string in the last character str[LenPos] by storing "MaxSize - length" there. If the string
1865    // to store has the maximal length of MaxSize then str[LenPos] will be 0 and therefore act as
1866    // the string terminator as well. For getting the string length back from that value just use
1867    // "MaxSize - str[LenPos]".
1868    // This allows to store 13-chars strings in 32-bit mode, 21-chars strings in 64-bit mode,
1869    // 13-chars strings for RAPIDJSON_48BITPOINTER_OPTIMIZATION=1 inline (for `UTF8`-encoded strings).
1870    struct ShortString {
1871        enum { MaxChars = sizeof(static_cast<Flag*>(0)->payload) / sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize };
1872        Ch str[MaxChars];
1873
1874        inline static bool Usable(SizeType len) { return                       (MaxSize >= len); }
1875        inline void     SetLength(SizeType len) { str[LenPos] = static_cast<Ch>(MaxSize -  len); }
1876        inline SizeType GetLength() const       { return  static_cast<SizeType>(MaxSize -  str[LenPos]); }
1877    };  // at most as many bytes as "String" above => 12 bytes in 32-bit mode, 16 bytes in 64-bit mode
1878
1879    // By using proper binary layout, retrieval of different integer types do not need conversions.
1880    union Number {
1881#if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN
1882        struct I {
1883            int i;
1884            char padding[4];
1885        }i;
1886        struct U {
1887            unsigned u;
1888            char padding2[4];
1889        }u;
1890#else
1891        struct I {
1892            char padding[4];
1893            int i;
1894        }i;
1895        struct U {
1896            char padding2[4];
1897            unsigned u;
1898        }u;
1899#endif
1900        int64_t i64;
1901        uint64_t u64;
1902        double d;
1903    };  // 8 bytes
1904
1905    struct ObjectData {
1906        SizeType size;
1907        SizeType capacity;
1908        Member* members;
1909    };  // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode
1910
1911    struct ArrayData {
1912        SizeType size;
1913        SizeType capacity;
1914        GenericValue* elements;
1915    };  // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode
1916
1917    union Data {
1918        String s;
1919        ShortString ss;
1920        Number n;
1921        ObjectData o;
1922        ArrayData a;
1923        Flag f;
1924    };  // 16 bytes in 32-bit mode, 24 bytes in 64-bit mode, 16 bytes in 64-bit with RAPIDJSON_48BITPOINTER_OPTIMIZATION
1925
1926    RAPIDJSON_FORCEINLINE const Ch* GetStringPointer() const { return RAPIDJSON_GETPOINTER(Ch, data_.s.str); }
1927    RAPIDJSON_FORCEINLINE const Ch* SetStringPointer(const Ch* str) { return RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); }
1928    RAPIDJSON_FORCEINLINE GenericValue* GetElementsPointer() const { return RAPIDJSON_GETPOINTER(GenericValue, data_.a.elements); }
1929    RAPIDJSON_FORCEINLINE GenericValue* SetElementsPointer(GenericValue* elements) { return RAPIDJSON_SETPOINTER(GenericValue, data_.a.elements, elements); }
1930    RAPIDJSON_FORCEINLINE Member* GetMembersPointer() const { return RAPIDJSON_GETPOINTER(Member, data_.o.members); }
1931    RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) { return RAPIDJSON_SETPOINTER(Member, data_.o.members, members); }
1932
1933    // Initialize this value as array with initial data, without calling destructor.
1934    void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) {
1935        data_.f.flags = kArrayFlag;
1936        if (count) {
1937            GenericValue* e = static_cast<GenericValue*>(allocator.Malloc(count * sizeof(GenericValue)));
1938            SetElementsPointer(e);
1939            std::memcpy(e, values, count * sizeof(GenericValue));
1940        }
1941        else
1942            SetElementsPointer(0);
1943        data_.a.size = data_.a.capacity = count;
1944    }
1945
1946    //! Initialize this value as object with initial data, without calling destructor.
1947    void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) {
1948        data_.f.flags = kObjectFlag;
1949        if (count) {
1950            Member* m = static_cast<Member*>(allocator.Malloc(count * sizeof(Member)));
1951            SetMembersPointer(m);
1952            std::memcpy(m, members, count * sizeof(Member));
1953        }
1954        else
1955            SetMembersPointer(0);
1956        data_.o.size = data_.o.capacity = count;
1957    }
1958
1959    //! Initialize this value as constant string, without calling destructor.
1960    void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT {
1961        data_.f.flags = kConstStringFlag;
1962        SetStringPointer(s);
1963        data_.s.length = s.length;
1964    }
1965
1966    //! Initialize this value as copy string with initial data, without calling destructor.
1967    void SetStringRaw(StringRefType s, Allocator& allocator) {
1968        Ch* str = 0;
1969        if (ShortString::Usable(s.length)) {
1970            data_.f.flags = kShortStringFlag;
1971            data_.ss.SetLength(s.length);
1972            str = data_.ss.str;
1973        } else {
1974            data_.f.flags = kCopyStringFlag;
1975            data_.s.length = s.length;
1976            str = static_cast<Ch *>(allocator.Malloc((s.length + 1) * sizeof(Ch)));
1977            SetStringPointer(str);
1978        }
1979        std::memcpy(str, s, s.length * sizeof(Ch));
1980        str[s.length] = '\0';
1981    }
1982
1983    //! Assignment without calling destructor
1984    void RawAssign(GenericValue& rhs) RAPIDJSON_NOEXCEPT {
1985        data_ = rhs.data_;
1986        // data_.f.flags = rhs.data_.f.flags;
1987        rhs.data_.f.flags = kNullFlag;
1988    }
1989
1990    template <typename SourceAllocator>
1991    bool StringEqual(const GenericValue<Encoding, SourceAllocator>& rhs) const {
1992        RAPIDJSON_ASSERT(IsString());
1993        RAPIDJSON_ASSERT(rhs.IsString());
1994
1995        const SizeType len1 = GetStringLength();
1996        const SizeType len2 = rhs.GetStringLength();
1997        if(len1 != len2) { return false; }
1998
1999        const Ch* const str1 = GetString();
2000        const Ch* const str2 = rhs.GetString();
2001        if(str1 == str2) { return true; } // fast path for constant string
2002
2003        return (std::memcmp(str1, str2, sizeof(Ch) * len1) == 0);
2004    }
2005
2006    Data data_;
2007};
2008
2009//! GenericValue with UTF8 encoding
2010typedef GenericValue<UTF8<> > Value;
2011
2012///////////////////////////////////////////////////////////////////////////////
2013// GenericDocument 
2014
2015//! A document for parsing JSON text as DOM.
2016/*!
2017    \note implements Handler concept
2018    \tparam Encoding Encoding for both parsing and string storage.
2019    \tparam Allocator Allocator for allocating memory for the DOM
2020    \tparam StackAllocator Allocator for allocating memory for stack during parsing.
2021    \warning Although GenericDocument inherits from GenericValue, the API does \b not provide any virtual functions, especially no virtual destructor.  To avoid memory leaks, do not \c delete a GenericDocument object via a pointer to a GenericValue.
2022*/
2023template <typename Encoding, typename Allocator = MemoryPoolAllocator<>, typename StackAllocator = CrtAllocator>
2024class GenericDocument : public GenericValue<Encoding, Allocator> {
2025public:
2026    typedef typename Encoding::Ch Ch;                       //!< Character type derived from Encoding.
2027    typedef GenericValue<Encoding, Allocator> ValueType;    //!< Value type of the document.
2028    typedef Allocator AllocatorType;                        //!< Allocator type from template parameter.
2029
2030    //! Constructor
2031    /*! Creates an empty document of specified type.
2032        \param type             Mandatory type of object to create.
2033        \param allocator        Optional allocator for allocating memory.
2034        \param stackCapacity    Optional initial capacity of stack in bytes.
2035        \param stackAllocator   Optional allocator for allocating memory for stack.
2036    */
2037    explicit GenericDocument(Type type, Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) :
2038        GenericValue<Encoding, Allocator>(type),  allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()
2039    {
2040        if (!allocator_)
2041            ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator());
2042    }
2043
2044    //! Constructor
2045    /*! Creates an empty document which type is Null. 
2046        \param allocator        Optional allocator for allocating memory.
2047        \param stackCapacity    Optional initial capacity of stack in bytes.
2048        \param stackAllocator   Optional allocator for allocating memory for stack.
2049    */
2050    GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : 
2051        allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()
2052    {
2053        if (!allocator_)
2054            ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator());
2055    }
2056
2057#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2058    //! Move constructor in C++11
2059    GenericDocument(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT
2060        : ValueType(std::forward<ValueType>(rhs)), // explicit cast to avoid prohibited move from Document
2061          allocator_(rhs.allocator_),
2062          ownAllocator_(rhs.ownAllocator_),
2063          stack_(std::move(rhs.stack_)),
2064          parseResult_(rhs.parseResult_)
2065    {
2066        rhs.allocator_ = 0;
2067        rhs.ownAllocator_ = 0;
2068        rhs.parseResult_ = ParseResult();
2069    }
2070#endif
2071
2072    ~GenericDocument() {
2073        Destroy();
2074    }
2075
2076#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2077    //! Move assignment in C++11
2078    GenericDocument& operator=(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT
2079    {
2080        // The cast to ValueType is necessary here, because otherwise it would
2081        // attempt to call GenericValue's templated assignment operator.
2082        ValueType::operator=(std::forward<ValueType>(rhs));
2083
2084        // Calling the destructor here would prematurely call stack_'s destructor
2085        Destroy();
2086
2087        allocator_ = rhs.allocator_;
2088        ownAllocator_ = rhs.ownAllocator_;
2089        stack_ = std::move(rhs.stack_);
2090        parseResult_ = rhs.parseResult_;
2091
2092        rhs.allocator_ = 0;
2093        rhs.ownAllocator_ = 0;
2094        rhs.parseResult_ = ParseResult();
2095
2096        return *this;
2097    }
2098#endif
2099
2100    //! Exchange the contents of this document with those of another.
2101    /*!
2102        \param rhs Another document.
2103        \note Constant complexity.
2104        \see GenericValue::Swap
2105    */
2106    GenericDocument& Swap(GenericDocument& rhs) RAPIDJSON_NOEXCEPT {
2107        ValueType::Swap(rhs);
2108        stack_.Swap(rhs.stack_);
2109        internal::Swap(allocator_, rhs.allocator_);
2110        internal::Swap(ownAllocator_, rhs.ownAllocator_);
2111        internal::Swap(parseResult_, rhs.parseResult_);
2112        return *this;
2113    }
2114
2115    //! free-standing swap function helper
2116    /*!
2117        Helper function to enable support for common swap implementation pattern based on \c std::swap:
2118        \code
2119        void swap(MyClass& a, MyClass& b) {
2120            using std::swap;
2121            swap(a.doc, b.doc);
2122            // ...
2123        }
2124        \endcode
2125        \see Swap()
2126     */
2127    friend inline void swap(GenericDocument& a, GenericDocument& b) RAPIDJSON_NOEXCEPT { a.Swap(b); }
2128
2129    //! Populate this document by a generator which produces SAX events.
2130    /*! \tparam Generator A functor with <tt>bool f(Handler)</tt> prototype.
2131        \param g Generator functor which sends SAX events to the parameter.
2132        \return The document itself for fluent API.
2133    */
2134    template <typename Generator>
2135    GenericDocument& Populate(Generator& g) {
2136        ClearStackOnExit scope(*this);
2137        if (g(*this)) {
2138            RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object
2139            ValueType::operator=(*stack_.template Pop<ValueType>(1));// Move value from stack to document
2140        }
2141        return *this;
2142    }
2143
2144    //!@name Parse from stream
2145    //!@{
2146
2147    //! Parse JSON text from an input stream (with Encoding conversion)
2148    /*! \tparam parseFlags Combination of \ref ParseFlag.
2149        \tparam SourceEncoding Encoding of input stream
2150        \tparam InputStream Type of input stream, implementing Stream concept
2151        \param is Input stream to be parsed.
2152        \return The document itself for fluent API.
2153    */
2154    template <unsigned parseFlags, typename SourceEncoding, typename InputStream>
2155    GenericDocument& ParseStream(InputStream& is) {
2156        GenericReader<SourceEncoding, Encoding, StackAllocator> reader(
2157            stack_.HasAllocator() ? &stack_.GetAllocator() : 0);
2158        ClearStackOnExit scope(*this);
2159        parseResult_ = reader.template Parse<parseFlags>(is, *this);
2160        if (parseResult_) {
2161            RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object
2162            ValueType::operator=(*stack_.template Pop<ValueType>(1));// Move value from stack to document
2163        }
2164        return *this;
2165    }
2166
2167    //! Parse JSON text from an input stream
2168    /*! \tparam parseFlags Combination of \ref ParseFlag.
2169        \tparam InputStream Type of input stream, implementing Stream concept
2170        \param is Input stream to be parsed.
2171        \return The document itself for fluent API.
2172    */
2173    template <unsigned parseFlags, typename InputStream>
2174    GenericDocument& ParseStream(InputStream& is) {
2175        return ParseStream<parseFlags, Encoding, InputStream>(is);
2176    }
2177
2178    //! Parse JSON text from an input stream (with \ref kParseDefaultFlags)
2179    /*! \tparam InputStream Type of input stream, implementing Stream concept
2180        \param is Input stream to be parsed.
2181        \return The document itself for fluent API.
2182    */
2183    template <typename InputStream>
2184    GenericDocument& ParseStream(InputStream& is) {
2185        return ParseStream<kParseDefaultFlags, Encoding, InputStream>(is);
2186    }
2187    //!@}
2188
2189    //!@name Parse in-place from mutable string
2190    //!@{
2191
2192    //! Parse JSON text from a mutable string
2193    /*! \tparam parseFlags Combination of \ref ParseFlag.
2194        \param str Mutable zero-terminated string to be parsed.
2195        \return The document itself for fluent API.
2196    */
2197    template <unsigned parseFlags>
2198    GenericDocument& ParseInsitu(Ch* str) {
2199        GenericInsituStringStream<Encoding> s(str);
2200        return ParseStream<parseFlags | kParseInsituFlag>(s);
2201    }
2202
2203    //! Parse JSON text from a mutable string (with \ref kParseDefaultFlags)
2204    /*! \param str Mutable zero-terminated string to be parsed.
2205        \return The document itself for fluent API.
2206    */
2207    GenericDocument& ParseInsitu(Ch* str) {
2208        return ParseInsitu<kParseDefaultFlags>(str);
2209    }
2210    //!@}
2211
2212    //!@name Parse from read-only string
2213    //!@{
2214
2215    //! Parse JSON text from a read-only string (with Encoding conversion)
2216    /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag).
2217        \tparam SourceEncoding Transcoding from input Encoding
2218        \param str Read-only zero-terminated string to be parsed.
2219    */
2220    template <unsigned parseFlags, typename SourceEncoding>
2221    GenericDocument& Parse(const typename SourceEncoding::Ch* str) {
2222        RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag));
2223        GenericStringStream<SourceEncoding> s(str);
2224        return ParseStream<parseFlags, SourceEncoding>(s);
2225    }
2226
2227    //! Parse JSON text from a read-only string
2228    /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag).
2229        \param str Read-only zero-terminated string to be parsed.
2230    */
2231    template <unsigned parseFlags>
2232    GenericDocument& Parse(const Ch* str) {
2233        return Parse<parseFlags, Encoding>(str);
2234    }
2235
2236    //! Parse JSON text from a read-only string (with \ref kParseDefaultFlags)
2237    /*! \param str Read-only zero-terminated string to be parsed.
2238    */
2239    GenericDocument& Parse(const Ch* str) {
2240        return Parse<kParseDefaultFlags>(str);
2241    }
2242
2243    template <unsigned parseFlags, typename SourceEncoding>
2244    GenericDocument& Parse(const typename SourceEncoding::Ch* str, size_t length) {
2245        RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag));
2246        MemoryStream ms(static_cast<const char*>(str), length * sizeof(typename SourceEncoding::Ch));
2247        EncodedInputStream<SourceEncoding, MemoryStream> is(ms);
2248        ParseStream<parseFlags, SourceEncoding>(is);
2249        return *this;
2250    }
2251
2252    template <unsigned parseFlags>
2253    GenericDocument& Parse(const Ch* str, size_t length) {
2254        return Parse<parseFlags, Encoding>(str, length);
2255    }
2256    
2257    GenericDocument& Parse(const Ch* str, size_t length) {
2258        return Parse<kParseDefaultFlags>(str, length);
2259    }
2260
2261#if RAPIDJSON_HAS_STDSTRING
2262    template <unsigned parseFlags, typename SourceEncoding>
2263    GenericDocument& Parse(const std::basic_string<typename SourceEncoding::Ch>& str) {
2264        // c_str() is constant complexity according to standard. Should be faster than Parse(const char*, size_t)
2265        return Parse<parseFlags, SourceEncoding>(str.c_str());
2266    }
2267
2268    template <unsigned parseFlags>
2269    GenericDocument& Parse(const std::basic_string<Ch>& str) {
2270        return Parse<parseFlags, Encoding>(str.c_str());
2271    }
2272
2273    GenericDocument& Parse(const std::basic_string<Ch>& str) {
2274        return Parse<kParseDefaultFlags>(str);
2275    }
2276#endif // RAPIDJSON_HAS_STDSTRING    
2277
2278    //!@}
2279
2280    //!@name Handling parse errors
2281    //!@{
2282
2283    //! Whether a parse error has occured in the last parsing.
2284    bool HasParseError() const { return parseResult_.IsError(); }
2285
2286    //! Get the \ref ParseErrorCode of last parsing.
2287    ParseErrorCode GetParseError() const { return parseResult_.Code(); }
2288
2289    //! Get the position of last parsing error in input, 0 otherwise.
2290    size_t GetErrorOffset() const { return parseResult_.Offset(); }
2291
2292    //! Implicit conversion to get the last parse result
2293#ifndef __clang // -Wdocumentation
2294    /*! \return \ref ParseResult of the last parse operation
2295
2296        \code
2297          Document doc;
2298          ParseResult ok = doc.Parse(json);
2299          if (!ok)
2300            printf( "JSON parse error: %s (%u)\n", GetParseError_En(ok.Code()), ok.Offset());
2301        \endcode
2302     */
2303#endif
2304    operator ParseResult() const { return parseResult_; }
2305    //!@}
2306
2307    //! Get the allocator of this document.
2308    Allocator& GetAllocator() {
2309        RAPIDJSON_ASSERT(allocator_);
2310        return *allocator_;
2311    }
2312
2313    //! Get the capacity of stack in bytes.
2314    size_t GetStackCapacity() const { return stack_.GetCapacity(); }
2315
2316private:
2317    // clear stack on any exit from ParseStream, e.g. due to exception
2318    struct ClearStackOnExit {
2319        explicit ClearStackOnExit(GenericDocument& d) : d_(d) {}
2320        ~ClearStackOnExit() { d_.ClearStack(); }
2321    private:
2322        ClearStackOnExit(const ClearStackOnExit&);
2323        ClearStackOnExit& operator=(const ClearStackOnExit&);
2324        GenericDocument& d_;
2325    };
2326
2327    // callers of the following private Handler functions
2328    // template <typename,typename,typename> friend class GenericReader; // for parsing
2329    template <typename, typename> friend class GenericValue; // for deep copying
2330
2331public:
2332    // Implementation of Handler
2333    bool Null() { new (stack_.template Push<ValueType>()) ValueType(); return true; }
2334    bool Bool(bool b) { new (stack_.template Push<ValueType>()) ValueType(b); return true; }
2335    bool Int(int i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
2336    bool Uint(unsigned i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
2337    bool Int64(int64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
2338    bool Uint64(uint64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
2339    bool Double(double d) { new (stack_.template Push<ValueType>()) ValueType(d); return true; }
2340
2341    bool RawNumber(const Ch* str, SizeType length, bool copy) { 
2342        if (copy) 
2343            new (stack_.template Push<ValueType>()) ValueType(str, length, GetAllocator());
2344        else
2345            new (stack_.template Push<ValueType>()) ValueType(str, length);
2346        return true;
2347    }
2348
2349    bool String(const Ch* str, SizeType length, bool copy) { 
2350        if (copy) 
2351            new (stack_.template Push<ValueType>()) ValueType(str, length, GetAllocator());
2352        else
2353            new (stack_.template Push<ValueType>()) ValueType(str, length);
2354        return true;
2355    }
2356
2357    bool StartObject() { new (stack_.template Push<ValueType>()) ValueType(kObjectType); return true; }
2358    
2359    bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); }
2360
2361    bool EndObject(SizeType memberCount) {
2362        typename ValueType::Member* members = stack_.template Pop<typename ValueType::Member>(memberCount);
2363        stack_.template Top<ValueType>()->SetObjectRaw(members, memberCount, GetAllocator());
2364        return true;
2365    }
2366
2367    bool StartArray() { new (stack_.template Push<ValueType>()) ValueType(kArrayType); return true; }
2368    
2369    bool EndArray(SizeType elementCount) {
2370        ValueType* elements = stack_.template Pop<ValueType>(elementCount);
2371        stack_.template Top<ValueType>()->SetArrayRaw(elements, elementCount, GetAllocator());
2372        return true;
2373    }
2374
2375private:
2376    //! Prohibit copying
2377    GenericDocument(const GenericDocument&);
2378    //! Prohibit assignment
2379    GenericDocument& operator=(const GenericDocument&);
2380
2381    void ClearStack() {
2382        if (Allocator::kNeedFree)
2383            while (stack_.GetSize() > 0)    // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects)
2384                (stack_.template Pop<ValueType>(1))->~ValueType();
2385        else
2386            stack_.Clear();
2387        stack_.ShrinkToFit();
2388    }
2389
2390    void Destroy() {
2391        RAPIDJSON_DELETE(ownAllocator_);
2392    }
2393
2394    static const size_t kDefaultStackCapacity = 1024;
2395    Allocator* allocator_;
2396    Allocator* ownAllocator_;
2397    internal::Stack<StackAllocator> stack_;
2398    ParseResult parseResult_;
2399};
2400
2401//! GenericDocument with UTF8 encoding
2402typedef GenericDocument<UTF8<> > Document;
2403
2404// defined here due to the dependency on GenericDocument
2405template <typename Encoding, typename Allocator>
2406template <typename SourceAllocator>
2407inline
2408GenericValue<Encoding,Allocator>::GenericValue(const GenericValue<Encoding,SourceAllocator>& rhs, Allocator& allocator)
2409{
2410    switch (rhs.GetType()) {
2411    case kObjectType:
2412    case kArrayType: { // perform deep copy via SAX Handler
2413            GenericDocument<Encoding,Allocator> d(&allocator);
2414            rhs.Accept(d);
2415            RawAssign(*d.stack_.template Pop<GenericValue>(1));
2416        }
2417        break;
2418    case kStringType:
2419        if (rhs.data_.f.flags == kConstStringFlag) {
2420            data_.f.flags = rhs.data_.f.flags;
2421            data_  = *reinterpret_cast<const Data*>(&rhs.data_);
2422        } else {
2423            SetStringRaw(StringRef(rhs.GetString(), rhs.GetStringLength()), allocator);
2424        }
2425        break;
2426    default:
2427        data_.f.flags = rhs.data_.f.flags;
2428        data_  = *reinterpret_cast<const Data*>(&rhs.data_);
2429        break;
2430    }
2431}
2432
2433//! Helper class for accessing Value of array type.
2434/*!
2435    Instance of this helper class is obtained by \c GenericValue::GetArray().
2436    In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1.
2437*/
2438template <bool Const, typename ValueT>
2439class GenericArray {
2440public:
2441    typedef GenericArray<true, ValueT> ConstArray;
2442    typedef GenericArray<false, ValueT> Array;
2443    typedef ValueT PlainType;
2444    typedef typename internal::MaybeAddConst<Const,PlainType>::Type ValueType;
2445    typedef ValueType* ValueIterator;  // This may be const or non-const iterator
2446    typedef const ValueT* ConstValueIterator;
2447    typedef typename ValueType::AllocatorType AllocatorType;
2448    typedef typename ValueType::StringRefType StringRefType;
2449
2450    template <typename, typename>
2451    friend class GenericValue;
2452
2453    GenericArray(const GenericArray& rhs) : value_(rhs.value_) {}
2454    GenericArray& operator=(const GenericArray& rhs) { value_ = rhs.value_; return *this; }
2455    ~GenericArray() {}
2456
2457    SizeType Size() const { return value_.Size(); }
2458    SizeType Capacity() const { return value_.Capacity(); }
2459    bool Empty() const { return value_.Empty(); }
2460    void Clear() const { value_.Clear(); }
2461    ValueType& operator[](SizeType index) const {  return value_[index]; }
2462    ValueIterator Begin() const { return value_.Begin(); }
2463    ValueIterator End() const { return value_.End(); }
2464    GenericArray Reserve(SizeType newCapacity, AllocatorType &allocator) const { value_.Reserve(newCapacity, allocator); return *this; }
2465    GenericArray PushBack(ValueType& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; }
2466#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2467    GenericArray PushBack(ValueType&& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; }
2468#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
2469    GenericArray PushBack(StringRefType value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; }
2470    template <typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (const GenericArray&)) PushBack(T value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; }
2471    GenericArray PopBack() const { value_.PopBack(); return *this; }
2472    ValueIterator Erase(ConstValueIterator pos) const { return value_.Erase(pos); }
2473    ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) const { return value_.Erase(first, last); }
2474
2475#if RAPIDJSON_HAS_CXX11_RANGE_FOR
2476    ValueIterator begin() const { return value_.Begin(); }
2477    ValueIterator end() const { return value_.End(); }
2478#endif
2479
2480private:
2481    GenericArray();
2482    GenericArray(ValueType& value) : value_(value) {}
2483    ValueType& value_;
2484};
2485
2486//! Helper class for accessing Value of object type.
2487/*!
2488    Instance of this helper class is obtained by \c GenericValue::GetObject().
2489    In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1.
2490*/
2491template <bool Const, typename ValueT>
2492class GenericObject {
2493public:
2494    typedef GenericObject<true, ValueT> ConstObject;
2495    typedef GenericObject<false, ValueT> Object;
2496    typedef ValueT PlainType;
2497    typedef typename internal::MaybeAddConst<Const,PlainType>::Type ValueType;
2498    typedef GenericMemberIterator<Const, typename ValueT::EncodingType, typename ValueT::AllocatorType> MemberIterator;  // This may be const or non-const iterator
2499    typedef GenericMemberIterator<true, typename ValueT::EncodingType, typename ValueT::AllocatorType> ConstMemberIterator;
2500    typedef typename ValueType::AllocatorType AllocatorType;
2501    typedef typename ValueType::StringRefType StringRefType;
2502    typedef typename ValueType::EncodingType EncodingType;
2503    typedef typename ValueType::Ch Ch;
2504
2505    template <typename, typename>
2506    friend class GenericValue;
2507
2508    GenericObject(const GenericObject& rhs) : value_(rhs.value_) {}
2509    GenericObject& operator=(const GenericObject& rhs) { value_ = rhs.value_; return *this; }
2510    ~GenericObject() {}
2511
2512    SizeType MemberCount() const { return value_.MemberCount(); }
2513    bool ObjectEmpty() const { return value_.ObjectEmpty(); }
2514    template <typename T> ValueType& operator[](T* name) const { return value_[name]; }
2515    template <typename SourceAllocator> ValueType& operator[](const GenericValue<EncodingType, SourceAllocator>& name) const { return value_[name]; }
2516#if RAPIDJSON_HAS_STDSTRING
2517    ValueType& operator[](const std::basic_string<Ch>& name) const { return value_[name]; }
2518#endif
2519    MemberIterator MemberBegin() const { return value_.MemberBegin(); }
2520    MemberIterator MemberEnd() const { return value_.MemberEnd(); }
2521    bool HasMember(const Ch* name) const { return value_.HasMember(name); }
2522#if RAPIDJSON_HAS_STDSTRING
2523    bool HasMember(const std::basic_string<Ch>& name) const { return value_.HasMember(name); }
2524#endif
2525    template <typename SourceAllocator> bool HasMember(const GenericValue<EncodingType, SourceAllocator>& name) const { return value_.HasMember(name); }
2526    MemberIterator FindMember(const Ch* name) const { return value_.FindMember(name); }
2527    template <typename SourceAllocator> MemberIterator FindMember(const GenericValue<EncodingType, SourceAllocator>& name) const { return value_.FindMember(name); }
2528#if RAPIDJSON_HAS_STDSTRING
2529    MemberIterator FindMember(const std::basic_string<Ch>& name) const { return value_.FindMember(name); }
2530#endif
2531    GenericObject AddMember(ValueType& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2532    GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2533#if RAPIDJSON_HAS_STDSTRING
2534    GenericObject AddMember(ValueType& name, std::basic_string<Ch>& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2535#endif
2536    template <typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&)) AddMember(ValueType& name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2537#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2538    GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2539    GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2540    GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2541    GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2542#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
2543    GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2544    GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2545    template <typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2546    void RemoveAllMembers() { return value_.RemoveAllMembers(); }
2547    bool RemoveMember(const Ch* name) const { return value_.RemoveMember(name); }
2548#if RAPIDJSON_HAS_STDSTRING
2549    bool RemoveMember(const std::basic_string<Ch>& name) const { return value_.RemoveMember(name); }
2550#endif
2551    template <typename SourceAllocator> bool RemoveMember(const GenericValue<EncodingType, SourceAllocator>& name) const { return value_.RemoveMember(name); }
2552    MemberIterator RemoveMember(MemberIterator m) const { return value_.RemoveMember(m); }
2553    MemberIterator EraseMember(ConstMemberIterator pos) const { return value_.EraseMember(pos); }
2554    MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) const { return value_.EraseMember(first, last); }
2555    bool EraseMember(const Ch* name) const { return value_.EraseMember(name); }
2556#if RAPIDJSON_HAS_STDSTRING
2557    bool EraseMember(const std::basic_string<Ch>& name) const { return EraseMember(ValueType(StringRef(name))); }
2558#endif
2559    template <typename SourceAllocator> bool EraseMember(const GenericValue<EncodingType, SourceAllocator>& name) const { return value_.EraseMember(name); }
2560
2561#if RAPIDJSON_HAS_CXX11_RANGE_FOR
2562    MemberIterator begin() const { return value_.MemberBegin(); }
2563    MemberIterator end() const { return value_.MemberEnd(); }
2564#endif
2565
2566private:
2567    GenericObject();
2568    GenericObject(ValueType& value) : value_(value) {}
2569    ValueType& value_;
2570};
2571
2572RAPIDJSON_NAMESPACE_END
2573RAPIDJSON_DIAG_POP
2574
2575#endif // RAPIDJSON_DOCUMENT_H_