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
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;
154 Iterator& operator++(){ ++ptr_;
return *
this; }
155 Iterator& operator--(){ --ptr_;
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_; }
200 template <
bool Const,
typename Encoding,
typename Allocator>
204 template <
typename Encoding,
typename Allocator>
210 template <
typename Encoding,
typename Allocator>
248 template<
typename CharType>
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>
398 : IsBaseOf<GenericValue<typename T::EncodingType, typename T::AllocatorType>, T>
::Type {};
410 template <
typename ValueType,
typename T>
413 template<
typename ValueType>
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>
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>
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>
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>
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>
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>
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>
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>
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;
575 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
577 template <
typename StackAllocator>
581 template <
typename StackAllocator>
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
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>
804 template <
typename SourceAllocator>
806 RAPIDJSON_ASSERT(
static_cast<void*
>(
this) !=
static_cast<void const*
>(&rhs));
821 other.RawAssign(temp);
841 GenericValue& Move() RAPIDJSON_NOEXCEPT {
return *
this; }
851 template <
typename SourceAllocator>
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;
896 #if RAPIDJSON_HAS_STDSTRING
900 bool operator==(
const std::basic_string<Ch>& rhs)
const {
return *
this ==
GenericValue(
StringRef(rhs)); }
911 template <
typename SourceAllocator>
915 bool operator!=(
const Ch* rhs)
const {
return !(*
this == rhs); }
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;
1001 bool GetBool()
const {
RAPIDJSON_ASSERT(IsBool());
return data_.f.flags == kTrueFlag; }
1019 bool ObjectEmpty()
const {
RAPIDJSON_ASSERT(IsObject());
return data_.o.size == 0; }
1030 template <
typename T>
1035 template <
typename T>
1047 template <
typename SourceAllocator>
1050 if (member != MemberEnd())
1051 return member->value;
1064 template <
typename SourceAllocator>
1067 #if RAPIDJSON_HAS_STDSTRING
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>
1134 return FindMember(n);
1152 template <
typename SourceAllocator>
1157 for ( ; member != MemberEnd(); ++member)
1158 if (name.StringEqual(member->name))
1164 #if RAPIDJSON_HAS_STDSTRING
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);
1220 return AddMember(name, v, allocator);
1223 #if RAPIDJSON_HAS_STDSTRING
1235 return AddMember(name, v, allocator);
1256 template <
typename T>
1260 return AddMember(name, v, allocator);
1263 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
1265 return AddMember(name, value, allocator);
1268 return AddMember(name, value, allocator);
1271 return AddMember(name, value, allocator);
1275 return AddMember(n, value, allocator);
1292 return AddMember(n, value, allocator);
1306 return AddMember(name, v, allocator);
1326 template <
typename T>
1330 return AddMember(n, value, allocator);
1337 void RemoveAllMembers() {
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>
1364 if (m != MemberEnd()) {
1387 if (data_.o.size > 1 && m != last)
1405 return EraseMember(pos, pos +1);
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>
1450 if (m != MemberEnd()) {
1459 ConstObject GetObject()
const {
RAPIDJSON_ASSERT(IsObject());
return ConstObject(*
this); }
1477 bool Empty()
const {
RAPIDJSON_ASSERT(IsArray());
return data_.a.size == 0; }
1499 return GetElementsPointer()[index];
1524 if (newCapacity > data_.a.capacity) {
1526 data_.a.capacity = newCapacity;
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
1551 return PushBack(value, allocator);
1565 return (*this).template PushBack<StringRefType>(value, allocator);
1585 template <
typename T>
1587 PushBack(T value,
Allocator& allocator) {
1589 return PushBack(v, allocator);
1611 return Erase(pos, pos + 1);
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());
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); }
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>
1746 template <
typename T>
1749 template <
typename T>
1752 template<
typename T>
1755 template<
typename T>
1767 template <
typename Handler>
1768 bool Accept(
Handler& handler)
const {
1772 case kTrueType:
return handler.Bool(
true);
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);
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;
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); }
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;
1938 SetElementsPointer(e);
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;
2076 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2087 allocator_ = rhs.allocator_;
2088 ownAllocator_ = rhs.ownAllocator_;
2089 stack_ = std::move(rhs.stack_);
2090 parseResult_ = rhs.parseResult_;
2093 rhs.ownAllocator_ = 0;
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);
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);
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>
2246 MemoryStream ms(
static_cast<const char*
>(str), length *
sizeof(
typename SourceEncoding::Ch));
2248 ParseStream<parseFlags, SourceEncoding>(is);
2252 template <
unsigned parseFlags>
2254 return Parse<parseFlags, Encoding>(str, length);
2258 return Parse<kParseDefaultFlags>(str, length);
2261 #if RAPIDJSON_HAS_STDSTRING
2262 template <
unsigned parseFlags,
typename SourceEncoding>
2265 return Parse<parseFlags, SourceEncoding>(str.c_str());
2268 template <
unsigned parseFlags>
2270 return Parse<parseFlags, Encoding>(str.c_str());
2274 return Parse<kParseDefaultFlags>(str);
2318 struct ClearStackOnExit {
2320 ~ClearStackOnExit() { d_.ClearStack(); }
2322 ClearStackOnExit(
const ClearStackOnExit&);
2323 ClearStackOnExit& operator=(
const ClearStackOnExit&);
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) {
2345 new (stack_.template Push<ValueType>())
ValueType(str, length);
2349 bool String(
const Ch* str,
SizeType length,
bool copy) {
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());
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;
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_);
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>
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; }
2469 GenericArray PushBack(StringRefType 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(); }
2491 template <
bool Const,
typename ValueT>
2496 typedef ValueT PlainType;
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>
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]; }
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(); }
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); }
2526 MemberIterator FindMember(
const Ch* 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; }
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; }
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); }
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))); }
2561 #if RAPIDJSON_HAS_CXX11_RANGE_FOR
Helper class for accessing Value of array type.
Definition: document.h:2439
A document for parsing JSON text as DOM.
Definition: document.h:2024
friend void swap(GenericDocument &a, GenericDocument &b) RAPIDJSON_NOEXCEPT
free-standing swap function helper
Definition: document.h:2127
GenericDocument & ParseInsitu(Ch *str)
Parse JSON text from a mutable string.
Definition: document.h:2198
Allocator AllocatorType
Allocator type from template parameter.
Definition: document.h:2028
GenericDocument & Populate(Generator &g)
Populate this document by a generator which produces SAX events.
Definition: document.h:2135
GenericDocument(Type type, Allocator *allocator=0, size_t stackCapacity=kDefaultStackCapacity, StackAllocator *stackAllocator=0)
Constructor.
Definition: document.h:2037
GenericDocument & Parse(const Ch *str)
Parse JSON text from a read-only string (with kParseDefaultFlags)
Definition: document.h:2239
bool HasParseError() const
Whether a parse error has occurred in the last parsing.
Definition: document.h:2284
GenericDocument & Parse(const Ch *str)
Parse JSON text from a read-only string.
Definition: document.h:2232
GenericDocument & Swap(GenericDocument &rhs) RAPIDJSON_NOEXCEPT
Exchange the contents of this document with those of another.
Definition: document.h:2106
GenericDocument(Allocator *allocator=0, size_t stackCapacity=kDefaultStackCapacity, StackAllocator *stackAllocator=0)
Constructor.
Definition: document.h:2050
GenericDocument & ParseStream(InputStream &is)
Parse JSON text from an input stream.
Definition: document.h:2174
Encoding::Ch Ch
Character type derived from Encoding.
Definition: document.h:2026
GenericDocument & ParseInsitu(Ch *str)
Parse JSON text from a mutable string (with kParseDefaultFlags)
Definition: document.h:2207
GenericValue< Encoding, Allocator > ValueType
Value type of the document.
Definition: document.h:2027
ParseErrorCode GetParseError() const
Get the ParseErrorCode of last parsing.
Definition: document.h:2287
size_t GetStackCapacity() const
Get the capacity of stack in bytes.
Definition: document.h:2314
Allocator & GetAllocator()
Get the allocator of this document.
Definition: document.h:2308
GenericDocument & Parse(const typename SourceEncoding::Ch *str)
Parse JSON text from a read-only string (with Encoding conversion)
Definition: document.h:2221
GenericDocument & ParseStream(InputStream &is)
Parse JSON text from an input stream (with kParseDefaultFlags)
Definition: document.h:2184
size_t GetErrorOffset() const
Get the position of last parsing error in input, 0 otherwise.
Definition: document.h:2290
GenericDocument & ParseStream(InputStream &is)
Parse JSON text from an input stream (with Encoding conversion)
Definition: document.h:2155
(Constant) member iterator for a JSON object value
Definition: document.h:103
GenericMemberIterator(const NonConstIterator &it)
Iterator conversions to more const.
Definition: document.h:149
GenericMemberIterator()
Default constructor (singular value)
Definition: document.h:131
BaseType::difference_type DifferenceType
Signed integer type (e.g. ptrdiff_t)
Definition: document.h:125
GenericMemberIterator< false, Encoding, Allocator > NonConstIterator
Non-constant iterator type.
Definition: document.h:118
BaseType::pointer Pointer
Pointer to (const) GenericMember.
Definition: document.h:121
GenericMemberIterator Iterator
Iterator type itself.
Definition: document.h:114
DifferenceType operator-(ConstIterator that) const
Distance.
Definition: document.h:187
GenericMemberIterator< true, Encoding, Allocator > ConstIterator
Constant iterator type.
Definition: document.h:116
BaseType::reference Reference
Reference to (const) GenericMember.
Definition: document.h:123
Helper class for accessing Value of object type.
Definition: document.h:2492
Represents a JSON Pointer. Use Pointer for UTF8 encoding and default allocator.
Definition: pointer.h:81
SAX-style JSON parser. Use Reader for UTF8 encoding and default allocator.
Definition: reader.h:466
Represents a JSON value. Use Value for UTF8 encoding and default allocator.
Definition: document.h:540
GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame< bool, T >))) RAPIDJSON_NOEXCEPT
Constructor for boolean value.
Definition: document.h:623
void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT
Initialize this value as constant string, without calling destructor.
Definition: document.h:1960
~GenericValue()
Destructor.
Definition: document.h:719
GenericValue(double d) RAPIDJSON_NOEXCEPT
Constructor for double value.
Definition: document.h:673
void SetObjectRaw(Member *members, SizeType count, Allocator &allocator)
Initialize this value as object with initial data, without calling destructor.
Definition: document.h:1947
Encoding EncodingType
Encoding type from template parameter.
Definition: document.h:544
GenericStringRef< Ch > StringRefType
Reference to a constant string.
Definition: document.h:547
GenericMemberIterator< false, Encoding, Allocator >::Iterator MemberIterator
Member iterator for iterating in object.
Definition: document.h:548
GenericValue & operator=(StringRefType str) RAPIDJSON_NOEXCEPT
Assignment of constant string reference (no copy)
Definition: document.h:774
GenericValue< Encoding, Allocator > ValueType
Value type of itself.
Definition: document.h:552
const GenericValue * ConstValueIterator
Constant value iterator for iterating in array.
Definition: document.h:551
RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer< T >),(GenericValue &)) operator
Assignment with primitive types.
GenericValue(const Ch *s, SizeType length) RAPIDJSON_NOEXCEPT
Constructor for constant string (i.e. do not make a copy of string)
Definition: document.h:676
GenericValue(const GenericValue< Encoding, SourceAllocator > &rhs, Allocator &allocator)
Explicit copy constructor (with allocator)
Definition: document.h:2408
Allocator AllocatorType
Allocator type from template parameter.
Definition: document.h:545
GenericMember< Encoding, Allocator > Member
Name-value pair in an object.
Definition: document.h:543
GenericValue(Type type) RAPIDJSON_NOEXCEPT
Constructor with JSON value type.
Definition: document.h:592
GenericValue & operator=(GenericValue &rhs) RAPIDJSON_NOEXCEPT
Assignment with move semantics.
Definition: document.h:755
GenericValue(Array a) RAPIDJSON_NOEXCEPT
Constructor for Array.
Definition: document.h:700
GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT
Constructor for int64_t value.
Definition: document.h:646
GenericValue(unsigned u) RAPIDJSON_NOEXCEPT
Constructor for unsigned value.
Definition: document.h:640
GenericValue(const Ch *s, Allocator &allocator)
Constructor for copy-string (i.e. do make a copy of string)
Definition: document.h:685
GenericValue(Object o) RAPIDJSON_NOEXCEPT
Constructor for Object.
Definition: document.h:711
GenericValue(const Ch *s, SizeType length, Allocator &allocator)
Constructor for copy-string (i.e. do make a copy of string)
Definition: document.h:682
GenericMemberIterator< true, Encoding, Allocator >::Iterator ConstMemberIterator
Constant member iterator for iterating in object.
Definition: document.h:549
GenericValue(int i) RAPIDJSON_NOEXCEPT
Constructor for int value.
Definition: document.h:634
GenericValue() RAPIDJSON_NOEXCEPT
Default constructor creates a null value.
Definition: document.h:562
GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT
Constructor for constant string (i.e. do not make a copy of string)
Definition: document.h:679
void RawAssign(GenericValue &rhs) RAPIDJSON_NOEXCEPT
Assignment without calling destructor.
Definition: document.h:1984
GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT
Constructor for uint64_t value.
Definition: document.h:661
void SetStringRaw(StringRefType s, Allocator &allocator)
Initialize this value as copy string with initial data, without calling destructor.
Definition: document.h:1967
Encoding::Ch Ch
Character type derived from Encoding.
Definition: document.h:546
GenericValue * ValueIterator
Value iterator for iterating in array.
Definition: document.h:550
Concept for allocating, resizing and freeing memory block.
Concept for encoding of Unicode characters.
Concept for receiving events from GenericReader upon parsing. The functions return true if no error o...
GenericValue< UTF8<> > Value
GenericValue with UTF8 encoding.
Definition: document.h:2010
GenericStringRef< CharType > StringRef(const CharType *str)
Mark a character pointer as constant string.
Definition: document.h:346
GenericDocument< UTF8<> > Document
GenericDocument with UTF8 encoding.
Definition: document.h:2402
#define RAPIDJSON_UNLIKELY(x)
Compiler branching hint for expression with low probability to be true.
Definition: rapidjson.h:468
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:402
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
Definition: rapidjson.h:116
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
Definition: rapidjson.h:119
ParseErrorCode
Error code of parsing.
Definition: error.h:64
Type
Type of JSON value.
Definition: rapidjson.h:603
@ kFalseType
false
Definition: rapidjson.h:605
@ kObjectType
object
Definition: rapidjson.h:607
@ kTrueType
true
Definition: rapidjson.h:606
@ kStringType
string
Definition: rapidjson.h:609
@ kNullType
null
Definition: rapidjson.h:604
@ kArrayType
array
Definition: rapidjson.h:608
@ kNumberType
number
Definition: rapidjson.h:610
#define RAPIDJSON_DELETE(x)
! customization point for global delete
Definition: rapidjson.h:590
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition: rapidjson.h:380
#define RAPIDJSON_UINT64_C2(high32, low32)
Construct a 64-bit literal by a pair of 32-bit integer.
Definition: rapidjson.h:289
#define RAPIDJSON_NEW(x)
! customization point for global new
Definition: rapidjson.h:586
#define RAPIDJSON_STATIC_ASSERT(x)
(Internal) macro to check for conditions at compile-time
Definition: rapidjson.h:437
@ kParseInsituFlag
In-situ(destructive) parsing.
Definition: reader.h:147
A read-write string stream.
Definition: stream.h:144
Name-value pair in a JSON object value.
Definition: document.h:71
GenericValue< Encoding, Allocator > name
name of member (must be a string)
Definition: document.h:72
GenericValue< Encoding, Allocator > value
value of member.
Definition: document.h:73
Reference to a constant string (not taking a copy)
Definition: document.h:249
CharType Ch
character type of the string
Definition: document.h:250
const SizeType length
length of the string (excluding the trailing NULL terminator)
Definition: document.h:325
GenericStringRef< CharType > StringRef(const CharType *str, size_t length)
Mark a character pointer as constant string.
Definition: document.h:366
GenericStringRef(const CharType *str, SizeType len)
Create constant string reference from pointer and length.
Definition: document.h:314
GenericStringRef(const CharType *str)
Explicitly create string reference from const character pointer.
Definition: document.h:302
GenericStringRef< CharType > StringRef(const CharType *str)
Mark a character pointer as constant string.
Definition: document.h:346
GenericStringRef(const CharType(&str)[N]) RAPIDJSON_NOEXCEPT
Create string reference from const character array.
Definition: document.h:278
const Ch *const s
plain CharType pointer
Definition: document.h:324
Read-only string stream.
Definition: stream.h:110
Definition: document.h:1911
Definition: document.h:1845
Definition: document.h:1882
Definition: document.h:1886
Definition: document.h:1905
Definition: document.h:1870
Definition: document.h:1856
SizeType hashcode
reserved
Definition: document.h:1858
Represents an in-memory input byte stream.
Definition: memorystream.h:40
Result of parsing (wraps ParseErrorCode)
Definition: error.h:106
ParseErrorCode Code() const
Get the error code.
Definition: error.h:114
bool IsError() const
Whether the result is an error.
Definition: error.h:121
size_t Offset() const
Get the error offset, if IsError(), 0 otherwise.
Definition: error.h:116
Definition: document.h:401
Definition: document.h:394
Definition: document.h:411
Definition: document.h:1917
Definition: document.h:1880