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(4127)
31 RAPIDJSON_DIAG_OFF(4244)
35 RAPIDJSON_DIAG_OFF(padded)
36 RAPIDJSON_DIAG_OFF(
switch-
enum)
37 RAPIDJSON_DIAG_OFF(c++98-compat)
41 RAPIDJSON_DIAG_OFF(effc++)
43 RAPIDJSON_DIAG_OFF(terminate)
47 #ifndef RAPIDJSON_NOMEMBERITERATORCLASS
51 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
55 RAPIDJSON_NAMESPACE_BEGIN
58 template <
typename Encoding,
typename Allocator>
61 template <
typename Encoding,
typename Allocator,
typename StackAllocator>
70 template <
typename Encoding,
typename Allocator>
79 #ifndef RAPIDJSON_NOMEMBERITERATORCLASS
100 template <
bool Const,
typename Encoding,
typename Allocator>
102 :
public std::iterator<std::random_access_iterator_tag
103 , typename internal::MaybeAddConst<Const,GenericMember<Encoding,Allocator> >::Type> {
110 typedef std::iterator<std::random_access_iterator_tag,ValueType> BaseType;
150 Iterator& operator=(
const NonConstIterator & it) { ptr_ = it.ptr_;
return *
this; }
154 Iterator& operator++(){ ++ptr_;
return *
this; }
155 Iterator& operator--(){ --ptr_;
return *
this; }
156 Iterator operator++(
int){ Iterator old(*
this); ++ptr_;
return old; }
157 Iterator operator--(
int){ Iterator old(*
this); --ptr_;
return old; }
162 Iterator operator+(DifferenceType n)
const {
return Iterator(ptr_+n); }
163 Iterator operator-(DifferenceType n)
const {
return Iterator(ptr_-n); }
165 Iterator& operator+=(DifferenceType n) { ptr_+=n;
return *
this; }
166 Iterator& operator-=(DifferenceType n) { ptr_-=n;
return *
this; }
171 bool operator==(ConstIterator that)
const {
return ptr_ == that.ptr_; }
172 bool operator!=(ConstIterator that)
const {
return ptr_ != that.ptr_; }
173 bool operator<=(ConstIterator that)
const {
return ptr_ <= that.ptr_; }
174 bool operator>=(ConstIterator that)
const {
return ptr_ >= that.ptr_; }
175 bool operator< (ConstIterator that)
const {
return ptr_ < that.ptr_; }
176 bool operator> (ConstIterator that)
const {
return ptr_ > that.ptr_; }
181 Reference operator*()
const {
return *ptr_; }
182 Pointer operator->()
const {
return ptr_; }
183 Reference operator[](DifferenceType n)
const {
return ptr_[n]; }
196 #else // RAPIDJSON_NOMEMBERITERATORCLASS
200 template <
bool Const,
typename Encoding,
typename Allocator>
201 struct GenericMemberIterator;
204 template <
typename Encoding,
typename Allocator>
207 typedef GenericMember<Encoding,Allocator>* Iterator;
210 template <
typename Encoding,
typename Allocator>
213 typedef const GenericMember<Encoding,Allocator>* Iterator;
216 #endif // RAPIDJSON_NOMEMBERITERATORCLASS
248 template<
typename CharType>
253 #ifndef __clang__ // -Wdocumentation
279 : s(str), length(N-1) {}
282 #ifndef __clang__ // -Wdocumentation
306 #ifndef __clang__ // -Wdocumentation
319 GenericStringRef& operator=(
const GenericStringRef& rhs) { s = rhs.s; length = rhs.length; }
322 operator const Ch *()
const {
return s; }
345 template<
typename CharType>
365 template<
typename CharType>
370 #if RAPIDJSON_HAS_STDSTRING
383 template<
typename CharType>
393 template <
typename T,
typename Encoding =
void,
typename Allocator =
void>
394 struct IsGenericValueImpl : FalseType {};
397 template <
typename T>
struct IsGenericValueImpl<T, typename Void<typename T::EncodingType>
::Type, typename Void<typename T::AllocatorType>
::Type>
398 : IsBaseOf<GenericValue<typename T::EncodingType, typename T::AllocatorType>, T>
::Type {};
401 template <
typename T>
struct IsGenericValue : IsGenericValueImpl<T>
::Type {};
410 template <
typename ValueType,
typename T>
411 struct TypeHelper {};
413 template<
typename ValueType>
414 struct TypeHelper<ValueType, bool> {
415 static bool Is(
const ValueType& v) {
return v.IsBool(); }
416 static bool Get(
const ValueType& v) {
return v.GetBool(); }
417 static ValueType& Set(ValueType& v,
bool data) {
return v.SetBool(data); }
418 static ValueType& Set(ValueType& v,
bool data,
typename ValueType::AllocatorType&) {
return v.SetBool(data); }
421 template<
typename ValueType>
422 struct TypeHelper<ValueType, int> {
423 static bool Is(
const ValueType& v) {
return v.IsInt(); }
424 static int Get(
const ValueType& v) {
return v.GetInt(); }
425 static ValueType& Set(ValueType& v,
int data) {
return v.SetInt(data); }
426 static ValueType& Set(ValueType& v,
int data,
typename ValueType::AllocatorType&) {
return v.SetInt(data); }
429 template<
typename ValueType>
430 struct TypeHelper<ValueType, unsigned> {
431 static bool Is(
const ValueType& v) {
return v.IsUint(); }
432 static unsigned Get(
const ValueType& v) {
return v.GetUint(); }
433 static ValueType& Set(ValueType& v,
unsigned data) {
return v.SetUint(data); }
434 static ValueType& Set(ValueType& v,
unsigned data,
typename ValueType::AllocatorType&) {
return v.SetUint(data); }
437 template<
typename ValueType>
438 struct TypeHelper<ValueType, int64_t> {
439 static bool Is(
const ValueType& v) {
return v.IsInt64(); }
440 static int64_t Get(
const ValueType& v) {
return v.GetInt64(); }
441 static ValueType& Set(ValueType& v, int64_t data) {
return v.SetInt64(data); }
442 static ValueType& Set(ValueType& v, int64_t data,
typename ValueType::AllocatorType&) {
return v.SetInt64(data); }
445 template<
typename ValueType>
446 struct TypeHelper<ValueType, uint64_t> {
447 static bool Is(
const ValueType& v) {
return v.IsUint64(); }
448 static uint64_t Get(
const ValueType& v) {
return v.GetUint64(); }
449 static ValueType& Set(ValueType& v, uint64_t data) {
return v.SetUint64(data); }
450 static ValueType& Set(ValueType& v, uint64_t data,
typename ValueType::AllocatorType&) {
return v.SetUint64(data); }
453 template<
typename ValueType>
454 struct TypeHelper<ValueType, double> {
455 static bool Is(
const ValueType& v) {
return v.IsDouble(); }
456 static double Get(
const ValueType& v) {
return v.GetDouble(); }
457 static ValueType& Set(ValueType& v,
double data) {
return v.SetDouble(data); }
458 static ValueType& Set(ValueType& v,
double data,
typename ValueType::AllocatorType&) {
return v.SetDouble(data); }
461 template<
typename ValueType>
462 struct TypeHelper<ValueType, float> {
463 static bool Is(
const ValueType& v) {
return v.IsFloat(); }
464 static float Get(
const ValueType& v) {
return v.GetFloat(); }
465 static ValueType& Set(ValueType& v,
float data) {
return v.SetFloat(data); }
466 static ValueType& Set(ValueType& v,
float data,
typename ValueType::AllocatorType&) {
return v.SetFloat(data); }
469 template<
typename ValueType>
470 struct TypeHelper<ValueType, const typename ValueType::Ch*> {
471 typedef const typename ValueType::Ch* StringType;
472 static bool Is(
const ValueType& v) {
return v.IsString(); }
473 static StringType Get(
const ValueType& v) {
return v.GetString(); }
474 static ValueType& Set(ValueType& v,
const StringType data) {
return v.SetString(
typename ValueType::StringRefType(data)); }
475 static ValueType& Set(ValueType& v,
const StringType data,
typename ValueType::AllocatorType& a) {
return v.SetString(data, a); }
478 #if RAPIDJSON_HAS_STDSTRING
479 template<
typename ValueType>
480 struct TypeHelper<ValueType, std::basic_string<typename ValueType::Ch> > {
481 typedef std::basic_string<typename ValueType::Ch> StringType;
482 static bool Is(
const ValueType& v) {
return v.IsString(); }
483 static StringType Get(
const ValueType& v) {
return StringType(v.GetString(), v.GetStringLength()); }
484 static ValueType& Set(ValueType& v,
const StringType& data,
typename ValueType::AllocatorType& a) {
return v.SetString(data, a); }
488 template<
typename ValueType>
489 struct TypeHelper<ValueType, typename ValueType::Array> {
490 typedef typename ValueType::Array ArrayType;
491 static bool Is(
const ValueType& v) {
return v.IsArray(); }
492 static ArrayType Get(ValueType& v) {
return v.GetArray(); }
493 static ValueType& Set(ValueType& v, ArrayType data) {
return v = data; }
494 static ValueType& Set(ValueType& v, ArrayType data,
typename ValueType::AllocatorType&) {
return v = data; }
497 template<
typename ValueType>
498 struct TypeHelper<ValueType, typename ValueType::ConstArray> {
499 typedef typename ValueType::ConstArray ArrayType;
500 static bool Is(
const ValueType& v) {
return v.IsArray(); }
501 static ArrayType Get(
const ValueType& v) {
return v.GetArray(); }
504 template<
typename ValueType>
505 struct TypeHelper<ValueType, typename ValueType::Object> {
506 typedef typename ValueType::Object ObjectType;
507 static bool Is(
const ValueType& v) {
return v.IsObject(); }
508 static ObjectType Get(ValueType& v) {
return v.GetObject(); }
509 static ValueType& Set(ValueType& v, ObjectType data) {
return v = data; }
510 static ValueType& Set(ValueType& v, ObjectType data,
typename ValueType::AllocatorType&) { v = data; }
513 template<
typename ValueType>
514 struct TypeHelper<ValueType, typename ValueType::ConstObject> {
515 typedef typename ValueType::ConstObject ObjectType;
516 static bool Is(
const ValueType& v) {
return v.IsObject(); }
517 static ObjectType Get(
const ValueType& v) {
return v.GetObject(); }
539 template <
typename Encoding,
typename Allocator = MemoryPoolAllocator<> >
546 typedef typename Encoding::Ch
Ch;
562 GenericValue() RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; }
564 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
567 rhs.data_.f.flags = kNullFlag;
573 GenericValue(
const GenericValue& rhs);
575 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
577 template <
typename StackAllocator>
578 GenericValue(GenericDocument<Encoding,Allocator,StackAllocator>&& rhs);
581 template <
typename StackAllocator>
582 GenericValue& operator=(GenericDocument<Encoding,Allocator,StackAllocator>&& rhs);
593 static const uint16_t defaultFlags[7] = {
594 kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag,
598 data_.f.flags = defaultFlags[type];
602 data_.ss.SetLength(0);
612 template<
typename SourceAllocator >
621 #ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen
622 template <
typename T>
623 explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame<bool, T>))) RAPIDJSON_NOEXCEPT
630 data_.f.flags = b ? kTrueFlag : kFalseFlag;
636 data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag;
642 data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag);
648 data_.f.flags = kNumberInt64Flag;
650 data_.f.flags |= kNumberUint64Flag;
652 data_.f.flags |= kUintFlag;
654 data_.f.flags |= kIntFlag;
657 data_.f.flags |= kIntFlag;
663 data_.f.flags = kNumberUint64Flag;
665 data_.f.flags |= kInt64Flag;
667 data_.f.flags |= kUintFlag;
669 data_.f.flags |= kIntFlag;
673 explicit GenericValue(
double d) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; }
687 #if RAPIDJSON_HAS_STDSTRING
701 a.value_.data_ = Data();
702 a.value_.data_.f.flags = kArrayFlag;
712 o.value_.data_ = Data();
713 o.value_.data_.f.flags = kObjectFlag;
720 if (Allocator::kNeedFree) {
721 switch(data_.f.flags) {
734 Allocator::Free(GetMembersPointer());
737 case kCopyStringFlag:
738 Allocator::Free(
const_cast<Ch*
>(GetStringPointer()));
762 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
765 return *
this = rhs.Move();
791 template <
typename T>
792 RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer<T>), (
GenericValue&))
804 template <
typename SourceAllocator>
805 GenericValue& CopyFrom(
const GenericValue<Encoding, SourceAllocator>& rhs,
Allocator& allocator) {
806 RAPIDJSON_ASSERT(
static_cast<void*
>(
this) !=
static_cast<void const*
>(&rhs));
807 this->~GenericValue();
808 new (
this) GenericValue(rhs, allocator);
817 GenericValue& Swap(GenericValue& other) RAPIDJSON_NOEXCEPT {
819 temp.RawAssign(*
this);
821 other.RawAssign(temp);
837 friend inline void swap(GenericValue& a, GenericValue& b) RAPIDJSON_NOEXCEPT { a.Swap(b); }
841 GenericValue& Move() RAPIDJSON_NOEXCEPT {
return *
this; }
851 template <
typename SourceAllocator>
852 bool operator==(
const GenericValue<Encoding, SourceAllocator>& rhs)
const {
853 typedef GenericValue<Encoding, SourceAllocator> RhsType;
854 if (GetType() != rhs.GetType())
859 if (data_.o.size != rhs.data_.o.size)
861 for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) {
862 typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name);
863 if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value)
869 if (data_.a.size != rhs.data_.a.size)
871 for (
SizeType i = 0; i < data_.a.size; i++)
872 if ((*
this)[i] != rhs[i])
877 return StringEqual(rhs);
880 if (IsDouble() || rhs.IsDouble()) {
881 double a = GetDouble();
882 double b = rhs.GetDouble();
883 return a >= b && a <= b;
886 return data_.n.u64 == rhs.data_.n.u64;
894 bool operator==(
const Ch* rhs)
const {
return *
this == GenericValue(
StringRef(rhs)); }
896 #if RAPIDJSON_HAS_STDSTRING
900 bool operator==(
const std::basic_string<Ch>& rhs)
const {
return *
this == GenericValue(
StringRef(rhs)); }
906 template <
typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>,internal::IsGenericValue<T> >), (
bool)) operator==(
const T& rhs)
const {
return *
this == GenericValue(rhs); }
911 template <
typename SourceAllocator>
912 bool operator!=(
const GenericValue<Encoding, SourceAllocator>& rhs)
const {
return !(*
this == rhs); }
915 bool operator!=(
const Ch* rhs)
const {
return !(*
this == rhs); }
920 template <
typename T> RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (
bool)) operator!=(
const T& rhs)
const {
return !(*
this == rhs); }
925 template <
typename T>
friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (
bool)) operator==(
const T& lhs,
const GenericValue& rhs) {
return rhs == lhs; }
930 template <
typename T>
friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (
bool)) operator!=(
const T& lhs,
const GenericValue& rhs) {
return !(rhs == lhs); }
936 Type GetType()
const {
return static_cast<Type>(data_.f.flags & kTypeMask); }
937 bool IsNull()
const {
return data_.f.flags == kNullFlag; }
938 bool IsFalse()
const {
return data_.f.flags == kFalseFlag; }
939 bool IsTrue()
const {
return data_.f.flags == kTrueFlag; }
940 bool IsBool()
const {
return (data_.f.flags & kBoolFlag) != 0; }
941 bool IsObject()
const {
return data_.f.flags == kObjectFlag; }
942 bool IsArray()
const {
return data_.f.flags == kArrayFlag; }
943 bool IsNumber()
const {
return (data_.f.flags & kNumberFlag) != 0; }
944 bool IsInt()
const {
return (data_.f.flags & kIntFlag) != 0; }
945 bool IsUint()
const {
return (data_.f.flags & kUintFlag) != 0; }
946 bool IsInt64()
const {
return (data_.f.flags & kInt64Flag) != 0; }
947 bool IsUint64()
const {
return (data_.f.flags & kUint64Flag) != 0; }
948 bool IsDouble()
const {
return (data_.f.flags & kDoubleFlag) != 0; }
949 bool IsString()
const {
return (data_.f.flags & kStringFlag) != 0; }
952 bool IsLosslessDouble()
const {
953 if (!IsNumber())
return false;
955 uint64_t u = GetUint64();
956 volatile double d =
static_cast<double>(u);
958 && (d < static_cast<double>(std::numeric_limits<uint64_t>::max()))
959 && (u ==
static_cast<uint64_t
>(d));
962 int64_t i = GetInt64();
963 volatile double d =
static_cast<double>(i);
964 return (d >=
static_cast<double>(std::numeric_limits<int64_t>::min()))
965 && (d <
static_cast<double>(std::numeric_limits<int64_t>::max()))
966 && (i ==
static_cast<int64_t
>(d));
972 bool IsFloat()
const {
973 if ((data_.f.flags & kDoubleFlag) == 0)
975 double d = GetDouble();
976 return d >= -3.4028234e38 && d <= 3.4028234e38;
979 bool IsLosslessFloat()
const {
980 if (!IsNumber())
return false;
981 double a = GetDouble();
982 if (a <
static_cast<double>(-std::numeric_limits<float>::max())
983 || a >
static_cast<double>(std::numeric_limits<float>::max()))
985 double b =
static_cast<double>(
static_cast<float>(a));
986 return a >= b && a <= b;
994 GenericValue& SetNull() { this->~GenericValue();
new (
this) GenericValue();
return *
this; }
1001 bool GetBool()
const {
RAPIDJSON_ASSERT(IsBool());
return data_.f.flags == kTrueFlag; }
1004 GenericValue& SetBool(
bool b) { this->~GenericValue();
new (
this) GenericValue(b);
return *
this; }
1013 GenericValue& SetObject() { this->~GenericValue();
new (
this) GenericValue(
kObjectType);
return *
this; }
1019 bool ObjectEmpty()
const {
RAPIDJSON_ASSERT(IsObject());
return data_.o.size == 0; }
1030 template <
typename T>
1031 RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr<internal::IsSame<
typename internal::RemoveConst<T>::Type, Ch> >),(GenericValue&)) operator[](T* name) {
1035 template <
typename T>
1036 RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr<internal::IsSame<
typename internal::RemoveConst<T>::Type, Ch> >),(
const GenericValue&)) operator[](T* name)
const {
return const_cast<GenericValue&
>(*this)[name]; }
1047 template <
typename SourceAllocator>
1048 GenericValue& operator[](
const GenericValue<Encoding, SourceAllocator>& name) {
1049 MemberIterator member = FindMember(name);
1050 if (member != MemberEnd())
1051 return member->value;
1060 static char buffer[
sizeof(GenericValue)];
1061 return *
new (buffer) GenericValue();
1064 template <
typename SourceAllocator>
1065 const GenericValue& operator[](
const GenericValue<Encoding, SourceAllocator>& name)
const {
return const_cast<GenericValue&
>(*this)[name]; }
1067 #if RAPIDJSON_HAS_STDSTRING
1069 GenericValue& operator[](
const std::basic_string<Ch>& name) {
return (*
this)[GenericValue(
StringRef(name))]; }
1070 const GenericValue& operator[](
const std::basic_string<Ch>& name)
const {
return (*
this)[GenericValue(
StringRef(name))]; }
1075 ConstMemberIterator MemberBegin()
const {
RAPIDJSON_ASSERT(IsObject());
return ConstMemberIterator(GetMembersPointer()); }
1078 ConstMemberIterator MemberEnd()
const {
RAPIDJSON_ASSERT(IsObject());
return ConstMemberIterator(GetMembersPointer() + data_.o.size); }
1081 MemberIterator MemberBegin() {
RAPIDJSON_ASSERT(IsObject());
return MemberIterator(GetMembersPointer()); }
1084 MemberIterator MemberEnd() {
RAPIDJSON_ASSERT(IsObject());
return MemberIterator(GetMembersPointer() + data_.o.size); }
1094 bool HasMember(
const Ch* name)
const {
return FindMember(name) != MemberEnd(); }
1096 #if RAPIDJSON_HAS_STDSTRING
1105 bool HasMember(
const std::basic_string<Ch>& name)
const {
return FindMember(name) != MemberEnd(); }
1117 template <
typename SourceAllocator>
1118 bool HasMember(
const GenericValue<Encoding, SourceAllocator>& name)
const {
return FindMember(name) != MemberEnd(); }
1132 MemberIterator FindMember(
const Ch* name) {
1134 return FindMember(n);
1137 ConstMemberIterator FindMember(
const Ch* name)
const {
return const_cast<GenericValue&
>(*this).FindMember(name); }
1152 template <
typename SourceAllocator>
1153 MemberIterator FindMember(
const GenericValue<Encoding, SourceAllocator>& name) {
1156 MemberIterator member = MemberBegin();
1157 for ( ; member != MemberEnd(); ++member)
1158 if (name.StringEqual(member->name))
1162 template <
typename SourceAllocator> ConstMemberIterator FindMember(
const GenericValue<Encoding, SourceAllocator>& name)
const {
return const_cast<GenericValue&
>(*this).FindMember(name); }
1164 #if RAPIDJSON_HAS_STDSTRING
1172 MemberIterator FindMember(
const std::basic_string<Ch>& name) {
return FindMember(GenericValue(
StringRef(name))); }
1173 ConstMemberIterator FindMember(
const std::basic_string<Ch>& name)
const {
return FindMember(GenericValue(
StringRef(name))); }
1186 GenericValue& AddMember(GenericValue& name, GenericValue& value,
Allocator& allocator) {
1190 ObjectData& o = data_.o;
1191 if (o.size >= o.capacity) {
1192 if (o.capacity == 0) {
1193 o.capacity = kDefaultObjectCapacity;
1194 SetMembersPointer(
reinterpret_cast<Member*
>(allocator.Malloc(o.capacity *
sizeof(Member))));
1198 o.capacity += (oldCapacity + 1) / 2;
1199 SetMembersPointer(
reinterpret_cast<Member*
>(allocator.Realloc(GetMembersPointer(), oldCapacity *
sizeof(Member), o.capacity *
sizeof(Member))));
1202 Member* members = GetMembersPointer();
1203 members[o.size].name.RawAssign(name);
1204 members[o.size].value.RawAssign(value);
1218 GenericValue& AddMember(GenericValue& name, StringRefType value,
Allocator& allocator) {
1219 GenericValue v(value);
1220 return AddMember(name, v, allocator);
1223 #if RAPIDJSON_HAS_STDSTRING
1233 GenericValue& AddMember(GenericValue& name, std::basic_string<Ch>& value,
Allocator& allocator) {
1234 GenericValue v(value, allocator);
1235 return AddMember(name, v, allocator);
1256 template <
typename T>
1257 RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&))
1258 AddMember(GenericValue& name, T value,
Allocator& allocator) {
1259 GenericValue v(value);
1260 return AddMember(name, v, allocator);
1263 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
1264 GenericValue& AddMember(GenericValue&& name, GenericValue&& value,
Allocator& allocator) {
1265 return AddMember(name, value, allocator);
1267 GenericValue& AddMember(GenericValue&& name, GenericValue& value,
Allocator& allocator) {
1268 return AddMember(name, value, allocator);
1270 GenericValue& AddMember(GenericValue& name, GenericValue&& value,
Allocator& allocator) {
1271 return AddMember(name, value, allocator);
1273 GenericValue& AddMember(StringRefType name, GenericValue&& value,
Allocator& allocator) {
1274 GenericValue n(name);
1275 return AddMember(n, value, allocator);
1277 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
1290 GenericValue& AddMember(StringRefType name, GenericValue& value,
Allocator& allocator) {
1291 GenericValue n(name);
1292 return AddMember(n, value, allocator);
1304 GenericValue& AddMember(StringRefType name, StringRefType value,
Allocator& allocator) {
1305 GenericValue v(value);
1306 return AddMember(name, v, allocator);
1326 template <
typename T>
1327 RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&))
1328 AddMember(StringRefType name, T value,
Allocator& allocator) {
1329 GenericValue n(name);
1330 return AddMember(n, value, allocator);
1337 void RemoveAllMembers() {
1339 for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m)
1352 bool RemoveMember(
const Ch* name) {
1354 return RemoveMember(n);
1357 #if RAPIDJSON_HAS_STDSTRING
1358 bool RemoveMember(
const std::basic_string<Ch>& name) {
return RemoveMember(GenericValue(
StringRef(name))); }
1361 template <
typename SourceAllocator>
1362 bool RemoveMember(
const GenericValue<Encoding, SourceAllocator>& name) {
1363 MemberIterator m = FindMember(name);
1364 if (m != MemberEnd()) {
1380 MemberIterator RemoveMember(MemberIterator m) {
1386 MemberIterator last(GetMembersPointer() + (data_.o.size - 1));
1387 if (data_.o.size > 1 && m != last)
1404 MemberIterator EraseMember(ConstMemberIterator pos) {
1405 return EraseMember(pos, pos +1);
1417 MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) {
1425 MemberIterator pos = MemberBegin() + (first - MemberBegin());
1426 for (MemberIterator itr = pos; itr != last; ++itr)
1428 std::memmove(&*pos, &*last,
static_cast<size_t>(MemberEnd() - last) *
sizeof(Member));
1429 data_.o.size -=
static_cast<SizeType>(last - first);
1438 bool EraseMember(
const Ch* name) {
1440 return EraseMember(n);
1443 #if RAPIDJSON_HAS_STDSTRING
1444 bool EraseMember(
const std::basic_string<Ch>& name) {
return EraseMember(GenericValue(
StringRef(name))); }
1447 template <
typename SourceAllocator>
1448 bool EraseMember(
const GenericValue<Encoding, SourceAllocator>& name) {
1449 MemberIterator m = FindMember(name);
1450 if (m != MemberEnd()) {
1459 ConstObject GetObject()
const {
RAPIDJSON_ASSERT(IsObject());
return ConstObject(*
this); }
1468 GenericValue& SetArray() { this->~GenericValue();
new (
this) GenericValue(
kArrayType);
return *
this; }
1477 bool Empty()
const {
RAPIDJSON_ASSERT(IsArray());
return data_.a.size == 0; }
1485 GenericValue* e = GetElementsPointer();
1486 for (GenericValue* v = e; v != e + data_.a.size; ++v)
1496 GenericValue& operator[](
SizeType index) {
1499 return GetElementsPointer()[index];
1501 const GenericValue& operator[](
SizeType index)
const {
return const_cast<GenericValue&
>(*this)[index]; }
1505 ValueIterator Begin() {
RAPIDJSON_ASSERT(IsArray());
return GetElementsPointer(); }
1508 ValueIterator End() {
RAPIDJSON_ASSERT(IsArray());
return GetElementsPointer() + data_.a.size; }
1511 ConstValueIterator Begin()
const {
return const_cast<GenericValue&
>(*this).Begin(); }
1514 ConstValueIterator End()
const {
return const_cast<GenericValue&
>(*this).End(); }
1524 if (newCapacity > data_.a.capacity) {
1525 SetElementsPointer(
reinterpret_cast<GenericValue*
>(allocator.Realloc(GetElementsPointer(), data_.a.capacity *
sizeof(GenericValue), newCapacity *
sizeof(GenericValue))));
1526 data_.a.capacity = newCapacity;
1541 GenericValue& PushBack(GenericValue& value,
Allocator& allocator) {
1543 if (data_.a.size >= data_.a.capacity)
1544 Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator);
1545 GetElementsPointer()[data_.a.size++].RawAssign(value);
1549 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
1550 GenericValue& PushBack(GenericValue&& value,
Allocator& allocator) {
1551 return PushBack(value, allocator);
1553 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
1564 GenericValue& PushBack(StringRefType value,
Allocator& allocator) {
1565 return (*this).template PushBack<StringRefType>(value, allocator);
1585 template <
typename T>
1586 RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&))
1587 PushBack(T value,
Allocator& allocator) {
1588 GenericValue v(value);
1589 return PushBack(v, allocator);
1596 GenericValue& PopBack() {
1599 GetElementsPointer()[--data_.a.size].~GenericValue();
1610 ValueIterator Erase(ConstValueIterator pos) {
1611 return Erase(pos, pos + 1);
1622 ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) {
1629 ValueIterator pos = Begin() + (first - Begin());
1630 for (ValueIterator itr = pos; itr != last; ++itr)
1631 itr->~GenericValue();
1632 std::memmove(pos, last,
static_cast<size_t>(End() - last) *
sizeof(GenericValue));
1633 data_.a.size -=
static_cast<SizeType>(last - first);
1638 ConstArray GetArray()
const {
RAPIDJSON_ASSERT(IsArray());
return ConstArray(*
this); }
1645 int GetInt()
const {
RAPIDJSON_ASSERT(data_.f.flags & kIntFlag);
return data_.n.i.i; }
1646 unsigned GetUint()
const {
RAPIDJSON_ASSERT(data_.f.flags & kUintFlag);
return data_.n.u.u; }
1647 int64_t GetInt64()
const {
RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag);
return data_.n.i64; }
1648 uint64_t GetUint64()
const {
RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag);
return data_.n.u64; }
1653 double GetDouble()
const {
1655 if ((data_.f.flags & kDoubleFlag) != 0)
return data_.n.d;
1656 if ((data_.f.flags & kIntFlag) != 0)
return data_.n.i.i;
1657 if ((data_.f.flags & kUintFlag) != 0)
return data_.n.u.u;
1658 if ((data_.f.flags & kInt64Flag) != 0)
return static_cast<double>(data_.n.i64);
1659 RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0);
return static_cast<double>(data_.n.u64);
1665 float GetFloat()
const {
1666 return static_cast<float>(GetDouble());
1669 GenericValue& SetInt(
int i) { this->~GenericValue();
new (
this) GenericValue(i);
return *
this; }
1670 GenericValue& SetUint(
unsigned u) { this->~GenericValue();
new (
this) GenericValue(u);
return *
this; }
1671 GenericValue& SetInt64(int64_t i64) { this->~GenericValue();
new (
this) GenericValue(i64);
return *
this; }
1672 GenericValue& SetUint64(uint64_t u64) { this->~GenericValue();
new (
this) GenericValue(u64);
return *
this; }
1673 GenericValue& SetDouble(
double d) { this->~GenericValue();
new (
this) GenericValue(d);
return *
this; }
1674 GenericValue& SetFloat(
float f) { this->~GenericValue();
new (
this) GenericValue(f);
return *
this; }
1681 const Ch* GetString()
const {
RAPIDJSON_ASSERT(IsString());
return (data_.f.flags & kInlineStrFlag) ? data_.ss.str : GetStringPointer(); }
1686 SizeType GetStringLength()
const {
RAPIDJSON_ASSERT(IsString());
return ((data_.f.flags & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); }
1696 GenericValue& SetString(
const Ch* s,
SizeType length) {
return SetString(
StringRef(s, length)); }
1703 GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s);
return *
this; }
1713 GenericValue& SetString(
const Ch* s,
SizeType length,
Allocator& allocator) { this->~GenericValue(); SetStringRaw(
StringRef(s, length), allocator);
return *
this; }
1721 GenericValue& SetString(
const Ch* s,
Allocator& allocator) {
return SetString(s, internal::StrLen(s), allocator); }
1723 #if RAPIDJSON_HAS_STDSTRING
1731 GenericValue& SetString(
const std::basic_string<Ch>& s,
Allocator& allocator) {
return SetString(s.data(),
SizeType(s.size()), allocator); }
1743 template <
typename T>
1744 bool Is()
const {
return internal::TypeHelper<ValueType, T>::Is(*
this); }
1746 template <
typename T>
1747 T Get()
const {
return internal::TypeHelper<ValueType, T>::Get(*
this); }
1749 template <
typename T>
1750 T Get() {
return internal::TypeHelper<ValueType, T>::Get(*
this); }
1752 template<
typename T>
1753 ValueType& Set(
const T& data) {
return internal::TypeHelper<ValueType, T>::Set(*
this, data); }
1755 template<
typename T>
1756 ValueType& Set(
const T& data, AllocatorType& allocator) {
return internal::TypeHelper<ValueType, T>::Set(*
this, data, allocator); }
1767 template <
typename Handler>
1768 bool Accept(
Handler& handler)
const {
1772 case kTrueType:
return handler.Bool(
true);
1777 for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) {
1779 if (
RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0)))
1784 return handler.EndObject(data_.o.size);
1789 for (
const GenericValue* v = Begin(); v != End(); ++v)
1792 return handler.EndArray(data_.a.size);
1795 return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0);
1799 if (IsDouble())
return handler.Double(data_.n.d);
1800 else if (IsInt())
return handler.Int(data_.n.i.i);
1801 else if (IsUint())
return handler.Uint(data_.n.u.u);
1802 else if (IsInt64())
return handler.Int64(data_.n.i64);
1803 else return handler.Uint64(data_.n.u64);
1808 template <
typename,
typename>
friend class GenericValue;
1809 template <
typename,
typename,
typename>
friend class GenericDocument;
1813 kNumberFlag = 0x0010,
1816 kInt64Flag = 0x0080,
1817 kUint64Flag = 0x0100,
1818 kDoubleFlag = 0x0200,
1819 kStringFlag = 0x0400,
1821 kInlineStrFlag = 0x1000,
1827 kNumberIntFlag =
kNumberType | kNumberFlag | kIntFlag | kInt64Flag,
1828 kNumberUintFlag =
kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag,
1829 kNumberInt64Flag =
kNumberType | kNumberFlag | kInt64Flag,
1830 kNumberUint64Flag =
kNumberType | kNumberFlag | kUint64Flag,
1831 kNumberDoubleFlag =
kNumberType | kNumberFlag | kDoubleFlag,
1832 kNumberAnyFlag =
kNumberType | kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag,
1834 kCopyStringFlag =
kStringType | kStringFlag | kCopyFlag,
1835 kShortStringFlag =
kStringType | kStringFlag | kCopyFlag | kInlineStrFlag,
1842 static const SizeType kDefaultArrayCapacity = 16;
1843 static const SizeType kDefaultObjectCapacity = 16;
1846 #if RAPIDJSON_48BITPOINTER_OPTIMIZATION
1847 char payload[
sizeof(
SizeType) * 2 + 6];
1848 #elif RAPIDJSON_64BIT
1849 char payload[
sizeof(
SizeType) * 2 +
sizeof(
void*) + 6];
1851 char payload[
sizeof(
SizeType) * 2 +
sizeof(
void*) + 2];
1871 enum { MaxChars =
sizeof(
static_cast<Flag*
>(0)->payload) /
sizeof(
Ch), MaxSize = MaxChars - 1, LenPos = MaxSize };
1874 inline static bool Usable(
SizeType len) {
return (MaxSize >= len); }
1875 inline void SetLength(
SizeType len) { str[LenPos] =
static_cast<Ch>(MaxSize - len); }
1876 inline SizeType GetLength()
const {
return static_cast<SizeType>(MaxSize - str[LenPos]); }
1881 #if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN
1926 RAPIDJSON_FORCEINLINE
const Ch* GetStringPointer()
const {
return RAPIDJSON_GETPOINTER(
Ch, data_.s.str); }
1927 RAPIDJSON_FORCEINLINE
const Ch* SetStringPointer(
const Ch* str) {
return RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); }
1928 RAPIDJSON_FORCEINLINE GenericValue* GetElementsPointer()
const {
return RAPIDJSON_GETPOINTER(GenericValue, data_.a.elements); }
1929 RAPIDJSON_FORCEINLINE GenericValue* SetElementsPointer(GenericValue* elements) {
return RAPIDJSON_SETPOINTER(GenericValue, data_.a.elements, elements); }
1930 RAPIDJSON_FORCEINLINE Member* GetMembersPointer()
const {
return RAPIDJSON_GETPOINTER(Member, data_.o.members); }
1931 RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) {
return RAPIDJSON_SETPOINTER(Member, data_.o.members, members); }
1935 data_.f.flags = kArrayFlag;
1937 GenericValue* e =
static_cast<GenericValue*
>(allocator.Malloc(count *
sizeof(GenericValue)));
1938 SetElementsPointer(e);
1939 std::memcpy(e, values, count *
sizeof(GenericValue));
1942 SetElementsPointer(0);
1943 data_.a.size = data_.a.capacity = count;
1948 data_.f.flags = kObjectFlag;
1951 SetMembersPointer(m);
1952 std::memcpy(m, members, count *
sizeof(
Member));
1955 SetMembersPointer(0);
1956 data_.o.size = data_.o.capacity = count;
1961 data_.f.flags = kConstStringFlag;
1962 SetStringPointer(s);
1963 data_.s.length = s.length;
1969 if (ShortString::Usable(s.
length)) {
1970 data_.f.flags = kShortStringFlag;
1971 data_.ss.SetLength(s.
length);
1974 data_.f.flags = kCopyStringFlag;
1975 data_.s.length = s.
length;
1976 str =
static_cast<Ch *
>(allocator.Malloc((s.
length + 1) *
sizeof(
Ch)));
1977 SetStringPointer(str);
1979 std::memcpy(str, s, s.
length *
sizeof(
Ch));
1987 rhs.data_.f.flags = kNullFlag;
1990 template <
typename SourceAllocator>
1995 const SizeType len1 = GetStringLength();
1996 const SizeType len2 = rhs.GetStringLength();
1997 if(len1 != len2) {
return false; }
1999 const Ch*
const str1 = GetString();
2000 const Ch*
const str2 = rhs.GetString();
2001 if(str1 == str2) {
return true; }
2003 return (std::memcmp(str1, str2,
sizeof(Ch) * len1) == 0);
2023 template <
typename Encoding,
typename Allocator = MemoryPoolAllocator<>,
typename StackAllocator = CrtAllocator>
2026 typedef typename Encoding::Ch
Ch;
2051 allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()
2057 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2060 : ValueType(std::forward<ValueType>(rhs)),
2061 allocator_(rhs.allocator_),
2062 ownAllocator_(rhs.ownAllocator_),
2063 stack_(std::move(rhs.stack_)),
2064 parseResult_(rhs.parseResult_)
2067 rhs.ownAllocator_ = 0;
2072 ~GenericDocument() {
2076 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2078 GenericDocument& operator=(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT
2082 ValueType::operator=(std::forward<ValueType>(rhs));
2087 allocator_ = rhs.allocator_;
2088 ownAllocator_ = rhs.ownAllocator_;
2089 stack_ = std::move(rhs.stack_);
2090 parseResult_ = rhs.parseResult_;
2093 rhs.ownAllocator_ = 0;
2094 rhs.parseResult_ = ParseResult();
2107 ValueType::Swap(rhs);
2108 stack_.Swap(rhs.stack_);
2109 internal::Swap(allocator_, rhs.allocator_);
2110 internal::Swap(ownAllocator_, rhs.ownAllocator_);
2111 internal::Swap(parseResult_, rhs.parseResult_);
2134 template <
typename Generator>
2136 ClearStackOnExit scope(*
this);
2139 ValueType::operator=(*stack_.template Pop<ValueType>(1));
2154 template <
unsigned parseFlags,
typename SourceEncoding,
typename InputStream>
2157 stack_.HasAllocator() ? &stack_.GetAllocator() : 0);
2158 ClearStackOnExit scope(*
this);
2159 parseResult_ = reader.template Parse<parseFlags>(is, *
this);
2162 ValueType::operator=(*stack_.template Pop<ValueType>(1));
2173 template <
unsigned parseFlags,
typename InputStream>
2175 return ParseStream<parseFlags, Encoding, InputStream>(is);
2183 template <
typename InputStream>
2185 return ParseStream<kParseDefaultFlags, Encoding, InputStream>(is);
2197 template <
unsigned parseFlags>
2200 return ParseStream<parseFlags | kParseInsituFlag>(s);
2208 return ParseInsitu<kParseDefaultFlags>(str);
2220 template <
unsigned parseFlags,
typename SourceEncoding>
2224 return ParseStream<parseFlags, SourceEncoding>(s);
2231 template <
unsigned parseFlags>
2233 return Parse<parseFlags, Encoding>(str);
2240 return Parse<kParseDefaultFlags>(str);
2243 template <
unsigned parseFlags,
typename SourceEncoding>
2244 GenericDocument& Parse(
const typename SourceEncoding::Ch* str,
size_t length) {
2246 MemoryStream ms(
static_cast<const char*
>(str), length *
sizeof(
typename SourceEncoding::Ch));
2248 ParseStream<parseFlags, SourceEncoding>(is);
2252 template <
unsigned parseFlags>
2253 GenericDocument& Parse(
const Ch* str,
size_t length) {
2254 return Parse<parseFlags, Encoding>(str, length);
2257 GenericDocument& Parse(
const Ch* str,
size_t length) {
2258 return Parse<kParseDefaultFlags>(str, length);
2261 #if RAPIDJSON_HAS_STDSTRING
2262 template <
unsigned parseFlags,
typename SourceEncoding>
2263 GenericDocument& Parse(
const std::basic_string<typename SourceEncoding::Ch>& str) {
2265 return Parse<parseFlags, SourceEncoding>(str.c_str());
2268 template <
unsigned parseFlags>
2269 GenericDocument& Parse(
const std::basic_string<Ch>& str) {
2270 return Parse<parseFlags, Encoding>(str.c_str());
2273 GenericDocument& Parse(
const std::basic_string<Ch>& str) {
2274 return Parse<kParseDefaultFlags>(str);
2276 #endif // RAPIDJSON_HAS_STDSTRING
2293 #ifndef __clang // -Wdocumentation
2318 struct ClearStackOnExit {
2320 ~ClearStackOnExit() { d_.ClearStack(); }
2322 ClearStackOnExit(
const ClearStackOnExit&);
2323 ClearStackOnExit& operator=(
const ClearStackOnExit&);
2324 GenericDocument& d_;
2329 template <
typename,
typename>
friend class GenericValue;
2333 bool Null() {
new (stack_.template Push<ValueType>()) ValueType();
return true; }
2334 bool Bool(
bool b) {
new (stack_.template Push<ValueType>()) ValueType(b);
return true; }
2335 bool Int(
int i) {
new (stack_.template Push<ValueType>()) ValueType(i);
return true; }
2336 bool Uint(
unsigned i) {
new (stack_.template Push<ValueType>()) ValueType(i);
return true; }
2337 bool Int64(int64_t i) {
new (stack_.template Push<ValueType>()) ValueType(i);
return true; }
2338 bool Uint64(uint64_t i) {
new (stack_.template Push<ValueType>()) ValueType(i);
return true; }
2339 bool Double(
double d) {
new (stack_.template Push<ValueType>()) ValueType(d);
return true; }
2341 bool RawNumber(
const Ch* str,
SizeType length,
bool copy) {
2343 new (stack_.template Push<ValueType>()) ValueType(str, length, GetAllocator());
2345 new (stack_.template Push<ValueType>()) ValueType(str, length);
2349 bool String(
const Ch* str,
SizeType length,
bool copy) {
2351 new (stack_.template Push<ValueType>()) ValueType(str, length, GetAllocator());
2353 new (stack_.template Push<ValueType>()) ValueType(str, length);
2357 bool StartObject() {
new (stack_.template Push<ValueType>()) ValueType(
kObjectType);
return true; }
2359 bool Key(
const Ch* str,
SizeType length,
bool copy) {
return String(str, length, copy); }
2361 bool EndObject(
SizeType memberCount) {
2362 typename ValueType::Member* members = stack_.template Pop<typename ValueType::Member>(memberCount);
2363 stack_.template Top<ValueType>()->SetObjectRaw(members, memberCount, GetAllocator());
2367 bool StartArray() {
new (stack_.template Push<ValueType>()) ValueType(
kArrayType);
return true; }
2369 bool EndArray(
SizeType elementCount) {
2370 ValueType* elements = stack_.template Pop<ValueType>(elementCount);
2371 stack_.template Top<ValueType>()->SetArrayRaw(elements, elementCount, GetAllocator());
2377 GenericDocument(
const GenericDocument&);
2379 GenericDocument& operator=(
const GenericDocument&);
2382 if (Allocator::kNeedFree)
2383 while (stack_.GetSize() > 0)
2384 (stack_.template Pop<ValueType>(1))->~ValueType();
2387 stack_.ShrinkToFit();
2394 static const size_t kDefaultStackCapacity = 1024;
2397 internal::Stack<StackAllocator> stack_;
2398 ParseResult parseResult_;
2405 template <
typename Encoding,
typename Allocator>
2406 template <
typename SourceAllocator>
2410 switch (rhs.GetType()) {
2415 RawAssign(*d.stack_.template Pop<GenericValue>(1));
2419 if (rhs.data_.f.flags == kConstStringFlag) {
2420 data_.f.flags = rhs.data_.f.flags;
2421 data_ = *
reinterpret_cast<const Data*
>(&rhs.data_);
2423 SetStringRaw(
StringRef(rhs.GetString(), rhs.GetStringLength()), allocator);
2427 data_.f.flags = rhs.data_.f.flags;
2428 data_ = *
reinterpret_cast<const Data*
>(&rhs.data_);
2438 template <
bool Const,
typename ValueT>
2443 typedef ValueT PlainType;
2445 typedef ValueType* ValueIterator;
2446 typedef const ValueT* ConstValueIterator;
2447 typedef typename ValueType::AllocatorType AllocatorType;
2448 typedef typename ValueType::StringRefType StringRefType;
2450 template <
typename,
typename>
2454 GenericArray& operator=(
const GenericArray& rhs) { value_ = rhs.value_;
return *
this; }
2457 SizeType Size()
const {
return value_.Size(); }
2458 SizeType Capacity()
const {
return value_.Capacity(); }
2459 bool Empty()
const {
return value_.Empty(); }
2460 void Clear()
const { value_.Clear(); }
2461 ValueType& operator[](
SizeType index)
const {
return value_[index]; }
2462 ValueIterator Begin()
const {
return value_.Begin(); }
2463 ValueIterator End()
const {
return value_.End(); }
2464 GenericArray Reserve(
SizeType newCapacity, AllocatorType &allocator)
const { value_.Reserve(newCapacity, allocator);
return *
this; }
2465 GenericArray PushBack(ValueType& value, AllocatorType& allocator)
const { value_.PushBack(value, allocator);
return *
this; }
2466 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2467 GenericArray PushBack(ValueType&& value, AllocatorType& allocator)
const { value_.PushBack(value, allocator);
return *
this; }
2468 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
2469 GenericArray PushBack(StringRefType value, AllocatorType& allocator)
const { value_.PushBack(value, allocator);
return *
this; }
2470 template <
typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (
const GenericArray&)) PushBack(T value, AllocatorType& allocator)
const { value_.PushBack(value, allocator);
return *
this; }
2471 GenericArray PopBack()
const { value_.PopBack();
return *
this; }
2472 ValueIterator Erase(ConstValueIterator pos)
const {
return value_.Erase(pos); }
2473 ValueIterator Erase(ConstValueIterator first, ConstValueIterator last)
const {
return value_.Erase(first, last); }
2475 #if RAPIDJSON_HAS_CXX11_RANGE_FOR
2476 ValueIterator begin()
const {
return value_.Begin(); }
2477 ValueIterator end()
const {
return value_.End(); }
2482 GenericArray(ValueType& value) : value_(value) {}
2491 template <
bool Const,
typename ValueT>
2492 class GenericObject {
2494 typedef GenericObject<true, ValueT> ConstObject;
2495 typedef GenericObject<false, ValueT> Object;
2496 typedef ValueT PlainType;
2498 typedef GenericMemberIterator<Const, typename ValueT::EncodingType, typename ValueT::AllocatorType> MemberIterator;
2499 typedef GenericMemberIterator<true, typename ValueT::EncodingType, typename ValueT::AllocatorType> ConstMemberIterator;
2500 typedef typename ValueType::AllocatorType AllocatorType;
2501 typedef typename ValueType::StringRefType StringRefType;
2502 typedef typename ValueType::EncodingType EncodingType;
2503 typedef typename ValueType::Ch Ch;
2505 template <
typename,
typename>
2506 friend class GenericValue;
2508 GenericObject(
const GenericObject& rhs) : value_(rhs.value_) {}
2509 GenericObject& operator=(
const GenericObject& rhs) { value_ = rhs.value_;
return *
this; }
2512 SizeType MemberCount()
const {
return value_.MemberCount(); }
2513 bool ObjectEmpty()
const {
return value_.ObjectEmpty(); }
2514 template <
typename T> ValueType& operator[](T* name)
const {
return value_[name]; }
2515 template <
typename SourceAllocator> ValueType& operator[](
const GenericValue<EncodingType, SourceAllocator>& name)
const {
return value_[name]; }
2516 #if RAPIDJSON_HAS_STDSTRING
2517 ValueType& operator[](
const std::basic_string<Ch>& name)
const {
return value_[name]; }
2519 MemberIterator MemberBegin()
const {
return value_.MemberBegin(); }
2520 MemberIterator MemberEnd()
const {
return value_.MemberEnd(); }
2521 bool HasMember(
const Ch* name)
const {
return value_.HasMember(name); }
2522 #if RAPIDJSON_HAS_STDSTRING
2523 bool HasMember(
const std::basic_string<Ch>& name)
const {
return value_.HasMember(name); }
2525 template <
typename SourceAllocator>
bool HasMember(
const GenericValue<EncodingType, SourceAllocator>& name)
const {
return value_.HasMember(name); }
2526 MemberIterator FindMember(
const Ch* name)
const {
return value_.FindMember(name); }
2527 template <
typename SourceAllocator> MemberIterator FindMember(
const GenericValue<EncodingType, SourceAllocator>& name)
const {
return value_.FindMember(name); }
2528 #if RAPIDJSON_HAS_STDSTRING
2529 MemberIterator FindMember(
const std::basic_string<Ch>& name)
const {
return value_.FindMember(name); }
2531 GenericObject AddMember(ValueType& name, ValueType& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2532 GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2533 #if RAPIDJSON_HAS_STDSTRING
2534 GenericObject AddMember(ValueType& name, std::basic_string<Ch>& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2536 template <
typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&)) AddMember(ValueType& name, T value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2537 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2538 GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2539 GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2540 GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2541 GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2542 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
2543 GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2544 GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2545 template <
typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2546 void RemoveAllMembers() {
return value_.RemoveAllMembers(); }
2547 bool RemoveMember(
const Ch* name)
const {
return value_.RemoveMember(name); }
2548 #if RAPIDJSON_HAS_STDSTRING
2549 bool RemoveMember(
const std::basic_string<Ch>& name)
const {
return value_.RemoveMember(name); }
2551 template <
typename SourceAllocator>
bool RemoveMember(
const GenericValue<EncodingType, SourceAllocator>& name)
const {
return value_.RemoveMember(name); }
2552 MemberIterator RemoveMember(MemberIterator m)
const {
return value_.RemoveMember(m); }
2553 MemberIterator EraseMember(ConstMemberIterator pos)
const {
return value_.EraseMember(pos); }
2554 MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last)
const {
return value_.EraseMember(first, last); }
2555 bool EraseMember(
const Ch* name)
const {
return value_.EraseMember(name); }
2556 #if RAPIDJSON_HAS_STDSTRING
2557 bool EraseMember(
const std::basic_string<Ch>& name)
const {
return EraseMember(ValueType(
StringRef(name))); }
2559 template <
typename SourceAllocator>
bool EraseMember(
const GenericValue<EncodingType, SourceAllocator>& name)
const {
return value_.EraseMember(name); }
2561 #if RAPIDJSON_HAS_CXX11_RANGE_FOR
2562 MemberIterator begin()
const {
return value_.MemberBegin(); }
2563 MemberIterator end()
const {
return value_.MemberEnd(); }
2568 GenericObject(ValueType& value) : value_(value) {}
2572 RAPIDJSON_NAMESPACE_END
2575 #endif // RAPIDJSON_DOCUMENT_H_