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" 29 #if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) 31 #pragma intrinsic(_BitScanForward) 33 #ifdef RAPIDJSON_SSE42 34 #include <nmmintrin.h> 35 #elif defined(RAPIDJSON_SSE2) 36 #include <emmintrin.h> 41 RAPIDJSON_DIAG_OFF(4127)
42 RAPIDJSON_DIAG_OFF(4702)
47 RAPIDJSON_DIAG_OFF(old-style-cast)
48 RAPIDJSON_DIAG_OFF(padded)
49 RAPIDJSON_DIAG_OFF(
switch-
enum)
54 RAPIDJSON_DIAG_OFF(effc++)
58 #define RAPIDJSON_NOTHING 59 #ifndef RAPIDJSON_PARSE_ERROR_EARLY_RETURN 60 #define RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \ 61 RAPIDJSON_MULTILINEMACRO_BEGIN \ 62 if (RAPIDJSON_UNLIKELY(HasParseError())) { return value; } \ 63 RAPIDJSON_MULTILINEMACRO_END 65 #define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \ 66 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING) 99 #ifndef RAPIDJSON_PARSE_ERROR_NORETURN 100 #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \ 101 RAPIDJSON_MULTILINEMACRO_BEGIN \ 102 RAPIDJSON_ASSERT(!HasParseError()); \ 103 SetParseError(parseErrorCode, offset); \ 104 RAPIDJSON_MULTILINEMACRO_END 118 #ifndef RAPIDJSON_PARSE_ERROR 119 #define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \ 120 RAPIDJSON_MULTILINEMACRO_BEGIN \ 121 RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \ 122 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \ 123 RAPIDJSON_MULTILINEMACRO_END 128 RAPIDJSON_NAMESPACE_BEGIN
139 #ifndef RAPIDJSON_PARSE_DEFAULT_FLAGS 140 #define RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags 179 bool RawNumber(const Ch* str, SizeType length, bool copy);
180 bool String(const Ch* str, SizeType length, bool copy);
182 bool Key(const Ch* str, SizeType length, bool copy);
183 bool EndObject(SizeType memberCount);
185 bool EndArray(SizeType elementCount);
196 template<
typename Encoding = UTF8<>,
typename Derived =
void>
198 typedef typename Encoding::Ch Ch;
200 typedef typename internal::SelectIf<internal::IsSame<Derived, void>,
BaseReaderHandler, Derived>
::Type Override;
202 bool Default() {
return true; }
203 bool Null() {
return static_cast<Override&
>(*this).Default(); }
204 bool Bool(
bool) {
return static_cast<Override&
>(*this).Default(); }
205 bool Int(
int) {
return static_cast<Override&
>(*this).Default(); }
206 bool Uint(
unsigned) {
return static_cast<Override&
>(*this).Default(); }
207 bool Int64(int64_t) {
return static_cast<Override&
>(*this).Default(); }
208 bool Uint64(uint64_t) {
return static_cast<Override&
>(*this).Default(); }
209 bool Double(
double) {
return static_cast<Override&
>(*this).Default(); }
211 bool RawNumber(
const Ch* str,
SizeType len,
bool copy) {
return static_cast<Override&
>(*this).String(str, len, copy); }
212 bool String(
const Ch*,
SizeType,
bool) {
return static_cast<Override&
>(*this).Default(); }
213 bool StartObject() {
return static_cast<Override&
>(*this).Default(); }
214 bool Key(
const Ch* str,
SizeType len,
bool copy) {
return static_cast<Override&
>(*this).String(str, len, copy); }
215 bool EndObject(
SizeType) {
return static_cast<Override&
>(*this).Default(); }
216 bool StartArray() {
return static_cast<Override&
>(*this).Default(); }
217 bool EndArray(
SizeType) {
return static_cast<Override&
>(*this).Default(); }
225 template<typename Stream, int = StreamTraits<Stream>::copyOptimization>
226 class StreamLocalCopy;
229 template<
typename Stream>
230 class StreamLocalCopy<Stream, 1> {
232 StreamLocalCopy(Stream& original) : s(original), original_(original) {}
233 ~StreamLocalCopy() { original_ = s; }
238 StreamLocalCopy& operator=(
const StreamLocalCopy&) ;
244 template<
typename Stream>
245 class StreamLocalCopy<Stream, 0> {
247 StreamLocalCopy(Stream& original) : s(original) {}
252 StreamLocalCopy& operator=(
const StreamLocalCopy&) ;
264 template<
typename InputStream>
266 internal::StreamLocalCopy<InputStream> copy(is);
267 InputStream& s(copy.s);
269 typename InputStream::Ch c;
270 while ((c = s.Peek()) ==
' ' || c ==
'\n' || c ==
'\r' || c ==
'\t')
274 inline const char*
SkipWhitespace(
const char* p,
const char* end) {
275 while (p != end && (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t'))
280 #ifdef RAPIDJSON_SSE42 282 inline const char *SkipWhitespace_SIMD(
const char* p) {
284 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
290 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
291 while (p != nextAligned)
292 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
298 static const char whitespace[16] =
" \n\r\t";
299 const __m128i w = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespace[0]));
302 const __m128i s = _mm_load_si128(reinterpret_cast<const __m128i *>(p));
303 const int r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY));
305 #ifdef _MSC_VER // Find the index of first non-whitespace 306 unsigned long offset;
307 _BitScanForward(&offset, r);
310 return p + __builtin_ffs(r) - 1;
316 inline const char *SkipWhitespace_SIMD(
const char* p,
const char* end) {
318 if (p != end && (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t'))
324 static const char whitespace[16] =
" \n\r\t";
325 const __m128i w = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespace[0]));
327 for (; p <= end - 16; p += 16) {
328 const __m128i s = _mm_loadu_si128(reinterpret_cast<const __m128i *>(p));
329 const int r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY));
331 #ifdef _MSC_VER // Find the index of first non-whitespace 332 unsigned long offset;
333 _BitScanForward(&offset, r);
336 return p + __builtin_ffs(r) - 1;
344 #elif defined(RAPIDJSON_SSE2) 347 inline const char *SkipWhitespace_SIMD(
const char* p) {
349 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
355 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
356 while (p != nextAligned)
357 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
363 #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } 364 static const char whitespaces[4][16] = { C16(
' '), C16(
'\n'), C16(
'\r'), C16(
'\t') };
367 const __m128i w0 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[0][0]));
368 const __m128i w1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[1][0]));
369 const __m128i w2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[2][0]));
370 const __m128i w3 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[3][0]));
373 const __m128i s = _mm_load_si128(reinterpret_cast<const __m128i *>(p));
374 __m128i x = _mm_cmpeq_epi8(s, w0);
375 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));
376 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));
377 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));
378 unsigned short r =
static_cast<unsigned short>(~_mm_movemask_epi8(x));
380 #ifdef _MSC_VER // Find the index of first non-whitespace 381 unsigned long offset;
382 _BitScanForward(&offset, r);
385 return p + __builtin_ffs(r) - 1;
391 inline const char *SkipWhitespace_SIMD(
const char* p,
const char* end) {
393 if (p != end && (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t'))
399 #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } 400 static const char whitespaces[4][16] = { C16(
' '), C16(
'\n'), C16(
'\r'), C16(
'\t') };
403 const __m128i w0 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[0][0]));
404 const __m128i w1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[1][0]));
405 const __m128i w2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[2][0]));
406 const __m128i w3 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[3][0]));
408 for (; p <= end - 16; p += 16) {
409 const __m128i s = _mm_loadu_si128(reinterpret_cast<const __m128i *>(p));
410 __m128i x = _mm_cmpeq_epi8(s, w0);
411 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));
412 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));
413 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));
414 unsigned short r =
static_cast<unsigned short>(~_mm_movemask_epi8(x));
416 #ifdef _MSC_VER // Find the index of first non-whitespace 417 unsigned long offset;
418 _BitScanForward(&offset, r);
421 return p + __builtin_ffs(r) - 1;
429 #endif // RAPIDJSON_SSE2 431 #ifdef RAPIDJSON_SIMD 434 is.src_ =
const_cast<char*
>(SkipWhitespace_SIMD(is.src_));
439 is.
src_ = SkipWhitespace_SIMD(is.
src_);
443 is.is_.src_ = SkipWhitespace_SIMD(is.is_.src_, is.is_.end_);
445 #endif // RAPIDJSON_SIMD 466 template <
typename SourceEncoding,
typename TargetEncoding,
typename StackAllocator = CrtAllocator>
469 typedef typename SourceEncoding::Ch
Ch;
475 GenericReader(StackAllocator* stackAllocator = 0,
size_t stackCapacity = kDefaultStackCapacity) : stack_(stackAllocator, stackCapacity), parseResult_() {}
485 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
488 return IterativeParse<parseFlags>(is, handler);
490 parseResult_.
Clear();
492 ClearStackOnExit scope(*
this);
494 SkipWhitespaceAndComments<parseFlags>(is);
495 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
499 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
502 ParseValue<parseFlags>(is, handler);
503 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
506 SkipWhitespaceAndComments<parseFlags>(is);
507 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
511 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
526 template <
typename InputStream,
typename Handler>
528 return Parse<kParseDefaultFlags>(is, handler);
541 void SetParseError(
ParseErrorCode code,
size_t offset) { parseResult_.Set(code, offset); }
548 void ClearStack() { stack_.Clear(); }
551 struct ClearStackOnExit {
553 ~ClearStackOnExit() { r_.ClearStack(); }
556 ClearStackOnExit(
const ClearStackOnExit&);
557 ClearStackOnExit& operator=(
const ClearStackOnExit&);
560 template<
unsigned parseFlags,
typename InputStream>
561 void SkipWhitespaceAndComments(InputStream& is) {
566 if (Consume(is,
'*')) {
570 else if (Consume(is,
'*')) {
571 if (Consume(is,
'/'))
579 while (is.Peek() !=
'\0' && is.Take() !=
'\n');
589 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
590 void ParseObject(InputStream& is,
Handler& handler) {
597 SkipWhitespaceAndComments<parseFlags>(is);
598 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
600 if (Consume(is,
'}')) {
610 ParseString<parseFlags>(is, handler,
true);
611 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
613 SkipWhitespaceAndComments<parseFlags>(is);
614 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
619 SkipWhitespaceAndComments<parseFlags>(is);
620 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
622 ParseValue<parseFlags>(is, handler);
623 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
625 SkipWhitespaceAndComments<parseFlags>(is);
626 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
633 SkipWhitespaceAndComments<parseFlags>(is);
634 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
646 if (is.Peek() ==
'}') {
657 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
658 void ParseArray(InputStream& is,
Handler& handler) {
665 SkipWhitespaceAndComments<parseFlags>(is);
666 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
668 if (Consume(is,
']')) {
675 ParseValue<parseFlags>(is, handler);
676 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
679 SkipWhitespaceAndComments<parseFlags>(is);
680 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
682 if (Consume(is,
',')) {
683 SkipWhitespaceAndComments<parseFlags>(is);
684 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
686 else if (Consume(is,
']')) {
695 if (is.Peek() ==
']') {
705 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
706 void ParseNull(InputStream& is,
Handler& handler) {
710 if (
RAPIDJSON_LIKELY(Consume(is,
'u') && Consume(is,
'l') && Consume(is,
'l'))) {
718 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
719 void ParseTrue(InputStream& is,
Handler& handler) {
723 if (
RAPIDJSON_LIKELY(Consume(is,
'r') && Consume(is,
'u') && Consume(is,
'e'))) {
731 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
732 void ParseFalse(InputStream& is,
Handler& handler) {
736 if (
RAPIDJSON_LIKELY(Consume(is,
'a') && Consume(is,
'l') && Consume(is,
's') && Consume(is,
'e'))) {
744 template<
typename InputStream>
745 RAPIDJSON_FORCEINLINE
static bool Consume(InputStream& is,
typename InputStream::Ch expect) {
755 template<
typename InputStream>
756 unsigned ParseHex4(InputStream& is,
size_t escapeOffset) {
757 unsigned codepoint = 0;
758 for (
int i = 0; i < 4; i++) {
761 codepoint +=
static_cast<unsigned>(c);
762 if (c >=
'0' && c <=
'9')
764 else if (c >=
'A' && c <=
'F')
765 codepoint -=
'A' - 10;
766 else if (c >=
'a' && c <=
'f')
767 codepoint -=
'a' - 10;
770 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0);
777 template <
typename CharType>
782 StackStream(internal::Stack<StackAllocator>& stack) : stack_(stack), length_(0) {}
783 RAPIDJSON_FORCEINLINE
void Put(Ch c) {
784 *stack_.template Push<Ch>() = c;
788 RAPIDJSON_FORCEINLINE
void* Push(
SizeType count) {
790 return stack_.template Push<Ch>(count);
793 size_t Length()
const {
return length_; }
796 return stack_.template Pop<Ch>(length_);
800 StackStream(
const StackStream&);
801 StackStream& operator=(
const StackStream&);
803 internal::Stack<StackAllocator>& stack_;
808 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
809 void ParseString(InputStream& is,
Handler& handler,
bool isKey =
false) {
810 internal::StreamLocalCopy<InputStream> copy(is);
811 InputStream& s(copy.s);
816 bool success =
false;
818 typename InputStream::Ch *head = s.PutBegin();
819 ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s);
820 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
821 size_t length = s.PutEnd(head) - 1;
823 const typename TargetEncoding::Ch*
const str =
reinterpret_cast<typename TargetEncoding::Ch*
>(head);
824 success = (isKey ? handler.Key(str,
SizeType(length),
false) : handler.String(str,
SizeType(length),
false));
827 StackStream<typename TargetEncoding::Ch> stackStream(stack_);
828 ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);
829 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
831 const typename TargetEncoding::Ch*
const str = stackStream.Pop();
832 success = (isKey ? handler.Key(str, length,
true) : handler.String(str, length,
true));
840 template<
unsigned parseFlags,
typename SEncoding,
typename TEncoding,
typename InputStream,
typename OutputStream>
841 RAPIDJSON_FORCEINLINE
void ParseStringToStream(InputStream& is, OutputStream& os) {
843 #define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 844 static const char escape[256] = {
845 Z16, Z16, 0, 0,
'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'/',
846 Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'\\', 0, 0, 0,
847 0, 0,
'\b', 0, 0, 0,
'\f', 0, 0, 0, 0, 0, 0, 0,
'\n', 0,
848 0, 0,
'\r', 0,
'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
849 Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
857 ScanCopyUnescapedString(is, os);
861 size_t escapeOffset = is.Tell();
864 if ((
sizeof(Ch) == 1 ||
unsigned(e) < 256) &&
RAPIDJSON_LIKELY(escape[static_cast<unsigned char>(e)])) {
866 os.Put(static_cast<typename TEncoding::Ch>(escape[static_cast<unsigned char>(e)]));
870 unsigned codepoint = ParseHex4(is, escapeOffset);
871 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
876 unsigned codepoint2 = ParseHex4(is, escapeOffset);
877 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
880 codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
882 TEncoding::Encode(os, codepoint);
899 size_t offset = is.Tell();
908 template<
typename InputStream,
typename OutputStream>
909 static RAPIDJSON_FORCEINLINE
void ScanCopyUnescapedString(InputStream&, OutputStream&) {
913 #if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) 915 static RAPIDJSON_FORCEINLINE
void ScanCopyUnescapedString(
StringStream& is, StackStream<char>& os) {
916 const char* p = is.
src_;
919 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
920 while (p != nextAligned)
929 static const char dquote[16] = {
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"' };
930 static const char bslash[16] = {
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\' };
931 static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 };
932 const __m128i dq = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&dquote[0]));
933 const __m128i bs = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&bslash[0]));
934 const __m128i sp = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&space[0]));
937 const __m128i s = _mm_load_si128(reinterpret_cast<const __m128i *>(p));
938 const __m128i t1 = _mm_cmpeq_epi8(s, dq);
939 const __m128i t2 = _mm_cmpeq_epi8(s, bs);
940 const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp);
941 const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);
942 unsigned short r =
static_cast<unsigned short>(_mm_movemask_epi8(x));
945 #ifdef _MSC_VER // Find the index of first escaped 946 unsigned long offset;
947 _BitScanForward(&offset, r);
950 length =
static_cast<SizeType>(__builtin_ffs(r) - 1);
952 char* q =
reinterpret_cast<char*
>(os.Push(length));
953 for (
size_t i = 0; i < length; i++)
959 _mm_storeu_si128(reinterpret_cast<__m128i *>(os.Push(16)), s);
970 if (is.src_ == is.dst_) {
971 SkipUnescapedString(is);
979 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
980 while (p != nextAligned)
990 static const char dquote[16] = {
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"' };
991 static const char bslash[16] = {
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\' };
992 static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 };
993 const __m128i dq = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&dquote[0]));
994 const __m128i bs = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&bslash[0]));
995 const __m128i sp = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&space[0]));
997 for (;; p += 16, q += 16) {
998 const __m128i s = _mm_load_si128(reinterpret_cast<const __m128i *>(p));
999 const __m128i t1 = _mm_cmpeq_epi8(s, dq);
1000 const __m128i t2 = _mm_cmpeq_epi8(s, bs);
1001 const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp);
1002 const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);
1003 unsigned short r =
static_cast<unsigned short>(_mm_movemask_epi8(x));
1006 #ifdef _MSC_VER // Find the index of first escaped 1007 unsigned long offset;
1008 _BitScanForward(&offset, r);
1011 length =
static_cast<size_t>(__builtin_ffs(r) - 1);
1013 for (
const char* pend = p + length; p != pend; )
1017 _mm_storeu_si128(reinterpret_cast<__m128i *>(q), s);
1030 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
1031 for (; p != nextAligned; p++)
1033 is.src_ = is.dst_ = p;
1038 static const char dquote[16] = {
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"' };
1039 static const char bslash[16] = {
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\' };
1040 static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 };
1041 const __m128i dq = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&dquote[0]));
1042 const __m128i bs = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&bslash[0]));
1043 const __m128i sp = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&space[0]));
1046 const __m128i s = _mm_load_si128(reinterpret_cast<const __m128i *>(p));
1047 const __m128i t1 = _mm_cmpeq_epi8(s, dq);
1048 const __m128i t2 = _mm_cmpeq_epi8(s, bs);
1049 const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp);
1050 const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);
1051 unsigned short r =
static_cast<unsigned short>(_mm_movemask_epi8(x));
1054 #ifdef _MSC_VER // Find the index of first escaped 1055 unsigned long offset;
1056 _BitScanForward(&offset, r);
1059 length =
static_cast<size_t>(__builtin_ffs(r) - 1);
1066 is.src_ = is.dst_ = p;
1070 template<
typename InputStream,
bool backup,
bool pushOnTake>
1073 template<
typename InputStream>
1074 class NumberStream<InputStream, false, false> {
1076 typedef typename InputStream::Ch Ch;
1078 NumberStream(
GenericReader& reader, InputStream& s) : is(s) { (void)reader; }
1081 RAPIDJSON_FORCEINLINE Ch Peek()
const {
return is.Peek(); }
1082 RAPIDJSON_FORCEINLINE Ch TakePush() {
return is.Take(); }
1083 RAPIDJSON_FORCEINLINE Ch Take() {
return is.Take(); }
1084 RAPIDJSON_FORCEINLINE
void Push(
char) {}
1086 size_t Tell() {
return is.Tell(); }
1087 size_t Length() {
return 0; }
1088 const char* Pop() {
return 0; }
1091 NumberStream& operator=(
const NumberStream&);
1096 template<
typename InputStream>
1097 class NumberStream<InputStream, true, false> :
public NumberStream<InputStream, false, false> {
1098 typedef NumberStream<InputStream, false, false> Base;
1100 NumberStream(
GenericReader& reader, InputStream& is) : Base(reader, is), stackStream(reader.stack_) {}
1103 RAPIDJSON_FORCEINLINE Ch TakePush() {
1104 stackStream.Put(static_cast<char>(Base::is.Peek()));
1105 return Base::is.Take();
1108 RAPIDJSON_FORCEINLINE
void Push(
char c) {
1112 size_t Length() {
return stackStream.Length(); }
1115 stackStream.Put(
'\0');
1116 return stackStream.Pop();
1120 StackStream<char> stackStream;
1123 template<
typename InputStream>
1124 class NumberStream<InputStream, true, true> :
public NumberStream<InputStream, true, false> {
1125 typedef NumberStream<InputStream, true, false> Base;
1127 NumberStream(
GenericReader& reader, InputStream& is) : Base(reader, is) {}
1130 RAPIDJSON_FORCEINLINE Ch Take() {
return Base::TakePush(); }
1133 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
1134 void ParseNumber(InputStream& is,
Handler& handler) {
1135 internal::StreamLocalCopy<InputStream> copy(is);
1136 NumberStream<InputStream,
1143 size_t startOffset = s.Tell();
1145 bool useNanOrInf =
false;
1148 bool minus = Consume(s,
'-');
1153 bool use64bit =
false;
1154 int significandDigit = 0;
1160 i =
static_cast<unsigned>(s.TakePush() -
'0');
1171 i = i * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1183 i = i * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1190 if (
RAPIDJSON_LIKELY(Consume(s,
'N') && Consume(s,
'a') && Consume(s,
'N'))) {
1191 d = std::numeric_limits<double>::quiet_NaN();
1193 else if (
RAPIDJSON_LIKELY(Consume(s,
'I') && Consume(s,
'n') && Consume(s,
'f'))) {
1194 d = (minus ? -std::numeric_limits<double>::infinity() : std::numeric_limits<double>::infinity());
1196 && Consume(s,
'i') && Consume(s,
't') && Consume(s,
'y'))))
1206 bool useDouble =
false;
1212 d =
static_cast<double>(i64);
1216 i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1223 d =
static_cast<double>(i64);
1227 i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1235 d = d * 10 + (s.TakePush() -
'0');
1241 size_t decimalPosition;
1242 if (Consume(s,
'.')) {
1243 decimalPosition = s.Length();
1258 i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1265 d =
static_cast<double>(i64);
1268 d =
static_cast<double>(use64bit ? i64 : i);
1274 if (significandDigit < 17) {
1275 d = d * 10.0 + (s.TakePush() -
'0');
1285 decimalPosition = s.Length();
1289 if (Consume(s,
'e') || Consume(s,
'E')) {
1291 d =
static_cast<double>(use64bit ? i64 : i);
1295 bool expMinus =
false;
1296 if (Consume(s,
'+'))
1298 else if (Consume(s,
'-'))
1302 exp =
static_cast<int>(s.Take() -
'0');
1311 int maxExp = (expFrac + 2147483639) / 10;
1314 exp = exp * 10 +
static_cast<int>(s.Take() -
'0');
1322 int maxExp = 308 - expFrac;
1324 exp = exp * 10 +
static_cast<int>(s.Take() -
'0');
1341 if (parseFlags & kParseInsituFlag) {
1343 typename InputStream::Ch* head = is.PutBegin();
1344 const size_t length = s.Tell() - startOffset;
1347 const typename TargetEncoding::Ch*
const str =
reinterpret_cast<typename TargetEncoding::Ch*
>(head);
1348 cont = handler.RawNumber(str,
SizeType(length),
false);
1353 StackStream<typename TargetEncoding::Ch> dstStream(stack_);
1354 while (numCharsToCopy--) {
1357 dstStream.Put(
'\0');
1358 const typename TargetEncoding::Ch* str = dstStream.Pop();
1360 cont = handler.RawNumber(str,
SizeType(length),
true);
1364 size_t length = s.Length();
1365 const char* decimal = s.Pop();
1368 int p = exp + expFrac;
1370 d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp);
1372 d = internal::StrtodNormalPrecision(d, p);
1374 if (std::isinf(d)) {
1380 cont = handler.Double(minus ? -d : d);
1382 else if (useNanOrInf) {
1383 cont = handler.Double(d);
1388 cont = handler.Int64(static_cast<int64_t>(~i64 + 1));
1390 cont = handler.Uint64(i64);
1394 cont = handler.Int(static_cast<int32_t>(~i + 1));
1396 cont = handler.Uint(i);
1405 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
1406 void ParseValue(InputStream& is,
Handler& handler) {
1407 switch (is.Peek()) {
1408 case 'n': ParseNull <parseFlags>(is, handler);
break;
1409 case 't': ParseTrue <parseFlags>(is, handler);
break;
1410 case 'f': ParseFalse <parseFlags>(is, handler);
break;
1411 case '"': ParseString<parseFlags>(is, handler);
break;
1412 case '{': ParseObject<parseFlags>(is, handler);
break;
1413 case '[': ParseArray <parseFlags>(is, handler);
break;
1415 ParseNumber<parseFlags>(is, handler);
1424 enum IterativeParsingState {
1425 IterativeParsingStartState = 0,
1426 IterativeParsingFinishState,
1427 IterativeParsingErrorState,
1430 IterativeParsingObjectInitialState,
1431 IterativeParsingMemberKeyState,
1432 IterativeParsingKeyValueDelimiterState,
1433 IterativeParsingMemberValueState,
1434 IterativeParsingMemberDelimiterState,
1435 IterativeParsingObjectFinishState,
1438 IterativeParsingArrayInitialState,
1439 IterativeParsingElementState,
1440 IterativeParsingElementDelimiterState,
1441 IterativeParsingArrayFinishState,
1444 IterativeParsingValueState
1447 enum { cIterativeParsingStateCount = IterativeParsingValueState + 1 };
1451 LeftBracketToken = 0,
1454 LeftCurlyBracketToken,
1455 RightCurlyBracketToken,
1469 RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) {
1472 #define N NumberToken 1473 #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N 1475 static const unsigned char tokenMap[256] = {
1478 N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N,
1479 N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N,
1481 N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N,
1482 N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N,
1483 N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N,
1484 N16, N16, N16, N16, N16, N16, N16, N16
1490 if (
sizeof(Ch) == 1 || static_cast<unsigned>(c) < 256)
1491 return static_cast<Token
>(tokenMap[
static_cast<unsigned char>(c)]);
1496 RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) {
1498 static const char G[cIterativeParsingStateCount][kTokenCount] = {
1501 IterativeParsingArrayInitialState,
1502 IterativeParsingErrorState,
1503 IterativeParsingObjectInitialState,
1504 IterativeParsingErrorState,
1505 IterativeParsingErrorState,
1506 IterativeParsingErrorState,
1507 IterativeParsingValueState,
1508 IterativeParsingValueState,
1509 IterativeParsingValueState,
1510 IterativeParsingValueState,
1511 IterativeParsingValueState
1515 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1516 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1517 IterativeParsingErrorState
1521 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1522 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1523 IterativeParsingErrorState
1527 IterativeParsingErrorState,
1528 IterativeParsingErrorState,
1529 IterativeParsingErrorState,
1530 IterativeParsingObjectFinishState,
1531 IterativeParsingErrorState,
1532 IterativeParsingErrorState,
1533 IterativeParsingMemberKeyState,
1534 IterativeParsingErrorState,
1535 IterativeParsingErrorState,
1536 IterativeParsingErrorState,
1537 IterativeParsingErrorState
1541 IterativeParsingErrorState,
1542 IterativeParsingErrorState,
1543 IterativeParsingErrorState,
1544 IterativeParsingErrorState,
1545 IterativeParsingErrorState,
1546 IterativeParsingKeyValueDelimiterState,
1547 IterativeParsingErrorState,
1548 IterativeParsingErrorState,
1549 IterativeParsingErrorState,
1550 IterativeParsingErrorState,
1551 IterativeParsingErrorState
1555 IterativeParsingArrayInitialState,
1556 IterativeParsingErrorState,
1557 IterativeParsingObjectInitialState,
1558 IterativeParsingErrorState,
1559 IterativeParsingErrorState,
1560 IterativeParsingErrorState,
1561 IterativeParsingMemberValueState,
1562 IterativeParsingMemberValueState,
1563 IterativeParsingMemberValueState,
1564 IterativeParsingMemberValueState,
1565 IterativeParsingMemberValueState
1569 IterativeParsingErrorState,
1570 IterativeParsingErrorState,
1571 IterativeParsingErrorState,
1572 IterativeParsingObjectFinishState,
1573 IterativeParsingMemberDelimiterState,
1574 IterativeParsingErrorState,
1575 IterativeParsingErrorState,
1576 IterativeParsingErrorState,
1577 IterativeParsingErrorState,
1578 IterativeParsingErrorState,
1579 IterativeParsingErrorState
1583 IterativeParsingErrorState,
1584 IterativeParsingErrorState,
1585 IterativeParsingErrorState,
1586 IterativeParsingObjectFinishState,
1587 IterativeParsingErrorState,
1588 IterativeParsingErrorState,
1589 IterativeParsingMemberKeyState,
1590 IterativeParsingErrorState,
1591 IterativeParsingErrorState,
1592 IterativeParsingErrorState,
1593 IterativeParsingErrorState
1597 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1598 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1599 IterativeParsingErrorState
1603 IterativeParsingArrayInitialState,
1604 IterativeParsingArrayFinishState,
1605 IterativeParsingObjectInitialState,
1606 IterativeParsingErrorState,
1607 IterativeParsingErrorState,
1608 IterativeParsingErrorState,
1609 IterativeParsingElementState,
1610 IterativeParsingElementState,
1611 IterativeParsingElementState,
1612 IterativeParsingElementState,
1613 IterativeParsingElementState
1617 IterativeParsingErrorState,
1618 IterativeParsingArrayFinishState,
1619 IterativeParsingErrorState,
1620 IterativeParsingErrorState,
1621 IterativeParsingElementDelimiterState,
1622 IterativeParsingErrorState,
1623 IterativeParsingErrorState,
1624 IterativeParsingErrorState,
1625 IterativeParsingErrorState,
1626 IterativeParsingErrorState,
1627 IterativeParsingErrorState
1631 IterativeParsingArrayInitialState,
1632 IterativeParsingArrayFinishState,
1633 IterativeParsingObjectInitialState,
1634 IterativeParsingErrorState,
1635 IterativeParsingErrorState,
1636 IterativeParsingErrorState,
1637 IterativeParsingElementState,
1638 IterativeParsingElementState,
1639 IterativeParsingElementState,
1640 IterativeParsingElementState,
1641 IterativeParsingElementState
1645 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1646 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1647 IterativeParsingErrorState
1651 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1652 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1653 IterativeParsingErrorState
1657 return static_cast<IterativeParsingState
>(G[state][token]);
1662 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1663 RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is,
Handler& handler) {
1667 case IterativeParsingErrorState:
1670 case IterativeParsingObjectInitialState:
1671 case IterativeParsingArrayInitialState:
1675 IterativeParsingState n = src;
1676 if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState)
1677 n = IterativeParsingElementState;
1678 else if (src == IterativeParsingKeyValueDelimiterState)
1679 n = IterativeParsingMemberValueState;
1681 *stack_.template Push<SizeType>(1) = n;
1683 *stack_.template Push<SizeType>(1) = 0;
1685 bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray();
1689 return IterativeParsingErrorState;
1697 case IterativeParsingMemberKeyState:
1698 ParseString<parseFlags>(is, handler,
true);
1699 if (HasParseError())
1700 return IterativeParsingErrorState;
1704 case IterativeParsingKeyValueDelimiterState:
1709 case IterativeParsingMemberValueState:
1711 ParseValue<parseFlags>(is, handler);
1712 if (HasParseError()) {
1713 return IterativeParsingErrorState;
1717 case IterativeParsingElementState:
1719 ParseValue<parseFlags>(is, handler);
1720 if (HasParseError()) {
1721 return IterativeParsingErrorState;
1725 case IterativeParsingMemberDelimiterState:
1726 case IterativeParsingElementDelimiterState:
1729 *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;
1732 case IterativeParsingObjectFinishState:
1737 return IterativeParsingErrorState;
1740 SizeType c = *stack_.template Pop<SizeType>(1);
1742 if (src == IterativeParsingMemberValueState)
1745 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1747 if (n == IterativeParsingStartState)
1748 n = IterativeParsingFinishState;
1750 bool hr = handler.EndObject(c);
1754 return IterativeParsingErrorState;
1762 case IterativeParsingArrayFinishState:
1767 return IterativeParsingErrorState;
1770 SizeType c = *stack_.template Pop<SizeType>(1);
1772 if (src == IterativeParsingElementState)
1775 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1777 if (n == IterativeParsingStartState)
1778 n = IterativeParsingFinishState;
1780 bool hr = handler.EndArray(c);
1784 return IterativeParsingErrorState;
1806 ParseValue<parseFlags>(is, handler);
1807 if (HasParseError()) {
1808 return IterativeParsingErrorState;
1810 return IterativeParsingFinishState;
1814 template <
typename InputStream>
1815 void HandleError(IterativeParsingState src, InputStream& is) {
1816 if (HasParseError()) {
1824 case IterativeParsingObjectInitialState:
1828 case IterativeParsingKeyValueDelimiterState:
1829 case IterativeParsingArrayInitialState:
1835 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1837 parseResult_.
Clear();
1838 ClearStackOnExit scope(*
this);
1839 IterativeParsingState state = IterativeParsingStartState;
1841 SkipWhitespaceAndComments<parseFlags>(is);
1842 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
1843 while (is.Peek() !=
'\0') {
1844 Token t = Tokenize(is.Peek());
1845 IterativeParsingState n = Predict(state, t);
1846 IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
1848 if (d == IterativeParsingErrorState) {
1849 HandleError(state, is);
1859 SkipWhitespaceAndComments<parseFlags>(is);
1860 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
1864 if (state != IterativeParsingFinishState)
1865 HandleError(state, is);
1867 return parseResult_;
1870 static const size_t kDefaultStackCapacity = 256;
1871 internal::Stack<StackAllocator> stack_;
1878 RAPIDJSON_NAMESPACE_END
1893 #endif // RAPIDJSON_READER_H_ Allow parsing NaN, Inf, Infinity, -Inf and -Infinity as doubles.
Definition: reader.h:156
Read-only string stream.
Definition: fwd.h:47
Iterative(constant complexity in terms of function call stack size) parsing.
Definition: reader.h:150
Concept for receiving events from GenericReader upon parsing. The functions return true if no error o...
Parse all numbers (ints/doubles) as strings.
Definition: reader.h:154
ParseResult Parse(InputStream &is, Handler &handler)
Parse JSON text.
Definition: reader.h:486
Validate encoding of JSON strings.
Definition: reader.h:149
Invalid value.
Definition: error.h:70
The surrogate pair in string is invalid.
Definition: error.h:79
#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset)
(Internal) macro to indicate and handle a parse error.
Definition: reader.h:119
#define RAPIDJSON_UINT64_C2(high32, low32)
Construct a 64-bit literal by a pair of 32-bit integer.
Definition: rapidjson.h:289
SAX-style JSON parser. Use Reader for UTF8 encoding and default allocator.
Definition: fwd.h:88
Encoding conversion.
Definition: encodings.h:658
Missing a colon after a name of object member.
Definition: error.h:73
Incorrect hex digit after \u escape in string.
Definition: error.h:78
ParseErrorCode GetParseErrorCode() const
Get the ParseErrorCode of last parsing.
Definition: reader.h:535
Miss fraction part in number.
Definition: error.h:85
unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition: rapidjson.h:380
bool RawNumber(const Ch *str, SizeType len, bool copy)
enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) ...
Definition: reader.h:211
ParseErrorCode
Error code of parsing.
Definition: error.h:64
GenericReader(StackAllocator *stackAllocator=0, size_t stackCapacity=kDefaultStackCapacity)
Constructor.
Definition: reader.h:475
void Clear()
Reset error code.
Definition: error.h:128
Represents an in-memory input byte stream.
Definition: memorystream.h:40
Missing a comma or ']' after an array element.
Definition: error.h:76
bool HasParseError() const
Whether a parse error has occured in the last parsing.
Definition: reader.h:532
SourceEncoding::Ch Ch
SourceEncoding character type
Definition: reader.h:469
The document root must not follow by other values.
Definition: error.h:68
const Ch * src_
Current read position.
Definition: stream.h:124
#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset)
Macro to indicate a parse error.
Definition: reader.h:100
Allow trailing commas at the end of objects and arrays.
Definition: reader.h:155
No flags are set.
Definition: reader.h:147
#define RAPIDJSON_LIKELY(x)
Compiler branching hint for expression with high probability to be true.
Definition: rapidjson.h:455
Unspecific syntax error.
Definition: error.h:89
Parse number in full precision (but slower).
Definition: reader.h:152
Missing a closing quotation mark in string.
Definition: error.h:81
Invalid escape character in string.
Definition: error.h:80
Result of parsing (wraps ParseErrorCode)
Definition: error.h:106
Missing a name for object member.
Definition: error.h:72
Type
Type of JSON value
Definition: rapidjson.h:603
After parsing a complete JSON root from stream, stop further processing the rest of stream...
Definition: reader.h:151
void SkipWhitespace(InputStream &is)
Skip the JSON white spaces in a stream.
Definition: reader.h:265
#define RAPIDJSON_UNLIKELY(x)
Compiler branching hint for expression with low probability to be true.
Definition: rapidjson.h:468
size_t GetErrorOffset() const
Get the position of last parsing error in input, 0 otherwise.
Definition: reader.h:538
Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS
Definition: reader.h:157
ParseFlag
Combination of parseFlags
Definition: reader.h:146
Allow one-line (//) and multi-line (/**/) comments.
Definition: reader.h:153
Parsing was terminated.
Definition: error.h:88
Number too big to be stored in double.
Definition: error.h:84
Default implementation of Handler.
Definition: fwd.h:85
Miss exponent in number.
Definition: error.h:86
In-situ(destructive) parsing.
Definition: reader.h:148
ParseResult Parse(InputStream &is, Handler &handler)
Parse JSON text (with kParseDefaultFlags)
Definition: reader.h:527
UTF-8 encoding.
Definition: encodings.h:96
The document is empty.
Definition: error.h:67
Missing a comma or '}' after an object member.
Definition: error.h:74
Invalid encoding in string.
Definition: error.h:82
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:402
#define RAPIDJSON_PARSE_DEFAULT_FLAGS
User-defined kParseDefaultFlags definition.
Definition: reader.h:140
A read-write string stream.
Definition: fwd.h:52