1 #ifndef RAPIDJSON_DOCUMENT_H_
2 #define RAPIDJSON_DOCUMENT_H_
10 #pragma warning(disable : 4127) // conditional expression is constant
28 #pragma pack (push, 4)
29 template <
typename Encoding,
typename Allocator = MemoryPoolAllocator<> >
40 typedef typename Encoding::Ch
Ch;
64 static const unsigned defaultFlags[7] = {
86 if (!(u & 0x80000000))
95 if (!(i64 & 0xFFFFFFFF00000000LL))
97 if (!(i64 & 0xFFFFFFFF80000000LL))
100 else if (i64 >= -2147483648LL)
107 if (!(u64 & 0x8000000000000000ULL))
109 if (!(u64 & 0xFFFFFFFF00000000ULL))
111 if (!(u64 & 0xFFFFFFFF80000000ULL))
139 if (Allocator::kNeedFree) {
149 m->name.~GenericValue();
150 m->value.~GenericValue();
156 Allocator::Free(const_cast<Ch*>(
data_.
s.
str));
182 template <
typename T>
234 return member->value;
262 if (o.size >= o.capacity) {
263 if (o.capacity == 0) {
265 o.members = (
Member*)allocator.Malloc(o.capacity *
sizeof(
Member));
270 o.members = (
Member*)allocator.Realloc(o.members, oldCapacity *
sizeof(
Member), o.capacity *
sizeof(
Member));
273 o.members[o.size].name.RawAssign(name);
274 o.members[o.size].value.RawAssign(value);
289 template <
typename T>
315 m->name.~GenericValue();
316 m->value.~GenericValue();
404 template <
typename T>
493 template <
typename Handler>
498 case kTrueType: handler.Bool(
true);
break;
501 handler.StartObject();
503 handler.String(
m->name.data_.s.str,
m->name.data_.s.length,
false);
504 m->value.Accept(handler);
510 handler.StartArray();
525 else handler.Double(
data_.
n.
d);
532 template <
typename,
typename>
574 #if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN
626 if (length == member->name.data_.s.length && memcmp(member->name.data_.s.str, name, length *
sizeof(
Ch)) == 0)
661 data_.
s.
str = (
Ch *)allocator.Malloc((length + 1) *
sizeof(
Ch));
663 memcpy(const_cast<Ch*>(
data_.
s.
str), s, length *
sizeof(
Ch));
690 template <
typename Encoding,
typename Allocator = MemoryPoolAllocator<> >
693 typedef typename Encoding::Ch
Ch;
708 template <
unsigned parseFlags,
typename Stream>
712 if (reader.template Parse<parseFlags>(stream, *
this)) {
731 template <
unsigned parseFlags>
734 return ParseStream<parseFlags | kParseInsituFlag>(
s);
741 template <
unsigned parseFlags>
745 return ParseStream<parseFlags>(
s);
788 typename ValueType::Member* members =
stack_.template Pop<typename ValueType::Member>(memberCount);
800 if (Allocator::kNeedFree)
801 while (
stack_.GetSize() > 0)
821 #endif // RAPIDJSON_DOCUMENT_H_