15 #ifndef RAPIDJSON_DOCUMENT_H_ 16 #define RAPIDJSON_DOCUMENT_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 53 template <
typename Encoding,
typename Allocator>
56 template <
typename Encoding,
typename Allocator,
typename StackAllocator>
65 template <
typename Encoding,
typename Allocator>
73 a.value.Swap(b.value);
80 #ifndef RAPIDJSON_NOMEMBERITERATORCLASS 101 template <
bool Const,
typename Encoding,
typename Allocator>
203 #else // RAPIDJSON_NOMEMBERITERATORCLASS 207 template <
bool Const,
typename Encoding,
typename Allocator>
211 template <
typename Encoding,
typename Allocator>
217 template <
typename Encoding,
typename Allocator>
223 #endif // RAPIDJSON_NOMEMBERITERATORCLASS 255 template<
typename CharType>
260 #ifndef __clang__ // -Wdocumentation 286 : s(str), length(N-1) {}
289 #ifndef __clang__ // -Wdocumentation 310 : s(str), length(NotNullStrLen(str)) {}
313 #ifndef __clang__ // -Wdocumentation 327 operator const Ch *()
const {
return s; }
339 static const Ch emptyString[];
348 template<
typename CharType>
363 template<
typename CharType>
383 template<
typename CharType>
388 #if RAPIDJSON_HAS_STDSTRING 401 template<
typename CharType>
411 template <
typename T,
typename Encoding =
void,
typename Allocator =
void>
416 : IsBaseOf<GenericValue<typename T::EncodingType, typename T::AllocatorType>, T>
::Type {};
428 template <
typename ValueType,
typename T>
431 template<
typename ValueType>
433 static bool Is(
const ValueType& v) {
return v.IsBool(); }
434 static bool Get(
const ValueType& v) {
return v.GetBool(); }
435 static ValueType&
Set(ValueType& v,
bool data) {
return v.SetBool(data); }
436 static ValueType&
Set(ValueType& v,
bool data,
typename ValueType::AllocatorType&) {
return v.SetBool(data); }
439 template<
typename ValueType>
441 static bool Is(
const ValueType& v) {
return v.IsInt(); }
442 static int Get(
const ValueType& v) {
return v.GetInt(); }
443 static ValueType&
Set(ValueType& v,
int data) {
return v.SetInt(data); }
444 static ValueType&
Set(ValueType& v,
int data,
typename ValueType::AllocatorType&) {
return v.SetInt(data); }
447 template<
typename ValueType>
449 static bool Is(
const ValueType& v) {
return v.IsUint(); }
450 static unsigned Get(
const ValueType& v) {
return v.GetUint(); }
451 static ValueType&
Set(ValueType& v,
unsigned data) {
return v.SetUint(data); }
452 static ValueType&
Set(ValueType& v,
unsigned data,
typename ValueType::AllocatorType&) {
return v.SetUint(data); }
457 template<
typename ValueType>
459 static bool Is(
const ValueType& v) {
return v.IsInt(); }
460 static long Get(
const ValueType& v) {
return v.GetInt(); }
461 static ValueType& Set(ValueType& v,
long data) {
return v.SetInt(data); }
462 static ValueType& Set(ValueType& v,
long data,
typename ValueType::AllocatorType&) {
return v.SetInt(data); }
466 template<
typename ValueType>
468 static bool Is(
const ValueType& v) {
return v.IsUint(); }
469 static unsigned long Get(
const ValueType& v) {
return v.GetUint(); }
470 static ValueType& Set(ValueType& v,
unsigned long data) {
return v.SetUint(data); }
471 static ValueType& Set(ValueType& v,
unsigned long data,
typename ValueType::AllocatorType&) {
return v.SetUint(data); }
475 template<
typename ValueType>
477 static bool Is(
const ValueType& v) {
return v.IsInt64(); }
478 static int64_t Get(
const ValueType& v) {
return v.GetInt64(); }
479 static ValueType&
Set(ValueType& v,
int64_t data) {
return v.SetInt64(data); }
480 static ValueType&
Set(ValueType& v,
int64_t data,
typename ValueType::AllocatorType&) {
return v.SetInt64(data); }
483 template<
typename ValueType>
485 static bool Is(
const ValueType& v) {
return v.IsUint64(); }
487 static ValueType&
Set(ValueType& v,
uint64_t data) {
return v.SetUint64(data); }
488 static ValueType&
Set(ValueType& v,
uint64_t data,
typename ValueType::AllocatorType&) {
return v.SetUint64(data); }
491 template<
typename ValueType>
493 static bool Is(
const ValueType& v) {
return v.IsDouble(); }
494 static double Get(
const ValueType& v) {
return v.GetDouble(); }
495 static ValueType&
Set(ValueType& v,
double data) {
return v.SetDouble(data); }
496 static ValueType&
Set(ValueType& v,
double data,
typename ValueType::AllocatorType&) {
return v.SetDouble(data); }
499 template<
typename ValueType>
501 static bool Is(
const ValueType& v) {
return v.IsFloat(); }
502 static float Get(
const ValueType& v) {
return v.GetFloat(); }
503 static ValueType&
Set(ValueType& v,
float data) {
return v.SetFloat(data); }
504 static ValueType&
Set(ValueType& v,
float data,
typename ValueType::AllocatorType&) {
return v.SetFloat(data); }
507 template<
typename ValueType>
508 struct TypeHelper<ValueType, const typename ValueType::Ch*> {
510 static bool Is(
const ValueType& v) {
return v.IsString(); }
511 static StringType
Get(
const ValueType& v) {
return v.GetString(); }
512 static ValueType&
Set(ValueType& v,
const StringType data) {
return v.SetString(
typename ValueType::StringRefType(data)); }
513 static ValueType&
Set(ValueType& v,
const StringType data,
typename ValueType::AllocatorType&
a) {
return v.SetString(data, a); }
516 #if RAPIDJSON_HAS_STDSTRING 517 template<
typename ValueType>
518 struct TypeHelper<ValueType, std::basic_string<typename ValueType::Ch> > {
519 typedef std::basic_string<typename ValueType::Ch>
StringType;
520 static bool Is(
const ValueType& v) {
return v.IsString(); }
521 static StringType Get(
const ValueType& v) {
return StringType(v.GetString(), v.GetStringLength()); }
522 static ValueType& Set(ValueType& v,
const StringType& data,
typename ValueType::AllocatorType&
a) {
return v.SetString(data, a); }
526 template<
typename ValueType>
529 static bool Is(
const ValueType& v) {
return v.IsArray(); }
530 static ArrayType
Get(ValueType& v) {
return v.GetArray(); }
531 static ValueType&
Set(ValueType& v, ArrayType data) {
return v = data; }
532 static ValueType&
Set(ValueType& v, ArrayType data,
typename ValueType::AllocatorType&) {
return v = data; }
535 template<
typename ValueType>
536 struct TypeHelper<ValueType, typename ValueType::ConstArray> {
538 static bool Is(
const ValueType& v) {
return v.IsArray(); }
539 static ArrayType
Get(
const ValueType& v) {
return v.GetArray(); }
542 template<
typename ValueType>
545 static bool Is(
const ValueType& v) {
return v.IsObject(); }
546 static ObjectType
Get(ValueType& v) {
return v.GetObject(); }
547 static ValueType&
Set(ValueType& v, ObjectType data) {
return v = data; }
548 static ValueType&
Set(ValueType& v, ObjectType data,
typename ValueType::AllocatorType&) {
return v = data; }
551 template<
typename ValueType>
552 struct TypeHelper<ValueType, typename ValueType::ConstObject> {
554 static bool Is(
const ValueType& v) {
return v.IsObject(); }
555 static ObjectType
Get(
const ValueType& v) {
return v.GetObject(); }
577 template <
typename Encoding,
typename Allocator = MemoryPoolAllocator<> >
584 typedef typename Encoding::Ch
Ch;
600 GenericValue() RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; }
602 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 613 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 614 template <
typename StackAllocator>
619 template <
typename StackAllocator>
631 static const uint16_t defaultFlags[] = {
632 kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag,
636 data_.f.flags = defaultFlags[type];
640 data_.ss.SetLength(0);
651 template <
typename SourceAllocator>
653 switch (rhs.GetType()) {
656 Member* lm =
reinterpret_cast<Member*
>(allocator.Malloc(count *
sizeof(Member)));
658 for (
SizeType i = 0; i < count; i++) {
662 data_.f.flags = kObjectFlag;
663 data_.o.size = data_.o.capacity = count;
664 SetMembersPointer(lm);
671 for (
SizeType i = 0; i < count; i++)
672 new (&le[i])
GenericValue(re[i], allocator, copyConstStrings);
673 data_.f.flags = kArrayFlag;
674 data_.a.size = data_.a.capacity = count;
675 SetElementsPointer(le);
679 if (rhs.
data_.f.flags == kConstStringFlag && !copyConstStrings) {
680 data_.f.flags = rhs.
data_.f.flags;
681 data_ = *
reinterpret_cast<const Data*
>(&rhs.
data_);
684 SetStringRaw(
StringRef(rhs.GetString(), rhs.GetStringLength()), allocator);
687 data_.f.flags = rhs.
data_.f.flags;
688 data_ = *
reinterpret_cast<const Data*
>(&rhs.
data_);
699 #ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen 700 template <
typename T>
701 explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame<bool, T>))) RAPIDJSON_NOEXCEPT
708 data_.f.flags = b ? kTrueFlag : kFalseFlag;
714 data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag;
720 data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag);
726 data_.f.flags = kNumberInt64Flag;
728 data_.f.flags |= kNumberUint64Flag;
730 data_.f.flags |= kUintFlag;
732 data_.f.flags |= kIntFlag;
735 data_.f.flags |= kIntFlag;
741 data_.f.flags = kNumberUint64Flag;
743 data_.f.flags |= kInt64Flag;
745 data_.f.flags |= kUintFlag;
747 data_.f.flags |= kIntFlag;
751 explicit GenericValue(
double d) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; }
754 explicit GenericValue(
float f) RAPIDJSON_NOEXCEPT : data_() { data_.n.d =
static_cast<double>(f); data_.f.flags = kNumberDoubleFlag; }
760 explicit GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(s); }
768 #if RAPIDJSON_HAS_STDSTRING 772 GenericValue(
const std::basic_string<Ch>& s, Allocator& allocator) : data_() { SetStringRaw(
StringRef(s), allocator); }
782 a.value_.data_ = Data();
783 a.value_.data_.f.flags = kArrayFlag;
793 o.value_.data_ = Data();
794 o.value_.data_.f.flags = kObjectFlag;
801 if (Allocator::kNeedFree) {
802 switch(data_.f.flags) {
813 for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m)
815 Allocator::Free(GetMembersPointer());
818 case kCopyStringFlag:
819 Allocator::Free(const_cast<Ch*>(GetStringPointer()));
844 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 847 return *
this = rhs.Move();
873 template <
typename T>
887 template <
typename SourceAllocator>
889 RAPIDJSON_ASSERT(static_cast<void*>(
this) != static_cast<void const*>(&rhs));
891 new (
this)
GenericValue(rhs, allocator, copyConstStrings);
924 GenericValue& Move() RAPIDJSON_NOEXCEPT {
return *
this; }
934 template <
typename SourceAllocator>
937 if (GetType() != rhs.GetType())
942 if (data_.o.size != rhs.
data_.o.size)
944 for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) {
945 typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name);
946 if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value)
952 if (data_.a.size != rhs.
data_.a.size)
954 for (
SizeType i = 0; i < data_.a.size; i++)
955 if ((*
this)[i] != rhs[i])
960 return StringEqual(rhs);
963 if (IsDouble() || rhs.IsDouble()) {
964 double a = GetDouble();
965 double b = rhs.GetDouble();
966 return a >= b && a <= b;
969 return data_.n.u64 == rhs.
data_.n.u64;
979 #if RAPIDJSON_HAS_STDSTRING 983 bool operator==(
const std::basic_string<Ch>& rhs)
const {
return *
this ==
GenericValue(
StringRef(rhs)); }
994 template <
typename SourceAllocator>
998 bool operator!=(
const Ch* rhs)
const {
return !(*
this == rhs); }
1019 Type GetType()
const {
return static_cast<Type>(data_.f.flags & kTypeMask); }
1020 bool IsNull()
const {
return data_.f.flags == kNullFlag; }
1021 bool IsFalse()
const {
return data_.f.flags == kFalseFlag; }
1022 bool IsTrue()
const {
return data_.f.flags == kTrueFlag; }
1023 bool IsBool()
const {
return (data_.f.flags & kBoolFlag) != 0; }
1024 bool IsObject()
const {
return data_.f.flags == kObjectFlag; }
1025 bool IsArray()
const {
return data_.f.flags == kArrayFlag; }
1026 bool IsNumber()
const {
return (data_.f.flags & kNumberFlag) != 0; }
1027 bool IsInt()
const {
return (data_.f.flags & kIntFlag) != 0; }
1028 bool IsUint()
const {
return (data_.f.flags & kUintFlag) != 0; }
1029 bool IsInt64()
const {
return (data_.f.flags & kInt64Flag) != 0; }
1030 bool IsUint64()
const {
return (data_.f.flags & kUint64Flag) != 0; }
1031 bool IsDouble()
const {
return (data_.f.flags & kDoubleFlag) != 0; }
1032 bool IsString()
const {
return (data_.f.flags & kStringFlag) != 0; }
1035 bool IsLosslessDouble()
const {
1036 if (!IsNumber())
return false;
1039 volatile double d =
static_cast<double>(u);
1041 && (d < static_cast<double>((std::numeric_limits<uint64_t>::max)()))
1042 && (u ==
static_cast<uint64_t>(d));
1046 volatile double d =
static_cast<double>(i);
1047 return (d >= static_cast<double>((std::numeric_limits<int64_t>::min)()))
1048 && (d < static_cast<double>((std::numeric_limits<int64_t>::max)()))
1049 && (i == static_cast<int64_t>(d));
1055 bool IsFloat()
const {
1056 if ((data_.f.flags & kDoubleFlag) == 0)
1058 double d = GetDouble();
1059 return d >= -3.4028234e38 && d <= 3.4028234e38;
1062 bool IsLosslessFloat()
const {
1063 if (!IsNumber())
return false;
1064 double a = GetDouble();
1065 if (a < static_cast<double>(-(std::numeric_limits<float>::max)())
1066 || a > static_cast<double>((std::numeric_limits<float>::max)()))
1068 double b =
static_cast<double>(
static_cast<float>(
a));
1069 return a >= b && a <= b;
1084 bool GetBool()
const {
RAPIDJSON_ASSERT(IsBool());
return data_.f.flags == kTrueFlag; }
1105 bool ObjectEmpty()
const {
RAPIDJSON_ASSERT(IsObject());
return data_.o.size == 0; }
1116 template <
typename T>
1121 template <
typename T>
1133 template <
typename SourceAllocator>
1135 MemberIterator member = FindMember(name);
1136 if (member != MemberEnd())
1137 return member->value;
1150 template <
typename SourceAllocator>
1153 #if RAPIDJSON_HAS_STDSTRING 1161 ConstMemberIterator MemberBegin()
const {
RAPIDJSON_ASSERT(IsObject());
return ConstMemberIterator(GetMembersPointer()); }
1164 ConstMemberIterator MemberEnd()
const {
RAPIDJSON_ASSERT(IsObject());
return ConstMemberIterator(GetMembersPointer() + data_.o.size); }
1167 MemberIterator MemberBegin() {
RAPIDJSON_ASSERT(IsObject());
return MemberIterator(GetMembersPointer()); }
1170 MemberIterator MemberEnd() {
RAPIDJSON_ASSERT(IsObject());
return MemberIterator(GetMembersPointer() + data_.o.size); }
1180 if (newCapacity > data_.o.capacity) {
1181 SetMembersPointer(reinterpret_cast<Member*>(allocator.Realloc(GetMembersPointer(), data_.o.capacity *
sizeof(Member), newCapacity *
sizeof(Member))));
1182 data_.o.capacity = newCapacity;
1195 bool HasMember(
const Ch* name)
const {
return FindMember(name) != MemberEnd(); }
1197 #if RAPIDJSON_HAS_STDSTRING 1206 bool HasMember(
const std::basic_string<Ch>& name)
const {
return FindMember(name) != MemberEnd(); }
1218 template <
typename SourceAllocator>
1233 MemberIterator FindMember(
const Ch* name) {
1235 return FindMember(n);
1238 ConstMemberIterator FindMember(
const Ch* name)
const {
return const_cast<GenericValue&
>(*this).FindMember(name); }
1253 template <
typename SourceAllocator>
1257 MemberIterator member = MemberBegin();
1258 for ( ; member != MemberEnd(); ++member)
1265 #if RAPIDJSON_HAS_STDSTRING 1273 MemberIterator FindMember(
const std::basic_string<Ch>& name) {
return FindMember(
GenericValue(
StringRef(name))); }
1274 ConstMemberIterator FindMember(
const std::basic_string<Ch>& name)
const {
return FindMember(
GenericValue(
StringRef(name))); }
1291 ObjectData& o = data_.o;
1292 if (o.size >= o.capacity)
1293 MemberReserve(o.capacity == 0 ? kDefaultObjectCapacity : (o.capacity + (o.capacity + 1) / 2), allocator);
1294 Member* members = GetMembersPointer();
1295 members[o.size].
name.RawAssign(name);
1296 members[o.size].
value.RawAssign(value);
1312 return AddMember(name, v, allocator);
1315 #if RAPIDJSON_HAS_STDSTRING 1327 return AddMember(name, v, allocator);
1348 template <
typename T>
1350 AddMember(
GenericValue& name, T value, Allocator& allocator) {
1352 return AddMember(name, v, allocator);
1355 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 1357 return AddMember(name, value, allocator);
1360 return AddMember(name, value, allocator);
1363 return AddMember(name, value, allocator);
1367 return AddMember(n, value, allocator);
1369 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS 1384 return AddMember(n, value, allocator);
1396 GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) {
1398 return AddMember(name, v, allocator);
1418 template <
typename T>
1420 AddMember(StringRefType name, T value, Allocator& allocator) {
1422 return AddMember(n, value, allocator);
1429 void RemoveAllMembers() {
1431 for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m)
1444 bool RemoveMember(
const Ch* name) {
1446 return RemoveMember(n);
1449 #if RAPIDJSON_HAS_STDSTRING 1450 bool RemoveMember(
const std::basic_string<Ch>& name) {
return RemoveMember(
GenericValue(
StringRef(name))); }
1453 template <
typename SourceAllocator>
1455 MemberIterator m = FindMember(name);
1456 if (m != MemberEnd()) {
1472 MemberIterator RemoveMember(MemberIterator m) {
1478 MemberIterator last(GetMembersPointer() + (data_.o.size - 1));
1479 if (data_.o.size > 1 && m != last)
1496 MemberIterator EraseMember(ConstMemberIterator pos) {
1497 return EraseMember(pos, pos +1);
1509 MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) {
1517 MemberIterator pos = MemberBegin() + (first - MemberBegin());
1518 for (MemberIterator itr = pos; itr != last; ++itr)
1520 std::memmove(static_cast<void*>(&*pos), &*last, static_cast<size_t>(MemberEnd() - last) *
sizeof(Member));
1521 data_.o.size -=
static_cast<SizeType>(last - first);
1530 bool EraseMember(
const Ch* name) {
1532 return EraseMember(n);
1535 #if RAPIDJSON_HAS_STDSTRING 1536 bool EraseMember(
const std::basic_string<Ch>& name) {
return EraseMember(
GenericValue(
StringRef(name))); }
1539 template <
typename SourceAllocator>
1541 MemberIterator m = FindMember(name);
1542 if (m != MemberEnd()) {
1551 ConstObject GetObject()
const {
RAPIDJSON_ASSERT(IsObject());
return ConstObject(*
this); }
1569 bool Empty()
const {
RAPIDJSON_ASSERT(IsArray());
return data_.a.size == 0; }
1591 return GetElementsPointer()[index];
1597 ValueIterator Begin() {
RAPIDJSON_ASSERT(IsArray());
return GetElementsPointer(); }
1600 ValueIterator End() {
RAPIDJSON_ASSERT(IsArray());
return GetElementsPointer() + data_.a.size; }
1603 ConstValueIterator Begin()
const {
return const_cast<GenericValue&
>(*this).Begin(); }
1606 ConstValueIterator End()
const {
return const_cast<GenericValue&
>(*this).End(); }
1616 if (newCapacity > data_.a.capacity) {
1617 SetElementsPointer(reinterpret_cast<GenericValue*>(allocator.Realloc(GetElementsPointer(), data_.a.capacity *
sizeof(
GenericValue), newCapacity *
sizeof(
GenericValue))));
1618 data_.a.capacity = newCapacity;
1635 if (data_.a.size >= data_.a.capacity)
1636 Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator);
1637 GetElementsPointer()[data_.a.size++].RawAssign(value);
1641 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 1643 return PushBack(value, allocator);
1645 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS 1656 GenericValue& PushBack(StringRefType value, Allocator& allocator) {
1657 return (*this).template PushBack<StringRefType>(value, allocator);
1677 template <
typename T>
1679 PushBack(T value, Allocator& allocator) {
1681 return PushBack(v, allocator);
1691 GetElementsPointer()[--data_.a.size].~GenericValue();
1702 ValueIterator Erase(ConstValueIterator pos) {
1703 return Erase(pos, pos + 1);
1714 ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) {
1721 ValueIterator pos = Begin() + (first - Begin());
1722 for (ValueIterator itr = pos; itr != last; ++itr)
1724 std::memmove(static_cast<void*>(pos), last, static_cast<size_t>(End() - last) *
sizeof(
GenericValue));
1725 data_.a.size -=
static_cast<SizeType>(last - first);
1730 ConstArray GetArray()
const {
RAPIDJSON_ASSERT(IsArray());
return ConstArray(*
this); }
1737 int GetInt()
const {
RAPIDJSON_ASSERT(data_.f.flags & kIntFlag);
return data_.n.i.i; }
1738 unsigned GetUint()
const {
RAPIDJSON_ASSERT(data_.f.flags & kUintFlag);
return data_.n.u.u; }
1745 double GetDouble()
const {
1747 if ((data_.f.flags & kDoubleFlag) != 0)
return data_.n.d;
1748 if ((data_.f.flags & kIntFlag) != 0)
return data_.n.i.i;
1749 if ((data_.f.flags & kUintFlag) != 0)
return data_.n.u.u;
1750 if ((data_.f.flags & kInt64Flag) != 0)
return static_cast<double>(data_.n.i64);
1751 RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0);
return static_cast<double>(data_.n.u64);
1757 float GetFloat()
const {
1758 return static_cast<float>(GetDouble());
1773 const Ch* GetString()
const {
RAPIDJSON_ASSERT(IsString());
return (data_.f.flags & kInlineStrFlag) ? data_.ss.str : GetStringPointer(); }
1778 SizeType GetStringLength()
const {
RAPIDJSON_ASSERT(IsString());
return ((data_.f.flags & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); }
1813 GenericValue& SetString(
const Ch* s, Allocator& allocator) {
return SetString(
StringRef(s), allocator); }
1821 GenericValue& SetString(StringRefType s, Allocator& allocator) { this->~
GenericValue(); SetStringRaw(s, allocator);
return *
this; }
1823 #if RAPIDJSON_HAS_STDSTRING 1831 GenericValue& SetString(
const std::basic_string<Ch>& s, Allocator& allocator) {
return SetString(
StringRef(s), allocator); }
1843 template <
typename T>
1846 template <
typename T>
1849 template <
typename T>
1852 template<
typename T>
1855 template<
typename T>
1867 template <
typename Handler>
1868 bool Accept(Handler& handler)
const {
1872 case kTrueType:
return handler.Bool(
true);
1877 for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) {
1879 if (
RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0)))
1884 return handler.EndObject(data_.o.size);
1892 return handler.EndArray(data_.a.size);
1895 return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0);
1899 if (IsDouble())
return handler.Double(data_.n.d);
1900 else if (IsInt())
return handler.Int(data_.n.i.i);
1901 else if (IsUint())
return handler.Uint(data_.n.u.u);
1902 else if (IsInt64())
return handler.Int64(data_.n.i64);
1903 else return handler.Uint64(data_.n.u64);
1908 template <
typename,
typename>
friend class GenericValue;
1946 #if RAPIDJSON_48BITPOINTER_OPTIMIZATION 1947 char payload[
sizeof(
SizeType) * 2 + 6];
1948 #elif RAPIDJSON_64BIT 1949 char payload[
sizeof(
SizeType) * 2 +
sizeof(
void*) + 6];
1951 char payload[
sizeof(
SizeType) * 2 +
sizeof(
void*) + 2];
1971 enum { MaxChars =
sizeof(
static_cast<Flag*
>(0)->payload) /
sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize };
1981 #if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN 2035 data_.f.flags = kArrayFlag;
2038 SetElementsPointer(e);
2039 std::memcpy(static_cast<void*>(e), values, count *
sizeof(
GenericValue));
2042 SetElementsPointer(0);
2043 data_.a.size = data_.a.capacity = count;
2048 data_.f.flags = kObjectFlag;
2050 Member* m =
static_cast<Member*
>(allocator.Malloc(count *
sizeof(Member)));
2051 SetMembersPointer(m);
2052 std::memcpy(static_cast<void*>(m), members, count *
sizeof(Member));
2055 SetMembersPointer(0);
2056 data_.o.size = data_.o.capacity = count;
2061 data_.f.flags = kConstStringFlag;
2062 SetStringPointer(s);
2063 data_.s.length = s.length;
2069 if (ShortString::Usable(s.
length)) {
2070 data_.f.flags = kShortStringFlag;
2071 data_.ss.SetLength(s.
length);
2074 data_.f.flags = kCopyStringFlag;
2075 data_.s.length = s.
length;
2076 str =
static_cast<Ch *
>(allocator.Malloc((s.
length + 1) *
sizeof(Ch)));
2077 SetStringPointer(str);
2079 std::memcpy(str, s, s.
length *
sizeof(Ch));
2090 template <
typename SourceAllocator>
2095 const SizeType len1 = GetStringLength();
2096 const SizeType len2 = rhs.GetStringLength();
2097 if(len1 != len2) {
return false; }
2099 const Ch*
const str1 = GetString();
2100 const Ch*
const str2 = rhs.GetString();
2101 if(str1 == str2) {
return true; }
2103 return (std::memcmp(str1, str2,
sizeof(Ch) * len1) == 0);
2123 template <
typename Encoding,
typename Allocator = MemoryPoolAllocator<>,
typename StackAllocator = CrtAllocator>
2126 typedef typename Encoding::Ch
Ch;
2137 explicit GenericDocument(
Type type, Allocator* allocator = 0,
size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) :
2138 GenericValue<Encoding, Allocator>(type), allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()
2150 GenericDocument(Allocator* allocator = 0,
size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) :
2151 allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()
2157 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 2160 : ValueType(std::forward<ValueType>(rhs)),
2161 allocator_(rhs.allocator_),
2162 ownAllocator_(rhs.ownAllocator_),
2163 stack_(std::move(rhs.stack_)),
2164 parseResult_(rhs.parseResult_)
2167 rhs.ownAllocator_ = 0;
2176 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 2182 ValueType::operator=(std::forward<ValueType>(rhs));
2187 allocator_ = rhs.allocator_;
2188 ownAllocator_ = rhs.ownAllocator_;
2189 stack_ = std::move(rhs.stack_);
2190 parseResult_ = rhs.parseResult_;
2193 rhs.ownAllocator_ = 0;
2208 stack_.Swap(rhs.stack_);
2238 template <
typename Generator>
2243 ValueType::operator=(*stack_.template Pop<ValueType>(1));
2258 template <
unsigned parseFlags,
typename SourceEncoding,
typename InputStream>
2261 stack_.HasAllocator() ? &stack_.GetAllocator() : 0);
2263 parseResult_ = reader.template Parse<parseFlags>(is, *
this);
2266 ValueType::operator=(*stack_.template Pop<ValueType>(1));
2277 template <
unsigned parseFlags,
typename InputStream>
2279 return ParseStream<parseFlags, Encoding, InputStream>(is);
2287 template <
typename InputStream>
2289 return ParseStream<kParseDefaultFlags, Encoding, InputStream>(is);
2301 template <
unsigned parseFlags>
2304 return ParseStream<parseFlags | kParseInsituFlag>(s);
2312 return ParseInsitu<kParseDefaultFlags>(str);
2324 template <
unsigned parseFlags,
typename SourceEncoding>
2328 return ParseStream<parseFlags, SourceEncoding>(s);
2335 template <
unsigned parseFlags>
2337 return Parse<parseFlags, Encoding>(str);
2344 return Parse<kParseDefaultFlags>(str);
2347 template <
unsigned parseFlags,
typename SourceEncoding>
2350 MemoryStream ms(reinterpret_cast<const char*>(str), length *
sizeof(
typename SourceEncoding::Ch));
2352 ParseStream<parseFlags, SourceEncoding>(is);
2356 template <
unsigned parseFlags>
2358 return Parse<parseFlags, Encoding>(str, length);
2362 return Parse<kParseDefaultFlags>(str, length);
2365 #if RAPIDJSON_HAS_STDSTRING 2366 template <
unsigned parseFlags,
typename SourceEncoding>
2367 GenericDocument& Parse(
const std::basic_string<typename SourceEncoding::Ch>& str) {
2369 return Parse<parseFlags, SourceEncoding>(str.c_str());
2372 template <
unsigned parseFlags>
2374 return Parse<parseFlags, Encoding>(str.c_str());
2378 return Parse<kParseDefaultFlags>(str);
2380 #endif // RAPIDJSON_HAS_STDSTRING 2397 #ifndef __clang // -Wdocumentation 2437 bool Null() {
new (stack_.template Push<ValueType>())
ValueType();
return true; }
2438 bool Bool(
bool b) {
new (stack_.template Push<ValueType>())
ValueType(b);
return true; }
2439 bool Int(
int i) {
new (stack_.template Push<ValueType>())
ValueType(i);
return true; }
2440 bool Uint(
unsigned i) {
new (stack_.template Push<ValueType>())
ValueType(i);
return true; }
2443 bool Double(
double d) {
new (stack_.template Push<ValueType>())
ValueType(d);
return true; }
2447 new (stack_.template Push<ValueType>())
ValueType(str, length, GetAllocator());
2449 new (stack_.template Push<ValueType>())
ValueType(str, length);
2455 new (stack_.template Push<ValueType>())
ValueType(str, length, GetAllocator());
2457 new (stack_.template Push<ValueType>())
ValueType(str, length);
2466 typename ValueType::Member* members = stack_.template Pop<typename ValueType::Member>(memberCount);
2467 stack_.template Top<ValueType>()->
SetObjectRaw(members, memberCount, GetAllocator());
2474 ValueType* elements = stack_.template Pop<ValueType>(elementCount);
2475 stack_.template Top<ValueType>()->
SetArrayRaw(elements, elementCount, GetAllocator());
2486 if (Allocator::kNeedFree)
2487 while (stack_.GetSize() > 0)
2488 (stack_.template Pop<ValueType>(1))->~
ValueType();
2491 stack_.ShrinkToFit();
2498 static const size_t kDefaultStackCapacity = 1024;
2513 template <
bool Const,
typename ValueT>
2525 template <
typename,
typename>
2534 bool Empty()
const {
return value_.Empty(); }
2537 ValueIterator
Begin()
const {
return value_.Begin(); }
2538 ValueIterator
End()
const {
return value_.End(); }
2541 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 2543 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS 2547 ValueIterator
Erase(ConstValueIterator pos)
const {
return value_.Erase(pos); }
2548 ValueIterator
Erase(ConstValueIterator first, ConstValueIterator last)
const {
return value_.Erase(first, last); }
2550 #if RAPIDJSON_HAS_CXX11_RANGE_FOR 2551 ValueIterator begin()
const {
return value_.Begin(); }
2552 ValueIterator end()
const {
return value_.End(); }
2566 template <
bool Const,
typename ValueT>
2578 typedef typename ValueType::Ch
Ch;
2580 template <
typename,
typename>
2592 #if RAPIDJSON_HAS_STDSTRING 2593 ValueType& operator[](
const std::basic_string<Ch>&
name)
const {
return value_[
name]; }
2596 MemberIterator
MemberEnd()
const {
return value_.MemberEnd(); }
2598 bool HasMember(
const Ch* name)
const {
return value_.HasMember(name); }
2599 #if RAPIDJSON_HAS_STDSTRING 2600 bool HasMember(
const std::basic_string<Ch>& name)
const {
return value_.HasMember(name); }
2603 MemberIterator
FindMember(
const Ch* name)
const {
return value_.FindMember(name); }
2605 #if RAPIDJSON_HAS_STDSTRING 2606 MemberIterator FindMember(
const std::basic_string<Ch>& name)
const {
return value_.FindMember(name); }
2610 #if RAPIDJSON_HAS_STDSTRING 2611 GenericObject AddMember(ValueType& name, std::basic_string<Ch>&
value, AllocatorType& allocator)
const { value_.
AddMember(name, value, allocator);
return *
this; }
2614 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 2615 GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator)
const { value_.
AddMember(name, value, allocator);
return *
this; }
2616 GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator)
const { value_.
AddMember(name, value, allocator);
return *
this; }
2617 GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator)
const { value_.
AddMember(name, value, allocator);
return *
this; }
2618 GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator)
const { value_.
AddMember(name, value, allocator);
return *
this; }
2619 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS 2624 bool RemoveMember(
const Ch* name)
const {
return value_.RemoveMember(name); }
2625 #if RAPIDJSON_HAS_STDSTRING 2626 bool RemoveMember(
const std::basic_string<Ch>& name)
const {
return value_.RemoveMember(name); }
2629 MemberIterator
RemoveMember(MemberIterator m)
const {
return value_.RemoveMember(m); }
2630 MemberIterator
EraseMember(ConstMemberIterator pos)
const {
return value_.EraseMember(pos); }
2631 MemberIterator
EraseMember(ConstMemberIterator first, ConstMemberIterator last)
const {
return value_.EraseMember(first, last); }
2632 bool EraseMember(
const Ch* name)
const {
return value_.EraseMember(name); }
2633 #if RAPIDJSON_HAS_STDSTRING 2634 bool EraseMember(
const std::basic_string<Ch>& name)
const {
return EraseMember(
ValueType(
StringRef(name))); }
2638 #if RAPIDJSON_HAS_CXX11_RANGE_FOR 2639 MemberIterator begin()
const {
return value_.MemberBegin(); }
2640 MemberIterator end()
const {
return value_.MemberEnd(); }
2652 #endif // RAPIDJSON_DOCUMENT_H_
GenericDocument & Parse(const typename SourceEncoding::Ch *str)
Parse JSON text from a read-only string (with Encoding conversion)
Iterator & operator=(const NonConstIterator &it)
SizeType MemberCount() const
static bool Get(const ValueType &v)
ValueType::AllocatorType AllocatorType
GenericMemberIterator< false, Encoding, Allocator > NonConstIterator
Non-constant iterator type.
static ValueType & Set(ValueType &v, unsigned data)
static bool Is(const ValueType &v)
static ValueType & Set(ValueType &v, ObjectType data, typename ValueType::AllocatorType &)
GenericDocument & Parse(const Ch *str)
Parse JSON text from a read-only string.
ValueType & operator[](T *name) const
GenericObject< true, ValueType > ConstObject
void RawAssign(GenericValue &rhs) RAPIDJSON_NOEXCEPT
Assignment without calling destructor.
static bool Is(const ValueType &v)
GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame< bool, T >))) RAPIDJSON_NOEXCEPT
Constructor for boolean value.
GenericDocument & ParseInsitu(Ch *str)
Parse JSON text from a mutable string.
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.)
GenericValue & operator=(StringRefType str) RAPIDJSON_NOEXCEPT
Assignment of constant string reference (no copy)
bool operator<=(ConstIterator that) const
Reference operator[](DifferenceType n) const
friend void swap(GenericMember &a, GenericMember &b) RAPIDJSON_NOEXCEPT
ParseErrorCode GetParseError() const
Get the ParseErrorCode of last parsing.
GenericStringRef(const CharType *str, SizeType len)
Create constant string reference from pointer and length.
#define RAPIDJSON_UINT64_C2(high32, low32)
Construct a 64-bit literal by a pair of 32-bit integer.
GenericValue(unsigned u) RAPIDJSON_NOEXCEPT
Constructor for unsigned value.
GenericDocument & ParseInsitu(Ch *str)
Parse JSON text from a mutable string (with kParseDefaultFlags)
static ValueType & Set(ValueType &v, ArrayType data)
GenericMember< Encoding, Allocator > PlainType
MemberIterator MemberEnd() const
static bool Is(const ValueType &v)
static bool Is(const ValueType &v)
Encoding::Ch Ch
Character type derived from Encoding.
bool HasMember(const Ch *name) const
GenericDocument & Parse(const typename SourceEncoding::Ch *str, size_t length)
GenericValue< Encoding, Allocator > ValueType
Value type of the document.
const ValueT * ConstValueIterator
GenericObject AddMember(ValueType &name, StringRefType value, AllocatorType &allocator) const
static bool Is(const ValueType &v)
internal::MaybeAddConst< Const, PlainType >::Type ValueType
ValueType::AllocatorType AllocatorType
const Ch *const s
plain CharType pointer
Name-value pair in a JSON object value.
void SetObjectRaw(Member *members, SizeType count, Allocator &allocator)
Initialize this value as object with initial data, without calling destructor.
RAPIDJSON_FORCEINLINE Member * GetMembersPointer() const
Iterator operator-(DifferenceType n) const
GenericArray & operator=(const GenericArray &rhs)
GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT
Constructor for constant string (i.e. do not make a copy of string)
MemberIterator MemberBegin() const
Iterator & operator-=(DifferenceType n)
void SetLength(SizeType len)
MemberIterator FindMember(const Ch *name) const
static ObjectType Get(const ValueType &v)
GenericArray PushBack(StringRefType value, AllocatorType &allocator) const
Represents a JSON value. Use Value for UTF8 encoding and default allocator.
#define RAPIDJSON_STATIC_ASSERT(x)
(Internal) macro to check for conditions at compile-time
static ValueType & Set(ValueType &v, float data)
GenericDocument & Swap(GenericDocument &rhs) RAPIDJSON_NOEXCEPT
Exchange the contents of this document with those of another.
SizeType NotNullStrLen(const CharType *str)
MemberIterator RemoveMember(MemberIterator m) const
RAPIDJSON_FORCEINLINE const Ch * SetStringPointer(const Ch *str)
ClearStackOnExit(GenericDocument &d)
bool HasMember(const GenericValue< EncodingType, SourceAllocator > &name) const
bool StringEqual(const GenericValue< Encoding, SourceAllocator > &rhs) const
ValueType::StringRefType StringRefType
static int64_t Get(const ValueType &v)
static ValueType & Set(ValueType &v, bool data)
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
GenericObject< true, ValueT > ConstObject
GenericMemberIterator Iterator
Iterator type itself.
GenericValue(const Ch *s, Allocator &allocator)
Constructor for copy-string (i.e. do make a copy of string)
GenericDocument(Type type, Allocator *allocator=0, size_t stackCapacity=kDefaultStackCapacity, StackAllocator *stackAllocator=0)
Constructor.
bool operator>(ConstIterator that) const
size_t GetErrorOffset() const
Get the position of last parsing error in input, 0 otherwise.
#define RAPIDJSON_LIKELY(x)
Compiler branching hint for expression with high probability to be true.
const SizeType length
length of the string (excluding the trailing NULL terminator)
ParseErrorCode
Error code of parsing.
size_t GetStackCapacity() const
Get the capacity of stack in bytes.
static unsigned Get(const ValueType &v)
Allocator & GetAllocator()
Get the allocator of this document.
GenericValue(const Ch *s, SizeType length) RAPIDJSON_NOEXCEPT
Constructor for constant string (i.e. do not make a copy of string)
internal::MaybeAddConst< Const, PlainType >::Type ValueType
static ValueType & Set(ValueType &v, bool data, typename ValueType::AllocatorType &)
static ArrayType Get(ValueType &v)
static ValueType & Set(ValueType &v, ArrayType data, typename ValueType::AllocatorType &)
Pointer operator->() const
GenericObject & operator=(const GenericObject &rhs)
bool EndArray(SizeType elementCount)
GenericValue(Object o) RAPIDJSON_NOEXCEPT
Constructor for Object.
static ValueType & Set(ValueType &v, int64_t data, typename ValueType::AllocatorType &)
bool EndObject(SizeType memberCount)
bool EraseMember(const Ch *name) const
bool operator<(ConstIterator that) const
static int Get(const ValueType &v)
SizeType GetLength() const
static bool Is(const ValueType &v)
static const SizeType kDefaultArrayCapacity
static bool Is(const ValueType &v)
Encoding::Ch Ch
Character type derived from Encoding.
#define RAPIDJSON_NEW(TypeName)
! customization point for global new
RAPIDJSON_FORCEINLINE GenericValue * SetElementsPointer(GenericValue *elements)
GenericMemberIterator(const NonConstIterator &it)
Iterator conversions to more const.
GenericMemberIterator< true, Encoding, Allocator >::Iterator ConstMemberIterator
Constant member iterator for iterating in object.
GenericValue(const Ch *s, SizeType length, Allocator &allocator)
Constructor for copy-string (i.e. do make a copy of string)
static double Get(const ValueType &v)
RAPIDJSON_FORCEINLINE Member * SetMembersPointer(Member *members)
#define RAPIDJSON_NOEXCEPT_ASSERT(x)
Assertion (in non-throwing contexts).
Reference to a constant string (not taking a copy)
GenericObject(const GenericObject &rhs)
static ValueType & Set(ValueType &v, int64_t data)
Represents an in-memory input byte stream.
const ValueType::Ch * StringType
ValueType::StringRefType StringRefType
static ValueType & Set(ValueType &v, uint64_t data, typename ValueType::AllocatorType &)
ValueType::Object ObjectType
void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT
Initialize this value as constant string, without calling destructor.
GenericValue< UTF8<> > Value
GenericValue with UTF8 encoding.
SizeType MemberCapacity() const
GenericDocument(Allocator *allocator=0, size_t stackCapacity=kDefaultStackCapacity, StackAllocator *stackAllocator=0)
Constructor.
GenericObject(ValueType &value)
bool operator!=(ConstIterator that) const
GenericDocument & Parse(const Ch *str, size_t length)
ValueType::EncodingType EncodingType
GenericValue(Type type) RAPIDJSON_NOEXCEPT
Constructor with JSON value type.
GenericValue & operator=(GenericValue &rhs) RAPIDJSON_NOEXCEPT
Assignment with move semantics.
static ValueType & Set(ValueType &v, ObjectType data)
Reference operator*() const
GenericObject AddMember(ValueType &name, ValueType &value, AllocatorType &allocator) const
static ValueType & Set(ValueType &v, uint64_t data)
ValueType::Array ArrayType
unsigned __int64 uint64_t
GenericValue(const GenericValue< Encoding, SourceAllocator > &rhs, Allocator &allocator, bool copyConstStrings=false)
Explicit copy constructor (with allocator)
GenericMemberIterator(Pointer p)
Internal constructor from plain pointer.
bool String(const Ch *str, SizeType length, bool copy)
GenericArray(const GenericArray &rhs)
GenericDocument< UTF8<> > Document
GenericDocument with UTF8 encoding.
friend void swap(GenericDocument &a, GenericDocument &b) RAPIDJSON_NOEXCEPT
free-standing swap function helper
static bool Is(const ValueType &v)
static ObjectType Get(ValueType &v)
ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) const
ValueIterator Begin() const
static bool Is(const ValueType &v)
static ArrayType Get(const ValueType &v)
#define RAPIDJSON_UNLIKELY(x)
Compiler branching hint for expression with low probability to be true.
pointer Pointer
Pointer to (const) GenericMember.
bool RawNumber(const Ch *str, SizeType length, bool copy)
static ValueType & Set(ValueType &v, const StringType data)
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
GenericMemberIterator()
Default constructor (singular value)
void Swap(T &a, T &b) RAPIDJSON_NOEXCEPT
Custom swap() to avoid dependency on C++ <algorithm> header.
GenericDocument & Parse(const Ch *str, size_t length)
#define RAPIDJSON_DELETE(x)
! customization point for global delete
GenericDocument & ParseStream(InputStream &is)
Parse JSON text from an input stream (with kParseDefaultFlags)
internal::MaybeAddConst< Const, PlainType >::Type ValueType
static const SizeType kDefaultObjectCapacity
GenericArray(ValueType &value)
bool RemoveMember(const GenericValue< EncodingType, SourceAllocator > &name) const
static bool Is(const ValueType &v)
Encoding EncodingType
Encoding type from template parameter.
static bool Is(const ValueType &v)
GenericValue(Array a) RAPIDJSON_NOEXCEPT
Constructor for Array.
GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType &allocator) const
MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) const
#define RAPIDJSON_SETPOINTER(type, p, x)
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
static ValueType & Set(ValueType &v, double data, typename ValueType::AllocatorType &)
GenericValue< Encoding, Allocator > name
name of member (must be a string)
Helper class for accessing Value of array type.
GenericObject AddMember(StringRefType name, ValueType &value, AllocatorType &allocator) const
Allocator AllocatorType
Allocator type from template parameter.
const GenericValue * ConstValueIterator
Constant value iterator for iterating in array.
GenericStringRef(const CharType *str)
Explicitly create string reference from const character pointer.
ValueType & operator[](const GenericValue< EncodingType, SourceAllocator > &name) const
GenericArray PushBack(ValueType &value, AllocatorType &allocator) const
SizeType hashcode
reserved
static ValueType & Set(ValueType &v, int data)
SAX-style JSON parser. Use Reader for UTF8 encoding and default allocator.
bool HasParseError() const
Whether a parse error has occurred in the last parsing.
RAPIDJSON_FORCEINLINE GenericValue * GetElementsPointer() const
GenericStringRef< CharType > StringRef(const CharType *str)
Mark a character pointer as constant string.
void SetArrayRaw(GenericValue *values, SizeType count, Allocator &allocator)
GenericArray< true, ValueType > ConstArray
Allocator * ownAllocator_
GenericValue() RAPIDJSON_NOEXCEPT
Default constructor creates a null value.
ValueType & operator[](SizeType index) const
ValueIterator Erase(ConstValueIterator pos) const
GenericObject< false, ValueType > Object
SizeType Capacity() const
std::ptrdiff_t difference_type
GenericMemberIterator< Const, typename ValueT::EncodingType, typename ValueT::AllocatorType > MemberIterator
GenericArray< false, ValueType > Array
GenericObject MemberReserve(SizeType newCapacity, AllocatorType &allocator) const
GenericMemberIterator< true, Encoding, Allocator > ConstIterator
Constant iterator type.
GenericStringRef< Ch > StringRefType
Reference to a constant string.
MemberIterator EraseMember(ConstMemberIterator pos) const
ValueIterator End() const
GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT
Constructor for uint64_t value.
Helper class for accessing Value of object type.
GenericObject< false, ValueT > Object
#define RAPIDJSON_GETPOINTER(type, p)
reference Reference
Reference to (const) GenericMember.
Result of parsing (wraps ParseErrorCode)
GenericDocument & ParseStream(InputStream &is)
Parse JSON text from an input stream (with Encoding conversion)
ValueType::ConstObject ObjectType
bool operator==(ConstIterator that) const
static float Get(const ValueType &v)
ValueType * ValueIterator
GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT
Constructor for int64_t value.
static bool Is(const ValueType &v)
~GenericValue()
Destructor.
GenericMember< Encoding, Allocator > Member
Name-value pair in an object.
DifferenceType operator-(ConstIterator that) const
Distance.
GenericValue(int i) RAPIDJSON_NOEXCEPT
Constructor for int value.
SizeType StrLen(const Ch *s)
Custom strlen() which works on different character types.
GenericArray Reserve(SizeType newCapacity, AllocatorType &allocator) const
internal::Stack< StackAllocator > stack_
GenericValue(float f) RAPIDJSON_NOEXCEPT
Constructor for float value.
GenericValue< Encoding, Allocator > ValueType
Value type of itself.
std::random_access_iterator_tag iterator_category
difference_type DifferenceType
Signed integer type (e.g. ptrdiff_t)
static uint64_t Get(const ValueType &v)
GenericDocument & ParseStream(InputStream &is)
Parse JSON text from an input stream.
static ValueType & Set(ValueType &v, double data)
void SetStringRaw(StringRefType s, Allocator &allocator)
Initialize this value as copy string with initial data, without calling destructor.
GenericDocument & Parse(const Ch *str)
Parse JSON text from a read-only string (with kParseDefaultFlags)
Iterator & operator+=(DifferenceType n)
Allocator AllocatorType
Allocator type from template parameter.
A read-write string stream.
static ValueType & Set(ValueType &v, float data, typename ValueType::AllocatorType &)
friend class GenericDocument
(Constant) member iterator for a JSON object value
GenericArray PopBack() const
bool EraseMember(const GenericValue< EncodingType, SourceAllocator > &name) const
GenericArray< false, ValueT > Array
GenericMemberIterator< false, Encoding, Allocator >::Iterator MemberIterator
Member iterator for iterating in object.
RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr< internal::IsPointer< T2 >, internal::IsGenericValue< T2 > >),(typename T::ValueType &)) GetValueByPointerWithDefault(T &root
bool RemoveMember(const Ch *name) const
bool operator>=(ConstIterator that) const
GenericValue(double d) RAPIDJSON_NOEXCEPT
Constructor for double value.
ValueType::ConstArray ArrayType
#define RAPIDJSON_ASSERT(x)
Assertion.
static ValueType & Set(ValueType &v, int data, typename ValueType::AllocatorType &)
GenericStringRef(const CharType(&str)[N]) RAPIDJSON_NOEXCEPT
Create string reference from const character array.
A document for parsing JSON text as DOM.
GenericDocument & Populate(Generator &g)
Populate this document by a generator which produces SAX events.
static StringType Get(const ValueType &v)
GenericValue< Encoding, Allocator > value
value of member.
CharType Ch
character type of the string
In-situ(destructive) parsing.
Iterator operator+(DifferenceType n) const
GenericValue * ValueIterator
Value iterator for iterating in array.
static bool Usable(SizeType len)
static ValueType & Set(ValueType &v, unsigned data, typename ValueType::AllocatorType &)
GenericArray< true, ValueT > ConstArray
RAPIDJSON_FORCEINLINE const Ch * GetStringPointer() const
GenericStringRef(const GenericStringRef &rhs)
MemberIterator FindMember(const GenericValue< EncodingType, SourceAllocator > &name) const
GenericMemberIterator< true, typename ValueT::EncodingType, typename ValueT::AllocatorType > ConstMemberIterator
bool Key(const Ch *str, SizeType length, bool copy)
static ValueType & Set(ValueType &v, const StringType data, typename ValueType::AllocatorType &a)