15 #ifndef RAPIDJSON_DOCUMENT_H_
16 #define RAPIDJSON_DOCUMENT_H_
21 #include "internal/meta.h"
22 #include "internal/strfunc.h"
23 #include "memorystream.h"
24 #include "encodedstream.h"
30 RAPIDJSON_DIAG_OFF(padded)
31 RAPIDJSON_DIAG_OFF(
switch-
enum)
32 RAPIDJSON_DIAG_OFF(c++98-compat)
33 #elif defined(_MSC_VER)
34 RAPIDJSON_DIAG_OFF(4127)
35 RAPIDJSON_DIAG_OFF(4244)
39 RAPIDJSON_DIAG_OFF(effc++)
42 #ifndef RAPIDJSON_NOMEMBERITERATORCLASS
46 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
50 RAPIDJSON_NAMESPACE_BEGIN
53 template <
typename Encoding,
typename Allocator>
56 template <
typename Encoding,
typename Allocator,
typename StackAllocator>
65 template <
typename Encoding,
typename Allocator>
71 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
74 : name(std::move(rhs.name)),
75 value(std::move(rhs.value))
81 return *
this = static_cast<GenericMember&>(rhs);
99 a.value.Swap(b.value);
104 GenericMember(
const GenericMember& rhs);
110 #ifndef RAPIDJSON_NOMEMBERITERATORCLASS
131 template <
bool Const,
typename Encoding,
typename Allocator>
150 typedef ValueType value_type;
151 typedef ValueType * pointer;
152 typedef ValueType & reference;
153 typedef std::ptrdiff_t difference_type;
154 typedef std::random_access_iterator_tag iterator_category;
187 Iterator& operator=(
const NonConstIterator & it) { ptr_ = it.ptr_;
return *
this; }
191 Iterator& operator++(){ ++ptr_;
return *
this; }
192 Iterator& operator--(){ --ptr_;
return *
this; }
193 Iterator operator++(
int){ Iterator old(*
this); ++ptr_;
return old; }
194 Iterator operator--(
int){ Iterator old(*
this); --ptr_;
return old; }
199 Iterator operator+(DifferenceType n)
const {
return Iterator(ptr_+n); }
200 Iterator operator-(DifferenceType n)
const {
return Iterator(ptr_-n); }
202 Iterator& operator+=(DifferenceType n) { ptr_+=n;
return *
this; }
203 Iterator& operator-=(DifferenceType n) { ptr_-=n;
return *
this; }
208 bool operator==(ConstIterator that)
const {
return ptr_ == that.ptr_; }
209 bool operator!=(ConstIterator that)
const {
return ptr_ != that.ptr_; }
210 bool operator<=(ConstIterator that)
const {
return ptr_ <= that.ptr_; }
211 bool operator>=(ConstIterator that)
const {
return ptr_ >= that.ptr_; }
212 bool operator< (ConstIterator that)
const {
return ptr_ < that.ptr_; }
213 bool operator> (ConstIterator that)
const {
return ptr_ > that.ptr_; }
218 Reference operator*()
const {
return *ptr_; }
219 Pointer operator->()
const {
return ptr_; }
220 Reference operator[](DifferenceType n)
const {
return ptr_[n]; }
233 #else // RAPIDJSON_NOMEMBERITERATORCLASS
237 template <
bool Const,
typename Encoding,
typename Allocator>
238 class GenericMemberIterator;
241 template <
typename Encoding,
typename Allocator>
244 typedef GenericMember<Encoding,Allocator>* Iterator;
247 template <
typename Encoding,
typename Allocator>
250 typedef const GenericMember<Encoding,Allocator>* Iterator;
253 #endif // RAPIDJSON_NOMEMBERITERATORCLASS
285 template<
typename CharType>
290 #ifndef __clang__ // -Wdocumentation
316 : s(str), length(N-1) {}
319 #ifndef __clang__ // -Wdocumentation
340 : s(str), length(NotNullStrLen(str)) {}
343 #ifndef __clang__ // -Wdocumentation
357 operator const Ch *()
const {
return s; }
363 SizeType NotNullStrLen(
const CharType* str) {
365 return internal::StrLen(str);
369 static const Ch emptyString[];
378 template<
typename CharType>
379 const CharType GenericStringRef<CharType>::emptyString[] = { CharType() };
393 template<
typename CharType>
413 template<
typename CharType>
418 #if RAPIDJSON_HAS_STDSTRING
431 template<
typename CharType>
441 template <
typename T,
typename Encoding =
void,
typename Allocator =
void>
442 struct IsGenericValueImpl : FalseType {};
445 template <
typename T>
struct IsGenericValueImpl<T, typename Void<typename T::EncodingType>
::Type, typename Void<typename T::AllocatorType>
::Type>
446 : IsBaseOf<GenericValue<typename T::EncodingType, typename T::AllocatorType>, T>
::Type {};
449 template <
typename T>
struct IsGenericValue : IsGenericValueImpl<T>
::Type {};
458 template <
typename ValueType,
typename T>
459 struct TypeHelper {};
461 template<
typename ValueType>
462 struct TypeHelper<ValueType, bool> {
463 static bool Is(
const ValueType& v) {
return v.IsBool(); }
464 static bool Get(
const ValueType& v) {
return v.GetBool(); }
465 static ValueType& Set(ValueType& v,
bool data) {
return v.SetBool(data); }
466 static ValueType& Set(ValueType& v,
bool data,
typename ValueType::AllocatorType&) {
return v.SetBool(data); }
469 template<
typename ValueType>
470 struct TypeHelper<ValueType, int> {
471 static bool Is(
const ValueType& v) {
return v.IsInt(); }
472 static int Get(
const ValueType& v) {
return v.GetInt(); }
473 static ValueType& Set(ValueType& v,
int data) {
return v.SetInt(data); }
474 static ValueType& Set(ValueType& v,
int data,
typename ValueType::AllocatorType&) {
return v.SetInt(data); }
477 template<
typename ValueType>
478 struct TypeHelper<ValueType, unsigned> {
479 static bool Is(
const ValueType& v) {
return v.IsUint(); }
480 static unsigned Get(
const ValueType& v) {
return v.GetUint(); }
481 static ValueType& Set(ValueType& v,
unsigned data) {
return v.SetUint(data); }
482 static ValueType& Set(ValueType& v,
unsigned data,
typename ValueType::AllocatorType&) {
return v.SetUint(data); }
487 template<
typename ValueType>
488 struct TypeHelper<ValueType, long> {
489 static bool Is(
const ValueType& v) {
return v.IsInt(); }
490 static long Get(
const ValueType& v) {
return v.GetInt(); }
491 static ValueType& Set(ValueType& v,
long data) {
return v.SetInt(data); }
492 static ValueType& Set(ValueType& v,
long data,
typename ValueType::AllocatorType&) {
return v.SetInt(data); }
496 template<
typename ValueType>
497 struct TypeHelper<ValueType, unsigned long> {
498 static bool Is(
const ValueType& v) {
return v.IsUint(); }
499 static unsigned long Get(
const ValueType& v) {
return v.GetUint(); }
500 static ValueType& Set(ValueType& v,
unsigned long data) {
return v.SetUint(data); }
501 static ValueType& Set(ValueType& v,
unsigned long data,
typename ValueType::AllocatorType&) {
return v.SetUint(data); }
505 template<
typename ValueType>
506 struct TypeHelper<ValueType, int64_t> {
507 static bool Is(
const ValueType& v) {
return v.IsInt64(); }
508 static int64_t Get(
const ValueType& v) {
return v.GetInt64(); }
509 static ValueType& Set(ValueType& v, int64_t data) {
return v.SetInt64(data); }
510 static ValueType& Set(ValueType& v, int64_t data,
typename ValueType::AllocatorType&) {
return v.SetInt64(data); }
513 template<
typename ValueType>
514 struct TypeHelper<ValueType, uint64_t> {
515 static bool Is(
const ValueType& v) {
return v.IsUint64(); }
516 static uint64_t Get(
const ValueType& v) {
return v.GetUint64(); }
517 static ValueType& Set(ValueType& v, uint64_t data) {
return v.SetUint64(data); }
518 static ValueType& Set(ValueType& v, uint64_t data,
typename ValueType::AllocatorType&) {
return v.SetUint64(data); }
521 template<
typename ValueType>
522 struct TypeHelper<ValueType, double> {
523 static bool Is(
const ValueType& v) {
return v.IsDouble(); }
524 static double Get(
const ValueType& v) {
return v.GetDouble(); }
525 static ValueType& Set(ValueType& v,
double data) {
return v.SetDouble(data); }
526 static ValueType& Set(ValueType& v,
double data,
typename ValueType::AllocatorType&) {
return v.SetDouble(data); }
529 template<
typename ValueType>
530 struct TypeHelper<ValueType, float> {
531 static bool Is(
const ValueType& v) {
return v.IsFloat(); }
532 static float Get(
const ValueType& v) {
return v.GetFloat(); }
533 static ValueType& Set(ValueType& v,
float data) {
return v.SetFloat(data); }
534 static ValueType& Set(ValueType& v,
float data,
typename ValueType::AllocatorType&) {
return v.SetFloat(data); }
537 template<
typename ValueType>
538 struct TypeHelper<ValueType, const typename ValueType::Ch*> {
539 typedef const typename ValueType::Ch* StringType;
540 static bool Is(
const ValueType& v) {
return v.IsString(); }
541 static StringType Get(
const ValueType& v) {
return v.GetString(); }
542 static ValueType& Set(ValueType& v,
const StringType data) {
return v.SetString(
typename ValueType::StringRefType(data)); }
543 static ValueType& Set(ValueType& v,
const StringType data,
typename ValueType::AllocatorType& a) {
return v.SetString(data, a); }
546 #if RAPIDJSON_HAS_STDSTRING
547 template<
typename ValueType>
548 struct TypeHelper<ValueType, std::basic_string<typename ValueType::Ch> > {
549 typedef std::basic_string<typename ValueType::Ch> StringType;
550 static bool Is(
const ValueType& v) {
return v.IsString(); }
551 static StringType Get(
const ValueType& v) {
return StringType(v.GetString(), v.GetStringLength()); }
552 static ValueType& Set(ValueType& v,
const StringType& data,
typename ValueType::AllocatorType& a) {
return v.SetString(data, a); }
556 template<
typename ValueType>
557 struct TypeHelper<ValueType, typename ValueType::Array> {
558 typedef typename ValueType::Array ArrayType;
559 static bool Is(
const ValueType& v) {
return v.IsArray(); }
560 static ArrayType Get(ValueType& v) {
return v.GetArray(); }
561 static ValueType& Set(ValueType& v, ArrayType data) {
return v = data; }
562 static ValueType& Set(ValueType& v, ArrayType data,
typename ValueType::AllocatorType&) {
return v = data; }
565 template<
typename ValueType>
566 struct TypeHelper<ValueType, typename ValueType::ConstArray> {
567 typedef typename ValueType::ConstArray ArrayType;
568 static bool Is(
const ValueType& v) {
return v.IsArray(); }
569 static ArrayType Get(
const ValueType& v) {
return v.GetArray(); }
572 template<
typename ValueType>
573 struct TypeHelper<ValueType, typename ValueType::Object> {
574 typedef typename ValueType::Object ObjectType;
575 static bool Is(
const ValueType& v) {
return v.IsObject(); }
576 static ObjectType Get(ValueType& v) {
return v.GetObject(); }
577 static ValueType& Set(ValueType& v, ObjectType data) {
return v = data; }
578 static ValueType& Set(ValueType& v, ObjectType data,
typename ValueType::AllocatorType&) {
return v = data; }
581 template<
typename ValueType>
582 struct TypeHelper<ValueType, typename ValueType::ConstObject> {
583 typedef typename ValueType::ConstObject ObjectType;
584 static bool Is(
const ValueType& v) {
return v.IsObject(); }
585 static ObjectType Get(
const ValueType& v) {
return v.GetObject(); }
607 template <
typename Encoding,
typename Allocator = MemoryPoolAllocator<> >
614 typedef typename Encoding::Ch
Ch;
630 GenericValue() RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; }
632 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
635 rhs.data_.f.flags = kNullFlag;
641 GenericValue(
const GenericValue& rhs);
643 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
645 template <
typename StackAllocator>
646 GenericValue(GenericDocument<Encoding,Allocator,StackAllocator>&& rhs);
649 template <
typename StackAllocator>
650 GenericValue& operator=(GenericDocument<Encoding,Allocator,StackAllocator>&& rhs);
661 static const uint16_t defaultFlags[] = {
662 kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag,
666 data_.f.flags = defaultFlags[type];
670 data_.ss.SetLength(0);
681 template <
typename SourceAllocator>
683 switch (rhs.GetType()) {
686 Member* lm = reinterpret_cast<Member*>(allocator.Malloc(count *
sizeof(
Member)));
688 for (
SizeType i = 0; i < count; i++) {
692 data_.f.flags = kObjectFlag;
693 data_.o.size = data_.o.capacity = count;
694 SetMembersPointer(lm);
701 for (
SizeType i = 0; i < count; i++)
702 new (&le[i])
GenericValue(re[i], allocator, copyConstStrings);
703 data_.f.flags = kArrayFlag;
704 data_.a.size = data_.a.capacity = count;
705 SetElementsPointer(le);
709 if (rhs.data_.f.flags == kConstStringFlag && !copyConstStrings) {
710 data_.f.flags = rhs.data_.f.flags;
711 data_ = *reinterpret_cast<const Data*>(&rhs.data_);
714 SetStringRaw(
StringRef(rhs.GetString(), rhs.GetStringLength()), allocator);
717 data_.f.flags = rhs.data_.f.flags;
718 data_ = *reinterpret_cast<const Data*>(&rhs.data_);
729 #ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen
730 template <
typename T>
731 explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame<bool, T>))) RAPIDJSON_NOEXCEPT
738 data_.f.flags = b ? kTrueFlag : kFalseFlag;
744 data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag;
750 data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag);
756 data_.f.flags = kNumberInt64Flag;
758 data_.f.flags |= kNumberUint64Flag;
760 data_.f.flags |= kUintFlag;
762 data_.f.flags |= kIntFlag;
765 data_.f.flags |= kIntFlag;
771 data_.f.flags = kNumberUint64Flag;
773 data_.f.flags |= kInt64Flag;
775 data_.f.flags |= kUintFlag;
777 data_.f.flags |= kIntFlag;
781 explicit GenericValue(
double d) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; }
784 explicit GenericValue(
float f) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = static_cast<double>(f); data_.f.flags = kNumberDoubleFlag; }
798 #if RAPIDJSON_HAS_STDSTRING
812 a.value_.data_ = Data();
813 a.value_.data_.f.flags = kArrayFlag;
823 o.value_.data_ = Data();
824 o.value_.data_.f.flags = kObjectFlag;
831 if (Allocator::kNeedFree) {
832 switch(data_.f.flags) {
845 Allocator::Free(GetMembersPointer());
848 case kCopyStringFlag:
849 Allocator::Free(const_cast<Ch*>(GetStringPointer()));
874 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
877 return *
this = rhs.Move();
903 template <
typename T>
904 RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer<T>), (
GenericValue&))
917 template <
typename SourceAllocator>
918 GenericValue& CopyFrom(
const GenericValue<Encoding, SourceAllocator>& rhs,
Allocator& allocator,
bool copyConstStrings =
false) {
919 RAPIDJSON_ASSERT(static_cast<void*>(
this) != static_cast<void const*>(&rhs));
920 this->~GenericValue();
921 new (
this) GenericValue(rhs, allocator, copyConstStrings);
930 GenericValue& Swap(GenericValue& other) RAPIDJSON_NOEXCEPT {
932 temp.RawAssign(*
this);
934 other.RawAssign(temp);
950 friend inline void swap(GenericValue& a, GenericValue& b) RAPIDJSON_NOEXCEPT { a.Swap(b); }
954 GenericValue& Move() RAPIDJSON_NOEXCEPT {
return *
this; }
964 template <
typename SourceAllocator>
965 bool operator==(
const GenericValue<Encoding, SourceAllocator>& rhs)
const {
966 typedef GenericValue<Encoding, SourceAllocator> RhsType;
967 if (GetType() != rhs.GetType())
972 if (data_.o.size != rhs.data_.o.size)
974 for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) {
975 typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name);
976 if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value)
982 if (data_.a.size != rhs.data_.a.size)
984 for (
SizeType i = 0; i < data_.a.size; i++)
985 if ((*
this)[i] != rhs[i])
990 return StringEqual(rhs);
993 if (IsDouble() || rhs.IsDouble()) {
994 double a = GetDouble();
995 double b = rhs.GetDouble();
996 return a >= b && a <= b;
999 return data_.n.u64 == rhs.data_.n.u64;
1007 bool operator==(
const Ch* rhs)
const {
return *
this == GenericValue(
StringRef(rhs)); }
1009 #if RAPIDJSON_HAS_STDSTRING
1013 bool operator==(
const std::basic_string<Ch>& rhs)
const {
return *
this == GenericValue(
StringRef(rhs)); }
1019 template <
typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>,internal::IsGenericValue<T> >), (
bool)) operator==(
const T& rhs)
const {
return *
this == GenericValue(rhs); }
1024 template <
typename SourceAllocator>
1025 bool operator!=(
const GenericValue<Encoding, SourceAllocator>& rhs)
const {
return !(*
this == rhs); }
1028 bool operator!=(
const Ch* rhs)
const {
return !(*
this == rhs); }
1033 template <
typename T> RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (
bool)) operator!=(
const T& rhs)
const {
return !(*
this == rhs); }
1038 template <
typename T>
friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (
bool)) operator==(
const T& lhs,
const GenericValue& rhs) {
return rhs == lhs; }
1043 template <
typename T>
friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (
bool)) operator!=(
const T& lhs,
const GenericValue& rhs) {
return !(rhs == lhs); }
1049 Type GetType()
const {
return static_cast<Type>(data_.f.flags & kTypeMask); }
1050 bool IsNull()
const {
return data_.f.flags == kNullFlag; }
1051 bool IsFalse()
const {
return data_.f.flags == kFalseFlag; }
1052 bool IsTrue()
const {
return data_.f.flags == kTrueFlag; }
1053 bool IsBool()
const {
return (data_.f.flags & kBoolFlag) != 0; }
1054 bool IsObject()
const {
return data_.f.flags == kObjectFlag; }
1055 bool IsArray()
const {
return data_.f.flags == kArrayFlag; }
1056 bool IsNumber()
const {
return (data_.f.flags & kNumberFlag) != 0; }
1057 bool IsInt()
const {
return (data_.f.flags & kIntFlag) != 0; }
1058 bool IsUint()
const {
return (data_.f.flags & kUintFlag) != 0; }
1059 bool IsInt64()
const {
return (data_.f.flags & kInt64Flag) != 0; }
1060 bool IsUint64()
const {
return (data_.f.flags & kUint64Flag) != 0; }
1061 bool IsDouble()
const {
return (data_.f.flags & kDoubleFlag) != 0; }
1062 bool IsString()
const {
return (data_.f.flags & kStringFlag) != 0; }
1065 bool IsLosslessDouble()
const {
1066 if (!IsNumber())
return false;
1068 uint64_t u = GetUint64();
1069 volatile double d = static_cast<double>(u);
1071 && (d < static_cast<double>((std::numeric_limits<uint64_t>::max)()))
1072 && (u == static_cast<uint64_t>(d));
1075 int64_t i = GetInt64();
1076 volatile double d = static_cast<double>(i);
1077 return (d >= static_cast<double>((std::numeric_limits<int64_t>::min)()))
1078 && (d < static_cast<double>((std::numeric_limits<int64_t>::max)()))
1079 && (i == static_cast<int64_t>(d));
1085 bool IsFloat()
const {
1086 if ((data_.f.flags & kDoubleFlag) == 0)
1088 double d = GetDouble();
1089 return d >= -3.4028234e38 && d <= 3.4028234e38;
1092 bool IsLosslessFloat()
const {
1093 if (!IsNumber())
return false;
1094 double a = GetDouble();
1095 if (a < static_cast<double>(-(std::numeric_limits<float>::max)())
1096 || a > static_cast<double>((std::numeric_limits<float>::max)()))
1098 double b = static_cast<double>(static_cast<float>(a));
1099 return a >= b && a <= b;
1107 GenericValue& SetNull() { this->~GenericValue();
new (
this) GenericValue();
return *
this; }
1114 bool GetBool()
const {
RAPIDJSON_ASSERT(IsBool());
return data_.f.flags == kTrueFlag; }
1117 GenericValue& SetBool(
bool b) { this->~GenericValue();
new (
this) GenericValue(b);
return *
this; }
1126 GenericValue& SetObject() { this->~GenericValue();
new (
this) GenericValue(
kObjectType);
return *
this; }
1135 bool ObjectEmpty()
const {
RAPIDJSON_ASSERT(IsObject());
return data_.o.size == 0; }
1146 template <
typename T>
1147 RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr<internal::IsSame<
typename internal::RemoveConst<T>::Type, Ch> >),(GenericValue&)) operator[](T* name) {
1151 template <
typename T>
1152 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]; }
1163 template <
typename SourceAllocator>
1164 GenericValue& operator[](
const GenericValue<Encoding, SourceAllocator>& name) {
1165 MemberIterator member = FindMember(name);
1166 if (member != MemberEnd())
1167 return member->value;
1176 static char buffer[
sizeof(GenericValue)];
1177 return *
new (buffer) GenericValue();
1180 template <
typename SourceAllocator>
1181 const GenericValue& operator[](
const GenericValue<Encoding, SourceAllocator>& name)
const {
return const_cast<GenericValue&>(*
this)[name]; }
1183 #if RAPIDJSON_HAS_STDSTRING
1185 GenericValue& operator[](
const std::basic_string<Ch>& name) {
return (*
this)[GenericValue(
StringRef(name))]; }
1186 const GenericValue& operator[](
const std::basic_string<Ch>& name)
const {
return (*
this)[GenericValue(
StringRef(name))]; }
1191 ConstMemberIterator MemberBegin()
const {
RAPIDJSON_ASSERT(IsObject());
return ConstMemberIterator(GetMembersPointer()); }
1194 ConstMemberIterator MemberEnd()
const {
RAPIDJSON_ASSERT(IsObject());
return ConstMemberIterator(GetMembersPointer() + data_.o.size); }
1197 MemberIterator MemberBegin() {
RAPIDJSON_ASSERT(IsObject());
return MemberIterator(GetMembersPointer()); }
1200 MemberIterator MemberEnd() {
RAPIDJSON_ASSERT(IsObject());
return MemberIterator(GetMembersPointer() + data_.o.size); }
1210 if (newCapacity > data_.o.capacity) {
1211 SetMembersPointer(reinterpret_cast<Member*>(allocator.Realloc(GetMembersPointer(), data_.o.capacity *
sizeof(Member), newCapacity *
sizeof(Member))));
1212 data_.o.capacity = newCapacity;
1225 bool HasMember(
const Ch* name)
const {
return FindMember(name) != MemberEnd(); }
1227 #if RAPIDJSON_HAS_STDSTRING
1236 bool HasMember(
const std::basic_string<Ch>& name)
const {
return FindMember(name) != MemberEnd(); }
1248 template <
typename SourceAllocator>
1249 bool HasMember(
const GenericValue<Encoding, SourceAllocator>& name)
const {
return FindMember(name) != MemberEnd(); }
1263 MemberIterator FindMember(
const Ch* name) {
1265 return FindMember(n);
1268 ConstMemberIterator FindMember(
const Ch* name)
const {
return const_cast<GenericValue&>(*this).FindMember(name); }
1283 template <
typename SourceAllocator>
1284 MemberIterator FindMember(
const GenericValue<Encoding, SourceAllocator>& name) {
1287 MemberIterator member = MemberBegin();
1288 for ( ; member != MemberEnd(); ++member)
1289 if (name.StringEqual(member->name))
1293 template <
typename SourceAllocator> ConstMemberIterator FindMember(
const GenericValue<Encoding, SourceAllocator>& name)
const {
return const_cast<GenericValue&>(*this).FindMember(name); }
1295 #if RAPIDJSON_HAS_STDSTRING
1303 MemberIterator FindMember(
const std::basic_string<Ch>& name) {
return FindMember(GenericValue(
StringRef(name))); }
1304 ConstMemberIterator FindMember(
const std::basic_string<Ch>& name)
const {
return FindMember(GenericValue(
StringRef(name))); }
1317 GenericValue& AddMember(GenericValue& name, GenericValue& value,
Allocator& allocator) {
1321 ObjectData& o = data_.o;
1322 if (o.size >= o.capacity)
1323 MemberReserve(o.capacity == 0 ? kDefaultObjectCapacity : (o.capacity + (o.capacity + 1) / 2), allocator);
1324 Member* members = GetMembersPointer();
1325 members[o.size].name.RawAssign(name);
1326 members[o.size].value.RawAssign(value);
1340 GenericValue& AddMember(GenericValue& name, StringRefType value,
Allocator& allocator) {
1341 GenericValue v(value);
1342 return AddMember(name, v, allocator);
1345 #if RAPIDJSON_HAS_STDSTRING
1355 GenericValue& AddMember(GenericValue& name, std::basic_string<Ch>& value,
Allocator& allocator) {
1356 GenericValue v(value, allocator);
1357 return AddMember(name, v, allocator);
1378 template <
typename T>
1379 RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&))
1380 AddMember(GenericValue& name, T value,
Allocator& allocator) {
1381 GenericValue v(value);
1382 return AddMember(name, v, allocator);
1385 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
1386 GenericValue& AddMember(GenericValue&& name, GenericValue&& value,
Allocator& allocator) {
1387 return AddMember(name, value, allocator);
1389 GenericValue& AddMember(GenericValue&& name, GenericValue& value,
Allocator& allocator) {
1390 return AddMember(name, value, allocator);
1392 GenericValue& AddMember(GenericValue& name, GenericValue&& value,
Allocator& allocator) {
1393 return AddMember(name, value, allocator);
1395 GenericValue& AddMember(StringRefType name, GenericValue&& value,
Allocator& allocator) {
1396 GenericValue n(name);
1397 return AddMember(n, value, allocator);
1399 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
1412 GenericValue& AddMember(StringRefType name, GenericValue& value,
Allocator& allocator) {
1413 GenericValue n(name);
1414 return AddMember(n, value, allocator);
1426 GenericValue& AddMember(StringRefType name, StringRefType value,
Allocator& allocator) {
1427 GenericValue v(value);
1428 return AddMember(name, v, allocator);
1448 template <
typename T>
1449 RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&))
1450 AddMember(StringRefType name, T value,
Allocator& allocator) {
1451 GenericValue n(name);
1452 return AddMember(n, value, allocator);
1459 void RemoveAllMembers() {
1461 for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m)
1474 bool RemoveMember(
const Ch* name) {
1476 return RemoveMember(n);
1479 #if RAPIDJSON_HAS_STDSTRING
1480 bool RemoveMember(
const std::basic_string<Ch>& name) {
return RemoveMember(GenericValue(
StringRef(name))); }
1483 template <
typename SourceAllocator>
1484 bool RemoveMember(
const GenericValue<Encoding, SourceAllocator>& name) {
1485 MemberIterator m = FindMember(name);
1486 if (m != MemberEnd()) {
1502 MemberIterator RemoveMember(MemberIterator m) {
1508 MemberIterator last(GetMembersPointer() + (data_.o.size - 1));
1509 if (data_.o.size > 1 && m != last)
1526 MemberIterator EraseMember(ConstMemberIterator pos) {
1527 return EraseMember(pos, pos +1);
1539 MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) {
1547 MemberIterator pos = MemberBegin() + (first - MemberBegin());
1548 for (MemberIterator itr = pos; itr != last; ++itr)
1550 std::memmove(static_cast<void*>(&*pos), &*last, static_cast<size_t>(MemberEnd() - last) *
sizeof(Member));
1551 data_.o.size -= static_cast<SizeType>(last - first);
1560 bool EraseMember(
const Ch* name) {
1562 return EraseMember(n);
1565 #if RAPIDJSON_HAS_STDSTRING
1566 bool EraseMember(
const std::basic_string<Ch>& name) {
return EraseMember(GenericValue(
StringRef(name))); }
1569 template <
typename SourceAllocator>
1570 bool EraseMember(
const GenericValue<Encoding, SourceAllocator>& name) {
1571 MemberIterator m = FindMember(name);
1572 if (m != MemberEnd()) {
1581 ConstObject GetObject()
const {
RAPIDJSON_ASSERT(IsObject());
return ConstObject(*
this); }
1590 GenericValue& SetArray() { this->~GenericValue();
new (
this) GenericValue(
kArrayType);
return *
this; }
1599 bool Empty()
const {
RAPIDJSON_ASSERT(IsArray());
return data_.a.size == 0; }
1607 GenericValue* e = GetElementsPointer();
1608 for (GenericValue* v = e; v != e + data_.a.size; ++v)
1618 GenericValue& operator[](
SizeType index) {
1621 return GetElementsPointer()[index];
1623 const GenericValue& operator[](
SizeType index)
const {
return const_cast<GenericValue&>(*
this)[index]; }
1627 ValueIterator Begin() {
RAPIDJSON_ASSERT(IsArray());
return GetElementsPointer(); }
1630 ValueIterator End() {
RAPIDJSON_ASSERT(IsArray());
return GetElementsPointer() + data_.a.size; }
1633 ConstValueIterator Begin()
const {
return const_cast<GenericValue&>(*this).Begin(); }
1636 ConstValueIterator End()
const {
return const_cast<GenericValue&>(*this).End(); }
1646 if (newCapacity > data_.a.capacity) {
1647 SetElementsPointer(reinterpret_cast<GenericValue*>(allocator.Realloc(GetElementsPointer(), data_.a.capacity *
sizeof(GenericValue), newCapacity *
sizeof(GenericValue))));
1648 data_.a.capacity = newCapacity;
1663 GenericValue& PushBack(GenericValue& value,
Allocator& allocator) {
1665 if (data_.a.size >= data_.a.capacity)
1666 Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator);
1667 GetElementsPointer()[data_.a.size++].RawAssign(value);
1671 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
1672 GenericValue& PushBack(GenericValue&& value,
Allocator& allocator) {
1673 return PushBack(value, allocator);
1675 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
1686 GenericValue& PushBack(StringRefType value,
Allocator& allocator) {
1687 return (*this).template PushBack<StringRefType>(value, allocator);
1707 template <
typename T>
1708 RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&))
1709 PushBack(T value,
Allocator& allocator) {
1710 GenericValue v(value);
1711 return PushBack(v, allocator);
1718 GenericValue& PopBack() {
1721 GetElementsPointer()[--data_.a.size].~GenericValue();
1732 ValueIterator Erase(ConstValueIterator pos) {
1733 return Erase(pos, pos + 1);
1744 ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) {
1751 ValueIterator pos = Begin() + (first - Begin());
1752 for (ValueIterator itr = pos; itr != last; ++itr)
1753 itr->~GenericValue();
1754 std::memmove(static_cast<void*>(pos), last, static_cast<size_t>(End() - last) *
sizeof(GenericValue));
1755 data_.a.size -= static_cast<SizeType>(last - first);
1760 ConstArray GetArray()
const {
RAPIDJSON_ASSERT(IsArray());
return ConstArray(*
this); }
1767 int GetInt()
const {
RAPIDJSON_ASSERT(data_.f.flags & kIntFlag);
return data_.n.i.i; }
1768 unsigned GetUint()
const {
RAPIDJSON_ASSERT(data_.f.flags & kUintFlag);
return data_.n.u.u; }
1769 int64_t GetInt64()
const {
RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag);
return data_.n.i64; }
1770 uint64_t GetUint64()
const {
RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag);
return data_.n.u64; }
1775 double GetDouble()
const {
1777 if ((data_.f.flags & kDoubleFlag) != 0)
return data_.n.d;
1778 if ((data_.f.flags & kIntFlag) != 0)
return data_.n.i.i;
1779 if ((data_.f.flags & kUintFlag) != 0)
return data_.n.u.u;
1780 if ((data_.f.flags & kInt64Flag) != 0)
return static_cast<double>(data_.n.i64);
1781 RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0);
return static_cast<double>(data_.n.u64);
1787 float GetFloat()
const {
1788 return static_cast<float>(GetDouble());
1791 GenericValue& SetInt(
int i) { this->~GenericValue();
new (
this) GenericValue(i);
return *
this; }
1792 GenericValue& SetUint(
unsigned u) { this->~GenericValue();
new (
this) GenericValue(u);
return *
this; }
1793 GenericValue& SetInt64(int64_t i64) { this->~GenericValue();
new (
this) GenericValue(i64);
return *
this; }
1794 GenericValue& SetUint64(uint64_t u64) { this->~GenericValue();
new (
this) GenericValue(u64);
return *
this; }
1795 GenericValue& SetDouble(
double d) { this->~GenericValue();
new (
this) GenericValue(d);
return *
this; }
1796 GenericValue& SetFloat(
float f) { this->~GenericValue();
new (
this) GenericValue(static_cast<double>(f));
return *
this; }
1803 const Ch* GetString()
const {
RAPIDJSON_ASSERT(IsString());
return (data_.f.flags & kInlineStrFlag) ? data_.ss.str : GetStringPointer(); }
1808 SizeType GetStringLength()
const {
RAPIDJSON_ASSERT(IsString());
return ((data_.f.flags & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); }
1818 GenericValue& SetString(
const Ch* s,
SizeType length) {
return SetString(
StringRef(s, length)); }
1825 GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s);
return *
this; }
1835 GenericValue& SetString(
const Ch* s,
SizeType length,
Allocator& allocator) {
return SetString(
StringRef(s, length), allocator); }
1843 GenericValue& SetString(
const Ch* s,
Allocator& allocator) {
return SetString(
StringRef(s), allocator); }
1851 GenericValue& SetString(StringRefType s,
Allocator& allocator) { this->~GenericValue(); SetStringRaw(s, allocator);
return *
this; }
1853 #if RAPIDJSON_HAS_STDSTRING
1861 GenericValue& SetString(
const std::basic_string<Ch>& s,
Allocator& allocator) {
return SetString(
StringRef(s), allocator); }
1873 template <
typename T>
1874 bool Is()
const {
return internal::TypeHelper<ValueType, T>::Is(*
this); }
1876 template <
typename T>
1877 T Get()
const {
return internal::TypeHelper<ValueType, T>::Get(*
this); }
1879 template <
typename T>
1880 T Get() {
return internal::TypeHelper<ValueType, T>::Get(*
this); }
1882 template<
typename T>
1883 ValueType& Set(
const T& data) {
return internal::TypeHelper<ValueType, T>::Set(*
this, data); }
1885 template<
typename T>
1886 ValueType& Set(
const T& data, AllocatorType& allocator) {
return internal::TypeHelper<ValueType, T>::Set(*
this, data, allocator); }
1897 template <
typename Handler>
1898 bool Accept(
Handler& handler)
const {
1902 case kTrueType:
return handler.Bool(
true);
1907 for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) {
1909 if (
RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0)))
1914 return handler.EndObject(data_.o.size);
1919 for (
const GenericValue* v = Begin(); v != End(); ++v)
1922 return handler.EndArray(data_.a.size);
1925 return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0);
1929 if (IsDouble())
return handler.Double(data_.n.d);
1930 else if (IsInt())
return handler.Int(data_.n.i.i);
1931 else if (IsUint())
return handler.Uint(data_.n.u.u);
1932 else if (IsInt64())
return handler.Int64(data_.n.i64);
1933 else return handler.Uint64(data_.n.u64);
1938 template <
typename,
typename>
friend class GenericValue;
1939 template <
typename,
typename,
typename>
friend class GenericDocument;
1943 kNumberFlag = 0x0010,
1946 kInt64Flag = 0x0080,
1947 kUint64Flag = 0x0100,
1948 kDoubleFlag = 0x0200,
1949 kStringFlag = 0x0400,
1951 kInlineStrFlag = 0x1000,
1957 kNumberIntFlag =
kNumberType | kNumberFlag | kIntFlag | kInt64Flag,
1958 kNumberUintFlag =
kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag,
1959 kNumberInt64Flag =
kNumberType | kNumberFlag | kInt64Flag,
1960 kNumberUint64Flag =
kNumberType | kNumberFlag | kUint64Flag,
1961 kNumberDoubleFlag =
kNumberType | kNumberFlag | kDoubleFlag,
1962 kNumberAnyFlag =
kNumberType | kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag,
1964 kCopyStringFlag =
kStringType | kStringFlag | kCopyFlag,
1965 kShortStringFlag =
kStringType | kStringFlag | kCopyFlag | kInlineStrFlag,
1972 static const SizeType kDefaultArrayCapacity = 16;
1973 static const SizeType kDefaultObjectCapacity = 16;
1976 #if RAPIDJSON_48BITPOINTER_OPTIMIZATION
1977 char payload[
sizeof(
SizeType) * 2 + 6];
1978 #elif RAPIDJSON_64BIT
1979 char payload[
sizeof(
SizeType) * 2 +
sizeof(
void*) + 6];
1981 char payload[
sizeof(
SizeType) * 2 +
sizeof(
void*) + 2];
2001 enum { MaxChars =
sizeof(static_cast<Flag*>(0)->payload) /
sizeof(
Ch), MaxSize = MaxChars - 1, LenPos = MaxSize };
2004 inline static bool Usable(
SizeType len) {
return (MaxSize >= len); }
2005 inline void SetLength(
SizeType len) { str[LenPos] = static_cast<Ch>(MaxSize - len); }
2006 inline SizeType GetLength()
const {
return static_cast<SizeType>(MaxSize - str[LenPos]); }
2011 #if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN
2056 RAPIDJSON_FORCEINLINE
const Ch* GetStringPointer()
const {
return RAPIDJSON_GETPOINTER(
Ch, data_.s.str); }
2057 RAPIDJSON_FORCEINLINE
const Ch* SetStringPointer(
const Ch* str) {
return RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); }
2058 RAPIDJSON_FORCEINLINE GenericValue* GetElementsPointer()
const {
return RAPIDJSON_GETPOINTER(GenericValue, data_.a.elements); }
2059 RAPIDJSON_FORCEINLINE GenericValue* SetElementsPointer(GenericValue* elements) {
return RAPIDJSON_SETPOINTER(GenericValue, data_.a.elements, elements); }
2060 RAPIDJSON_FORCEINLINE Member* GetMembersPointer()
const {
return RAPIDJSON_GETPOINTER(Member, data_.o.members); }
2061 RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) {
return RAPIDJSON_SETPOINTER(Member, data_.o.members, members); }
2065 data_.f.flags = kArrayFlag;
2067 GenericValue* e = static_cast<GenericValue*>(allocator.Malloc(count *
sizeof(GenericValue)));
2068 SetElementsPointer(e);
2069 std::memcpy(static_cast<void*>(e), values, count *
sizeof(GenericValue));
2072 SetElementsPointer(0);
2073 data_.a.size = data_.a.capacity = count;
2078 data_.f.flags = kObjectFlag;
2080 Member* m = static_cast<Member*>(allocator.Malloc(count *
sizeof(
Member)));
2081 SetMembersPointer(m);
2082 std::memcpy(static_cast<void*>(m), members, count *
sizeof(
Member));
2085 SetMembersPointer(0);
2086 data_.o.size = data_.o.capacity = count;
2091 data_.f.flags = kConstStringFlag;
2092 SetStringPointer(s);
2093 data_.s.length = s.length;
2099 if (ShortString::Usable(s.
length)) {
2100 data_.f.flags = kShortStringFlag;
2101 data_.ss.SetLength(s.
length);
2104 data_.f.flags = kCopyStringFlag;
2105 data_.s.length = s.
length;
2106 str = static_cast<Ch *>(allocator.Malloc((s.
length + 1) *
sizeof(
Ch)));
2107 SetStringPointer(str);
2109 std::memcpy(str, s, s.
length *
sizeof(
Ch));
2117 rhs.data_.f.flags = kNullFlag;
2120 template <
typename SourceAllocator>
2125 const SizeType len1 = GetStringLength();
2126 const SizeType len2 = rhs.GetStringLength();
2127 if(len1 != len2) {
return false; }
2129 const Ch*
const str1 = GetString();
2130 const Ch*
const str2 = rhs.GetString();
2131 if(str1 == str2) {
return true; }
2133 return (std::memcmp(str1, str2,
sizeof(Ch) * len1) == 0);
2153 template <
typename Encoding,
typename Allocator = MemoryPoolAllocator<>,
typename StackAllocator = CrtAllocator>
2156 typedef typename Encoding::Ch
Ch;
2181 allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()
2187 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2190 : ValueType(std::forward<ValueType>(rhs)),
2191 allocator_(rhs.allocator_),
2192 ownAllocator_(rhs.ownAllocator_),
2193 stack_(std::move(rhs.stack_)),
2194 parseResult_(rhs.parseResult_)
2197 rhs.ownAllocator_ = 0;
2202 ~GenericDocument() {
2206 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2208 GenericDocument& operator=(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT
2212 ValueType::operator=(std::forward<ValueType>(rhs));
2217 allocator_ = rhs.allocator_;
2218 ownAllocator_ = rhs.ownAllocator_;
2219 stack_ = std::move(rhs.stack_);
2220 parseResult_ = rhs.parseResult_;
2223 rhs.ownAllocator_ = 0;
2224 rhs.parseResult_ = ParseResult();
2237 ValueType::Swap(rhs);
2238 stack_.Swap(rhs.stack_);
2239 internal::Swap(allocator_, rhs.allocator_);
2240 internal::Swap(ownAllocator_, rhs.ownAllocator_);
2241 internal::Swap(parseResult_, rhs.parseResult_);
2247 using ValueType::Swap;
2268 template <
typename Generator>
2270 ClearStackOnExit scope(*
this);
2273 ValueType::operator=(*stack_.template Pop<ValueType>(1));
2288 template <
unsigned parseFlags,
typename SourceEncoding,
typename InputStream>
2291 stack_.HasAllocator() ? &stack_.GetAllocator() : 0);
2292 ClearStackOnExit scope(*
this);
2293 parseResult_ = reader.template Parse<parseFlags>(is, *
this);
2296 ValueType::operator=(*stack_.template Pop<ValueType>(1));
2307 template <
unsigned parseFlags,
typename InputStream>
2309 return ParseStream<parseFlags, Encoding, InputStream>(is);
2317 template <
typename InputStream>
2319 return ParseStream<kParseDefaultFlags, Encoding, InputStream>(is);
2331 template <
unsigned parseFlags>
2334 return ParseStream<parseFlags | kParseInsituFlag>(s);
2342 return ParseInsitu<kParseDefaultFlags>(str);
2354 template <
unsigned parseFlags,
typename SourceEncoding>
2358 return ParseStream<parseFlags, SourceEncoding>(s);
2365 template <
unsigned parseFlags>
2367 return Parse<parseFlags, Encoding>(str);
2374 return Parse<kParseDefaultFlags>(str);
2377 template <
unsigned parseFlags,
typename SourceEncoding>
2378 GenericDocument& Parse(
const typename SourceEncoding::Ch* str,
size_t length) {
2380 MemoryStream ms(reinterpret_cast<const char*>(str), length *
sizeof(
typename SourceEncoding::Ch));
2382 ParseStream<parseFlags, SourceEncoding>(is);
2386 template <
unsigned parseFlags>
2387 GenericDocument& Parse(
const Ch* str,
size_t length) {
2388 return Parse<parseFlags, Encoding>(str, length);
2391 GenericDocument& Parse(
const Ch* str,
size_t length) {
2392 return Parse<kParseDefaultFlags>(str, length);
2395 #if RAPIDJSON_HAS_STDSTRING
2396 template <
unsigned parseFlags,
typename SourceEncoding>
2397 GenericDocument& Parse(
const std::basic_string<typename SourceEncoding::Ch>& str) {
2399 return Parse<parseFlags, SourceEncoding>(str.c_str());
2402 template <
unsigned parseFlags>
2403 GenericDocument& Parse(
const std::basic_string<Ch>& str) {
2404 return Parse<parseFlags, Encoding>(str.c_str());
2407 GenericDocument& Parse(
const std::basic_string<Ch>& str) {
2408 return Parse<kParseDefaultFlags>(str);
2410 #endif // RAPIDJSON_HAS_STDSTRING
2427 #ifndef __clang // -Wdocumentation
2452 struct ClearStackOnExit {
2454 ~ClearStackOnExit() { d_.ClearStack(); }
2456 ClearStackOnExit(
const ClearStackOnExit&);
2457 ClearStackOnExit& operator=(
const ClearStackOnExit&);
2458 GenericDocument& d_;
2463 template <
typename,
typename>
friend class GenericValue;
2467 bool Null() {
new (stack_.template Push<ValueType>()) ValueType();
return true; }
2468 bool Bool(
bool b) {
new (stack_.template Push<ValueType>()) ValueType(b);
return true; }
2469 bool Int(
int i) {
new (stack_.template Push<ValueType>()) ValueType(i);
return true; }
2470 bool Uint(
unsigned i) {
new (stack_.template Push<ValueType>()) ValueType(i);
return true; }
2471 bool Int64(int64_t i) {
new (stack_.template Push<ValueType>()) ValueType(i);
return true; }
2472 bool Uint64(uint64_t i) {
new (stack_.template Push<ValueType>()) ValueType(i);
return true; }
2473 bool Double(
double d) {
new (stack_.template Push<ValueType>()) ValueType(d);
return true; }
2475 bool RawNumber(
const Ch* str,
SizeType length,
bool copy) {
2477 new (stack_.template Push<ValueType>()) ValueType(str, length, GetAllocator());
2479 new (stack_.template Push<ValueType>()) ValueType(str, length);
2483 bool String(
const Ch* str,
SizeType length,
bool copy) {
2485 new (stack_.template Push<ValueType>()) ValueType(str, length, GetAllocator());
2487 new (stack_.template Push<ValueType>()) ValueType(str, length);
2491 bool StartObject() {
new (stack_.template Push<ValueType>()) ValueType(
kObjectType);
return true; }
2493 bool Key(
const Ch* str,
SizeType length,
bool copy) {
return String(str, length, copy); }
2495 bool EndObject(
SizeType memberCount) {
2496 typename ValueType::Member* members = stack_.template Pop<typename ValueType::Member>(memberCount);
2497 stack_.template Top<ValueType>()->SetObjectRaw(members, memberCount, GetAllocator());
2501 bool StartArray() {
new (stack_.template Push<ValueType>()) ValueType(
kArrayType);
return true; }
2503 bool EndArray(
SizeType elementCount) {
2504 ValueType* elements = stack_.template Pop<ValueType>(elementCount);
2505 stack_.template Top<ValueType>()->SetArrayRaw(elements, elementCount, GetAllocator());
2511 GenericDocument(
const GenericDocument&);
2513 GenericDocument& operator=(
const GenericDocument&);
2516 if (Allocator::kNeedFree)
2517 while (stack_.GetSize() > 0)
2518 (stack_.template Pop<ValueType>(1))->~ValueType();
2521 stack_.ShrinkToFit();
2528 static const size_t kDefaultStackCapacity = 1024;
2531 internal::Stack<StackAllocator> stack_;
2532 ParseResult parseResult_;
2543 template <
bool Const,
typename ValueT>
2548 typedef ValueT PlainType;
2550 typedef ValueType* ValueIterator;
2551 typedef const ValueT* ConstValueIterator;
2552 typedef typename ValueType::AllocatorType AllocatorType;
2553 typedef typename ValueType::StringRefType StringRefType;
2555 template <
typename,
typename>
2562 SizeType Size()
const {
return value_.Size(); }
2563 SizeType Capacity()
const {
return value_.Capacity(); }
2564 bool Empty()
const {
return value_.Empty(); }
2565 void Clear()
const { value_.Clear(); }
2566 ValueType& operator[](
SizeType index)
const {
return value_[index]; }
2567 ValueIterator Begin()
const {
return value_.Begin(); }
2568 ValueIterator End()
const {
return value_.End(); }
2569 GenericArray Reserve(
SizeType newCapacity, AllocatorType &allocator)
const { value_.Reserve(newCapacity, allocator);
return *
this; }
2570 GenericArray PushBack(ValueType& value, AllocatorType& allocator)
const { value_.PushBack(value, allocator);
return *
this; }
2571 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2572 GenericArray PushBack(ValueType&& value, AllocatorType& allocator)
const { value_.PushBack(value, allocator);
return *
this; }
2573 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
2574 GenericArray PushBack(StringRefType value, AllocatorType& allocator)
const { value_.PushBack(value, allocator);
return *
this; }
2575 template <
typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (
const GenericArray&)) PushBack(T value, AllocatorType& allocator)
const { value_.PushBack(value, allocator);
return *
this; }
2576 GenericArray PopBack()
const { value_.PopBack();
return *
this; }
2577 ValueIterator Erase(ConstValueIterator pos)
const {
return value_.Erase(pos); }
2578 ValueIterator Erase(ConstValueIterator first, ConstValueIterator last)
const {
return value_.Erase(first, last); }
2580 #if RAPIDJSON_HAS_CXX11_RANGE_FOR
2581 ValueIterator begin()
const {
return value_.Begin(); }
2582 ValueIterator end()
const {
return value_.End(); }
2596 template <
bool Const,
typename ValueT>
2597 class GenericObject {
2599 typedef GenericObject<true, ValueT> ConstObject;
2600 typedef GenericObject<false, ValueT> Object;
2601 typedef ValueT PlainType;
2603 typedef GenericMemberIterator<Const, typename ValueT::EncodingType, typename ValueT::AllocatorType> MemberIterator;
2604 typedef GenericMemberIterator<true, typename ValueT::EncodingType, typename ValueT::AllocatorType> ConstMemberIterator;
2605 typedef typename ValueType::AllocatorType AllocatorType;
2606 typedef typename ValueType::StringRefType StringRefType;
2607 typedef typename ValueType::EncodingType EncodingType;
2608 typedef typename ValueType::Ch Ch;
2610 template <
typename,
typename>
2611 friend class GenericValue;
2613 GenericObject(
const GenericObject& rhs) : value_(rhs.value_) {}
2614 GenericObject& operator=(
const GenericObject& rhs) { value_ = rhs.value_;
return *
this; }
2617 SizeType MemberCount()
const {
return value_.MemberCount(); }
2618 SizeType MemberCapacity()
const {
return value_.MemberCapacity(); }
2619 bool ObjectEmpty()
const {
return value_.ObjectEmpty(); }
2620 template <
typename T> ValueType& operator[](T* name)
const {
return value_[name]; }
2621 template <
typename SourceAllocator> ValueType& operator[](
const GenericValue<EncodingType, SourceAllocator>& name)
const {
return value_[name]; }
2622 #if RAPIDJSON_HAS_STDSTRING
2623 ValueType& operator[](
const std::basic_string<Ch>& name)
const {
return value_[name]; }
2625 MemberIterator MemberBegin()
const {
return value_.MemberBegin(); }
2626 MemberIterator MemberEnd()
const {
return value_.MemberEnd(); }
2627 GenericObject MemberReserve(
SizeType newCapacity, AllocatorType &allocator)
const { value_.MemberReserve(newCapacity, allocator);
return *
this; }
2628 bool HasMember(
const Ch* name)
const {
return value_.HasMember(name); }
2629 #if RAPIDJSON_HAS_STDSTRING
2630 bool HasMember(
const std::basic_string<Ch>& name)
const {
return value_.HasMember(name); }
2632 template <
typename SourceAllocator>
bool HasMember(
const GenericValue<EncodingType, SourceAllocator>& name)
const {
return value_.HasMember(name); }
2633 MemberIterator FindMember(
const Ch* name)
const {
return value_.FindMember(name); }
2634 template <
typename SourceAllocator> MemberIterator FindMember(
const GenericValue<EncodingType, SourceAllocator>& name)
const {
return value_.FindMember(name); }
2635 #if RAPIDJSON_HAS_STDSTRING
2636 MemberIterator FindMember(
const std::basic_string<Ch>& name)
const {
return value_.FindMember(name); }
2638 GenericObject AddMember(ValueType& name, ValueType& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2639 GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2640 #if RAPIDJSON_HAS_STDSTRING
2641 GenericObject AddMember(ValueType& name, std::basic_string<Ch>& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2643 template <
typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&)) AddMember(ValueType& name, T value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2644 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2645 GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2646 GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2647 GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2648 GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2649 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
2650 GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2651 GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2652 template <
typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2653 void RemoveAllMembers() { value_.RemoveAllMembers(); }
2654 bool RemoveMember(
const Ch* name)
const {
return value_.RemoveMember(name); }
2655 #if RAPIDJSON_HAS_STDSTRING
2656 bool RemoveMember(
const std::basic_string<Ch>& name)
const {
return value_.RemoveMember(name); }
2658 template <
typename SourceAllocator>
bool RemoveMember(
const GenericValue<EncodingType, SourceAllocator>& name)
const {
return value_.RemoveMember(name); }
2659 MemberIterator RemoveMember(MemberIterator m)
const {
return value_.RemoveMember(m); }
2660 MemberIterator EraseMember(ConstMemberIterator pos)
const {
return value_.EraseMember(pos); }
2661 MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last)
const {
return value_.EraseMember(first, last); }
2662 bool EraseMember(
const Ch* name)
const {
return value_.EraseMember(name); }
2663 #if RAPIDJSON_HAS_STDSTRING
2664 bool EraseMember(
const std::basic_string<Ch>& name)
const {
return EraseMember(ValueType(
StringRef(name))); }
2666 template <
typename SourceAllocator>
bool EraseMember(
const GenericValue<EncodingType, SourceAllocator>& name)
const {
return value_.EraseMember(name); }
2668 #if RAPIDJSON_HAS_CXX11_RANGE_FOR
2669 MemberIterator begin()
const {
return value_.MemberBegin(); }
2670 MemberIterator end()
const {
return value_.MemberEnd(); }
2675 GenericObject(ValueType& value) : value_(value) {}
2679 RAPIDJSON_NAMESPACE_END
2682 #endif // RAPIDJSON_DOCUMENT_H_