15 #ifndef RAPIDJSON_READER_H_
16 #define RAPIDJSON_READER_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>
37 #elif defined(RAPIDJSON_NEON)
43 RAPIDJSON_DIAG_OFF(old - style - cast)
44 RAPIDJSON_DIAG_OFF(padded)
45 RAPIDJSON_DIAG_OFF(
switch -
enum)
46 #elif defined(_MSC_VER)
48 RAPIDJSON_DIAG_OFF(4127)
49 RAPIDJSON_DIAG_OFF(4702)
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())) \
66 RAPIDJSON_MULTILINEMACRO_END
68 #define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \
69 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
102 #ifndef RAPIDJSON_PARSE_ERROR_NORETURN
103 #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \
104 RAPIDJSON_MULTILINEMACRO_BEGIN \
105 RAPIDJSON_ASSERT(!HasParseError()); \
106 SetParseError(parseErrorCode, offset); \
107 RAPIDJSON_MULTILINEMACRO_END
121 #ifndef RAPIDJSON_PARSE_ERROR
122 #define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \
123 RAPIDJSON_MULTILINEMACRO_BEGIN \
124 RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
125 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
126 RAPIDJSON_MULTILINEMACRO_END
142 #ifndef RAPIDJSON_PARSE_DEFAULT_FLAGS
143 #define RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags
206 template <
typename Encoding = UTF8<>,
typename Derived =
void>
209 typedef typename Encoding::Ch
Ch;
211 typedef typename internal::
218 bool Uint(
unsigned) {
return static_cast<Override&
>(*this).Default(); }
225 return static_cast<Override&
>(*this).String(str, len,
copy);
231 return static_cast<Override&
>(*this).String(str, len,
copy);
243 template <typename Stream, int = StreamTraits<Stream>::copyOptimization>
247 template <
typename Stream>
263 template <
typename Stream>
284 template <
typename InputStream>
288 InputStream& s(
copy.s);
290 typename InputStream::Ch c;
291 while((c = s.Peek()) ==
' ' || c ==
'\n' || c ==
'\r' || c ==
'\t')
297 while(p != end && (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t'))
302 #ifdef RAPIDJSON_SSE42
304 inline const char* SkipWhitespace_SIMD(
const char* p)
307 if(*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
313 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
314 static_cast<size_t>(~15));
315 while(p != nextAligned)
316 if(*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
322 static const char whitespace[16] =
" \n\r\t";
323 const __m128i w = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&whitespace[0]));
327 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i*
>(p));
328 const int r = _mm_cmpistri(w,
330 _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT |
331 _SIDD_NEGATIVE_POLARITY);
337 inline const char* SkipWhitespace_SIMD(
const char* p,
const char* end)
340 if(p != end && (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t'))
346 static const char whitespace[16] =
" \n\r\t";
347 const __m128i w = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&whitespace[0]));
349 for(; p <= end - 16; p += 16)
351 const __m128i s = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(p));
352 const int r = _mm_cmpistri(w,
354 _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT |
355 _SIDD_NEGATIVE_POLARITY);
363 #elif defined(RAPIDJSON_SSE2)
366 inline const char* SkipWhitespace_SIMD(
const char* p)
369 if(*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
375 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
376 static_cast<size_t>(~15));
377 while(p != nextAligned)
378 if(*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
386 c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c \
388 static const char whitespaces[4][16] = {C16(
' '), C16(
'\n'), C16(
'\r'), C16(
'\t')};
391 const __m128i w0 = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&whitespaces[0][0]));
392 const __m128i w1 = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&whitespaces[1][0]));
393 const __m128i w2 = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&whitespaces[2][0]));
394 const __m128i w3 = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&whitespaces[3][0]));
398 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i*
>(p));
399 __m128i x = _mm_cmpeq_epi8(s, w0);
400 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));
401 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));
402 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));
403 unsigned short r =
static_cast<unsigned short>(~_mm_movemask_epi8(x));
408 _BitScanForward(&offset, r);
411 return p + __builtin_ffs(r) - 1;
417 inline const char* SkipWhitespace_SIMD(
const char* p,
const char* end)
420 if(p != end && (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t'))
428 c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c \
430 static const char whitespaces[4][16] = {C16(
' '), C16(
'\n'), C16(
'\r'), C16(
'\t')};
433 const __m128i w0 = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&whitespaces[0][0]));
434 const __m128i w1 = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&whitespaces[1][0]));
435 const __m128i w2 = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&whitespaces[2][0]));
436 const __m128i w3 = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&whitespaces[3][0]));
438 for(; p <= end - 16; p += 16)
440 const __m128i s = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(p));
441 __m128i x = _mm_cmpeq_epi8(s, w0);
442 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));
443 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));
444 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));
445 unsigned short r =
static_cast<unsigned short>(~_mm_movemask_epi8(x));
450 _BitScanForward(&offset, r);
453 return p + __builtin_ffs(r) - 1;
461 #elif defined(RAPIDJSON_NEON)
464 inline const char* SkipWhitespace_SIMD(
const char* p)
467 if(*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
473 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
474 static_cast<size_t>(~15));
475 while(p != nextAligned)
476 if(*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
490 x = vorrq_u8(x, vceqq_u8(s, w1));
491 x = vorrq_u8(x, vceqq_u8(s, w2));
492 x = vorrq_u8(x, vceqq_u8(s, w3));
496 uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0);
497 uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1);
504 return p + 8 + (lz >> 3);
510 return p + (lz >> 3);
515 inline const char* SkipWhitespace_SIMD(
const char* p,
const char* end)
518 if(p != end && (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t'))
528 for(; p <= end - 16; p += 16)
532 x = vorrq_u8(x, vceqq_u8(s, w1));
533 x = vorrq_u8(x, vceqq_u8(s, w2));
534 x = vorrq_u8(x, vceqq_u8(s, w3));
538 uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0);
539 uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1);
546 return p + 8 + (lz >> 3);
552 return p + (lz >> 3);
561 #ifdef RAPIDJSON_SIMD
566 is.
src_ =
const_cast<char*
>(SkipWhitespace_SIMD(is.
src_));
573 is.
src_ = SkipWhitespace_SIMD(is.
src_);
579 is.is_.src_ = SkipWhitespace_SIMD(is.is_.src_, is.is_.end_);
602 template <
typename SourceEncoding,
typename TargetEncoding,
typename StackAllocator = CrtAllocator>
606 typedef typename SourceEncoding::Ch
Ch;
613 GenericReader(StackAllocator* stackAllocator = 0,
size_t stackCapacity = kDefaultStackCapacity)
614 : stack_(stackAllocator, stackCapacity), parseResult_(), state_(IterativeParsingStartState)
626 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
630 return IterativeParse<parseFlags>(is, handler);
632 parseResult_.
Clear();
634 ClearStackOnExit scope(*
this);
636 SkipWhitespaceAndComments<parseFlags>(is);
637 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
642 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
646 ParseValue<parseFlags>(is, handler);
647 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
651 SkipWhitespaceAndComments<parseFlags>(is);
652 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
657 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
672 template <
typename InputStream,
typename Handler>
675 return Parse<kParseDefaultFlags>(is, handler);
683 parseResult_.
Clear();
684 state_ = IterativeParsingStartState;
694 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
699 SkipWhitespaceAndComments<parseFlags>(is);
701 Token t = Tokenize(is.Peek());
702 IterativeParsingState n = Predict(state_, t);
703 IterativeParsingState d = Transit<parseFlags>(state_, t, n, is, handler);
709 if(d == IterativeParsingErrorState)
711 HandleError(state_, is);
723 SkipWhitespaceAndComments<parseFlags>(is);
724 if(is.Peek() !=
'\0')
727 HandleError(state_, is);
741 if(!IsIterativeParsingDelimiterState(n))
748 if(state_ != IterativeParsingFinishState)
750 HandleError(state_, is);
762 return IsIterativeParsingCompleteState(state_);
782 void ClearStack() { stack_.
Clear(); }
785 struct ClearStackOnExit
788 ~ClearStackOnExit() { r_.ClearStack(); }
792 ClearStackOnExit(
const ClearStackOnExit&);
793 ClearStackOnExit& operator=(
const ClearStackOnExit&);
796 template <
unsigned parseFlags,
typename InputStream>
797 void SkipWhitespaceAndComments(InputStream& is)
811 else if(Consume(is,
'*'))
821 while(is.Peek() !=
'\0' && is.Take() !=
'\n') {}
831 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
832 void ParseObject(InputStream& is,
Handler& handler)
840 SkipWhitespaceAndComments<parseFlags>(is);
841 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
855 ParseString<parseFlags>(is, handler,
true);
856 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
858 SkipWhitespaceAndComments<parseFlags>(is);
859 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
864 SkipWhitespaceAndComments<parseFlags>(is);
865 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
867 ParseValue<parseFlags>(is, handler);
868 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
870 SkipWhitespaceAndComments<parseFlags>(is);
871 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
879 SkipWhitespaceAndComments<parseFlags>(is);
880 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
906 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
907 void ParseArray(InputStream& is,
Handler& handler)
915 SkipWhitespaceAndComments<parseFlags>(is);
916 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
927 ParseValue<parseFlags>(is, handler);
928 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
931 SkipWhitespaceAndComments<parseFlags>(is);
932 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
936 SkipWhitespaceAndComments<parseFlags>(is);
937 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
939 else if(Consume(is,
']'))
961 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
962 void ParseNull(InputStream& is,
Handler& handler)
967 if(
RAPIDJSON_LIKELY(Consume(is,
'u') && Consume(is,
'l') && Consume(is,
'l')))
976 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
977 void ParseTrue(InputStream& is,
Handler& handler)
982 if(
RAPIDJSON_LIKELY(Consume(is,
'r') && Consume(is,
'u') && Consume(is,
'e')))
991 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
992 void ParseFalse(InputStream& is,
Handler& handler)
997 if(
RAPIDJSON_LIKELY(Consume(is,
'a') && Consume(is,
'l') && Consume(is,
's') &&
1007 template <
typename InputStream>
1008 RAPIDJSON_FORCEINLINE
static bool Consume(InputStream& is,
typename InputStream::Ch expect)
1020 template <
typename InputStream>
1021 unsigned ParseHex4(InputStream& is,
size_t escapeOffset)
1023 unsigned codepoint = 0;
1024 for(
int i = 0; i < 4; i++)
1028 codepoint +=
static_cast<unsigned>(c);
1029 if(c >=
'0' && c <=
'9')
1031 else if(c >=
'A' && c <=
'F')
1032 codepoint -=
'A' - 10;
1033 else if(c >=
'a' && c <=
'f')
1034 codepoint -=
'a' - 10;
1039 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0);
1046 template <
typename CharType>
1050 typedef CharType
Ch;
1053 RAPIDJSON_FORCEINLINE
void Put(
Ch c)
1055 *stack_.template Push<Ch>() = c;
1059 RAPIDJSON_FORCEINLINE
void* Push(
SizeType count)
1062 return stack_.template Push<Ch>(count);
1065 size_t Length()
const {
return length_; }
1067 Ch* Pop() {
return stack_.template Pop<Ch>(length_); }
1070 StackStream(
const StackStream&);
1071 StackStream& operator=(
const StackStream&);
1078 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1079 void ParseString(InputStream& is,
Handler& handler,
bool isKey =
false)
1082 InputStream& s(
copy.s);
1087 bool success =
false;
1090 typename InputStream::Ch* head = s.PutBegin();
1091 ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s);
1092 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
1093 size_t length = s.PutEnd(head) - 1;
1095 const typename TargetEncoding::Ch*
const str =
1096 reinterpret_cast<typename TargetEncoding::Ch*
>(head);
1097 success = (isKey ? handler.Key(str,
SizeType(length),
false)
1098 : handler.String(str,
SizeType(length),
false));
1102 StackStream<typename TargetEncoding::Ch> stackStream(stack_);
1103 ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);
1104 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
1106 const typename TargetEncoding::Ch*
const str = stackStream.Pop();
1107 success = (isKey ? handler.Key(str, length,
true) : handler.String(str, length,
true));
1116 template <
unsigned parseFlags,
1119 typename InputStream,
1120 typename OutputStream>
1121 RAPIDJSON_FORCEINLINE
void ParseStringToStream(InputStream& is, OutputStream& os)
1124 #define Z16 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1125 static const char escape[256] = {
1126 Z16,
Z16, 0, 0,
'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'/',
Z16,
1127 Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'\\', 0, 0, 0, 0, 0,
1128 '\b', 0, 0, 0,
'\f', 0, 0, 0, 0, 0, 0, 0,
'\n', 0, 0, 0,
'\r', 0,
'\t',
1129 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Z16,
Z16,
Z16,
Z16,
Z16,
Z16,
Z16,
Z16};
1137 ScanCopyUnescapedString(is, os);
1142 size_t escapeOffset =
1146 if((
sizeof(
Ch) == 1 ||
unsigned(e) < 256) &&
1151 static_cast<typename TEncoding::Ch
>(escape[
static_cast<unsigned char>(e)]));
1161 unsigned codepoint = ParseHex4(is, escapeOffset);
1162 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
1172 unsigned codepoint2 = ParseHex4(is, escapeOffset);
1173 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
1178 (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
1187 TEncoding::Encode(os, codepoint);
1207 size_t offset = is.Tell();
1216 template <
typename InputStream,
typename OutputStream>
1217 static RAPIDJSON_FORCEINLINE
void ScanCopyUnescapedString(InputStream&, OutputStream&)
1222 #if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42)
1224 static RAPIDJSON_FORCEINLINE
void ScanCopyUnescapedString(
StringStream& is,
1225 StackStream<char>& os)
1227 const char* p = is.
src_;
1230 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
1231 static_cast<size_t>(~15));
1232 while(p != nextAligned)
1243 static const char dquote[16] = {
'\"',
1259 static const char bslash[16] = {
'\\',
1275 static const char space[16] = {0x1F,
1291 const __m128i dq = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&dquote[0]));
1292 const __m128i bs = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&bslash[0]));
1293 const __m128i sp = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&space[0]));
1297 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i*
>(p));
1298 const __m128i t1 = _mm_cmpeq_epi8(s, dq);
1299 const __m128i t2 = _mm_cmpeq_epi8(s, bs);
1301 _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp);
1302 const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);
1303 unsigned short r =
static_cast<unsigned short>(_mm_movemask_epi8(x));
1309 _BitScanForward(&offset, r);
1312 length =
static_cast<SizeType>(__builtin_ffs(r) - 1);
1316 char* q =
reinterpret_cast<char*
>(os.Push(length));
1317 for(
size_t i = 0; i < length; i++)
1324 _mm_storeu_si128(
reinterpret_cast<__m128i*
>(os.Push(16)), s);
1339 SkipUnescapedString(is);
1347 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
1348 static_cast<size_t>(~15));
1349 while(p != nextAligned)
1361 static const char dquote[16] = {
'\"',
1377 static const char bslash[16] = {
'\\',
1393 static const char space[16] = {0x1F,
1409 const __m128i dq = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&dquote[0]));
1410 const __m128i bs = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&bslash[0]));
1411 const __m128i sp = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&space[0]));
1413 for(;; p += 16, q += 16)
1415 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i*
>(p));
1416 const __m128i t1 = _mm_cmpeq_epi8(s, dq);
1417 const __m128i t2 = _mm_cmpeq_epi8(s, bs);
1419 _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp);
1420 const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);
1421 unsigned short r =
static_cast<unsigned short>(_mm_movemask_epi8(x));
1427 _BitScanForward(&offset, r);
1430 length =
static_cast<size_t>(__builtin_ffs(r) - 1);
1432 for(
const char* pend = p + length; p != pend;)
1436 _mm_storeu_si128(
reinterpret_cast<__m128i*
>(q), s);
1450 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
1451 static_cast<size_t>(~15));
1452 for(; p != nextAligned; p++)
1461 static const char dquote[16] = {
'\"',
1477 static const char bslash[16] = {
'\\',
1493 static const char space[16] = {0x1F,
1509 const __m128i dq = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&dquote[0]));
1510 const __m128i bs = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&bslash[0]));
1511 const __m128i sp = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&space[0]));
1515 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i*
>(p));
1516 const __m128i t1 = _mm_cmpeq_epi8(s, dq);
1517 const __m128i t2 = _mm_cmpeq_epi8(s, bs);
1519 _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp);
1520 const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);
1521 unsigned short r =
static_cast<unsigned short>(_mm_movemask_epi8(x));
1527 _BitScanForward(&offset, r);
1530 length =
static_cast<size_t>(__builtin_ffs(r) - 1);
1539 #elif defined(RAPIDJSON_NEON)
1541 static RAPIDJSON_FORCEINLINE
void ScanCopyUnescapedString(
StringStream& is,
1542 StackStream<char>& os)
1544 const char* p = is.
src_;
1547 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
1548 static_cast<size_t>(~15));
1549 while(p != nextAligned)
1569 x = vorrq_u8(x, vceqq_u8(s, s1));
1570 x = vorrq_u8(x, vceqq_u8(s, s2));
1571 x = vorrq_u8(x, vcltq_u8(s, s3));
1574 uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0);
1575 uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1);
1578 bool escaped =
false;
1584 length = 8 + (lz >> 3);
1598 char* q =
reinterpret_cast<char*
>(os.Push(length));
1599 for(
size_t i = 0; i < length; i++)
1606 vst1q_u8(
reinterpret_cast<uint8_t*
>(os.Push(16)), s);
1621 SkipUnescapedString(is);
1629 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
1630 static_cast<size_t>(~15));
1631 while(p != nextAligned)
1648 for(;; p += 16, q += 16)
1652 x = vorrq_u8(x, vceqq_u8(s, s1));
1653 x = vorrq_u8(x, vceqq_u8(s, s2));
1654 x = vorrq_u8(x, vcltq_u8(s, s3));
1657 uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0);
1658 uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1);
1661 bool escaped =
false;
1667 length = 8 + (lz >> 3);
1679 for(
const char* pend = p + length; p != pend;)
1685 vst1q_u8(
reinterpret_cast<uint8_t*
>(q), s);
1699 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
1700 static_cast<size_t>(~15));
1701 for(; p != nextAligned; p++)
1719 x = vorrq_u8(x, vceqq_u8(s, s1));
1720 x = vorrq_u8(x, vceqq_u8(s, s2));
1721 x = vorrq_u8(x, vcltq_u8(s, s3));
1724 uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0);
1725 uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1);
1748 template <
typename InputStream,
typename StackCharacter,
bool backup,
bool pushOnTake>
1751 template <
typename InputStream,
typename StackCharacter>
1752 class NumberStream<InputStream, StackCharacter, false, false>
1755 typedef typename InputStream::Ch
Ch;
1757 NumberStream(
GenericReader& reader, InputStream& s) : is(s) { (void)reader; }
1759 RAPIDJSON_FORCEINLINE
Ch Peek()
const {
return is.
Peek(); }
1760 RAPIDJSON_FORCEINLINE
Ch TakePush() {
return is.
Take(); }
1761 RAPIDJSON_FORCEINLINE
Ch Take() {
return is.
Take(); }
1762 RAPIDJSON_FORCEINLINE
void Push(
char) {}
1764 size_t Tell() {
return is.
Tell(); }
1765 size_t Length() {
return 0; }
1766 const StackCharacter* Pop() {
return 0; }
1769 NumberStream& operator=(
const NumberStream&);
1774 template <
typename InputStream,
typename StackCharacter>
1775 class NumberStream<InputStream, StackCharacter, true, false>
1776 :
public NumberStream<InputStream, StackCharacter, false, false>
1778 typedef NumberStream<InputStream, StackCharacter, false, false> Base;
1782 : Base(reader, s), stackStream(reader.stack_)
1786 RAPIDJSON_FORCEINLINE
Ch TakePush()
1788 stackStream.Put(
static_cast<StackCharacter
>(Base::is.Peek()));
1789 return Base::is.Take();
1792 RAPIDJSON_FORCEINLINE
void Push(StackCharacter c) { stackStream.Put(c); }
1794 size_t Length() {
return stackStream.Length(); }
1796 const StackCharacter* Pop()
1798 stackStream.Put(
'\0');
1799 return stackStream.Pop();
1803 StackStream<StackCharacter> stackStream;
1806 template <
typename InputStream,
typename StackCharacter>
1807 class NumberStream<InputStream, StackCharacter, true, true>
1808 :
public NumberStream<InputStream, StackCharacter, true, false>
1810 typedef NumberStream<InputStream, StackCharacter, true, false> Base;
1813 NumberStream(
GenericReader& reader, InputStream& s) : Base(reader, s) {}
1815 RAPIDJSON_FORCEINLINE
Ch Take() {
return Base::TakePush(); }
1818 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1819 void ParseNumber(InputStream& is,
Handler& handler)
1821 typedef typename internal::SelectIf<
1823 typename TargetEncoding::Ch,
1824 char>::
Type NumberCharacter;
1827 NumberStream<InputStream,
1836 size_t startOffset = s.Tell();
1838 bool useNanOrInf =
false;
1841 bool minus = Consume(s,
'-');
1846 bool use64bit =
false;
1847 int significandDigit = 0;
1855 i =
static_cast<unsigned>(s.TakePush() -
'0');
1869 i = i * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1884 i = i * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1894 if(Consume(s,
'a') && Consume(s,
'N'))
1896 d = std::numeric_limits<double>::quiet_NaN();
1902 if(Consume(s,
'n') && Consume(s,
'f'))
1904 d = (
minus ? -std::numeric_limits<double>::infinity()
1905 : std::numeric_limits<double>::infinity());
1909 !(Consume(s,
'i') && Consume(s,
'n') && Consume(s,
'i') &&
1910 Consume(s,
't') && Consume(s,
'y'))))
1926 bool useDouble =
false;
1938 d =
static_cast<double>(i64);
1942 i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1950 0x19999999, 0x99999999)))
1954 d =
static_cast<double>(i64);
1958 i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1968 d = d * 10 + (s.TakePush() -
'0');
1974 size_t decimalPosition;
1975 if(!useNanOrInf && Consume(s,
'.'))
1977 decimalPosition = s.Length();
1995 i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
2002 d =
static_cast<double>(i64);
2005 d =
static_cast<double>(use64bit ? i64 : i);
2012 if(significandDigit < 17)
2014 d = d * 10.0 + (s.TakePush() -
'0');
2024 decimalPosition = s.Length();
2028 if(!useNanOrInf && (Consume(s,
'e') || Consume(s,
'E')))
2032 d =
static_cast<double>(use64bit ? i64 : i);
2036 bool expMinus =
false;
2039 else if(Consume(s,
'-'))
2044 exp =
static_cast<int>(s.Take() -
'0');
2054 int maxExp = (expFrac + 2147483639) / 10;
2058 exp =
exp * 10 +
static_cast<int>(s.Take() -
'0');
2062 s.Peek() >=
'0' && s.Peek() <=
'9'))
2069 int maxExp = 308 - expFrac;
2072 exp =
exp * 10 +
static_cast<int>(s.Take() -
'0');
2093 typename InputStream::Ch* head = is.PutBegin();
2094 const size_t length = s.Tell() - startOffset;
2097 const typename TargetEncoding::Ch*
const str =
2098 reinterpret_cast<typename TargetEncoding::Ch*
>(head);
2099 cont = handler.RawNumber(str,
SizeType(length),
false);
2105 StackStream<typename TargetEncoding::Ch> dstStream(stack_);
2106 while(numCharsToCopy--)
2109 srcStream, dstStream);
2111 dstStream.Put(
'\0');
2112 const typename TargetEncoding::Ch* str = dstStream.Pop();
2114 cont = handler.RawNumber(str,
SizeType(length),
true);
2119 size_t length = s.Length();
2120 const NumberCharacter* decimal =
2125 int p =
exp + expFrac;
2139 cont = handler.Double(
minus ? -d : d);
2141 else if(useNanOrInf)
2143 cont = handler.Double(d);
2150 cont = handler.Int64(
static_cast<int64_t>(~i64 + 1));
2152 cont = handler.Uint64(i64);
2157 cont = handler.Int(
static_cast<int32_t>(~i + 1));
2159 cont = handler.Uint(i);
2168 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
2169 void ParseValue(InputStream& is,
Handler& handler)
2173 case 'n': ParseNull<parseFlags>(is, handler);
break;
2174 case 't': ParseTrue<parseFlags>(is, handler);
break;
2175 case 'f': ParseFalse<parseFlags>(is, handler);
break;
2176 case '"': ParseString<parseFlags>(is, handler);
break;
2177 case '{': ParseObject<parseFlags>(is, handler);
break;
2178 case '[': ParseArray<parseFlags>(is, handler);
break;
2179 default: ParseNumber<parseFlags>(is, handler);
break;
2186 enum IterativeParsingState
2188 IterativeParsingFinishState = 0,
2189 IterativeParsingErrorState,
2190 IterativeParsingStartState,
2193 IterativeParsingObjectInitialState,
2194 IterativeParsingMemberKeyState,
2195 IterativeParsingMemberValueState,
2196 IterativeParsingObjectFinishState,
2199 IterativeParsingArrayInitialState,
2200 IterativeParsingElementState,
2201 IterativeParsingArrayFinishState,
2204 IterativeParsingValueState,
2207 IterativeParsingElementDelimiterState,
2208 IterativeParsingMemberDelimiterState,
2209 IterativeParsingKeyValueDelimiterState,
2211 cIterativeParsingStateCount
2217 LeftBracketToken = 0,
2220 LeftCurlyBracketToken,
2221 RightCurlyBracketToken,
2235 RAPIDJSON_FORCEINLINE Token Tokenize(
Ch c)
const
2239 #define N NumberToken
2240 #define N16 N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N
2242 static const unsigned char tokenMap[256] = {
2267 N, LeftBracketToken,
2268 N, RightBracketToken,
2283 N, LeftCurlyBracketToken,
2284 N, RightCurlyBracketToken,
2295 if(
sizeof(
Ch) == 1 ||
static_cast<unsigned>(c) < 256)
2296 return static_cast<Token
>(tokenMap[
static_cast<unsigned char>(c)]);
2301 RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state,
2305 static const char G[cIterativeParsingStateCount][kTokenCount] = {
2307 {IterativeParsingErrorState,
2308 IterativeParsingErrorState,
2309 IterativeParsingErrorState,
2310 IterativeParsingErrorState,
2311 IterativeParsingErrorState,
2312 IterativeParsingErrorState,
2313 IterativeParsingErrorState,
2314 IterativeParsingErrorState,
2315 IterativeParsingErrorState,
2316 IterativeParsingErrorState,
2317 IterativeParsingErrorState},
2319 {IterativeParsingErrorState,
2320 IterativeParsingErrorState,
2321 IterativeParsingErrorState,
2322 IterativeParsingErrorState,
2323 IterativeParsingErrorState,
2324 IterativeParsingErrorState,
2325 IterativeParsingErrorState,
2326 IterativeParsingErrorState,
2327 IterativeParsingErrorState,
2328 IterativeParsingErrorState,
2329 IterativeParsingErrorState},
2332 IterativeParsingArrayInitialState,
2333 IterativeParsingErrorState,
2334 IterativeParsingObjectInitialState,
2335 IterativeParsingErrorState,
2336 IterativeParsingErrorState,
2337 IterativeParsingErrorState,
2338 IterativeParsingValueState,
2339 IterativeParsingValueState,
2340 IterativeParsingValueState,
2341 IterativeParsingValueState,
2342 IterativeParsingValueState
2346 IterativeParsingErrorState,
2347 IterativeParsingErrorState,
2348 IterativeParsingErrorState,
2349 IterativeParsingObjectFinishState,
2350 IterativeParsingErrorState,
2351 IterativeParsingErrorState,
2352 IterativeParsingMemberKeyState,
2353 IterativeParsingErrorState,
2354 IterativeParsingErrorState,
2355 IterativeParsingErrorState,
2356 IterativeParsingErrorState
2360 IterativeParsingErrorState,
2361 IterativeParsingErrorState,
2362 IterativeParsingErrorState,
2363 IterativeParsingErrorState,
2364 IterativeParsingErrorState,
2365 IterativeParsingKeyValueDelimiterState,
2366 IterativeParsingErrorState,
2367 IterativeParsingErrorState,
2368 IterativeParsingErrorState,
2369 IterativeParsingErrorState,
2370 IterativeParsingErrorState
2374 IterativeParsingErrorState,
2375 IterativeParsingErrorState,
2376 IterativeParsingErrorState,
2377 IterativeParsingObjectFinishState,
2378 IterativeParsingMemberDelimiterState,
2379 IterativeParsingErrorState,
2380 IterativeParsingErrorState,
2381 IterativeParsingErrorState,
2382 IterativeParsingErrorState,
2383 IterativeParsingErrorState,
2384 IterativeParsingErrorState
2387 {IterativeParsingErrorState,
2388 IterativeParsingErrorState,
2389 IterativeParsingErrorState,
2390 IterativeParsingErrorState,
2391 IterativeParsingErrorState,
2392 IterativeParsingErrorState,
2393 IterativeParsingErrorState,
2394 IterativeParsingErrorState,
2395 IterativeParsingErrorState,
2396 IterativeParsingErrorState,
2397 IterativeParsingErrorState},
2400 IterativeParsingArrayInitialState,
2401 IterativeParsingArrayFinishState,
2402 IterativeParsingObjectInitialState,
2403 IterativeParsingErrorState,
2404 IterativeParsingErrorState,
2405 IterativeParsingErrorState,
2406 IterativeParsingElementState,
2407 IterativeParsingElementState,
2408 IterativeParsingElementState,
2409 IterativeParsingElementState,
2410 IterativeParsingElementState
2414 IterativeParsingErrorState,
2415 IterativeParsingArrayFinishState,
2416 IterativeParsingErrorState,
2417 IterativeParsingErrorState,
2418 IterativeParsingElementDelimiterState,
2419 IterativeParsingErrorState,
2420 IterativeParsingErrorState,
2421 IterativeParsingErrorState,
2422 IterativeParsingErrorState,
2423 IterativeParsingErrorState,
2424 IterativeParsingErrorState
2427 {IterativeParsingErrorState,
2428 IterativeParsingErrorState,
2429 IterativeParsingErrorState,
2430 IterativeParsingErrorState,
2431 IterativeParsingErrorState,
2432 IterativeParsingErrorState,
2433 IterativeParsingErrorState,
2434 IterativeParsingErrorState,
2435 IterativeParsingErrorState,
2436 IterativeParsingErrorState,
2437 IterativeParsingErrorState},
2439 {IterativeParsingErrorState,
2440 IterativeParsingErrorState,
2441 IterativeParsingErrorState,
2442 IterativeParsingErrorState,
2443 IterativeParsingErrorState,
2444 IterativeParsingErrorState,
2445 IterativeParsingErrorState,
2446 IterativeParsingErrorState,
2447 IterativeParsingErrorState,
2448 IterativeParsingErrorState,
2449 IterativeParsingErrorState},
2452 IterativeParsingArrayInitialState,
2453 IterativeParsingArrayFinishState,
2454 IterativeParsingObjectInitialState,
2455 IterativeParsingErrorState,
2456 IterativeParsingErrorState,
2457 IterativeParsingErrorState,
2458 IterativeParsingElementState,
2459 IterativeParsingElementState,
2460 IterativeParsingElementState,
2461 IterativeParsingElementState,
2462 IterativeParsingElementState
2466 IterativeParsingErrorState,
2467 IterativeParsingErrorState,
2468 IterativeParsingErrorState,
2469 IterativeParsingObjectFinishState,
2470 IterativeParsingErrorState,
2471 IterativeParsingErrorState,
2472 IterativeParsingMemberKeyState,
2473 IterativeParsingErrorState,
2474 IterativeParsingErrorState,
2475 IterativeParsingErrorState,
2476 IterativeParsingErrorState
2480 IterativeParsingArrayInitialState,
2481 IterativeParsingErrorState,
2482 IterativeParsingObjectInitialState,
2483 IterativeParsingErrorState,
2484 IterativeParsingErrorState,
2485 IterativeParsingErrorState,
2486 IterativeParsingMemberValueState,
2487 IterativeParsingMemberValueState,
2488 IterativeParsingMemberValueState,
2489 IterativeParsingMemberValueState,
2490 IterativeParsingMemberValueState
2494 return static_cast<IterativeParsingState
>(G[state][token]);
2499 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
2500 RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src,
2502 IterativeParsingState dst,
2510 case IterativeParsingErrorState:
return dst;
2512 case IterativeParsingObjectInitialState:
2513 case IterativeParsingArrayInitialState: {
2517 IterativeParsingState n = src;
2518 if(src == IterativeParsingArrayInitialState ||
2519 src == IterativeParsingElementDelimiterState)
2520 n = IterativeParsingElementState;
2521 else if(src == IterativeParsingKeyValueDelimiterState)
2522 n = IterativeParsingMemberValueState;
2524 *stack_.template Push<SizeType>(1) = n;
2526 *stack_.template Push<SizeType>(1) = 0;
2528 bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject()
2529 : handler.StartArray();
2534 return IterativeParsingErrorState;
2543 case IterativeParsingMemberKeyState:
2544 ParseString<parseFlags>(is, handler,
true);
2546 return IterativeParsingErrorState;
2550 case IterativeParsingKeyValueDelimiterState:
2555 case IterativeParsingMemberValueState:
2557 ParseValue<parseFlags>(is, handler);
2560 return IterativeParsingErrorState;
2564 case IterativeParsingElementState:
2566 ParseValue<parseFlags>(is, handler);
2569 return IterativeParsingErrorState;
2573 case IterativeParsingMemberDelimiterState:
2574 case IterativeParsingElementDelimiterState:
2577 *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;
2580 case IterativeParsingObjectFinishState: {
2583 src == IterativeParsingMemberDelimiterState)
2586 return IterativeParsingErrorState;
2589 SizeType c = *stack_.template Pop<SizeType>(1);
2591 if(src == IterativeParsingMemberValueState)
2594 IterativeParsingState n =
2595 static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
2597 if(n == IterativeParsingStartState)
2598 n = IterativeParsingFinishState;
2600 bool hr = handler.EndObject(c);
2605 return IterativeParsingErrorState;
2614 case IterativeParsingArrayFinishState: {
2617 src == IterativeParsingElementDelimiterState)
2620 return IterativeParsingErrorState;
2623 SizeType c = *stack_.template Pop<SizeType>(1);
2625 if(src == IterativeParsingElementState)
2628 IterativeParsingState n =
2629 static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
2631 if(n == IterativeParsingStartState)
2632 n = IterativeParsingFinishState;
2634 bool hr = handler.EndArray(c);
2639 return IterativeParsingErrorState;
2662 ParseValue<parseFlags>(is, handler);
2665 return IterativeParsingErrorState;
2667 return IterativeParsingFinishState;
2671 template <
typename InputStream>
2672 void HandleError(IterativeParsingState src, InputStream& is)
2682 case IterativeParsingStartState:
2685 case IterativeParsingFinishState:
2688 case IterativeParsingObjectInitialState:
2689 case IterativeParsingMemberDelimiterState:
2692 case IterativeParsingMemberKeyState:
2695 case IterativeParsingMemberValueState:
2698 case IterativeParsingKeyValueDelimiterState:
2699 case IterativeParsingArrayInitialState:
2700 case IterativeParsingElementDelimiterState:
2710 RAPIDJSON_FORCEINLINE
bool IsIterativeParsingDelimiterState(IterativeParsingState s)
const
2712 return s >= IterativeParsingElementDelimiterState;
2715 RAPIDJSON_FORCEINLINE
bool IsIterativeParsingCompleteState(IterativeParsingState s)
const
2717 return s <= IterativeParsingErrorState;
2720 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
2723 parseResult_.
Clear();
2724 ClearStackOnExit scope(*
this);
2725 IterativeParsingState state = IterativeParsingStartState;
2727 SkipWhitespaceAndComments<parseFlags>(is);
2728 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
2729 while(is.Peek() !=
'\0')
2731 Token t = Tokenize(is.Peek());
2732 IterativeParsingState n = Predict(state, t);
2733 IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
2735 if(d == IterativeParsingErrorState)
2737 HandleError(state, is);
2747 SkipWhitespaceAndComments<parseFlags>(is);
2748 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
2752 if(state != IterativeParsingFinishState)
2753 HandleError(state, is);
2755 return parseResult_;
2758 static const size_t kDefaultStackCapacity =
2763 IterativeParsingState state_;
2771 #if defined(__clang__) || defined(_MSC_VER)
SAX-style JSON parser. Use Reader for UTF8 encoding and default allocator.
Definition: reader.h:604
ParseResult Parse(InputStream &is, Handler &handler)
Parse JSON text.
Definition: reader.h:627
bool IterativeParseNext(InputStream &is, Handler &handler)
Parse one token from JSON text.
Definition: reader.h:695
ParseResult Parse(InputStream &is, Handler &handler)
Parse JSON text (with kParseDefaultFlags)
Definition: reader.h:673
void IterativeParseInit()
Initialize JSON text token-by-token parsing.
Definition: reader.h:681
ParseErrorCode GetParseErrorCode() const
Get the ParseErrorCode of last parsing.
Definition: reader.h:769
RAPIDJSON_FORCEINLINE bool IterativeParseComplete() const
Check if token-by-token parsing JSON text is complete.
Definition: reader.h:760
GenericReader(StackAllocator *stackAllocator=0, size_t stackCapacity=kDefaultStackCapacity)
Constructor.
Definition: reader.h:613
SourceEncoding::Ch Ch
SourceEncoding character type.
Definition: reader.h:606
bool HasParseError() const
Whether a parse error has occurred in the last parsing.
Definition: reader.h:766
void SetParseError(ParseErrorCode code, size_t offset)
Definition: reader.h:775
size_t GetErrorOffset() const
Get the position of last parsing error in input, 0 otherwise.
Definition: reader.h:772
void Clear()
Definition: stack.h:107
StreamLocalCopy(Stream &original)
Definition: reader.h:267
Stream & s
Definition: reader.h:269
Stream s
Definition: reader.h:254
StreamLocalCopy(Stream &original)
Definition: reader.h:251
~StreamLocalCopy()
Definition: reader.h:252
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:518
#define RAPIDJSON_UNLIKELY(x)
Compiler branching hint for expression with low probability to be true.
Definition: rapidjson.h:531
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:451
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
Definition: rapidjson.h:121
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
Definition: rapidjson.h:124
#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset)
Macro to indicate a parse error.
Definition: reader.h:103
ParseErrorCode
Error code of parsing.
Definition: error.h:65
#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset)
(Internal) macro to indicate and handle a parse error.
Definition: reader.h:122
@ kParseErrorDocumentEmpty
The document is empty.
Definition: error.h:68
@ kParseErrorNumberMissFraction
Miss fraction part in number.
Definition: error.h:86
@ kParseErrorStringInvalidEncoding
Invalid encoding in string.
Definition: error.h:83
@ kParseErrorValueInvalid
Invalid value.
Definition: error.h:71
@ kParseErrorDocumentRootNotSingular
The document root must not follow by other values.
Definition: error.h:69
@ kParseErrorUnspecificSyntaxError
Unspecific syntax error.
Definition: error.h:90
@ kParseErrorObjectMissCommaOrCurlyBracket
Missing a comma or '}' after an object member.
Definition: error.h:75
@ kParseErrorObjectMissColon
Missing a colon after a name of object member.
Definition: error.h:74
@ kParseErrorStringMissQuotationMark
Missing a closing quotation mark in string.
Definition: error.h:82
@ kParseErrorTermination
Parsing was terminated.
Definition: error.h:89
@ kParseErrorNumberMissExponent
Miss exponent in number.
Definition: error.h:87
@ kParseErrorStringEscapeInvalid
Invalid escape character in string.
Definition: error.h:81
@ kParseErrorArrayMissCommaOrSquareBracket
Missing a comma or ']' after an array element.
Definition: error.h:77
@ kParseErrorStringUnicodeSurrogateInvalid
The surrogate pair in string is invalid.
Definition: error.h:80
@ kParseErrorObjectMissName
Missing a name for object member.
Definition: error.h:73
@ kParseErrorNumberTooBig
Number too big to be stored in double.
Definition: error.h:85
@ kParseErrorStringUnicodeEscapeInvalidHex
Incorrect hex digit after \u escape in string.
Definition: error.h:79
__host__ T exp(T x)
Definition: math_v2.hpp:391
__host__ constexpr __device__ T max(T x)
Definition: math.hpp:84
auto copy(InputRange &&range, OutputIterator iter) -> decltype(std::copy(std::begin(std::forward< InputRange >(range)), std::end(std::forward< InputRange >(range)), iter))
Definition: algorithm.hpp:14
__host__ __device__ minus() -> minus< void, void >
FIXME: create macro to replace 'host device' and nothing more.
typename vector_type< uint8_t, 16 >::type uint8x16_t
Definition: dtype_vector.hpp:2253
Definition: allocators.h:459
double StrtodFullPrecision(double d, int p, const Ch *decimals, size_t length, size_t decimalPosition, int exp)
Definition: strtod.h:252
double StrtodNormalPrecision(double d, int p)
Definition: strtod.h:38
uint32_t clzll(uint64_t x)
Definition: clzll.h:32
Type
Type of JSON value.
Definition: rapidjson.h:760
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition: rapidjson.h:429
#define RAPIDJSON_UINT64_C2(high32, low32)
Construct a 64-bit literal by a pair of 32-bit integer.
Definition: rapidjson.h:326
void SkipWhitespace(InputStream &is)
Skip the JSON white spaces in a stream.
Definition: reader.h:285
#define RAPIDJSON_PARSE_DEFAULT_FLAGS
Definition: reader.h:143
GenericReader< UTF8<>, UTF8<> > Reader
Reader with UTF8 encoding and default allocator.
Definition: reader.h:2767
ParseFlag
Combination of parseFlags.
Definition: reader.h:150
@ kParseFullPrecisionFlag
Parse number in full precision (but slower).
Definition: reader.h:159
@ kParseInsituFlag
In-situ(destructive) parsing.
Definition: reader.h:152
@ kParseNoFlags
No flags are set.
Definition: reader.h:151
@ kParseCommentsFlag
Allow one-line (//) and multi-line (/**/) comments.
Definition: reader.h:160
@ kParseEscapedApostropheFlag
Allow escaped apostrophe in strings.
Definition: reader.h:164
@ kParseDefaultFlags
Definition: reader.h:165
@ kParseTrailingCommasFlag
Allow trailing commas at the end of objects and arrays.
Definition: reader.h:162
@ kParseNanAndInfFlag
Allow parsing NaN, Inf, Infinity, -Inf and -Infinity as doubles.
Definition: reader.h:163
@ kParseValidateEncodingFlag
Validate encoding of JSON strings.
Definition: reader.h:153
@ kParseNumbersAsStringsFlag
Parse all numbers (ints/doubles) as strings.
Definition: reader.h:161
@ kParseIterativeFlag
Iterative(constant complexity in terms of function call stack size) parsing.
Definition: reader.h:154
@ kParseStopWhenDoneFlag
Definition: reader.h:156
signed __int64 int64_t
Definition: stdint.h:135
unsigned int uint32_t
Definition: stdint.h:126
signed int int32_t
Definition: stdint.h:123
unsigned char uint8_t
Definition: stdint.h:124
unsigned __int64 uint64_t
Definition: stdint.h:136
Default implementation of Handler.
Definition: reader.h:208
bool Int64(int64_t)
Definition: reader.h:219
bool EndObject(SizeType)
Definition: reader.h:233
bool Uint(unsigned)
Definition: reader.h:218
bool Uint64(uint64_t)
Definition: reader.h:220
bool String(const Ch *, SizeType, bool)
Definition: reader.h:227
bool Double(double)
Definition: reader.h:221
Encoding::Ch Ch
Definition: reader.h:209
bool Default()
Definition: reader.h:214
bool Int(int)
Definition: reader.h:217
bool StartArray()
Definition: reader.h:234
bool RawNumber(const Ch *str, SizeType len, bool copy)
enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length)
Definition: reader.h:223
bool Bool(bool)
Definition: reader.h:216
bool StartObject()
Definition: reader.h:228
internal::SelectIf< internal::IsSame< Derived, void >, BaseReaderHandler, Derived >::Type Override
Definition: reader.h:212
bool Key(const Ch *str, SizeType len, bool copy)
Definition: reader.h:229
bool Null()
Definition: reader.h:215
bool EndArray(SizeType)
Definition: reader.h:235
A read-write string stream.
Definition: stream.h:210
size_t Tell()
Definition: stream.h:218
Ch * dst_
Definition: stream.h:240
Ch Peek()
Definition: stream.h:216
Ch * src_
Definition: stream.h:239
Ch Take()
Definition: stream.h:217
Read-only string stream.
Definition: stream.h:163
const Ch * src_
Current read position.
Definition: stream.h:185
Represents an in-memory input byte stream.
Definition: memorystream.h:42
Result of parsing (wraps ParseErrorCode)
Definition: error.h:108
ParseErrorCode Code() const
Get the error code.
Definition: error.h:119
void Clear()
Reset error code.
Definition: error.h:140
void Set(ParseErrorCode code, size_t offset=0)
Update error code and offset.
Definition: error.h:142
bool IsError() const
Whether the result is an error.
Definition: error.h:126
size_t Offset() const
Get the error offset, if IsError(), 0 otherwise.
Definition: error.h:121
Encoding conversion.
Definition: encodings.h:823
UTF-8 encoding.
Definition: encodings.h:98