15#ifndef RAPIDJSON_READER_H_
16#define RAPIDJSON_READER_H_
20#include "allocators.h"
22#include "encodedstream.h"
23#include "internal/meta.h"
24#include "internal/stack.h"
25#include "internal/strtod.h"
28#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER)
30#pragma intrinsic(_BitScanForward)
34#elif defined(RAPIDJSON_SSE2)
40RAPIDJSON_DIAG_OFF(4127)
41RAPIDJSON_DIAG_OFF(4702)
46RAPIDJSON_DIAG_OFF(old-style-cast)
47RAPIDJSON_DIAG_OFF(padded)
48RAPIDJSON_DIAG_OFF(
switch-
enum)
53RAPIDJSON_DIAG_OFF(effc++)
57#define RAPIDJSON_NOTHING
58#ifndef RAPIDJSON_PARSE_ERROR_EARLY_RETURN
59#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \
60 RAPIDJSON_MULTILINEMACRO_BEGIN \
61 if (RAPIDJSON_UNLIKELY(HasParseError())) { return value; } \
62 RAPIDJSON_MULTILINEMACRO_END
64#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \
65 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
98#ifndef RAPIDJSON_PARSE_ERROR_NORETURN
99#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \
100 RAPIDJSON_MULTILINEMACRO_BEGIN \
101 RAPIDJSON_ASSERT(!HasParseError()); \
102 SetParseError(parseErrorCode, offset); \
103 RAPIDJSON_MULTILINEMACRO_END
117#ifndef RAPIDJSON_PARSE_ERROR
118#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \
119 RAPIDJSON_MULTILINEMACRO_BEGIN \
120 RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
121 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
122 RAPIDJSON_MULTILINEMACRO_END
127RAPIDJSON_NAMESPACE_BEGIN
138#ifndef RAPIDJSON_PARSE_DEFAULT_FLAGS
139#define RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags
178 bool RawNumber(const Ch* str, SizeType length, bool copy);
179 bool String(const Ch* str, SizeType length, bool copy);
181 bool Key(const Ch* str, SizeType length, bool copy);
182 bool EndObject(SizeType memberCount);
184 bool EndArray(SizeType elementCount);
195template<
typename Encoding = UTF8<>,
typename Derived =
void>
197 typedef typename Encoding::Ch Ch;
199 typedef typename internal::SelectIf<internal::IsSame<Derived, void>,
BaseReaderHandler, Derived>
::Type Override;
201 bool Default() {
return true; }
202 bool Null() {
return static_cast<Override&
>(*this).Default(); }
203 bool Bool(
bool) {
return static_cast<Override&
>(*this).Default(); }
204 bool Int(
int) {
return static_cast<Override&
>(*this).Default(); }
205 bool Uint(
unsigned) {
return static_cast<Override&
>(*this).Default(); }
206 bool Int64(int64_t) {
return static_cast<Override&
>(*this).Default(); }
207 bool Uint64(uint64_t) {
return static_cast<Override&
>(*this).Default(); }
208 bool Double(
double) {
return static_cast<Override&
>(*this).Default(); }
210 bool RawNumber(
const Ch* str,
SizeType len,
bool copy) {
return static_cast<Override&
>(*this).String(str, len, copy); }
211 bool String(
const Ch*,
SizeType,
bool) {
return static_cast<Override&
>(*this).Default(); }
212 bool StartObject() {
return static_cast<Override&
>(*this).Default(); }
213 bool Key(
const Ch* str,
SizeType len,
bool copy) {
return static_cast<Override&
>(*this).String(str, len, copy); }
214 bool EndObject(
SizeType) {
return static_cast<Override&
>(*this).Default(); }
215 bool StartArray() {
return static_cast<Override&
>(*this).Default(); }
216 bool EndArray(
SizeType) {
return static_cast<Override&
>(*this).Default(); }
224template<typename Stream, int = StreamTraits<Stream>::copyOptimization>
225class StreamLocalCopy;
228template<
typename Stream>
229class StreamLocalCopy<
Stream, 1> {
231 StreamLocalCopy(
Stream& original) : s(original), original_(original) {}
232 ~StreamLocalCopy() { original_ = s; }
237 StreamLocalCopy& operator=(
const StreamLocalCopy&) ;
243template<
typename Stream>
244class StreamLocalCopy<
Stream, 0> {
246 StreamLocalCopy(
Stream& original) : s(original) {}
251 StreamLocalCopy& operator=(
const StreamLocalCopy&) ;
263template<
typename InputStream>
265 internal::StreamLocalCopy<InputStream> copy(is);
266 InputStream& s(copy.s);
268 typename InputStream::Ch c;
269 while ((c = s.Peek()) ==
' ' || c ==
'\n' || c ==
'\r' || c ==
'\t')
273inline const char* SkipWhitespace(
const char* p,
const char* end) {
274 while (p != end && (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t'))
279#ifdef RAPIDJSON_SSE42
281inline const char *SkipWhitespace_SIMD(
const char* p) {
283 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
289 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
290 while (p != nextAligned)
291 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
297 static const char whitespace[16] =
" \n\r\t";
298 const __m128i w = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&whitespace[0]));
301 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i *
>(p));
302 const int r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY));
305 unsigned long offset;
306 _BitScanForward(&offset, r);
309 return p + __builtin_ffs(r) - 1;
315inline const char *SkipWhitespace_SIMD(
const char* p,
const char* end) {
317 if (p != end && (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t'))
323 static const char whitespace[16] =
" \n\r\t";
324 const __m128i w = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&whitespace[0]));
326 for (; p <= end - 16; p += 16) {
327 const __m128i s = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(p));
328 const int r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY));
331 unsigned long offset;
332 _BitScanForward(&offset, r);
335 return p + __builtin_ffs(r) - 1;
343#elif defined(RAPIDJSON_SSE2)
346inline const char *SkipWhitespace_SIMD(
const char* p) {
348 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
354 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
355 while (p != nextAligned)
356 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
362 #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c }
363 static const char whitespaces[4][16] = { C16(
' '), C16(
'\n'), C16(
'\r'), C16(
'\t') };
366 const __m128i w0 = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&whitespaces[0][0]));
367 const __m128i w1 = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&whitespaces[1][0]));
368 const __m128i w2 = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&whitespaces[2][0]));
369 const __m128i w3 = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&whitespaces[3][0]));
372 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i *
>(p));
373 __m128i x = _mm_cmpeq_epi8(s, w0);
374 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));
375 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));
376 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));
377 unsigned short r =
static_cast<unsigned short>(~_mm_movemask_epi8(x));
380 unsigned long offset;
381 _BitScanForward(&offset, r);
384 return p + __builtin_ffs(r) - 1;
390inline const char *SkipWhitespace_SIMD(
const char* p,
const char* end) {
392 if (p != end && (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t'))
398 #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c }
399 static const char whitespaces[4][16] = { C16(
' '), C16(
'\n'), C16(
'\r'), C16(
'\t') };
402 const __m128i w0 = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&whitespaces[0][0]));
403 const __m128i w1 = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&whitespaces[1][0]));
404 const __m128i w2 = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&whitespaces[2][0]));
405 const __m128i w3 = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&whitespaces[3][0]));
407 for (; p <= end - 16; p += 16) {
408 const __m128i s = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(p));
409 __m128i x = _mm_cmpeq_epi8(s, w0);
410 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));
411 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));
412 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));
413 unsigned short r =
static_cast<unsigned short>(~_mm_movemask_epi8(x));
416 unsigned long offset;
417 _BitScanForward(&offset, r);
420 return p + __builtin_ffs(r) - 1;
433 is.src_ =
const_cast<char*
>(SkipWhitespace_SIMD(is.src_));
438 is.
src_ = SkipWhitespace_SIMD(is.
src_);
441template<>
inline void SkipWhitespace(EncodedInputStream<UTF8<>, MemoryStream>& is) {
442 is.is_.src_ = SkipWhitespace_SIMD(is.is_.src_, is.is_.end_);
465template <
typename SourceEncoding,
typename TargetEncoding,
typename StackAllocator = CrtAllocator>
468 typedef typename SourceEncoding::Ch
Ch;
474 GenericReader(StackAllocator* stackAllocator = 0,
size_t stackCapacity = kDefaultStackCapacity) : stack_(stackAllocator, stackCapacity), parseResult_() {}
484 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
487 return IterativeParse<parseFlags>(is, handler);
489 parseResult_.Clear();
491 ClearStackOnExit scope(*
this);
493 SkipWhitespaceAndComments<parseFlags>(is);
494 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
498 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
501 ParseValue<parseFlags>(is, handler);
502 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
505 SkipWhitespaceAndComments<parseFlags>(is);
506 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
510 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
525 template <
typename InputStream,
typename Handler>
527 return Parse<kParseDefaultFlags>(is, handler);
540 void SetParseError(
ParseErrorCode code,
size_t offset) { parseResult_.Set(code, offset); }
544 GenericReader(
const GenericReader&);
545 GenericReader& operator=(
const GenericReader&);
547 void ClearStack() { stack_.Clear(); }
550 struct ClearStackOnExit {
551 explicit ClearStackOnExit(GenericReader& r) : r_(r) {}
552 ~ClearStackOnExit() { r_.ClearStack(); }
555 ClearStackOnExit(
const ClearStackOnExit&);
556 ClearStackOnExit& operator=(
const ClearStackOnExit&);
559 template<
unsigned parseFlags,
typename InputStream>
560 void SkipWhitespaceAndComments(InputStream& is) {
565 if (Consume(is,
'*')) {
569 else if (Consume(is,
'*')) {
570 if (Consume(is,
'/'))
578 while (is.Peek() !=
'\0' && is.Take() !=
'\n');
588 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
589 void ParseObject(InputStream& is,
Handler& handler) {
596 SkipWhitespaceAndComments<parseFlags>(is);
597 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
599 if (Consume(is,
'}')) {
609 ParseString<parseFlags>(is, handler,
true);
610 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
612 SkipWhitespaceAndComments<parseFlags>(is);
613 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
618 SkipWhitespaceAndComments<parseFlags>(is);
619 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
621 ParseValue<parseFlags>(is, handler);
622 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
624 SkipWhitespaceAndComments<parseFlags>(is);
625 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
632 SkipWhitespaceAndComments<parseFlags>(is);
633 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
645 if (is.Peek() ==
'}') {
656 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
657 void ParseArray(InputStream& is,
Handler& handler) {
664 SkipWhitespaceAndComments<parseFlags>(is);
665 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
667 if (Consume(is,
']')) {
674 ParseValue<parseFlags>(is, handler);
675 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
678 SkipWhitespaceAndComments<parseFlags>(is);
679 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
681 if (Consume(is,
',')) {
682 SkipWhitespaceAndComments<parseFlags>(is);
683 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
685 else if (Consume(is,
']')) {
694 if (is.Peek() ==
']') {
704 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
705 void ParseNull(InputStream& is,
Handler& handler) {
709 if (
RAPIDJSON_LIKELY(Consume(is,
'u') && Consume(is,
'l') && Consume(is,
'l'))) {
717 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
718 void ParseTrue(InputStream& is,
Handler& handler) {
722 if (
RAPIDJSON_LIKELY(Consume(is,
'r') && Consume(is,
'u') && Consume(is,
'e'))) {
730 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
731 void ParseFalse(InputStream& is,
Handler& handler) {
735 if (
RAPIDJSON_LIKELY(Consume(is,
'a') && Consume(is,
'l') && Consume(is,
's') && Consume(is,
'e'))) {
743 template<
typename InputStream>
744 RAPIDJSON_FORCEINLINE
static bool Consume(InputStream& is,
typename InputStream::Ch expect) {
754 template<
typename InputStream>
755 unsigned ParseHex4(InputStream& is,
size_t escapeOffset) {
756 unsigned codepoint = 0;
757 for (
int i = 0; i < 4; i++) {
760 codepoint +=
static_cast<unsigned>(c);
761 if (c >=
'0' && c <=
'9')
763 else if (c >=
'A' && c <=
'F')
764 codepoint -=
'A' - 10;
765 else if (c >=
'a' && c <=
'f')
766 codepoint -=
'a' - 10;
769 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0);
776 template <
typename CharType>
781 StackStream(internal::Stack<StackAllocator>& stack) : stack_(stack), length_(0) {}
782 RAPIDJSON_FORCEINLINE
void Put(Ch c) {
783 *stack_.template Push<Ch>() = c;
787 RAPIDJSON_FORCEINLINE
void* Push(
SizeType count) {
789 return stack_.template Push<Ch>(count);
792 size_t Length()
const {
return length_; }
795 return stack_.template Pop<Ch>(length_);
799 StackStream(
const StackStream&);
800 StackStream& operator=(
const StackStream&);
802 internal::Stack<StackAllocator>& stack_;
807 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
808 void ParseString(InputStream& is,
Handler& handler,
bool isKey =
false) {
809 internal::StreamLocalCopy<InputStream> copy(is);
810 InputStream& s(copy.s);
815 bool success =
false;
817 typename InputStream::Ch *head = s.PutBegin();
818 ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s);
819 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
820 size_t length = s.PutEnd(head) - 1;
822 const typename TargetEncoding::Ch*
const str =
reinterpret_cast<typename TargetEncoding::Ch*
>(head);
823 success = (isKey ? handler.Key(str,
SizeType(length),
false) : handler.String(str,
SizeType(length),
false));
826 StackStream<typename TargetEncoding::Ch> stackStream(stack_);
827 ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);
828 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
830 const typename TargetEncoding::Ch*
const str = stackStream.Pop();
831 success = (isKey ? handler.Key(str, length,
true) : handler.String(str, length,
true));
839 template<
unsigned parseFlags,
typename SEncoding,
typename TEncoding,
typename InputStream,
typename OutputStream>
840 RAPIDJSON_FORCEINLINE
void ParseStringToStream(InputStream& is, OutputStream& os) {
842#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
843 static const char escape[256] = {
844 Z16, Z16, 0, 0,
'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'/',
845 Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'\\', 0, 0, 0,
846 0, 0,
'\b', 0, 0, 0,
'\f', 0, 0, 0, 0, 0, 0, 0,
'\n', 0,
847 0, 0,
'\r', 0,
'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
848 Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
856 ScanCopyUnescapedString(is, os);
860 size_t escapeOffset = is.Tell();
863 if ((
sizeof(Ch) == 1 ||
unsigned(e) < 256) &&
RAPIDJSON_LIKELY(escape[
static_cast<unsigned char>(e)])) {
865 os.Put(
static_cast<typename TEncoding::Ch
>(escape[
static_cast<unsigned char>(e)]));
869 unsigned codepoint = ParseHex4(is, escapeOffset);
870 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
875 unsigned codepoint2 = ParseHex4(is, escapeOffset);
876 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
879 codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
881 TEncoding::Encode(os, codepoint);
898 size_t offset = is.Tell();
900 !Transcoder<SEncoding, TEncoding>::Validate(is, os) :
901 !Transcoder<SEncoding, TEncoding>::Transcode(is, os))))
907 template<
typename InputStream,
typename OutputStream>
908 static RAPIDJSON_FORCEINLINE
void ScanCopyUnescapedString(InputStream&, OutputStream&) {
912#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42)
914 static RAPIDJSON_FORCEINLINE
void ScanCopyUnescapedString(StringStream& is, StackStream<char>& os) {
915 const char* p = is.src_;
918 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
919 while (p != nextAligned)
928 static const char dquote[16] = {
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"' };
929 static const char bslash[16] = {
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\' };
930 static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 };
931 const __m128i dq = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&dquote[0]));
932 const __m128i bs = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&bslash[0]));
933 const __m128i sp = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&space[0]));
936 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i *
>(p));
937 const __m128i t1 = _mm_cmpeq_epi8(s, dq);
938 const __m128i t2 = _mm_cmpeq_epi8(s, bs);
939 const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp);
940 const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);
941 unsigned short r =
static_cast<unsigned short>(_mm_movemask_epi8(x));
945 unsigned long offset;
946 _BitScanForward(&offset, r);
949 length =
static_cast<SizeType>(__builtin_ffs(r) - 1);
951 char* q =
reinterpret_cast<char*
>(os.Push(length));
952 for (
size_t i = 0; i < length; i++)
958 _mm_storeu_si128(
reinterpret_cast<__m128i *
>(os.Push(16)), s);
965 static RAPIDJSON_FORCEINLINE
void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) {
969 if (is.src_ == is.dst_) {
970 SkipUnescapedString(is);
978 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
979 while (p != nextAligned)
989 static const char dquote[16] = {
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"' };
990 static const char bslash[16] = {
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\' };
991 static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 };
992 const __m128i dq = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&dquote[0]));
993 const __m128i bs = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&bslash[0]));
994 const __m128i sp = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&space[0]));
996 for (;; p += 16, q += 16) {
997 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i *
>(p));
998 const __m128i t1 = _mm_cmpeq_epi8(s, dq);
999 const __m128i t2 = _mm_cmpeq_epi8(s, bs);
1000 const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp);
1001 const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);
1002 unsigned short r =
static_cast<unsigned short>(_mm_movemask_epi8(x));
1006 unsigned long offset;
1007 _BitScanForward(&offset, r);
1010 length =
static_cast<size_t>(__builtin_ffs(r) - 1);
1012 for (
const char* pend = p + length; p != pend; )
1016 _mm_storeu_si128(
reinterpret_cast<__m128i *
>(q), s);
1024 static RAPIDJSON_FORCEINLINE
void SkipUnescapedString(InsituStringStream& is) {
1029 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
1030 for (; p != nextAligned; p++)
1032 is.src_ = is.dst_ = p;
1037 static const char dquote[16] = {
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"' };
1038 static const char bslash[16] = {
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\' };
1039 static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 };
1040 const __m128i dq = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&dquote[0]));
1041 const __m128i bs = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&bslash[0]));
1042 const __m128i sp = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&space[0]));
1045 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i *
>(p));
1046 const __m128i t1 = _mm_cmpeq_epi8(s, dq);
1047 const __m128i t2 = _mm_cmpeq_epi8(s, bs);
1048 const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp);
1049 const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);
1050 unsigned short r =
static_cast<unsigned short>(_mm_movemask_epi8(x));
1054 unsigned long offset;
1055 _BitScanForward(&offset, r);
1058 length =
static_cast<size_t>(__builtin_ffs(r) - 1);
1065 is.src_ = is.dst_ = p;
1069 template<
typename InputStream,
bool backup,
bool pushOnTake>
1072 template<
typename InputStream>
1073 class NumberStream<InputStream, false, false> {
1075 typedef typename InputStream::Ch Ch;
1077 NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader; }
1080 RAPIDJSON_FORCEINLINE Ch Peek()
const {
return is.Peek(); }
1081 RAPIDJSON_FORCEINLINE Ch TakePush() {
return is.Take(); }
1082 RAPIDJSON_FORCEINLINE Ch Take() {
return is.Take(); }
1083 RAPIDJSON_FORCEINLINE
void Push(
char) {}
1085 size_t Tell() {
return is.Tell(); }
1086 size_t Length() {
return 0; }
1087 const char* Pop() {
return 0; }
1090 NumberStream& operator=(
const NumberStream&);
1095 template<
typename InputStream>
1096 class NumberStream<InputStream, true, false> :
public NumberStream<InputStream, false, false> {
1097 typedef NumberStream<InputStream, false, false> Base;
1099 NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is), stackStream(reader.stack_) {}
1102 RAPIDJSON_FORCEINLINE Ch TakePush() {
1103 stackStream.Put(
static_cast<char>(Base::is.Peek()));
1104 return Base::is.Take();
1107 RAPIDJSON_FORCEINLINE
void Push(
char c) {
1111 size_t Length() {
return stackStream.Length(); }
1114 stackStream.Put(
'\0');
1115 return stackStream.Pop();
1119 StackStream<char> stackStream;
1122 template<
typename InputStream>
1123 class NumberStream<InputStream, true, true> :
public NumberStream<InputStream, true, false> {
1124 typedef NumberStream<InputStream, true, false> Base;
1126 NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is) {}
1129 RAPIDJSON_FORCEINLINE Ch Take() {
return Base::TakePush(); }
1132 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
1133 void ParseNumber(InputStream& is,
Handler& handler) {
1134 internal::StreamLocalCopy<InputStream> copy(is);
1135 NumberStream<InputStream,
1142 size_t startOffset = s.Tell();
1144 bool useNanOrInf =
false;
1147 bool minus = Consume(s,
'-');
1152 bool use64bit =
false;
1153 int significandDigit = 0;
1159 i =
static_cast<unsigned>(s.TakePush() -
'0');
1170 i = i * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1182 i = i * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1189 if (
RAPIDJSON_LIKELY(Consume(s,
'N') && Consume(s,
'a') && Consume(s,
'N'))) {
1190 d = std::numeric_limits<double>::quiet_NaN();
1192 else if (
RAPIDJSON_LIKELY(Consume(s,
'I') && Consume(s,
'n') && Consume(s,
'f'))) {
1193 d = (minus ? -std::numeric_limits<double>::infinity() : std::numeric_limits<double>::infinity());
1195 && Consume(s,
'i') && Consume(s,
't') && Consume(s,
'y'))))
1205 bool useDouble =
false;
1211 d =
static_cast<double>(i64);
1215 i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1222 d =
static_cast<double>(i64);
1226 i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1236 d = d * 10 + (s.TakePush() -
'0');
1242 size_t decimalPosition;
1243 if (Consume(s,
'.')) {
1244 decimalPosition = s.Length();
1259 i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1266 d =
static_cast<double>(i64);
1269 d =
static_cast<double>(use64bit ? i64 : i);
1275 if (significandDigit < 17) {
1276 d = d * 10.0 + (s.TakePush() -
'0');
1286 decimalPosition = s.Length();
1290 if (Consume(s,
'e') || Consume(s,
'E')) {
1292 d =
static_cast<double>(use64bit ? i64 : i);
1296 bool expMinus =
false;
1297 if (Consume(s,
'+'))
1299 else if (Consume(s,
'-'))
1303 exp =
static_cast<int>(s.Take() -
'0');
1312 int maxExp = (expFrac + 2147483639) / 10;
1315 exp = exp * 10 +
static_cast<int>(s.Take() -
'0');
1323 int maxExp = 308 - expFrac;
1325 exp = exp * 10 +
static_cast<int>(s.Take() -
'0');
1344 typename InputStream::Ch* head = is.PutBegin();
1345 const size_t length = s.Tell() - startOffset;
1348 const typename TargetEncoding::Ch*
const str =
reinterpret_cast<typename TargetEncoding::Ch*
>(head);
1349 cont = handler.RawNumber(str,
SizeType(length),
false);
1354 StackStream<typename TargetEncoding::Ch> dstStream(stack_);
1355 while (numCharsToCopy--) {
1356 Transcoder<UTF8<>, TargetEncoding>::Transcode(srcStream, dstStream);
1358 dstStream.Put(
'\0');
1359 const typename TargetEncoding::Ch* str = dstStream.Pop();
1361 cont = handler.RawNumber(str,
SizeType(length),
true);
1365 size_t length = s.Length();
1366 const char* decimal = s.Pop();
1369 int p = exp + expFrac;
1371 d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp);
1373 d = internal::StrtodNormalPrecision(d, p);
1375 cont = handler.Double(minus ? -d : d);
1377 else if (useNanOrInf) {
1378 cont = handler.Double(d);
1383 cont = handler.Int64(
static_cast<int64_t
>(~i64 + 1));
1385 cont = handler.Uint64(i64);
1389 cont = handler.Int(
static_cast<int32_t
>(~i + 1));
1391 cont = handler.Uint(i);
1400 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
1401 void ParseValue(InputStream& is,
Handler& handler) {
1402 switch (is.Peek()) {
1403 case 'n': ParseNull <parseFlags>(is, handler);
break;
1404 case 't': ParseTrue <parseFlags>(is, handler);
break;
1405 case 'f': ParseFalse <parseFlags>(is, handler);
break;
1406 case '"': ParseString<parseFlags>(is, handler);
break;
1407 case '{': ParseObject<parseFlags>(is, handler);
break;
1408 case '[': ParseArray <parseFlags>(is, handler);
break;
1410 ParseNumber<parseFlags>(is, handler);
1419 enum IterativeParsingState {
1420 IterativeParsingStartState = 0,
1421 IterativeParsingFinishState,
1422 IterativeParsingErrorState,
1425 IterativeParsingObjectInitialState,
1426 IterativeParsingMemberKeyState,
1427 IterativeParsingKeyValueDelimiterState,
1428 IterativeParsingMemberValueState,
1429 IterativeParsingMemberDelimiterState,
1430 IterativeParsingObjectFinishState,
1433 IterativeParsingArrayInitialState,
1434 IterativeParsingElementState,
1435 IterativeParsingElementDelimiterState,
1436 IterativeParsingArrayFinishState,
1439 IterativeParsingValueState
1442 enum { cIterativeParsingStateCount = IterativeParsingValueState + 1 };
1446 LeftBracketToken = 0,
1449 LeftCurlyBracketToken,
1450 RightCurlyBracketToken,
1464 RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) {
1467#define N NumberToken
1468#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
1470 static const unsigned char tokenMap[256] = {
1473 N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N,
1474 N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N,
1476 N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N,
1477 N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N,
1478 N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N,
1479 N16, N16, N16, N16, N16, N16, N16, N16
1485 if (
sizeof(Ch) == 1 ||
static_cast<unsigned>(c) < 256)
1486 return static_cast<Token
>(tokenMap[
static_cast<unsigned char>(c)]);
1491 RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) {
1493 static const char G[cIterativeParsingStateCount][kTokenCount] = {
1496 IterativeParsingArrayInitialState,
1497 IterativeParsingErrorState,
1498 IterativeParsingObjectInitialState,
1499 IterativeParsingErrorState,
1500 IterativeParsingErrorState,
1501 IterativeParsingErrorState,
1502 IterativeParsingValueState,
1503 IterativeParsingValueState,
1504 IterativeParsingValueState,
1505 IterativeParsingValueState,
1506 IterativeParsingValueState
1510 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1511 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1512 IterativeParsingErrorState
1516 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1517 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1518 IterativeParsingErrorState
1522 IterativeParsingErrorState,
1523 IterativeParsingErrorState,
1524 IterativeParsingErrorState,
1525 IterativeParsingObjectFinishState,
1526 IterativeParsingErrorState,
1527 IterativeParsingErrorState,
1528 IterativeParsingMemberKeyState,
1529 IterativeParsingErrorState,
1530 IterativeParsingErrorState,
1531 IterativeParsingErrorState,
1532 IterativeParsingErrorState
1536 IterativeParsingErrorState,
1537 IterativeParsingErrorState,
1538 IterativeParsingErrorState,
1539 IterativeParsingErrorState,
1540 IterativeParsingErrorState,
1541 IterativeParsingKeyValueDelimiterState,
1542 IterativeParsingErrorState,
1543 IterativeParsingErrorState,
1544 IterativeParsingErrorState,
1545 IterativeParsingErrorState,
1546 IterativeParsingErrorState
1550 IterativeParsingArrayInitialState,
1551 IterativeParsingErrorState,
1552 IterativeParsingObjectInitialState,
1553 IterativeParsingErrorState,
1554 IterativeParsingErrorState,
1555 IterativeParsingErrorState,
1556 IterativeParsingMemberValueState,
1557 IterativeParsingMemberValueState,
1558 IterativeParsingMemberValueState,
1559 IterativeParsingMemberValueState,
1560 IterativeParsingMemberValueState
1564 IterativeParsingErrorState,
1565 IterativeParsingErrorState,
1566 IterativeParsingErrorState,
1567 IterativeParsingObjectFinishState,
1568 IterativeParsingMemberDelimiterState,
1569 IterativeParsingErrorState,
1570 IterativeParsingErrorState,
1571 IterativeParsingErrorState,
1572 IterativeParsingErrorState,
1573 IterativeParsingErrorState,
1574 IterativeParsingErrorState
1578 IterativeParsingErrorState,
1579 IterativeParsingErrorState,
1580 IterativeParsingErrorState,
1581 IterativeParsingObjectFinishState,
1582 IterativeParsingErrorState,
1583 IterativeParsingErrorState,
1584 IterativeParsingMemberKeyState,
1585 IterativeParsingErrorState,
1586 IterativeParsingErrorState,
1587 IterativeParsingErrorState,
1588 IterativeParsingErrorState
1592 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1593 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1594 IterativeParsingErrorState
1598 IterativeParsingArrayInitialState,
1599 IterativeParsingArrayFinishState,
1600 IterativeParsingObjectInitialState,
1601 IterativeParsingErrorState,
1602 IterativeParsingErrorState,
1603 IterativeParsingErrorState,
1604 IterativeParsingElementState,
1605 IterativeParsingElementState,
1606 IterativeParsingElementState,
1607 IterativeParsingElementState,
1608 IterativeParsingElementState
1612 IterativeParsingErrorState,
1613 IterativeParsingArrayFinishState,
1614 IterativeParsingErrorState,
1615 IterativeParsingErrorState,
1616 IterativeParsingElementDelimiterState,
1617 IterativeParsingErrorState,
1618 IterativeParsingErrorState,
1619 IterativeParsingErrorState,
1620 IterativeParsingErrorState,
1621 IterativeParsingErrorState,
1622 IterativeParsingErrorState
1626 IterativeParsingArrayInitialState,
1627 IterativeParsingArrayFinishState,
1628 IterativeParsingObjectInitialState,
1629 IterativeParsingErrorState,
1630 IterativeParsingErrorState,
1631 IterativeParsingErrorState,
1632 IterativeParsingElementState,
1633 IterativeParsingElementState,
1634 IterativeParsingElementState,
1635 IterativeParsingElementState,
1636 IterativeParsingElementState
1640 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1641 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1642 IterativeParsingErrorState
1646 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1647 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1648 IterativeParsingErrorState
1652 return static_cast<IterativeParsingState
>(G[state][token]);
1657 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1658 RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is,
Handler& handler) {
1662 case IterativeParsingErrorState:
1665 case IterativeParsingObjectInitialState:
1666 case IterativeParsingArrayInitialState:
1670 IterativeParsingState n = src;
1671 if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState)
1672 n = IterativeParsingElementState;
1673 else if (src == IterativeParsingKeyValueDelimiterState)
1674 n = IterativeParsingMemberValueState;
1676 *stack_.template Push<SizeType>(1) = n;
1678 *stack_.template Push<SizeType>(1) = 0;
1680 bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray();
1684 return IterativeParsingErrorState;
1692 case IterativeParsingMemberKeyState:
1693 ParseString<parseFlags>(is, handler,
true);
1694 if (HasParseError())
1695 return IterativeParsingErrorState;
1699 case IterativeParsingKeyValueDelimiterState:
1704 case IterativeParsingMemberValueState:
1706 ParseValue<parseFlags>(is, handler);
1707 if (HasParseError()) {
1708 return IterativeParsingErrorState;
1712 case IterativeParsingElementState:
1714 ParseValue<parseFlags>(is, handler);
1715 if (HasParseError()) {
1716 return IterativeParsingErrorState;
1720 case IterativeParsingMemberDelimiterState:
1721 case IterativeParsingElementDelimiterState:
1724 *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;
1727 case IterativeParsingObjectFinishState:
1732 return IterativeParsingErrorState;
1735 SizeType c = *stack_.template Pop<SizeType>(1);
1737 if (src == IterativeParsingMemberValueState)
1740 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1742 if (n == IterativeParsingStartState)
1743 n = IterativeParsingFinishState;
1745 bool hr = handler.EndObject(c);
1749 return IterativeParsingErrorState;
1757 case IterativeParsingArrayFinishState:
1762 return IterativeParsingErrorState;
1765 SizeType c = *stack_.template Pop<SizeType>(1);
1767 if (src == IterativeParsingElementState)
1770 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1772 if (n == IterativeParsingStartState)
1773 n = IterativeParsingFinishState;
1775 bool hr = handler.EndArray(c);
1779 return IterativeParsingErrorState;
1801 ParseValue<parseFlags>(is, handler);
1802 if (HasParseError()) {
1803 return IterativeParsingErrorState;
1805 return IterativeParsingFinishState;
1809 template <
typename InputStream>
1810 void HandleError(IterativeParsingState src, InputStream& is) {
1811 if (HasParseError()) {
1819 case IterativeParsingObjectInitialState:
1823 case IterativeParsingKeyValueDelimiterState:
1824 case IterativeParsingArrayInitialState:
1830 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1831 ParseResult IterativeParse(InputStream& is,
Handler& handler) {
1832 parseResult_.Clear();
1833 ClearStackOnExit scope(*
this);
1834 IterativeParsingState state = IterativeParsingStartState;
1836 SkipWhitespaceAndComments<parseFlags>(is);
1837 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
1838 while (is.Peek() !=
'\0') {
1839 Token t = Tokenize(is.Peek());
1840 IterativeParsingState n = Predict(state, t);
1841 IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
1843 if (d == IterativeParsingErrorState) {
1844 HandleError(state, is);
1854 SkipWhitespaceAndComments<parseFlags>(is);
1855 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
1859 if (state != IterativeParsingFinishState)
1860 HandleError(state, is);
1862 return parseResult_;
1865 static const size_t kDefaultStackCapacity = 256;
1866 internal::Stack<StackAllocator> stack_;
1867 ParseResult parseResult_;
1871typedef GenericReader<UTF8<>, UTF8<> >
Reader;
1873RAPIDJSON_NAMESPACE_END
SAX-style JSON parser. Use Reader for UTF8 encoding and default allocator.
Definition: reader.h:466
ParseErrorCode GetParseErrorCode() const
Get the ParseErrorCode of last parsing.
Definition: reader.h:534
SourceEncoding::Ch Ch
SourceEncoding character type.
Definition: reader.h:468
ParseResult Parse(InputStream &is, Handler &handler)
Parse JSON text (with kParseDefaultFlags)
Definition: reader.h:526
GenericReader(StackAllocator *stackAllocator=0, size_t stackCapacity=kDefaultStackCapacity)
Constructor.
Definition: reader.h:474
size_t GetErrorOffset() const
Get the position of last parsing error in input, 0 otherwise.
Definition: reader.h:537
bool HasParseError() const
Whether a parse error has occured in the last parsing.
Definition: reader.h:531
ParseResult Parse(InputStream &is, Handler &handler)
Parse JSON text.
Definition: reader.h:485
Concept for receiving events from GenericReader upon parsing. The functions return true if no error o...
Concept for reading and writing characters.
#define RAPIDJSON_LIKELY(x)
Compiler branching hint for expression with high probability to be true.
Definition: rapidjson.h:455
#define RAPIDJSON_UNLIKELY(x)
Compiler branching hint for expression with low probability to be true.
Definition: rapidjson.h:468
#define RAPIDJSON_PARSE_DEFAULT_FLAGS
User-defined kParseDefaultFlags definition.
Definition: reader.h:139
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:402
ParseErrorCode
Error code of parsing.
Definition: error.h:64
#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset)
Macro to indicate a parse error.
Definition: reader.h:99
#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset)
(Internal) macro to indicate and handle a parse error.
Definition: reader.h:118
@ kParseErrorDocumentEmpty
The document is empty.
Definition: error.h:67
@ kParseErrorArrayMissCommaOrSquareBracket
Missing a comma or ']' after an array element.
Definition: error.h:76
@ kParseErrorDocumentRootNotSingular
The document root must not follow by other values.
Definition: error.h:68
@ kParseErrorStringUnicodeEscapeInvalidHex
Incorrect hex digit after \u escape in string.
Definition: error.h:78
@ kParseErrorNumberTooBig
Number too big to be stored in double.
Definition: error.h:84
@ kParseErrorNumberMissExponent
Miss exponent in number.
Definition: error.h:86
@ kParseErrorObjectMissCommaOrCurlyBracket
Missing a comma or '}' after an object member.
Definition: error.h:74
@ kParseErrorObjectMissColon
Missing a colon after a name of object member.
Definition: error.h:73
@ kParseErrorStringInvalidEncoding
Invalid encoding in string.
Definition: error.h:82
@ kParseErrorStringUnicodeSurrogateInvalid
The surrogate pair in string is invalid.
Definition: error.h:79
@ kParseErrorUnspecificSyntaxError
Unspecific syntax error.
Definition: error.h:89
@ kParseErrorStringEscapeInvalid
Invalid escape character in string.
Definition: error.h:80
@ kParseErrorTermination
Parsing was terminated.
Definition: error.h:88
@ kParseErrorObjectMissName
Missing a name for object member.
Definition: error.h:72
@ kParseErrorValueInvalid
Invalid value.
Definition: error.h:70
@ kParseErrorNumberMissFraction
Miss fraction part in number.
Definition: error.h:85
@ kParseErrorStringMissQuotationMark
Missing a closing quotation mark in string.
Definition: error.h:81
Result of parsing (wraps ParseErrorCode)
Definition: error.h:106
GenericStringStream< UTF8< char > > StringStream
String stream with UTF8 encoding.
Definition: fwd.h:47
unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition: rapidjson.h:380
void SkipWhitespace(InputStream &is)
Skip the JSON white spaces in a stream.
Definition: reader.h:264
ParseFlag
Combination of parseFlags.
Definition: reader.h:145
@ kParseInsituFlag
In-situ(destructive) parsing.
Definition: reader.h:147
@ kParseNumbersAsStringsFlag
Parse all numbers (ints/doubles) as strings.
Definition: reader.h:153
@ kParseValidateEncodingFlag
Validate encoding of JSON strings.
Definition: reader.h:148
@ kParseDefaultFlags
Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS.
Definition: reader.h:156
@ kParseIterativeFlag
Iterative(constant complexity in terms of function call stack size) parsing.
Definition: reader.h:149
@ kParseNanAndInfFlag
Allow parsing NaN, Inf, Infinity, -Inf and -Infinity as doubles.
Definition: reader.h:155
@ kParseCommentsFlag
Allow one-line (//) and multi-line (/**/) comments.
Definition: reader.h:152
@ kParseFullPrecisionFlag
Parse number in full precision (but slower).
Definition: reader.h:151
@ kParseNoFlags
No flags are set.
Definition: reader.h:146
@ kParseStopWhenDoneFlag
After parsing a complete JSON root from stream, stop further processing the rest of stream....
Definition: reader.h:150
@ kParseTrailingCommasFlag
Allow trailing commas at the end of objects and arrays.
Definition: reader.h:154
GenericReader< UTF8< char >, UTF8< char >, CrtAllocator > Reader
Reader with UTF8 encoding and default allocator.
Definition: fwd.h:88
Type
Type of JSON value.
Definition: rapidjson.h:603
#define RAPIDJSON_UINT64_C2(high32, low32)
Construct a 64-bit literal by a pair of 32-bit integer.
Definition: rapidjson.h:289
Default implementation of Handler.
Definition: reader.h:196
bool RawNumber(const Ch *str, SizeType len, bool copy)
enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length)
Definition: reader.h:210
A read-write string stream.
Definition: stream.h:144
Read-only string stream.
Definition: stream.h:110
const Ch * src_
Current read position.
Definition: stream.h:124