mirror of
https://github.com/Tencent/rapidjson.git
synced 2025-03-06 13:41:35 +01:00
Restored original IterativeParse implementation
Runs about 1-2% faster (original speed) by running in a tight loop, at the expense of slight code duplication with IterativeParseNext.
This commit is contained in:
parent
488252eca2
commit
0f8389e787
@ -1892,11 +1892,36 @@ private:
|
||||
|
||||
template <unsigned parseFlags, typename InputStream, typename Handler>
|
||||
ParseResult IterativeParse(InputStream& is, Handler& handler) {
|
||||
IterativeParseInit();
|
||||
while (!IterativeParseComplete()) {
|
||||
if (!IterativeParseNext<parseFlags>(is, handler))
|
||||
parseResult_.Clear();
|
||||
ClearStackOnExit scope(*this);
|
||||
IterativeParsingState state = IterativeParsingStartState;
|
||||
|
||||
SkipWhitespaceAndComments<parseFlags>(is);
|
||||
RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
|
||||
while (is.Peek() != '\0') {
|
||||
Token t = Tokenize(is.Peek());
|
||||
IterativeParsingState n = Predict(state, t);
|
||||
IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
|
||||
|
||||
if (d == IterativeParsingErrorState) {
|
||||
HandleError(state, is);
|
||||
break;
|
||||
}
|
||||
|
||||
state = d;
|
||||
|
||||
// Do not further consume streams if a root JSON has been parsed.
|
||||
if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState)
|
||||
break;
|
||||
|
||||
SkipWhitespaceAndComments<parseFlags>(is);
|
||||
RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
|
||||
}
|
||||
|
||||
// Handle the end of file.
|
||||
if (state != IterativeParsingFinishState)
|
||||
HandleError(state, is);
|
||||
|
||||
return parseResult_;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user