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