RAPIDJSON_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 138 #ifndef RAPIDJSON_PARSE_DEFAULT_FLAGS 139 #define RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags 178bool RawNumber(const Ch* str, SizeType length, bool copy);
179bool String(const Ch* str, SizeType length, bool copy);
181bool Key(const Ch* str, SizeType length, bool copy);
182bool EndObject(SizeType memberCount);
184bool EndArray(SizeType elementCount);
195 template<
typenameEncoding = UTF8<>,
typenameDerived =
void>
197 typedef typenameEncoding::Ch
Ch;
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(); }
224template<typename Stream, int = StreamTraits<Stream>::copyOptimization>
228 template<
typenameStream>
243 template<
typenameStream>
263 template<
typenameInputStream>
266InputStream& s(
copy.s);
268 typenameInputStream::Ch c;
269 while((c = s.Peek()) ==
' '|| c ==
'\n'|| c ==
'\r'|| c ==
'\t')
274 while(p != end && (*p ==
' '|| *p ==
'\n'|| *p ==
'\r'|| *p ==
'\t'))
279 #ifdef RAPIDJSON_SSE42 281 inline 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";
302 const int r= _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY);
308 inline const char*SkipWhitespace_SIMD(
const char* p,
const char* end) {
310 if(p != end && (*p ==
' '|| *p ==
'\n'|| *p ==
'\r'|| *p ==
'\t'))
316 static const char whitespace[16] =
" \n\r\t";
319 for(; p <= end - 16; p += 16) {
321 const int r= _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY);
329 #elif defined(RAPIDJSON_SSE2) 332 inline const char*SkipWhitespace_SIMD(
const char* p) {
334 if(*p ==
' '|| *p ==
'\n'|| *p ==
'\r'|| *p ==
'\t')
340 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
341 while(p != nextAligned)
342 if(*p ==
' '|| *p ==
'\n'|| *p ==
'\r'|| *p ==
'\t')
348 #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } 349 static const charwhitespaces[4][16] = { C16(
' '), C16(
'\n'), C16(
'\r'), C16(
'\t') };
367_BitScanForward(&
offset,
r);
370 returnp + __builtin_ffs(
r) - 1;
376 inline const char*SkipWhitespace_SIMD(
const char* p,
const char* end) {
378 if(p != end && (*p ==
' '|| *p ==
'\n'|| *p ==
'\r'|| *p ==
'\t'))
384 #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } 385 static const charwhitespaces[4][16] = { C16(
' '), C16(
'\n'), C16(
'\r'), C16(
'\t') };
393 for(; p <= end - 16; p += 16) {
403_BitScanForward(&
offset,
r);
406 returnp + __builtin_ffs(
r) - 1;
416 #ifdef RAPIDJSON_SIMD 419is.src_ =
const_cast<char*
>(SkipWhitespace_SIMD(is.src_));
424is.src_ = SkipWhitespace_SIMD(is.src_);
427 template<>
inline void SkipWhitespace(EncodedInputStream<UTF8<>, MemoryStream>& is) {
428is.is_.src_ = SkipWhitespace_SIMD(is.is_.src_, is.is_.end_);
451 template<
typenameSourceEncoding,
typenameTargetEncoding,
typenameStackAllocator = CrtAllocator>
454 typedef typenameSourceEncoding::Ch
Ch;
460 GenericReader(StackAllocator* stackAllocator = 0,
size_tstackCapacity = kDefaultStackCapacity) : stack_(stackAllocator, stackCapacity), parseResult_() {}
470 template<
unsignedparseFlags,
typenameInputStream,
typenameHandler>
473 returnIterativeParse<parseFlags>(is,
handler);
475parseResult_.Clear();
479SkipWhitespaceAndComments<parseFlags>(is);
480RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
484RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
487ParseValue<parseFlags>(is,
handler);
488RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
491SkipWhitespaceAndComments<parseFlags>(is);
492RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
496RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
511 template<
typenameInputStream,
typenameHandler>
513 returnParse<kParseDefaultFlags>(is,
handler);
545 template<
unsignedparseFlags,
typenameInputStream>
551 if(Consume(is,
'*')) {
555 else if(Consume(is,
'*')) {
556 if(Consume(is,
'/'))
564 while(is.Peek() !=
'\0'&& is.Take() !=
'\n') {}
574 template<
unsignedparseFlags,
typenameInputStream,
typenameHandler>
582SkipWhitespaceAndComments<parseFlags>(is);
583RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
585 if(Consume(is,
'}')) {
595ParseString<parseFlags>(is,
handler,
true);
596RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
598SkipWhitespaceAndComments<parseFlags>(is);
599RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
604SkipWhitespaceAndComments<parseFlags>(is);
605RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
607ParseValue<parseFlags>(is,
handler);
608RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
610SkipWhitespaceAndComments<parseFlags>(is);
611RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
618SkipWhitespaceAndComments<parseFlags>(is);
619RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
631 if(is.Peek() ==
'}') {
642 template<
unsignedparseFlags,
typenameInputStream,
typenameHandler>
650SkipWhitespaceAndComments<parseFlags>(is);
651RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
653 if(Consume(is,
']')) {
659 for(
SizeTypeelementCount = 0;;) {
660ParseValue<parseFlags>(is,
handler);
661RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
664SkipWhitespaceAndComments<parseFlags>(is);
665RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
667 if(Consume(is,
',')) {
668SkipWhitespaceAndComments<parseFlags>(is);
669RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
671 else if(Consume(is,
']')) {
680 if(is.Peek() ==
']') {
690 template<
unsignedparseFlags,
typenameInputStream,
typenameHandler>
695 if(
RAPIDJSON_LIKELY(Consume(is,
'u') && Consume(is,
'l') && Consume(is,
'l'))) {
703 template<
unsignedparseFlags,
typenameInputStream,
typenameHandler>
708 if(
RAPIDJSON_LIKELY(Consume(is,
'r') && Consume(is,
'u') && Consume(is,
'e'))) {
716 template<
unsignedparseFlags,
typenameInputStream,
typenameHandler>
721 if(
RAPIDJSON_LIKELY(Consume(is,
'a') && Consume(is,
'l') && Consume(is,
's') && Consume(is,
'e'))) {
729 template<
typenameInputStream>
730RAPIDJSON_FORCEINLINE
static bool Consume(InputStream& is,
typenameInputStream::Ch
expect) {
740 template<
typenameInputStream>
741 unsigned ParseHex4(InputStream& is,
size_tescapeOffset) {
742 unsignedcodepoint = 0;
743 for(
int i= 0;
i< 4;
i++) {
746codepoint +=
static_cast<unsigned>(c);
747 if(c >=
'0'&& c <=
'9')
749 else if(c >=
'A'&& c <=
'F')
750codepoint -=
'A'- 10;
751 else if(c >=
'a'&& c <=
'f')
752codepoint -=
'a'- 10;
755RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0);
762 template<
typenameCharType>
765 typedefCharType
Ch;
768RAPIDJSON_FORCEINLINE
void Put(
Chc) {
769*stack_.template Push<Ch>() = c;
775 returnstack_.template Push<Ch>(
count);
778 size_t Length()
const{
returnlength_; }
781 returnstack_.template Pop<Ch>(length_);
793 template<
unsignedparseFlags,
typenameInputStream,
typenameHandler>
796InputStream& s(
copy.s);
801 boolsuccess =
false;
803 typenameInputStream::Ch *
head= s.PutBegin();
804ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s);
805RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
806 size_tlength = s.PutEnd(
head) - 1;
808 const typenameTargetEncoding::Ch*
const str=
reinterpret_cast<typename TargetEncoding::Ch*
>(
head);
813ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);
814RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
816 const typenameTargetEncoding::Ch*
const str= stackStream.
Pop();
825 template<
unsignedparseFlags,
typenameSEncoding,
typenameTEncoding,
typenameInputStream,
typenameOutputStream>
828 #define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 829 static const charescape[256] = {
830 Z16,
Z16, 0, 0,
'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'/',
831 Z16,
Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'\\', 0, 0, 0,
8320, 0,
'\b', 0, 0, 0,
'\f', 0, 0, 0, 0, 0, 0, 0,
'\n', 0,
8330, 0,
'\r', 0,
'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
842ScanCopyUnescapedString(is, os);
846 size_tescapeOffset = is.Tell();
849 if((
sizeof(
Ch) == 1 ||
unsigned(e) < 256) &&
RAPIDJSON_LIKELY(escape[
static_cast<unsigned char>(e)])) {
851os.Put(
static_cast<typename TEncoding::Ch
>(escape[
static_cast<unsigned char>(e)]));
855 unsignedcodepoint = ParseHex4(is, escapeOffset);
856RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
861 unsignedcodepoint2 = ParseHex4(is, escapeOffset);
862RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
865codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
884 size_t offset= is.Tell();
893 template<
typenameInputStream,
typenameOutputStream>
898 #if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) 900 staticRAPIDJSON_FORCEINLINE
voidScanCopyUnescapedString(
StringStream& is, StackStream<char>& os) {
901 const char* p = is.
src_;
904 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
905 while(p != nextAligned)
914 static const chardquote[16] = {
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"'};
915 static const charbslash[16] = {
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\'};
916 static const charspace[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 };
932_BitScanForward(&
offset,
r);
935length =
static_cast<SizeType>(__builtin_ffs(
r) - 1);
938 char* q =
reinterpret_cast<char*
>(os.Push(length));
939 for(
size_t i= 0;
i< length;
i++)
957 if(is.src_ == is.dst_) {
958SkipUnescapedString(is);
966 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
967 while(p != nextAligned)
977 static const chardquote[16] = {
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"'};
978 static const charbslash[16] = {
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\'};
979 static const charspace[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 };
984 for(;; p += 16, q += 16) {
995_BitScanForward(&
offset,
r);
998length =
static_cast<size_t>(__builtin_ffs(
r) - 1);
1000 for(
const char* pend = p + length; p != pend; )
1017 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
1018 for(; p != nextAligned; p++)
1020is.src_ = is.dst_ = p;
1025 static const chardquote[16] = {
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"'};
1026 static const charbslash[16] = {
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\'};
1027 static const charspace[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 };
1043_BitScanForward(&
offset,
r);
1046length =
static_cast<size_t>(__builtin_ffs(
r) - 1);
1053is.src_ = is.dst_ = p;
1057 template<
typenameInputStream,
boolbackup,
boolpushOnTake>
1060 template<
typenameInputStream>
1063 typedef typenameInputStream::Ch
Ch;
1067RAPIDJSON_FORCEINLINE
Ch Peek()
const{
returnis.Peek(); }
1069RAPIDJSON_FORCEINLINE
Ch Take() {
returnis.Take(); }
1070RAPIDJSON_FORCEINLINE
void Push(
char) {}
1072 size_t Tell() {
returnis.Tell(); }
1074 const char*
Pop() {
return0; }
1082 template<
typenameInputStream>
1089stackStream.Put(
static_cast<char>(Base::is.Peek()));
1090 returnBase::is.Take();
1093RAPIDJSON_FORCEINLINE
void Push(
charc) {
1097 size_t Length() {
returnstackStream.Length(); }
1100stackStream.Put(
'\0');
1101 returnstackStream.Pop();
1108 template<
typenameInputStream>
1114RAPIDJSON_FORCEINLINE
Ch Take() {
returnBase::TakePush(); }
1117 template<
unsignedparseFlags,
typenameInputStream,
typenameHandler>
1127 size_tstartOffset = s.Tell();
1129 booluseNanOrInf =
false;
1132 bool minus= Consume(s,
'-');
1137 booluse64bit =
false;
1138 intsignificandDigit = 0;
1144 i=
static_cast<unsigned>(s.TakePush() -
'0');
1155 i=
i* 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1167 i=
i* 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1173useNanOrInf =
true;
1174 if(
RAPIDJSON_LIKELY(Consume(s,
'N') && Consume(s,
'a') && Consume(s,
'N'))) {
1175d = std::numeric_limits<double>::quiet_NaN();
1177 else if(
RAPIDJSON_LIKELY(Consume(s,
'I') && Consume(s,
'n') && Consume(s,
'f'))) {
1180&& Consume(s,
'i') && Consume(s,
't') && Consume(s,
'y'))))
1190 booluseDouble =
false;
1196d =
static_cast<double>(i64);
1200i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1207d =
static_cast<double>(i64);
1211i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1221d = d * 10 + (s.TakePush() -
'0');
1227 size_tdecimalPosition;
1228 if(Consume(s,
'.')) {
1229decimalPosition = s.Length();
1244i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1251d =
static_cast<double>(i64);
1254d =
static_cast<double>(use64bit ? i64 :
i);
1260 if(significandDigit < 17) {
1261d = d * 10.0 + (s.TakePush() -
'0');
1271decimalPosition = s.Length();
1275 if(Consume(s,
'e') || Consume(s,
'E')) {
1277d =
static_cast<double>(use64bit ? i64 :
i);
1281 boolexpMinus =
false;
1282 if(Consume(s,
'+'))
1284 else if(Consume(s,
'-'))
1288exp =
static_cast<int>(s.Take() -
'0');
1291exp = exp * 10 +
static_cast<int>(s.Take() -
'0');
1292 if(exp >= 214748364) {
1299 intmaxExp = 308 - expFrac;
1301exp = exp * 10 +
static_cast<int>(s.Take() -
'0');
1320 typenameInputStream::Ch*
head= is.PutBegin();
1321 const size_tlength = s.Tell() - startOffset;
1324 const typenameTargetEncoding::Ch*
const str=
reinterpret_cast<typename TargetEncoding::Ch*
>(
head);
1331 while(numCharsToCopy--) {
1334dstStream.
Put(
'\0');
1335 const typenameTargetEncoding::Ch*
str= dstStream.
Pop();
1341 size_tlength = s.Length();
1342 const char* decimal = s.Pop();
1345 intp = exp + expFrac;
1353 else if(useNanOrInf) {
1376 template<
unsignedparseFlags,
typenameInputStream,
typenameHandler>
1378 switch(is.Peek()) {
1379 case 'n': ParseNull <parseFlags>(is,
handler);
break;
1380 case 't': ParseTrue <parseFlags>(is,
handler);
break;
1381 case 'f': ParseFalse <parseFlags>(is,
handler);
break;
1382 case '"': ParseString<parseFlags>(is,
handler);
break;
1383 case '{': ParseObject<parseFlags>(is,
handler);
break;
1384 case '[': ParseArray <parseFlags>(is,
handler);
break;
1386ParseNumber<parseFlags>(is,
handler);
1396IterativeParsingStartState = 0,
1415IterativeParsingValueState
1418 enum{ cIterativeParsingStateCount = IterativeParsingValueState + 1 };
1422LeftBracketToken = 0,
1443 #define N NumberToken 1444 #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N 1446 static const unsigned chartokenMap[256] = {
1449 N,
N, StringToken,
N,
N,
N,
N,
N,
N,
N,
N,
N, CommaToken,
N,
N,
N,
1450 N,
N,
N,
N,
N,
N,
N,
N,
N,
N, ColonToken,
N,
N,
N,
N,
N,
1452 N,
N,
N,
N,
N,
N,
N,
N,
N,
N,
N, LeftBracketToken,
N, RightBracketToken,
N,
N,
1453 N,
N,
N,
N,
N,
N, FalseToken,
N,
N,
N,
N,
N,
N,
N, NullToken,
N,
1454 N,
N,
N,
N, TrueToken,
N,
N,
N,
N,
N,
N, LeftCurlyBracketToken,
N, RightCurlyBracketToken,
N,
N,
1455N16, N16, N16, N16, N16, N16, N16, N16
1461 if(
sizeof(
Ch) == 1 ||
static_cast<unsigned>(c) < 256)
1462 return static_cast<Token>(tokenMap[
static_cast<unsigned char>(c)]);
1469 static const char G[cIterativeParsingStateCount][kTokenCount] = {
1472IterativeParsingArrayInitialState,
1473IterativeParsingErrorState,
1474IterativeParsingObjectInitialState,
1475IterativeParsingErrorState,
1476IterativeParsingErrorState,
1477IterativeParsingErrorState,
1478IterativeParsingValueState,
1479IterativeParsingValueState,
1480IterativeParsingValueState,
1481IterativeParsingValueState,
1482IterativeParsingValueState
1486IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1487IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1488IterativeParsingErrorState
1492IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1493IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1494IterativeParsingErrorState
1498IterativeParsingErrorState,
1499IterativeParsingErrorState,
1500IterativeParsingErrorState,
1501IterativeParsingObjectFinishState,
1502IterativeParsingErrorState,
1503IterativeParsingErrorState,
1504IterativeParsingMemberKeyState,
1505IterativeParsingErrorState,
1506IterativeParsingErrorState,
1507IterativeParsingErrorState,
1508IterativeParsingErrorState
1512IterativeParsingErrorState,
1513IterativeParsingErrorState,
1514IterativeParsingErrorState,
1515IterativeParsingErrorState,
1516IterativeParsingErrorState,
1517IterativeParsingKeyValueDelimiterState,
1518IterativeParsingErrorState,
1519IterativeParsingErrorState,
1520IterativeParsingErrorState,
1521IterativeParsingErrorState,
1522IterativeParsingErrorState
1526IterativeParsingArrayInitialState,
1527IterativeParsingErrorState,
1528IterativeParsingObjectInitialState,
1529IterativeParsingErrorState,
1530IterativeParsingErrorState,
1531IterativeParsingErrorState,
1532IterativeParsingMemberValueState,
1533IterativeParsingMemberValueState,
1534IterativeParsingMemberValueState,
1535IterativeParsingMemberValueState,
1536IterativeParsingMemberValueState
1540IterativeParsingErrorState,
1541IterativeParsingErrorState,
1542IterativeParsingErrorState,
1543IterativeParsingObjectFinishState,
1544IterativeParsingMemberDelimiterState,
1545IterativeParsingErrorState,
1546IterativeParsingErrorState,
1547IterativeParsingErrorState,
1548IterativeParsingErrorState,
1549IterativeParsingErrorState,
1550IterativeParsingErrorState
1554IterativeParsingErrorState,
1555IterativeParsingErrorState,
1556IterativeParsingErrorState,
1557IterativeParsingObjectFinishState,
1558IterativeParsingErrorState,
1559IterativeParsingErrorState,
1560IterativeParsingMemberKeyState,
1561IterativeParsingErrorState,
1562IterativeParsingErrorState,
1563IterativeParsingErrorState,
1564IterativeParsingErrorState
1568IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1569IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1570IterativeParsingErrorState
1574IterativeParsingArrayInitialState,
1575IterativeParsingArrayFinishState,
1576IterativeParsingObjectInitialState,
1577IterativeParsingErrorState,
1578IterativeParsingErrorState,
1579IterativeParsingErrorState,
1580IterativeParsingElementState,
1581IterativeParsingElementState,
1582IterativeParsingElementState,
1583IterativeParsingElementState,
1584IterativeParsingElementState
1588IterativeParsingErrorState,
1589IterativeParsingArrayFinishState,
1590IterativeParsingErrorState,
1591IterativeParsingErrorState,
1592IterativeParsingElementDelimiterState,
1593IterativeParsingErrorState,
1594IterativeParsingErrorState,
1595IterativeParsingErrorState,
1596IterativeParsingErrorState,
1597IterativeParsingErrorState,
1598IterativeParsingErrorState
1602IterativeParsingArrayInitialState,
1603IterativeParsingArrayFinishState,
1604IterativeParsingObjectInitialState,
1605IterativeParsingErrorState,
1606IterativeParsingErrorState,
1607IterativeParsingErrorState,
1608IterativeParsingElementState,
1609IterativeParsingElementState,
1610IterativeParsingElementState,
1611IterativeParsingElementState,
1612IterativeParsingElementState
1616IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1617IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1618IterativeParsingErrorState
1622IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1623IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1624IterativeParsingErrorState
1633 template<
unsignedparseFlags,
typenameInputStream,
typenameHandler>
1638 caseIterativeParsingErrorState:
1641 caseIterativeParsingObjectInitialState:
1642 caseIterativeParsingArrayInitialState:
1647 if(src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState)
1648 n= IterativeParsingElementState;
1649 else if(src == IterativeParsingKeyValueDelimiterState)
1650 n= IterativeParsingMemberValueState;
1652*stack_.template Push<SizeType>(1) =
n;
1654*stack_.template Push<SizeType>(1) = 0;
1656 boolhr = (dst == IterativeParsingObjectInitialState) ?
handler.StartObject() :
handler.StartArray();
1660 returnIterativeParsingErrorState;
1668 caseIterativeParsingMemberKeyState:
1669ParseString<parseFlags>(is,
handler,
true);
1670 if(HasParseError())
1671 returnIterativeParsingErrorState;
1675 caseIterativeParsingKeyValueDelimiterState:
1680 caseIterativeParsingMemberValueState:
1682ParseValue<parseFlags>(is,
handler);
1683 if(HasParseError()) {
1684 returnIterativeParsingErrorState;
1688 caseIterativeParsingElementState:
1690ParseValue<parseFlags>(is,
handler);
1691 if(HasParseError()) {
1692 returnIterativeParsingErrorState;
1696 caseIterativeParsingMemberDelimiterState:
1697 caseIterativeParsingElementDelimiterState:
1700*stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;
1703 caseIterativeParsingObjectFinishState:
1708 returnIterativeParsingErrorState;
1711 SizeTypec = *stack_.template Pop<SizeType>(1);
1713 if(src == IterativeParsingMemberValueState)
1718 if(
n== IterativeParsingStartState)
1719 n= IterativeParsingFinishState;
1721 boolhr =
handler.EndObject(c);
1725 returnIterativeParsingErrorState;
1733 caseIterativeParsingArrayFinishState:
1738 returnIterativeParsingErrorState;
1741 SizeTypec = *stack_.template Pop<SizeType>(1);
1743 if(src == IterativeParsingElementState)
1748 if(
n== IterativeParsingStartState)
1749 n= IterativeParsingFinishState;
1751 boolhr =
handler.EndArray(c);
1755 returnIterativeParsingErrorState;
1777ParseValue<parseFlags>(is,
handler);
1778 if(HasParseError()) {
1779 returnIterativeParsingErrorState;
1781 returnIterativeParsingFinishState;
1785 template<
typenameInputStream>
1787 if(HasParseError()) {
1795 caseIterativeParsingObjectInitialState:
1799 caseIterativeParsingKeyValueDelimiterState:
1800 caseIterativeParsingArrayInitialState:
1806 template<
unsignedparseFlags,
typenameInputStream,
typenameHandler>
1808parseResult_.
Clear();
1812SkipWhitespaceAndComments<parseFlags>(is);
1813RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
1814 while(is.Peek() !=
'\0') {
1815 Token t= Tokenize(is.Peek());
1819 if(d == IterativeParsingErrorState) {
1820HandleError(
state, is);
1830SkipWhitespaceAndComments<parseFlags>(is);
1831RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
1835 if(
state!= IterativeParsingFinishState)
1836HandleError(
state, is);
1838 returnparseResult_;
1841 static const size_tkDefaultStackCapacity = 256;
RAPIDJSON_FORCEINLINE Ch Peek() const
RAPIDJSON_FORCEINLINE Ch TakePush()
RAPIDJSON_FORCEINLINE void Push(char)
NumberStream & operator=(const NumberStream &)
NumberStream(GenericReader &reader, InputStream &s)
RAPIDJSON_FORCEINLINE Ch Take()
NumberStream< InputStream, false, false > Base
NumberStream(GenericReader &reader, InputStream &is)
StackStream< char > stackStream
RAPIDJSON_FORCEINLINE void Push(char c)
RAPIDJSON_FORCEINLINE Ch TakePush()
NumberStream< InputStream, true, false > Base
NumberStream(GenericReader &reader, InputStream &is)
RAPIDJSON_FORCEINLINE Ch Take()
StackStream & operator=(const StackStream &)
RAPIDJSON_FORCEINLINE void * Push(SizeType count)
RAPIDJSON_FORCEINLINE void Put(Ch c)
internal::Stack< StackAllocator > & stack_
StackStream(internal::Stack< StackAllocator > &stack)
StackStream(const StackStream &)
SAX-style JSON parser. Use Reader for UTF8 encoding and default allocator.
ParseErrorCode GetParseErrorCode() const
Get the ParseErrorCode of last parsing.
SourceEncoding::Ch Ch
SourceEncoding character type.
void ParseFalse(InputStream &is, Handler &handler)
internal::Stack< StackAllocator > stack_
A stack for storing decoded string temporarily during non-destructive parsing.
GenericReader & operator=(const GenericReader &)
void ParseNumber(InputStream &is, Handler &handler)
@ IterativeParsingObjectFinishState
@ IterativeParsingErrorState
@ IterativeParsingObjectInitialState
@ IterativeParsingMemberValueState
@ IterativeParsingArrayFinishState
@ IterativeParsingArrayInitialState
@ IterativeParsingElementDelimiterState
@ IterativeParsingElementState
@ IterativeParsingFinishState
@ IterativeParsingMemberKeyState
@ IterativeParsingKeyValueDelimiterState
@ IterativeParsingMemberDelimiterState
ParseResult Parse(InputStream &is, Handler &handler)
Parse JSON text (with kParseDefaultFlags)
void ParseNull(InputStream &is, Handler &handler)
static RAPIDJSON_FORCEINLINE bool Consume(InputStream &is, typename InputStream::Ch expect)
void ParseObject(InputStream &is, Handler &handler)
void SetParseError(ParseErrorCode code, size_t offset)
GenericReader(StackAllocator *stackAllocator=0, size_t stackCapacity=kDefaultStackCapacity)
Constructor.
unsigned ParseHex4(InputStream &is, size_t escapeOffset)
void HandleError(IterativeParsingState src, InputStream &is)
GenericReader(const GenericReader &)
void ParseTrue(InputStream &is, Handler &handler)
RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token)
RAPIDJSON_FORCEINLINE Token Tokenize(Ch c)
RAPIDJSON_FORCEINLINE void ParseStringToStream(InputStream &is, OutputStream &os)
size_t GetErrorOffset() const
Get the position of last parsing error in input, 0 otherwise.
void SkipWhitespaceAndComments(InputStream &is)
bool HasParseError() const
Whether a parse error has occured in the last parsing.
void ParseString(InputStream &is, Handler &handler, bool isKey=false)
ParseResult Parse(InputStream &is, Handler &handler)
Parse JSON text.
ParseResult IterativeParse(InputStream &is, Handler &handler)
void ParseArray(InputStream &is, Handler &handler)
void ParseValue(InputStream &is, Handler &handler)
RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream &is, Handler &handler)
static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InputStream &, OutputStream &)
Concept for receiving events from GenericReader upon parsing. The functions return true if no error o...
Concept for reading and writing characters.
StreamLocalCopy & operator=(const StreamLocalCopy &)
StreamLocalCopy(Stream &original)
StreamLocalCopy(Stream &original)
StreamLocalCopy & operator=(const StreamLocalCopy &)
void(*)(CSeq_entry_Handle seh, IWorkbench *wb, const CSerialObject &obj) handler
boolean whitespace(char c)
static const char * str(char *buf, int n)
static const char * expect
#define RAPIDJSON_LIKELY(x)
Compiler branching hint for expression with high probability to be true.
#define RAPIDJSON_UNLIKELY(x)
Compiler branching hint for expression with low probability to be true.
#define RAPIDJSON_PARSE_DEFAULT_FLAGS
User-defined kParseDefaultFlags definition.
#define RAPIDJSON_ASSERT(x)
Assertion.
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
ParseErrorCode
Error code of parsing.
#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset)
Macro to indicate a parse error.
#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset)
(Internal) macro to indicate and handle a parse error.
@ kParseErrorDocumentEmpty
The document is empty.
@ kParseErrorArrayMissCommaOrSquareBracket
Missing a comma or ']' after an array element.
@ kParseErrorDocumentRootNotSingular
The document root must not follow by other values.
@ kParseErrorStringUnicodeEscapeInvalidHex
Incorrect hex digit after \u escape in string.
@ kParseErrorNumberTooBig
Number too big to be stored in double.
@ kParseErrorNumberMissExponent
Miss exponent in number.
@ kParseErrorObjectMissCommaOrCurlyBracket
Missing a comma or '}' after an object member.
@ kParseErrorObjectMissColon
Missing a colon after a name of object member.
@ kParseErrorStringInvalidEncoding
Invalid encoding in string.
@ kParseErrorStringUnicodeSurrogateInvalid
The surrogate pair in string is invalid.
@ kParseErrorUnspecificSyntaxError
Unspecific syntax error.
@ kParseErrorStringEscapeInvalid
Invalid escape character in string.
@ kParseErrorTermination
Parsing was terminated.
@ kParseErrorObjectMissName
Missing a name for object member.
@ kParseErrorValueInvalid
Invalid value.
@ kParseErrorNumberMissFraction
Miss fraction part in number.
@ kParseErrorStringMissQuotationMark
Missing a closing quotation mark in string.
double StrtodNormalPrecision(double d, int p)
double StrtodFullPrecision(double d, int p, const char *decimals, size_t length, size_t decimalPosition, int exp)
GenericStringStream< UTF8< char > > StringStream
String stream with UTF8 encoding.
unsigned SizeType
Size type (for string lengths, array sizes, etc.)
GenericInsituStringStream< UTF8< char > > InsituStringStream
Insitu string stream with UTF8 encoding.
ParseFlag
Combination of parseFlags.
@ kParseInsituFlag
In-situ(destructive) parsing.
@ kParseNumbersAsStringsFlag
Parse all numbers (ints/doubles) as strings.
@ kParseValidateEncodingFlag
Validate encoding of JSON strings.
@ kParseDefaultFlags
Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS.
@ kParseIterativeFlag
Iterative(constant complexity in terms of function call stack size) parsing.
@ kParseNanAndInfFlag
Allow parsing NaN, Inf, Infinity, -Inf and -Infinity as doubles.
@ kParseCommentsFlag
Allow one-line (//) and multi-line (/â**/) comments.
@ kParseFullPrecisionFlag
Parse number in full precision (but slower).
@ kParseNoFlags
No flags are set.
@ kParseStopWhenDoneFlag
After parsing a complete JSON root from stream, stop further processing the rest of stream....
@ kParseTrailingCommasFlag
Allow trailing commas at the end of objects and arrays.
const char * SkipWhitespace(const char *p, const char *end)
GenericReader< UTF8< char >, UTF8< char >, CrtAllocator > Reader
Reader with UTF8 encoding and default allocator.
double r(size_t dimension_, const Int4 *score_, const double *prob_, double theta_)
void copy(Njn::Matrix< S > *matrix_, const Njn::Matrix< T > &matrix0_)
#define RAPIDJSON_UINT64_C2(high32, low32)
Construct a 64-bit literal by a pair of 32-bit integer.
static __m128i _mm_max_epu8(__m128i a, __m128i b)
static int _mm_movemask_epi8(__m128i a)
static __m128i _mm_loadu_si128(const __m128i *p)
static __m128i _mm_cmpeq_epi8(__m128i a, __m128i b)
static __m128i _mm_load_si128(const __m128i *p)
static __m128i _mm_or_si128(__m128i, __m128i)
static void _mm_storeu_si128(__m128i *p, __m128i a)
Default implementation of Handler.
bool RawNumber(const Ch *str, SizeType len, bool copy)
enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length)
bool Key(const Ch *str, SizeType len, bool copy)
bool String(const Ch *, SizeType, bool)
internal::SelectIf< internal::IsSame< Derived, void >, BaseReaderHandler, Derived >::Type Override
ClearStackOnExit(GenericReader &r)
ClearStackOnExit(const ClearStackOnExit &)
ClearStackOnExit & operator=(const ClearStackOnExit &)
const Ch * src_
Current read position.
Result of parsing (wraps ParseErrorCode)
void Clear()
Reset error code.
void Encode(const CRawScoreVector< Key, Score > &, vector< char > &)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4