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)
32 #ifdef _MINWINDEF_ // see: http://stackoverflow.com/questions/22744262/cant-call-stdmax-because-minwindef-h-defines-max 34 #pragma push_macro("min") 35 #pragma push_macro("max") 43 RAPIDJSON_DIAG_OFF(padded)
44 RAPIDJSON_DIAG_OFF(switch-enum)
45 RAPIDJSON_DIAG_OFF(c++98-compat)
49 RAPIDJSON_DIAG_OFF(effc++)
51 RAPIDJSON_DIAG_OFF(terminate)
55 #ifndef RAPIDJSON_NOMEMBERITERATORCLASS 59 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 66 template <
typename Encoding,
typename Allocator>
69 template <
typename Encoding,
typename Allocator,
typename StackAllocator>
78 template <
typename Encoding,
typename Allocator>
87 #ifndef RAPIDJSON_NOMEMBERITERATORCLASS 108 template <
bool Const,
typename Encoding,
typename Allocator>
110 :
public std::iterator<std::random_access_iterator_tag
111 , typename internal::MaybeAddConst<Const,GenericMember<Encoding,Allocator> >::Type> {
118 typedef std::iterator<std::random_access_iterator_tag,ValueType> BaseType;
158 Iterator& operator=(
const NonConstIterator & it) { ptr_ = it.ptr_;
return *
this; }
162 Iterator& operator++(){ ++ptr_;
return *
this; }
163 Iterator& operator--(){ --ptr_;
return *
this; }
164 Iterator operator++(
int){ Iterator old(*
this); ++ptr_;
return old; }
165 Iterator operator--(
int){ Iterator old(*
this); --ptr_;
return old; }
170 Iterator operator+(DifferenceType n)
const {
return Iterator(ptr_+n); }
171 Iterator operator-(DifferenceType n)
const {
return Iterator(ptr_-n); }
173 Iterator& operator+=(DifferenceType n) { ptr_+=n;
return *
this; }
174 Iterator& operator-=(DifferenceType n) { ptr_-=n;
return *
this; }
179 bool operator==(ConstIterator that)
const {
return ptr_ == that.ptr_; }
180 bool operator!=(ConstIterator that)
const {
return ptr_ != that.ptr_; }
181 bool operator<=(ConstIterator that)
const {
return ptr_ <= that.ptr_; }
182 bool operator>=(ConstIterator that)
const {
return ptr_ >= that.ptr_; }
183 bool operator< (ConstIterator that)
const {
return ptr_ < that.ptr_; }
184 bool operator> (ConstIterator that)
const {
return ptr_ > that.ptr_; }
189 Reference operator*()
const {
return *ptr_; }
190 Pointer operator->()
const {
return ptr_; }
191 Reference operator[](DifferenceType n)
const {
return ptr_[n]; }
195 DifferenceType
operator-(ConstIterator that)
const {
return ptr_-that.ptr_; }
204 #else // RAPIDJSON_NOMEMBERITERATORCLASS 208 template <
bool Const,
typename Encoding,
typename Allocator>
212 template <
typename Encoding,
typename Allocator>
218 template <
typename Encoding,
typename Allocator>
224 #endif // RAPIDJSON_NOMEMBERITERATORCLASS 256 template<
typename CharType>
261 #ifndef __clang__ // -Wdocumentation 287 : s(str), length(N-1) {}
290 #ifndef __clang__ // -Wdocumentation 314 #ifndef __clang__ // -Wdocumentation 328 operator const Ch *()
const {
return s; }
353 template<
typename CharType>
373 template<
typename CharType>
378 #if RAPIDJSON_HAS_STDSTRING 391 template<
typename CharType>
401 template <
typename T,
typename Encoding =
void,
typename Allocator =
void>
406 : IsBaseOf<GenericValue<typename T::EncodingType, typename T::AllocatorType>, T>
::Type {};
418 template <
typename ValueType,
typename T>
421 template<
typename ValueType>
423 static bool Is(
const ValueType& v) {
return v.IsBool(); }
424 static bool Get(
const ValueType& v) {
return v.GetBool(); }
425 static ValueType& Set(ValueType& v,
bool data) {
return v.SetBool(data); }
426 static ValueType& Set(ValueType& v,
bool data,
typename ValueType::AllocatorType&) {
return v.SetBool(data); }
429 template<
typename ValueType>
431 static bool Is(
const ValueType& v) {
return v.IsInt(); }
432 static int Get(
const ValueType& v) {
return v.GetInt(); }
433 static ValueType& Set(ValueType& v,
int data) {
return v.SetInt(data); }
434 static ValueType& Set(ValueType& v,
int data,
typename ValueType::AllocatorType&) {
return v.SetInt(data); }
437 template<
typename ValueType>
439 static bool Is(
const ValueType& v) {
return v.IsUint(); }
440 static unsigned Get(
const ValueType& v) {
return v.GetUint(); }
441 static ValueType& Set(ValueType& v,
unsigned data) {
return v.SetUint(data); }
442 static ValueType& Set(ValueType& v,
unsigned data,
typename ValueType::AllocatorType&) {
return v.SetUint(data); }
445 template<
typename ValueType>
447 static bool Is(
const ValueType& v) {
return v.IsInt64(); }
448 static int64_t Get(
const ValueType& v) {
return v.GetInt64(); }
449 static ValueType& Set(ValueType& v, int64_t data) {
return v.SetInt64(data); }
450 static ValueType& Set(ValueType& v, int64_t data,
typename ValueType::AllocatorType&) {
return v.SetInt64(data); }
453 template<
typename ValueType>
455 static bool Is(
const ValueType& v) {
return v.IsUint64(); }
456 static uint64_t Get(
const ValueType& v) {
return v.GetUint64(); }
457 static ValueType& Set(ValueType& v, uint64_t data) {
return v.SetUint64(data); }
458 static ValueType& Set(ValueType& v, uint64_t data,
typename ValueType::AllocatorType&) {
return v.SetUint64(data); }
461 template<
typename ValueType>
463 static bool Is(
const ValueType& v) {
return v.IsDouble(); }
464 static double Get(
const ValueType& v) {
return v.GetDouble(); }
465 static ValueType& Set(ValueType& v,
double data) {
return v.SetDouble(data); }
466 static ValueType& Set(ValueType& v,
double data,
typename ValueType::AllocatorType&) {
return v.SetDouble(data); }
469 template<
typename ValueType>
471 static bool Is(
const ValueType& v) {
return v.IsFloat(); }
472 static float Get(
const ValueType& v) {
return v.GetFloat(); }
473 static ValueType& Set(ValueType& v,
float data) {
return v.SetFloat(data); }
474 static ValueType& Set(ValueType& v,
float data,
typename ValueType::AllocatorType&) {
return v.SetFloat(data); }
477 template<
typename ValueType>
478 struct TypeHelper<ValueType, const typename ValueType::Ch*> {
479 typedef const typename ValueType::Ch* StringType;
480 static bool Is(
const ValueType& v) {
return v.IsString(); }
481 static StringType Get(
const ValueType& v) {
return v.GetString(); }
482 static ValueType& Set(ValueType& v,
const StringType data) {
return v.SetString(
typename ValueType::StringRefType(data)); }
483 static ValueType& Set(ValueType& v,
const StringType data,
typename ValueType::AllocatorType& a) {
return v.SetString(data, a); }
486 #if RAPIDJSON_HAS_STDSTRING 487 template<
typename ValueType>
488 struct TypeHelper<ValueType, std::basic_string<typename ValueType::Ch> > {
489 typedef std::basic_string<typename ValueType::Ch> StringType;
490 static bool Is(
const ValueType& v) {
return v.IsString(); }
491 static StringType Get(
const ValueType& v) {
return StringType(v.GetString(), v.GetStringLength()); }
492 static ValueType& Set(ValueType& v,
const StringType& data,
typename ValueType::AllocatorType& a) {
return v.SetString(data, a); }
496 template<
typename ValueType>
498 typedef typename ValueType::Array ArrayType;
499 static bool Is(
const ValueType& v) {
return v.IsArray(); }
500 static ArrayType Get(ValueType& v) {
return v.GetArray(); }
501 static ValueType& Set(ValueType& v, ArrayType data) {
return v = data; }
502 static ValueType& Set(ValueType& v, ArrayType data,
typename ValueType::AllocatorType&) {
return v = data; }
505 template<
typename ValueType>
506 struct TypeHelper<ValueType, typename ValueType::ConstArray> {
507 typedef typename ValueType::ConstArray ArrayType;
508 static bool Is(
const ValueType& v) {
return v.IsArray(); }
509 static ArrayType Get(
const ValueType& v) {
return v.GetArray(); }
512 template<
typename ValueType>
514 typedef typename ValueType::Object ObjectType;
515 static bool Is(
const ValueType& v) {
return v.IsObject(); }
516 static ObjectType Get(ValueType& v) {
return v.GetObject(); }
517 static ValueType& Set(ValueType& v, ObjectType data) {
return v = data; }
518 static ValueType& Set(ValueType& v, ObjectType data,
typename ValueType::AllocatorType&) { v = data; }
521 template<
typename ValueType>
522 struct TypeHelper<ValueType, typename ValueType::ConstObject> {
523 typedef typename ValueType::ConstObject ObjectType;
524 static bool Is(
const ValueType& v) {
return v.IsObject(); }
525 static ObjectType Get(
const ValueType& v) {
return v.GetObject(); }
547 template <
typename Encoding,
typename Allocator = MemoryPoolAllocator<> >
554 typedef typename Encoding::Ch
Ch;
570 GenericValue() RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; }
572 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 575 rhs.data_.f.flags = kNullFlag;
583 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 584 template <
typename StackAllocator>
589 template <
typename StackAllocator>
601 static const uint16_t defaultFlags[7] = {
602 kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag,
606 data_.f.flags = defaultFlags[type];
610 data_.ss.SetLength(0);
620 template <
typename SourceAllocator>
622 switch (rhs.GetType()) {
625 Member* lm =
reinterpret_cast<Member*
>(allocator.Malloc(count *
sizeof(Member)));
627 for (
SizeType i = 0; i < count; i++) {
631 data_.f.flags = kObjectFlag;
632 data_.o.size = data_.o.capacity = count;
633 SetMembersPointer(lm);
640 for (
SizeType i = 0; i < count; i++)
642 data_.f.flags = kArrayFlag;
643 data_.a.size = data_.a.capacity = count;
644 SetElementsPointer(le);
648 if (rhs.data_.f.flags == kConstStringFlag) {
649 data_.f.flags = rhs.data_.f.flags;
650 data_ = *
reinterpret_cast<const Data*
>(&rhs.data_);
653 SetStringRaw(
StringRef(rhs.GetString(), rhs.GetStringLength()), allocator);
656 data_.f.flags = rhs.data_.f.flags;
657 data_ = *
reinterpret_cast<const Data*
>(&rhs.data_);
668 #ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen 669 template <
typename T>
670 explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame<bool, T>))) RAPIDJSON_NOEXCEPT
677 data_.f.flags = b ? kTrueFlag : kFalseFlag;
683 data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag;
689 data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag);
695 data_.f.flags = kNumberInt64Flag;
697 data_.f.flags |= kNumberUint64Flag;
699 data_.f.flags |= kUintFlag;
701 data_.f.flags |= kIntFlag;
704 data_.f.flags |= kIntFlag;
710 data_.f.flags = kNumberUint64Flag;
712 data_.f.flags |= kInt64Flag;
714 data_.f.flags |= kUintFlag;
716 data_.f.flags |= kIntFlag;
720 explicit GenericValue(
double d) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; }
723 explicit GenericValue(
float f) RAPIDJSON_NOEXCEPT : data_() { data_.n.d =
static_cast<double>(f); data_.f.flags = kNumberDoubleFlag; }
729 explicit GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(s); }
737 #if RAPIDJSON_HAS_STDSTRING 741 GenericValue(
const std::basic_string<Ch>& s, Allocator& allocator) : data_() { SetStringRaw(
StringRef(s), allocator); }
751 a.value_.data_ = Data();
752 a.value_.data_.f.flags = kArrayFlag;
762 o.value_.data_ = Data();
763 o.value_.data_.f.flags = kObjectFlag;
770 if (Allocator::kNeedFree) {
771 switch(data_.f.flags) {
782 for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m)
784 Allocator::Free(GetMembersPointer());
787 case kCopyStringFlag:
788 Allocator::Free(const_cast<Ch*>(GetStringPointer()));
812 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 815 return *
this = rhs.Move();
841 template <
typename T>
842 RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer<T>), (
GenericValue&))
854 template <
typename SourceAllocator>
856 RAPIDJSON_ASSERT(static_cast<void*>(
this) != static_cast<void const*>(&rhs));
891 GenericValue& Move() RAPIDJSON_NOEXCEPT {
return *
this; }
901 template <
typename SourceAllocator>
904 if (GetType() != rhs.GetType())
909 if (data_.o.size != rhs.data_.o.size)
911 for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) {
912 typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name);
913 if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value)
919 if (data_.a.size != rhs.data_.a.size)
921 for (
SizeType i = 0; i < data_.a.size; i++)
922 if ((*
this)[i] != rhs[i])
927 return StringEqual(rhs);
930 if (IsDouble() || rhs.IsDouble()) {
931 double a = GetDouble();
932 double b = rhs.GetDouble();
933 return a >= b && a <= b;
936 return data_.n.u64 == rhs.data_.n.u64;
946 #if RAPIDJSON_HAS_STDSTRING 950 bool operator==(
const std::basic_string<Ch>& rhs)
const {
return *
this ==
GenericValue(
StringRef(rhs)); }
956 template <
typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>,
internal::IsGenericValue<T> >), (
bool)) operator==(
const T& rhs)
const {
return *
this ==
GenericValue(rhs); }
961 template <
typename SourceAllocator>
965 bool operator!=(
const Ch* rhs)
const {
return !(*
this == rhs); }
970 template <
typename T> RAPIDJSON_DISABLEIF_RETURN((
internal::IsGenericValue<T>), (
bool)) operator!=(
const T& rhs)
const {
return !(*
this == rhs); }
986 Type GetType()
const {
return static_cast<Type>(data_.f.flags & kTypeMask); }
987 bool IsNull()
const {
return data_.f.flags == kNullFlag; }
988 bool IsFalse()
const {
return data_.f.flags == kFalseFlag; }
989 bool IsTrue()
const {
return data_.f.flags == kTrueFlag; }
990 bool IsBool()
const {
return (data_.f.flags & kBoolFlag) != 0; }
991 bool IsObject()
const {
return data_.f.flags == kObjectFlag; }
992 bool IsArray()
const {
return data_.f.flags == kArrayFlag; }
993 bool IsNumber()
const {
return (data_.f.flags & kNumberFlag) != 0; }
994 bool IsInt()
const {
return (data_.f.flags & kIntFlag) != 0; }
995 bool IsUint()
const {
return (data_.f.flags & kUintFlag) != 0; }
996 bool IsInt64()
const {
return (data_.f.flags & kInt64Flag) != 0; }
997 bool IsUint64()
const {
return (data_.f.flags & kUint64Flag) != 0; }
998 bool IsDouble()
const {
return (data_.f.flags & kDoubleFlag) != 0; }
999 bool IsString()
const {
return (data_.f.flags & kStringFlag) != 0; }
1002 bool IsLosslessDouble()
const {
1003 if (!IsNumber())
return false;
1005 uint64_t u = GetUint64();
1006 volatile double d =
static_cast<double>(u);
1008 && (d < static_cast<double>(std::numeric_limits<uint64_t>::max()))
1009 && (u ==
static_cast<uint64_t
>(d));
1012 int64_t i = GetInt64();
1013 volatile double d =
static_cast<double>(i);
1014 return (d >= static_cast<double>(std::numeric_limits<int64_t>::min()))
1015 && (d < static_cast<double>(std::numeric_limits<int64_t>::max()))
1016 && (i == static_cast<int64_t>(d));
1022 bool IsFloat()
const {
1023 if ((data_.f.flags & kDoubleFlag) == 0)
1025 double d = GetDouble();
1026 return d >= -3.4028234e38 && d <= 3.4028234e38;
1029 bool IsLosslessFloat()
const {
1030 if (!IsNumber())
return false;
1031 double a = GetDouble();
1032 if (a < static_cast<double>(-std::numeric_limits<float>::max())
1033 || a > static_cast<double>(std::numeric_limits<float>::max()))
1035 double b =
static_cast<double>(
static_cast<float>(a));
1036 return a >= b && a <= b;
1051 bool GetBool()
const {
RAPIDJSON_ASSERT(IsBool());
return data_.f.flags == kTrueFlag; }
1069 bool ObjectEmpty()
const {
RAPIDJSON_ASSERT(IsObject());
return data_.o.size == 0; }
1080 template <
typename T>
1085 template <
typename T>
1097 template <
typename SourceAllocator>
1099 MemberIterator member = FindMember(name);
1100 if (member != MemberEnd())
1101 return member->value;
1114 template <
typename SourceAllocator>
1117 #if RAPIDJSON_HAS_STDSTRING 1125 ConstMemberIterator MemberBegin()
const {
RAPIDJSON_ASSERT(IsObject());
return ConstMemberIterator(GetMembersPointer()); }
1128 ConstMemberIterator MemberEnd()
const {
RAPIDJSON_ASSERT(IsObject());
return ConstMemberIterator(GetMembersPointer() + data_.o.size); }
1131 MemberIterator MemberBegin() {
RAPIDJSON_ASSERT(IsObject());
return MemberIterator(GetMembersPointer()); }
1134 MemberIterator MemberEnd() {
RAPIDJSON_ASSERT(IsObject());
return MemberIterator(GetMembersPointer() + data_.o.size); }
1144 bool HasMember(
const Ch* name)
const {
return FindMember(name) != MemberEnd(); }
1146 #if RAPIDJSON_HAS_STDSTRING 1155 bool HasMember(
const std::basic_string<Ch>& name)
const {
return FindMember(name) != MemberEnd(); }
1167 template <
typename SourceAllocator>
1182 MemberIterator FindMember(
const Ch* name) {
1184 return FindMember(n);
1187 ConstMemberIterator FindMember(
const Ch* name)
const {
return const_cast<GenericValue&
>(*this).FindMember(name); }
1202 template <
typename SourceAllocator>
1206 MemberIterator member = MemberBegin();
1207 for ( ; member != MemberEnd(); ++member)
1208 if (name.StringEqual(member->name))
1214 #if RAPIDJSON_HAS_STDSTRING 1222 MemberIterator FindMember(
const std::basic_string<Ch>& name) {
return FindMember(
GenericValue(
StringRef(name))); }
1223 ConstMemberIterator FindMember(
const std::basic_string<Ch>& name)
const {
return FindMember(
GenericValue(
StringRef(name))); }
1240 ObjectData& o = data_.o;
1241 if (o.size >= o.capacity) {
1242 if (o.capacity == 0) {
1243 o.capacity = kDefaultObjectCapacity;
1244 SetMembersPointer(reinterpret_cast<Member*>(allocator.Malloc(o.capacity *
sizeof(Member))));
1248 o.capacity += (oldCapacity + 1) / 2;
1249 SetMembersPointer(reinterpret_cast<Member*>(allocator.Realloc(GetMembersPointer(), oldCapacity *
sizeof(Member), o.capacity *
sizeof(Member))));
1252 Member* members = GetMembersPointer();
1253 members[o.size].
name.RawAssign(name);
1254 members[o.size].
value.RawAssign(value);
1270 return AddMember(name, v, allocator);
1273 #if RAPIDJSON_HAS_STDSTRING 1285 return AddMember(name, v, allocator);
1306 template <
typename T>
1308 AddMember(
GenericValue& name, T value, Allocator& allocator) {
1310 return AddMember(name, v, allocator);
1313 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 1315 return AddMember(name, value, allocator);
1318 return AddMember(name, value, allocator);
1321 return AddMember(name, value, allocator);
1325 return AddMember(n, value, allocator);
1327 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS 1342 return AddMember(n, value, allocator);
1354 GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) {
1356 return AddMember(name, v, allocator);
1376 template <
typename T>
1378 AddMember(StringRefType name, T value, Allocator& allocator) {
1380 return AddMember(n, value, allocator);
1387 void RemoveAllMembers() {
1389 for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m)
1402 bool RemoveMember(
const Ch* name) {
1404 return RemoveMember(n);
1407 #if RAPIDJSON_HAS_STDSTRING 1408 bool RemoveMember(
const std::basic_string<Ch>& name) {
return RemoveMember(
GenericValue(
StringRef(name))); }
1411 template <
typename SourceAllocator>
1413 MemberIterator m = FindMember(name);
1414 if (m != MemberEnd()) {
1430 MemberIterator RemoveMember(MemberIterator m) {
1436 MemberIterator last(GetMembersPointer() + (data_.o.size - 1));
1437 if (data_.o.size > 1 && m != last)
1454 MemberIterator EraseMember(ConstMemberIterator pos) {
1455 return EraseMember(pos, pos +1);
1467 MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) {
1475 MemberIterator pos = MemberBegin() + (first - MemberBegin());
1476 for (MemberIterator itr = pos; itr != last; ++itr)
1478 std::memmove(&*pos, &*last, static_cast<size_t>(MemberEnd() - last) *
sizeof(Member));
1479 data_.o.size -=
static_cast<SizeType>(last - first);
1488 bool EraseMember(
const Ch* name) {
1490 return EraseMember(n);
1493 #if RAPIDJSON_HAS_STDSTRING 1494 bool EraseMember(
const std::basic_string<Ch>& name) {
return EraseMember(
GenericValue(
StringRef(name))); }
1497 template <
typename SourceAllocator>
1499 MemberIterator m = FindMember(name);
1500 if (m != MemberEnd()) {
1509 ConstObject GetObject()
const {
RAPIDJSON_ASSERT(IsObject());
return ConstObject(*
this); }
1527 bool Empty()
const {
RAPIDJSON_ASSERT(IsArray());
return data_.a.size == 0; }
1549 return GetElementsPointer()[index];
1555 ValueIterator Begin() {
RAPIDJSON_ASSERT(IsArray());
return GetElementsPointer(); }
1558 ValueIterator End() {
RAPIDJSON_ASSERT(IsArray());
return GetElementsPointer() + data_.a.size; }
1561 ConstValueIterator Begin()
const {
return const_cast<GenericValue&
>(*this).Begin(); }
1564 ConstValueIterator End()
const {
return const_cast<GenericValue&
>(*this).End(); }
1574 if (newCapacity > data_.a.capacity) {
1575 SetElementsPointer(reinterpret_cast<GenericValue*>(allocator.Realloc(GetElementsPointer(), data_.a.capacity *
sizeof(
GenericValue), newCapacity *
sizeof(
GenericValue))));
1576 data_.a.capacity = newCapacity;
1593 if (data_.a.size >= data_.a.capacity)
1594 Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator);
1595 GetElementsPointer()[data_.a.size++].RawAssign(value);
1599 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 1601 return PushBack(value, allocator);
1603 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS 1614 GenericValue& PushBack(StringRefType value, Allocator& allocator) {
1615 return (*this).template PushBack<StringRefType>(value, allocator);
1635 template <
typename T>
1637 PushBack(T value, Allocator& allocator) {
1639 return PushBack(v, allocator);
1649 GetElementsPointer()[--data_.a.size].~GenericValue();
1660 ValueIterator Erase(ConstValueIterator pos) {
1661 return Erase(pos, pos + 1);
1672 ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) {
1679 ValueIterator pos = Begin() + (first - Begin());
1680 for (ValueIterator itr = pos; itr != last; ++itr)
1682 std::memmove(pos, last, static_cast<size_t>(End() - last) *
sizeof(
GenericValue));
1683 data_.a.size -=
static_cast<SizeType>(last - first);
1688 ConstArray GetArray()
const {
RAPIDJSON_ASSERT(IsArray());
return ConstArray(*
this); }
1695 int GetInt()
const {
RAPIDJSON_ASSERT(data_.f.flags & kIntFlag);
return data_.n.i.i; }
1696 unsigned GetUint()
const {
RAPIDJSON_ASSERT(data_.f.flags & kUintFlag);
return data_.n.u.u; }
1697 int64_t GetInt64()
const {
RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag);
return data_.n.i64; }
1698 uint64_t GetUint64()
const {
RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag);
return data_.n.u64; }
1703 double GetDouble()
const {
1705 if ((data_.f.flags & kDoubleFlag) != 0)
return data_.n.d;
1706 if ((data_.f.flags & kIntFlag) != 0)
return data_.n.i.i;
1707 if ((data_.f.flags & kUintFlag) != 0)
return data_.n.u.u;
1708 if ((data_.f.flags & kInt64Flag) != 0)
return static_cast<double>(data_.n.i64);
1709 RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0);
return static_cast<double>(data_.n.u64);
1715 float GetFloat()
const {
1716 return static_cast<float>(GetDouble());
1731 const Ch* GetString()
const {
RAPIDJSON_ASSERT(IsString());
return (data_.f.flags & kInlineStrFlag) ? data_.ss.str : GetStringPointer(); }
1736 SizeType GetStringLength()
const {
RAPIDJSON_ASSERT(IsString());
return ((data_.f.flags & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); }
1771 GenericValue& SetString(
const Ch* s, Allocator& allocator) {
return SetString(s, internal::StrLen(s), allocator); }
1773 #if RAPIDJSON_HAS_STDSTRING 1781 GenericValue& SetString(
const std::basic_string<Ch>& s, Allocator& allocator) {
return SetString(s.data(),
SizeType(s.size()), allocator); }
1793 template <
typename T>
1796 template <
typename T>
1799 template <
typename T>
1802 template<
typename T>
1805 template<
typename T>
1817 template <
typename Handler>
1818 bool Accept(Handler& handler)
const {
1822 case kTrueType:
return handler.Bool(
true);
1827 for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) {
1829 if (
RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0)))
1834 return handler.EndObject(data_.o.size);
1842 return handler.EndArray(data_.a.size);
1845 return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0);
1849 if (IsDouble())
return handler.Double(data_.n.d);
1850 else if (IsInt())
return handler.Int(data_.n.i.i);
1851 else if (IsUint())
return handler.Uint(data_.n.u.u);
1852 else if (IsInt64())
return handler.Int64(data_.n.i64);
1853 else return handler.Uint64(data_.n.u64);
1858 template <
typename,
typename>
friend class GenericValue;
1863 kNumberFlag = 0x0010,
1866 kInt64Flag = 0x0080,
1867 kUint64Flag = 0x0100,
1868 kDoubleFlag = 0x0200,
1869 kStringFlag = 0x0400,
1871 kInlineStrFlag = 0x1000,
1877 kNumberIntFlag =
kNumberType | kNumberFlag | kIntFlag | kInt64Flag,
1878 kNumberUintFlag =
kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag,
1879 kNumberInt64Flag =
kNumberType | kNumberFlag | kInt64Flag,
1880 kNumberUint64Flag =
kNumberType | kNumberFlag | kUint64Flag,
1881 kNumberDoubleFlag =
kNumberType | kNumberFlag | kDoubleFlag,
1882 kNumberAnyFlag =
kNumberType | kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag,
1884 kCopyStringFlag =
kStringType | kStringFlag | kCopyFlag,
1885 kShortStringFlag =
kStringType | kStringFlag | kCopyFlag | kInlineStrFlag,
1892 static const SizeType kDefaultArrayCapacity = 16;
1893 static const SizeType kDefaultObjectCapacity = 16;
1896 #if RAPIDJSON_48BITPOINTER_OPTIMIZATION 1897 char payload[
sizeof(
SizeType) * 2 + 6];
1898 #elif RAPIDJSON_64BIT 1899 char payload[
sizeof(
SizeType) * 2 +
sizeof(
void*) + 6];
1901 char payload[
sizeof(
SizeType) * 2 +
sizeof(
void*) + 2];
1921 enum { MaxChars =
sizeof(
static_cast<Flag*
>(0)->payload) /
sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize };
1924 inline static bool Usable(
SizeType len) {
return (MaxSize >= len); }
1925 inline void SetLength(
SizeType len) { str[LenPos] =
static_cast<Ch
>(MaxSize - len); }
1926 inline SizeType GetLength()
const {
return static_cast<SizeType>(MaxSize - str[LenPos]); }
1931 #if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN 1976 RAPIDJSON_FORCEINLINE
const Ch* GetStringPointer()
const {
return RAPIDJSON_GETPOINTER(Ch, data_.s.str); }
1977 RAPIDJSON_FORCEINLINE
const Ch* SetStringPointer(
const Ch* str) {
return RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); }
1978 RAPIDJSON_FORCEINLINE
GenericValue* GetElementsPointer()
const {
return RAPIDJSON_GETPOINTER(
GenericValue, data_.a.elements); }
1980 RAPIDJSON_FORCEINLINE Member* GetMembersPointer()
const {
return RAPIDJSON_GETPOINTER(Member, data_.o.members); }
1981 RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) {
return RAPIDJSON_SETPOINTER(Member, data_.o.members, members); }
1985 data_.f.flags = kArrayFlag;
1988 SetElementsPointer(e);
1992 SetElementsPointer(0);
1993 data_.a.size = data_.a.capacity = count;
1998 data_.f.flags = kObjectFlag;
2000 Member* m =
static_cast<Member*
>(allocator.Malloc(count *
sizeof(Member)));
2001 SetMembersPointer(m);
2002 std::memcpy(m, members, count *
sizeof(Member));
2005 SetMembersPointer(0);
2006 data_.o.size = data_.o.capacity = count;
2011 data_.f.flags = kConstStringFlag;
2012 SetStringPointer(s);
2013 data_.s.length = s.length;
2019 if (ShortString::Usable(s.
length)) {
2020 data_.f.flags = kShortStringFlag;
2021 data_.ss.SetLength(s.
length);
2024 data_.f.flags = kCopyStringFlag;
2025 data_.s.length = s.
length;
2026 str =
static_cast<Ch *
>(allocator.Malloc((s.
length + 1) *
sizeof(Ch)));
2027 SetStringPointer(str);
2029 std::memcpy(str, s, s.
length *
sizeof(Ch));
2037 rhs.data_.f.flags = kNullFlag;
2040 template <
typename SourceAllocator>
2045 const SizeType len1 = GetStringLength();
2046 const SizeType len2 = rhs.GetStringLength();
2047 if(len1 != len2) {
return false; }
2049 const Ch*
const str1 = GetString();
2050 const Ch*
const str2 = rhs.GetString();
2051 if(str1 == str2) {
return true; }
2053 return (std::memcmp(str1, str2,
sizeof(Ch) * len1) == 0);
2073 template <
typename Encoding,
typename Allocator = MemoryPoolAllocator<>,
typename StackAllocator = CrtAllocator>
2076 typedef typename Encoding::Ch
Ch;
2087 explicit GenericDocument(
Type type, Allocator* allocator = 0,
size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) :
2088 GenericValue<Encoding, Allocator>(type), allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()
2100 GenericDocument(Allocator* allocator = 0,
size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) :
2101 allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()
2107 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 2110 : ValueType(std::forward<ValueType>(rhs)),
2111 allocator_(rhs.allocator_),
2112 ownAllocator_(rhs.ownAllocator_),
2113 stack_(std::move(rhs.stack_)),
2114 parseResult_(rhs.parseResult_)
2117 rhs.ownAllocator_ = 0;
2126 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 2132 ValueType::operator=(std::forward<ValueType>(rhs));
2137 allocator_ = rhs.allocator_;
2138 ownAllocator_ = rhs.ownAllocator_;
2139 stack_ = std::move(rhs.stack_);
2140 parseResult_ = rhs.parseResult_;
2143 rhs.ownAllocator_ = 0;
2157 ValueType::Swap(rhs);
2158 stack_.Swap(rhs.stack_);
2159 internal::Swap(allocator_, rhs.allocator_);
2160 internal::Swap(ownAllocator_, rhs.ownAllocator_);
2161 internal::Swap(parseResult_, rhs.parseResult_);
2184 template <
typename Generator>
2186 ClearStackOnExit scope(*
this);
2189 ValueType::operator=(*stack_.template Pop<ValueType>(1));
2204 template <
unsigned parseFlags,
typename SourceEncoding,
typename InputStream>
2207 stack_.HasAllocator() ? &stack_.GetAllocator() : 0);
2208 ClearStackOnExit scope(*
this);
2209 parseResult_ = reader.template Parse<parseFlags>(is, *
this);
2212 ValueType::operator=(*stack_.template Pop<ValueType>(1));
2223 template <
unsigned parseFlags,
typename InputStream>
2225 return ParseStream<parseFlags, Encoding, InputStream>(is);
2233 template <
typename InputStream>
2235 return ParseStream<kParseDefaultFlags, Encoding, InputStream>(is);
2247 template <
unsigned parseFlags>
2250 return ParseStream<parseFlags | kParseInsituFlag>(s);
2258 return ParseInsitu<kParseDefaultFlags>(str);
2270 template <
unsigned parseFlags,
typename SourceEncoding>
2274 return ParseStream<parseFlags, SourceEncoding>(s);
2281 template <
unsigned parseFlags>
2283 return Parse<parseFlags, Encoding>(str);
2290 return Parse<kParseDefaultFlags>(str);
2293 template <
unsigned parseFlags,
typename SourceEncoding>
2294 GenericDocument& Parse(
const typename SourceEncoding::Ch* str,
size_t length) {
2296 MemoryStream ms(static_cast<const char*>(str), length *
sizeof(
typename SourceEncoding::Ch));
2298 ParseStream<parseFlags, SourceEncoding>(is);
2302 template <
unsigned parseFlags>
2304 return Parse<parseFlags, Encoding>(str, length);
2308 return Parse<kParseDefaultFlags>(str, length);
2311 #if RAPIDJSON_HAS_STDSTRING 2312 template <
unsigned parseFlags,
typename SourceEncoding>
2313 GenericDocument& Parse(
const std::basic_string<typename SourceEncoding::Ch>& str) {
2315 return Parse<parseFlags, SourceEncoding>(str.c_str());
2318 template <
unsigned parseFlags>
2320 return Parse<parseFlags, Encoding>(str.c_str());
2324 return Parse<kParseDefaultFlags>(str);
2326 #endif // RAPIDJSON_HAS_STDSTRING 2343 #ifndef __clang // -Wdocumentation 2368 struct ClearStackOnExit {
2370 ~ClearStackOnExit() { d_.ClearStack(); }
2372 ClearStackOnExit(
const ClearStackOnExit&);
2373 ClearStackOnExit& operator=(
const ClearStackOnExit&);
2379 template <
typename,
typename>
friend class GenericValue;
2383 bool Null() {
new (stack_.template Push<ValueType>())
ValueType();
return true; }
2384 bool Bool(
bool b) {
new (stack_.template Push<ValueType>())
ValueType(b);
return true; }
2385 bool Int(
int i) {
new (stack_.template Push<ValueType>())
ValueType(i);
return true; }
2386 bool Uint(
unsigned i) {
new (stack_.template Push<ValueType>())
ValueType(i);
return true; }
2387 bool Int64(int64_t i) {
new (stack_.template Push<ValueType>())
ValueType(i);
return true; }
2388 bool Uint64(uint64_t i) {
new (stack_.template Push<ValueType>())
ValueType(i);
return true; }
2389 bool Double(
double d) {
new (stack_.template Push<ValueType>())
ValueType(d);
return true; }
2391 bool RawNumber(
const Ch* str,
SizeType length,
bool copy) {
2393 new (stack_.template Push<ValueType>())
ValueType(str, length, GetAllocator());
2395 new (stack_.template Push<ValueType>())
ValueType(str, length);
2401 new (stack_.template Push<ValueType>())
ValueType(str, length, GetAllocator());
2403 new (stack_.template Push<ValueType>())
ValueType(str, length);
2407 bool StartObject() {
new (stack_.template Push<ValueType>())
ValueType(
kObjectType);
return true; }
2409 bool Key(
const Ch* str,
SizeType length,
bool copy) {
return String(str, length, copy); }
2411 bool EndObject(
SizeType memberCount) {
2412 typename ValueType::Member* members = stack_.template Pop<typename ValueType::Member>(memberCount);
2413 stack_.template Top<ValueType>()->
SetObjectRaw(members, memberCount, GetAllocator());
2417 bool StartArray() {
new (stack_.template Push<ValueType>())
ValueType(
kArrayType);
return true; }
2419 bool EndArray(
SizeType elementCount) {
2420 ValueType* elements = stack_.template Pop<ValueType>(elementCount);
2421 stack_.template Top<ValueType>()->SetArrayRaw(elements, elementCount, GetAllocator());
2432 if (Allocator::kNeedFree)
2433 while (stack_.GetSize() > 0)
2434 (stack_.template Pop<ValueType>(1))->~
ValueType();
2437 stack_.ShrinkToFit();
2444 static const size_t kDefaultStackCapacity = 1024;
2445 Allocator* allocator_;
2446 Allocator* ownAllocator_;
2459 template <
bool Const,
typename ValueT>
2464 typedef ValueT PlainType;
2466 typedef ValueType* ValueIterator;
2467 typedef const ValueT* ConstValueIterator;
2468 typedef typename ValueType::AllocatorType AllocatorType;
2469 typedef typename ValueType::StringRefType StringRefType;
2471 template <
typename,
typename>
2478 SizeType Size()
const {
return value_.Size(); }
2479 SizeType Capacity()
const {
return value_.Capacity(); }
2480 bool Empty()
const {
return value_.Empty(); }
2481 void Clear()
const { value_.Clear(); }
2482 ValueType& operator[](
SizeType index)
const {
return value_[index]; }
2483 ValueIterator Begin()
const {
return value_.Begin(); }
2484 ValueIterator End()
const {
return value_.End(); }
2485 GenericArray Reserve(
SizeType newCapacity, AllocatorType &allocator)
const { value_.Reserve(newCapacity, allocator);
return *
this; }
2486 GenericArray PushBack(ValueType&
value, AllocatorType& allocator)
const { value_.PushBack(value, allocator);
return *
this; }
2487 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 2488 GenericArray PushBack(ValueType&& value, AllocatorType& allocator)
const { value_.PushBack(value, allocator);
return *
this; }
2489 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS 2490 GenericArray PushBack(StringRefType value, AllocatorType& allocator)
const { value_.PushBack(value, allocator);
return *
this; }
2492 GenericArray PopBack()
const { value_.PopBack();
return *
this; }
2493 ValueIterator Erase(ConstValueIterator pos)
const {
return value_.Erase(pos); }
2494 ValueIterator Erase(ConstValueIterator first, ConstValueIterator last)
const {
return value_.Erase(first, last); }
2496 #if RAPIDJSON_HAS_CXX11_RANGE_FOR 2497 ValueIterator begin()
const {
return value_.Begin(); }
2498 ValueIterator end()
const {
return value_.End(); }
2512 template <
bool Const,
typename ValueT>
2517 typedef ValueT PlainType;
2521 typedef typename ValueType::AllocatorType AllocatorType;
2522 typedef typename ValueType::StringRefType StringRefType;
2523 typedef typename ValueType::EncodingType EncodingType;
2524 typedef typename ValueType::Ch Ch;
2526 template <
typename,
typename>
2533 SizeType MemberCount()
const {
return value_.MemberCount(); }
2534 bool ObjectEmpty()
const {
return value_.ObjectEmpty(); }
2535 template <
typename T> ValueType& operator[](T*
name)
const {
return value_[
name]; }
2537 #if RAPIDJSON_HAS_STDSTRING 2538 ValueType& operator[](
const std::basic_string<Ch>& name)
const {
return value_[
name]; }
2540 MemberIterator MemberBegin()
const {
return value_.MemberBegin(); }
2541 MemberIterator MemberEnd()
const {
return value_.MemberEnd(); }
2542 bool HasMember(
const Ch* name)
const {
return value_.HasMember(name); }
2543 #if RAPIDJSON_HAS_STDSTRING 2544 bool HasMember(
const std::basic_string<Ch>& name)
const {
return value_.HasMember(name); }
2547 MemberIterator FindMember(
const Ch* name)
const {
return value_.FindMember(name); }
2549 #if RAPIDJSON_HAS_STDSTRING 2550 MemberIterator FindMember(
const std::basic_string<Ch>& name)
const {
return value_.FindMember(name); }
2552 GenericObject AddMember(ValueType& name, ValueType&
value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2553 GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2554 #if RAPIDJSON_HAS_STDSTRING 2555 GenericObject AddMember(ValueType& name, std::basic_string<Ch>& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2557 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; }
2558 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 2559 GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2560 GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2561 GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2562 GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2563 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS 2564 GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2565 GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator)
const { value_.AddMember(name, value, allocator);
return *
this; }
2567 void RemoveAllMembers() {
return value_.RemoveAllMembers(); }
2568 bool RemoveMember(
const Ch* name)
const {
return value_.RemoveMember(name); }
2569 #if RAPIDJSON_HAS_STDSTRING 2570 bool RemoveMember(
const std::basic_string<Ch>& name)
const {
return value_.RemoveMember(name); }
2573 MemberIterator RemoveMember(MemberIterator m)
const {
return value_.RemoveMember(m); }
2574 MemberIterator EraseMember(ConstMemberIterator pos)
const {
return value_.EraseMember(pos); }
2575 MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last)
const {
return value_.EraseMember(first, last); }
2576 bool EraseMember(
const Ch* name)
const {
return value_.EraseMember(name); }
2577 #if RAPIDJSON_HAS_STDSTRING 2578 bool EraseMember(
const std::basic_string<Ch>& name)
const {
return EraseMember(
ValueType(
StringRef(name))); }
2582 #if RAPIDJSON_HAS_CXX11_RANGE_FOR 2583 MemberIterator begin()
const {
return value_.MemberBegin(); }
2584 MemberIterator end()
const {
return value_.MemberEnd(); }
2594 #ifdef _MINWINDEF_ // see: http://stackoverflow.com/questions/22744262/cant-call-stdmax-because-minwindef-h-defines-max 2596 #pragma pop_macro("min") 2597 #pragma pop_macro("max") 2602 #endif // RAPIDJSON_DOCUMENT_H_ GenericValue(int i) RAPIDJSON_NOEXCEPT
Constructor for int value.
Definition: document.h:681
GenericMemberIterator()
Default constructor (singular value)
Definition: document.h:139
GenericValue(const Ch *s, SizeType length, Allocator &allocator)
Constructor for copy-string (i.e. do make a copy of string)
Definition: document.h:732
GenericValue< Encoding, Allocator > name
name of member (must be a string)
Definition: document.h:80
Allocator AllocatorType
Allocator type from template parameter.
Definition: document.h:2078
GenericValue< Encoding, Allocator > ValueType
Value type of the document.
Definition: document.h:2077
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition: rapidjson.h:380
Definition: document.h:402
Represents an in-memory input byte stream.
Definition: memorystream.h:40
GenericValue(Object o) RAPIDJSON_NOEXCEPT
Constructor for Object.
Definition: document.h:761
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:402
Definition: document.h:1955
BaseType::pointer Pointer
Pointer to (const) GenericMember.
Definition: document.h:129
Definition: document.h:1932
#define RAPIDJSON_UINT64_C2(high32, low32)
Construct a 64-bit literal by a pair of 32-bit integer.
Definition: rapidjson.h:289
object
Definition: rapidjson.h:607
Helper class for accessing Value of array type.
Definition: document.h:531
GenericValue(Type type) RAPIDJSON_NOEXCEPT
Constructor with JSON value type.
Definition: document.h:600
Read-only string stream.
Definition: fwd.h:47
friend void swap(GenericDocument &a, GenericDocument &b) RAPIDJSON_NOEXCEPT
free-standing swap function helper
Definition: document.h:2177
GenericValue(float f) RAPIDJSON_NOEXCEPT
Constructor for float value.
Definition: document.h:723
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
Definition: rapidjson.h:119
GenericValue< Encoding, Allocator > value
value of member.
Definition: document.h:81
GenericDocument & Populate(Generator &g)
Populate this document by a generator which produces SAX events.
Definition: document.h:2185
(Constant) member iterator for a JSON object value
Definition: document.h:109
const Ch *const s
plain CharType pointer
Definition: document.h:330
array
Definition: rapidjson.h:608
GenericMemberIterator Iterator
Iterator type itself.
Definition: document.h:122
Encoding::Ch Ch
Character type derived from Encoding.
Definition: document.h:2076
GenericDocument & ParseStream(InputStream &is)
Parse JSON text from an input stream.
Definition: document.h:2224
Represents a JSON value. Use Value for UTF8 encoding and default allocator.
Definition: document.h:67
#define RAPIDJSON_STATIC_ASSERT(x)
(Internal) macro to check for conditions at compile-time
Definition: rapidjson.h:437
false
Definition: rapidjson.h:605
DifferenceType operator-(ConstIterator that) const
Distance.
Definition: document.h:195
GenericValue(const Ch *s, Allocator &allocator)
Constructor for copy-string (i.e. do make a copy of string)
Definition: document.h:735
bool HasParseError() const
Whether a parse error has occured in the last parsing.
Definition: document.h:2334
GenericMemberIterator< true, Encoding, Allocator > ConstIterator
Constant iterator type.
Definition: document.h:124
Result of parsing (wraps ParseErrorCode)
Definition: error.h:106
const GenericValue * ConstValueIterator
Constant value iterator for iterating in array.
Definition: document.h:559
Encoding EncodingType
Encoding type from template parameter.
Definition: document.h:552
GenericDocument & ParseStream(InputStream &is)
Parse JSON text from an input stream (with kParseDefaultFlags)
Definition: document.h:2234
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
Definition: rapidjson.h:116
size_t GetErrorOffset() const
Get the position of last parsing error in input, 0 otherwise.
Definition: document.h:2340
GenericMember< Encoding, Allocator > Member
Name-value pair in an object.
Definition: document.h:551
A document for parsing JSON text as DOM.
Definition: document.h:70
A read-write string stream.
Definition: fwd.h:52
GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT
Constructor for int64_t value.
Definition: document.h:693
Definition: document.h:1967
GenericValue(const Ch *s, SizeType length) RAPIDJSON_NOEXCEPT
Constructor for constant string (i.e. do not make a copy of string)
Definition: document.h:726
GenericDocument(Type type, Allocator *allocator=0, size_t stackCapacity=kDefaultStackCapacity, StackAllocator *stackAllocator=0)
Constructor.
Definition: document.h:2087
Allocator AllocatorType
Allocator type from template parameter.
Definition: document.h:553
GenericDocument(Allocator *allocator=0, size_t stackCapacity=kDefaultStackCapacity, StackAllocator *stackAllocator=0)
Constructor.
Definition: document.h:2100
GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame< bool, T >))) RAPIDJSON_NOEXCEPT
Constructor for boolean value.
Definition: document.h:670
string
Definition: rapidjson.h:609
SAX-style JSON parser. Use Reader for UTF8 encoding and default allocator.
Definition: fwd.h:88
Encoding::Ch Ch
Character type derived from Encoding.
Definition: document.h:554
GenericStringRef(const CharType *str)
Explicitly create string reference from const character pointer.
Definition: document.h:310
GenericValue< UTF8<> > Value
GenericValue with UTF8 encoding.
Definition: document.h:2060
GenericMemberIterator< true, Encoding, Allocator >::Iterator ConstMemberIterator
Constant member iterator for iterating in object.
Definition: document.h:557
ParseErrorCode
Error code of parsing.
Definition: error.h:64
Helper class for accessing Value of object type.
Definition: document.h:532
GenericDocument & ParseInsitu(Ch *str)
Parse JSON text from a mutable string.
Definition: document.h:2248
GenericStringRef(const CharType(&str)[N]) RAPIDJSON_NOEXCEPT
Create string reference from const character array.
Definition: document.h:286
GenericStringRef< Ch > StringRefType
Reference to a constant string.
Definition: document.h:555
Allocator & GetAllocator()
Get the allocator of this document.
Definition: document.h:2358
GenericDocument< UTF8<> > Document
GenericDocument with UTF8 encoding.
Definition: document.h:2452
GenericValue< Encoding, Allocator > ValueType
Value type of itself.
Definition: document.h:560
const SizeType length
length of the string (excluding the trailing NULL terminator)
Definition: document.h:331
number
Definition: rapidjson.h:610
#define RAPIDJSON_NEW(x)
! customization point for global new
Definition: rapidjson.h:586
Name-value pair in a JSON object value.
Definition: document.h:79
SizeType hashcode
reserved
Definition: document.h:1908
#define RAPIDJSON_DELETE(x)
! customization point for global delete
Definition: rapidjson.h:590
GenericDocument & Parse(const typename SourceEncoding::Ch *str)
Parse JSON text from a read-only string (with Encoding conversion)
Definition: document.h:2271
~GenericValue()
Destructor.
Definition: document.h:769
GenericDocument & ParseInsitu(Ch *str)
Parse JSON text from a mutable string (with kParseDefaultFlags)
Definition: document.h:2257
size_t GetStackCapacity() const
Get the capacity of stack in bytes.
Definition: document.h:2364
Definition: document.h:1961
Definition: document.h:1930
void SetObjectRaw(Member *members, SizeType count, Allocator &allocator)
Initialize this value as object with initial data, without calling destructor.
Definition: document.h:1997
CharType Ch
character type of the string
Definition: document.h:258
Definition: document.h:1920
Definition: document.h:399
ParseErrorCode GetParseError() const
Get the ParseErrorCode of last parsing.
Definition: document.h:2337
GenericStringRef< CharType > StringRef(const CharType *str)
Mark a character pointer as constant string.
Definition: document.h:354
GenericMemberIterator< false, Encoding, Allocator >::Iterator MemberIterator
Member iterator for iterating in object.
Definition: document.h:556
Definition: document.h:1906
void SetStringRaw(StringRefType s, Allocator &allocator)
Initialize this value as copy string with initial data, without calling destructor.
Definition: document.h:2017
void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT
Initialize this value as constant string, without calling destructor.
Definition: document.h:2010
GenericValue(unsigned u) RAPIDJSON_NOEXCEPT
Constructor for unsigned value.
Definition: document.h:687
GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT
Constructor for uint64_t value.
Definition: document.h:708
GenericValue * ValueIterator
Value iterator for iterating in array.
Definition: document.h:558
GenericValue(const GenericValue< Encoding, SourceAllocator > &rhs, Allocator &allocator)
Explicit copy constructor (with allocator)
Definition: document.h:621
GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT
Constructor for constant string (i.e. do not make a copy of string)
Definition: document.h:729
Definition: document.h:1936
GenericDocument & Parse(const Ch *str)
Parse JSON text from a read-only string.
Definition: document.h:2282
true
Definition: rapidjson.h:606
Definition: document.h:419
Reference to a constant string (not taking a copy)
Definition: document.h:257
Definition: document.h:409
BaseType::difference_type DifferenceType
Signed integer type (e.g. ptrdiff_t)
Definition: document.h:133
GenericMemberIterator< false, Encoding, Allocator > NonConstIterator
Non-constant iterator type.
Definition: document.h:126
GenericMemberIterator(const NonConstIterator &it)
Iterator conversions to more const.
Definition: document.h:157
GenericValue() RAPIDJSON_NOEXCEPT
Default constructor creates a null value.
Definition: document.h:570
GenericValue(double d) RAPIDJSON_NOEXCEPT
Constructor for double value.
Definition: document.h:720
Type
Type of JSON value.
Definition: rapidjson.h:603
GenericValue & operator=(StringRefType str) RAPIDJSON_NOEXCEPT
Assignment of constant string reference (no copy)
Definition: document.h:824
BaseType::reference Reference
Reference to (const) GenericMember.
Definition: document.h:131
GenericDocument & Parse(const Ch *str)
Parse JSON text from a read-only string (with kParseDefaultFlags)
Definition: document.h:2289
GenericStringRef(const CharType *str, SizeType len)
Create constant string reference from pointer and length.
Definition: document.h:322
void RawAssign(GenericValue &rhs) RAPIDJSON_NOEXCEPT
Assignment without calling destructor.
Definition: document.h:2034
#define RAPIDJSON_UNLIKELY(x)
Compiler branching hint for expression with low probability to be true.
Definition: rapidjson.h:468
GenericDocument & Swap(GenericDocument &rhs) RAPIDJSON_NOEXCEPT
Exchange the contents of this document with those of another.
Definition: document.h:2156
Definition: document.h:1895
GenericValue & operator=(GenericValue &rhs) RAPIDJSON_NOEXCEPT
Assignment with move semantics.
Definition: document.h:805
In-situ(destructive) parsing.
Definition: reader.h:147
GenericDocument & ParseStream(InputStream &is)
Parse JSON text from an input stream (with Encoding conversion)
Definition: document.h:2205
null
Definition: rapidjson.h:604
RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer< T >),(GenericValue &)) operator
Assignment with primitive types.
GenericValue(Array a) RAPIDJSON_NOEXCEPT
Constructor for Array.
Definition: document.h:750