mirror of
https://github.com/Tencent/rapidjson.git
synced 2025-03-06 13:41:35 +01:00
Rename flags/state names/functions/test cases from 'NonRecursive' to 'Iterative'.
This commit is contained in:
parent
3006fa7d8c
commit
7acb0c181e
@ -47,7 +47,7 @@ enum ParseFlag {
|
|||||||
kParseDefaultFlags = 0, //!< Default parse flags. Non-destructive parsing. Text strings are decoded into allocated buffer.
|
kParseDefaultFlags = 0, //!< Default parse flags. Non-destructive parsing. Text strings are decoded into allocated buffer.
|
||||||
kParseInsituFlag = 1, //!< In-situ(destructive) parsing.
|
kParseInsituFlag = 1, //!< In-situ(destructive) parsing.
|
||||||
kParseValidateEncodingFlag = 2, //!< Validate encoding of JSON strings.
|
kParseValidateEncodingFlag = 2, //!< Validate encoding of JSON strings.
|
||||||
kParseNonRecursiveFlag = 4 //!< Non-recursive(constant complexity in terms of function call stack size) parsing.
|
kParseIterativeFlag = 4 //!< Iterative(constant complexity in terms of function call stack size) parsing.
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Error code of parsing.
|
//! Error code of parsing.
|
||||||
@ -298,8 +298,8 @@ public:
|
|||||||
parseErrorCode_ = kParseErrorNone;
|
parseErrorCode_ = kParseErrorNone;
|
||||||
errorOffset_ = 0;
|
errorOffset_ = 0;
|
||||||
|
|
||||||
if (parseFlags & kParseNonRecursiveFlag)
|
if (parseFlags & kParseIterativeFlag)
|
||||||
return NonRecursiveParse<parseFlags>(is, handler);
|
return IterativeParse<parseFlags>(is, handler);
|
||||||
|
|
||||||
SkipWhitespace(is);
|
SkipWhitespace(is);
|
||||||
|
|
||||||
@ -753,37 +753,37 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Non-recursive parsing
|
// Non-recursive parsing
|
||||||
enum NonRecursiveParsingState {
|
enum IterativeParsingState {
|
||||||
NonRecursiveParsingStartState,
|
IterativeParsingStartState,
|
||||||
NonRecursiveParsingFinishState,
|
IterativeParsingFinishState,
|
||||||
NonRecursiveParsingErrorState,
|
IterativeParsingErrorState,
|
||||||
// Object states
|
// Object states
|
||||||
NonRecursiveParsingObjectInitialState,
|
IterativeParsingObjectInitialState,
|
||||||
NonRecursiveParsingObjectContentState,
|
IterativeParsingObjectContentState,
|
||||||
// Array states
|
// Array states
|
||||||
NonRecursiveParsingArrayInitialState,
|
IterativeParsingArrayInitialState,
|
||||||
NonRecursiveParsingArrayContentState
|
IterativeParsingArrayContentState
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename InputStream, typename Handler>
|
template <typename InputStream, typename Handler>
|
||||||
NonRecursiveParsingState TransitToCompoundValueTypeState(NonRecursiveParsingState state, InputStream& is, Handler& handler) {
|
IterativeParsingState TransitToCompoundValueTypeState(IterativeParsingState state, InputStream& is, Handler& handler) {
|
||||||
// For compound value type(object and array), we should push the current state and start a new stack frame for this type.
|
// For compound value type(object and array), we should push the current state and start a new stack frame for this type.
|
||||||
NonRecursiveParsingState r = NonRecursiveParsingErrorState;
|
IterativeParsingState r = IterativeParsingErrorState;
|
||||||
|
|
||||||
switch (is.Take()) {
|
switch (is.Take()) {
|
||||||
case '{':
|
case '{':
|
||||||
handler.StartObject();
|
handler.StartObject();
|
||||||
r = NonRecursiveParsingObjectInitialState;
|
r = IterativeParsingObjectInitialState;
|
||||||
// Push current state.
|
// Push current state.
|
||||||
*stack_.template Push<NonRecursiveParsingState>(1) = state;
|
*stack_.template Push<IterativeParsingState>(1) = state;
|
||||||
// Initialize and push member count.
|
// Initialize and push member count.
|
||||||
*stack_.template Push<int>(1) = 0;
|
*stack_.template Push<int>(1) = 0;
|
||||||
break;
|
break;
|
||||||
case '[':
|
case '[':
|
||||||
handler.StartArray();
|
handler.StartArray();
|
||||||
r = NonRecursiveParsingArrayInitialState;
|
r = IterativeParsingArrayInitialState;
|
||||||
// Push current state.
|
// Push current state.
|
||||||
*stack_.template Push<NonRecursiveParsingState>(1) = state;
|
*stack_.template Push<IterativeParsingState>(1) = state;
|
||||||
// Initialize and push element count.
|
// Initialize and push element count.
|
||||||
*stack_.template Push<int>(1) = 0;
|
*stack_.template Push<int>(1) = 0;
|
||||||
break;
|
break;
|
||||||
@ -793,22 +793,22 @@ private:
|
|||||||
|
|
||||||
// Inner transition of object or array states(ObjectInitial->ObjectContent, ArrayInitial->ArrayContent).
|
// Inner transition of object or array states(ObjectInitial->ObjectContent, ArrayInitial->ArrayContent).
|
||||||
template <unsigned parseFlags, typename InputStream, typename Handler>
|
template <unsigned parseFlags, typename InputStream, typename Handler>
|
||||||
NonRecursiveParsingState TransitByValue(NonRecursiveParsingState state, InputStream& is, Handler& handler) {
|
IterativeParsingState TransitByValue(IterativeParsingState state, InputStream& is, Handler& handler) {
|
||||||
RAPIDJSON_ASSERT(
|
RAPIDJSON_ASSERT(
|
||||||
state == NonRecursiveParsingObjectInitialState ||
|
state == IterativeParsingObjectInitialState ||
|
||||||
state == NonRecursiveParsingArrayInitialState ||
|
state == IterativeParsingArrayInitialState ||
|
||||||
state == NonRecursiveParsingObjectContentState ||
|
state == IterativeParsingObjectContentState ||
|
||||||
state == NonRecursiveParsingArrayContentState);
|
state == IterativeParsingArrayContentState);
|
||||||
|
|
||||||
NonRecursiveParsingState t;
|
IterativeParsingState t;
|
||||||
if (state == NonRecursiveParsingObjectInitialState)
|
if (state == IterativeParsingObjectInitialState)
|
||||||
t = NonRecursiveParsingObjectContentState;
|
t = IterativeParsingObjectContentState;
|
||||||
else if (state == NonRecursiveParsingArrayInitialState)
|
else if (state == IterativeParsingArrayInitialState)
|
||||||
t = NonRecursiveParsingArrayContentState;
|
t = IterativeParsingArrayContentState;
|
||||||
else
|
else
|
||||||
t = state;
|
t = state;
|
||||||
|
|
||||||
NonRecursiveParsingState r = NonRecursiveParsingErrorState;
|
IterativeParsingState r = IterativeParsingErrorState;
|
||||||
|
|
||||||
switch (is.Peek()) {
|
switch (is.Peek()) {
|
||||||
// For plain value state is not changed.
|
// For plain value state is not changed.
|
||||||
@ -824,39 +824,39 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (HasParseError())
|
if (HasParseError())
|
||||||
r = NonRecursiveParsingErrorState;
|
r = IterativeParsingErrorState;
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Transit from object related states(ObjectInitial, ObjectContent).
|
// Transit from object related states(ObjectInitial, ObjectContent).
|
||||||
template <unsigned parseFlags, typename InputStream, typename Handler>
|
template <unsigned parseFlags, typename InputStream, typename Handler>
|
||||||
NonRecursiveParsingState TransitFromObjectStates(NonRecursiveParsingState state, InputStream& is, Handler& handler) {
|
IterativeParsingState TransitFromObjectStates(IterativeParsingState state, InputStream& is, Handler& handler) {
|
||||||
NonRecursiveParsingState r = NonRecursiveParsingErrorState;
|
IterativeParsingState r = IterativeParsingErrorState;
|
||||||
|
|
||||||
switch (is.Peek()) {
|
switch (is.Peek()) {
|
||||||
case '}': {
|
case '}': {
|
||||||
is.Take();
|
is.Take();
|
||||||
// Get member count(include an extra one for non-empty object).
|
// Get member count(include an extra one for non-empty object).
|
||||||
int memberCount = *stack_.template Pop<int>(1);
|
int memberCount = *stack_.template Pop<int>(1);
|
||||||
if (state == NonRecursiveParsingObjectContentState)
|
if (state == IterativeParsingObjectContentState)
|
||||||
++memberCount;
|
++memberCount;
|
||||||
// Restore the parent stack frame.
|
// Restore the parent stack frame.
|
||||||
r = *stack_.template Pop<NonRecursiveParsingState>(1);
|
r = *stack_.template Pop<IterativeParsingState>(1);
|
||||||
// Transit to ContentState since a member/an element was just parsed.
|
// Transit to ContentState since a member/an element was just parsed.
|
||||||
if (r == NonRecursiveParsingArrayInitialState)
|
if (r == IterativeParsingArrayInitialState)
|
||||||
r = NonRecursiveParsingArrayContentState;
|
r = IterativeParsingArrayContentState;
|
||||||
else if (r == NonRecursiveParsingObjectInitialState)
|
else if (r == IterativeParsingObjectInitialState)
|
||||||
r = NonRecursiveParsingObjectContentState;
|
r = IterativeParsingObjectContentState;
|
||||||
// If we return to the topmost frame mark it finished.
|
// If we return to the topmost frame mark it finished.
|
||||||
if (r == NonRecursiveParsingStartState)
|
if (r == IterativeParsingStartState)
|
||||||
r = NonRecursiveParsingFinishState;
|
r = IterativeParsingFinishState;
|
||||||
handler.EndObject(memberCount);
|
handler.EndObject(memberCount);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ',':
|
case ',':
|
||||||
is.Take();
|
is.Take();
|
||||||
r = NonRecursiveParsingObjectContentState;
|
r = IterativeParsingObjectContentState;
|
||||||
// Update member count.
|
// Update member count.
|
||||||
*stack_.template Top<int>() = *stack_.template Top<int>() + 1;
|
*stack_.template Top<int>() = *stack_.template Top<int>() + 1;
|
||||||
break;
|
break;
|
||||||
@ -864,7 +864,7 @@ private:
|
|||||||
// Should be a key-value pair.
|
// Should be a key-value pair.
|
||||||
ParseString<parseFlags>(is, handler);
|
ParseString<parseFlags>(is, handler);
|
||||||
if (HasParseError()) {
|
if (HasParseError()) {
|
||||||
r = NonRecursiveParsingErrorState;
|
r = IterativeParsingErrorState;
|
||||||
RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissName, is.Tell());
|
RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissName, is.Tell());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -872,7 +872,7 @@ private:
|
|||||||
SkipWhitespace(is);
|
SkipWhitespace(is);
|
||||||
|
|
||||||
if (is.Take() != ':') {
|
if (is.Take() != ':') {
|
||||||
r = NonRecursiveParsingErrorState;
|
r = IterativeParsingErrorState;
|
||||||
RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissColon, is.Tell());
|
RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissColon, is.Tell());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -883,7 +883,7 @@ private:
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
r = NonRecursiveParsingErrorState;
|
r = IterativeParsingErrorState;
|
||||||
RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell());
|
RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -893,32 +893,32 @@ private:
|
|||||||
|
|
||||||
// Transit from array related states(ArrayInitial, ArrayContent).
|
// Transit from array related states(ArrayInitial, ArrayContent).
|
||||||
template <unsigned parseFlags, typename InputStream, typename Handler>
|
template <unsigned parseFlags, typename InputStream, typename Handler>
|
||||||
NonRecursiveParsingState TransitFromArrayStates(NonRecursiveParsingState state, InputStream& is, Handler& handler) {
|
IterativeParsingState TransitFromArrayStates(IterativeParsingState state, InputStream& is, Handler& handler) {
|
||||||
NonRecursiveParsingState r = NonRecursiveParsingErrorState;
|
IterativeParsingState r = IterativeParsingErrorState;
|
||||||
|
|
||||||
switch (is.Peek()) {
|
switch (is.Peek()) {
|
||||||
case ']': {
|
case ']': {
|
||||||
is.Take();
|
is.Take();
|
||||||
// Get element count(include an extra one for non-empty array).
|
// Get element count(include an extra one for non-empty array).
|
||||||
int elementCount = *stack_.template Pop<int>(1);
|
int elementCount = *stack_.template Pop<int>(1);
|
||||||
if (state == NonRecursiveParsingArrayContentState)
|
if (state == IterativeParsingArrayContentState)
|
||||||
++elementCount;
|
++elementCount;
|
||||||
// Restore the parent stack frame.
|
// Restore the parent stack frame.
|
||||||
r = *stack_.template Pop<NonRecursiveParsingState>(1);
|
r = *stack_.template Pop<IterativeParsingState>(1);
|
||||||
// Transit to ContentState since a member/an element was just parsed.
|
// Transit to ContentState since a member/an element was just parsed.
|
||||||
if (r == NonRecursiveParsingArrayInitialState)
|
if (r == IterativeParsingArrayInitialState)
|
||||||
r = NonRecursiveParsingArrayContentState;
|
r = IterativeParsingArrayContentState;
|
||||||
else if (r == NonRecursiveParsingObjectInitialState)
|
else if (r == IterativeParsingObjectInitialState)
|
||||||
r = NonRecursiveParsingObjectContentState;
|
r = IterativeParsingObjectContentState;
|
||||||
// If we return to the topmost frame mark it finished.
|
// If we return to the topmost frame mark it finished.
|
||||||
if (r == NonRecursiveParsingStartState)
|
if (r == IterativeParsingStartState)
|
||||||
r = NonRecursiveParsingFinishState;
|
r = IterativeParsingFinishState;
|
||||||
handler.EndArray(elementCount);
|
handler.EndArray(elementCount);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ',':
|
case ',':
|
||||||
is.Take();
|
is.Take();
|
||||||
r = NonRecursiveParsingArrayContentState;
|
r = IterativeParsingArrayContentState;
|
||||||
// Update element count.
|
// Update element count.
|
||||||
*stack_.template Top<int>() = *stack_.template Top<int>() + 1;
|
*stack_.template Top<int>() = *stack_.template Top<int>() + 1;
|
||||||
break;
|
break;
|
||||||
@ -932,19 +932,19 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <unsigned parseFlags, typename InputStream, typename Handler>
|
template <unsigned parseFlags, typename InputStream, typename Handler>
|
||||||
NonRecursiveParsingState Transit(NonRecursiveParsingState state, InputStream& is, Handler& handler) {
|
IterativeParsingState Transit(IterativeParsingState state, InputStream& is, Handler& handler) {
|
||||||
NonRecursiveParsingState r = NonRecursiveParsingErrorState;
|
IterativeParsingState r = IterativeParsingErrorState;
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case NonRecursiveParsingStartState:
|
case IterativeParsingStartState:
|
||||||
r = TransitToCompoundValueTypeState(state, is, handler);
|
r = TransitToCompoundValueTypeState(state, is, handler);
|
||||||
break;
|
break;
|
||||||
case NonRecursiveParsingObjectInitialState:
|
case IterativeParsingObjectInitialState:
|
||||||
case NonRecursiveParsingObjectContentState:
|
case IterativeParsingObjectContentState:
|
||||||
r = TransitFromObjectStates<parseFlags>(state, is, handler);
|
r = TransitFromObjectStates<parseFlags>(state, is, handler);
|
||||||
break;
|
break;
|
||||||
case NonRecursiveParsingArrayInitialState:
|
case IterativeParsingArrayInitialState:
|
||||||
case NonRecursiveParsingArrayContentState:
|
case IterativeParsingArrayContentState:
|
||||||
r = TransitFromArrayStates<parseFlags>(state, is, handler);
|
r = TransitFromArrayStates<parseFlags>(state, is, handler);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -953,17 +953,17 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <unsigned parseFlags, typename InputStream, typename Handler>
|
template <unsigned parseFlags, typename InputStream, typename Handler>
|
||||||
bool NonRecursiveParse(InputStream& is, Handler& handler) {
|
bool IterativeParse(InputStream& is, Handler& handler) {
|
||||||
NonRecursiveParsingState state = NonRecursiveParsingStartState;
|
IterativeParsingState state = IterativeParsingStartState;
|
||||||
|
|
||||||
SkipWhitespace(is);
|
SkipWhitespace(is);
|
||||||
while (is.Peek() != '\0' && state != NonRecursiveParsingErrorState) {
|
while (is.Peek() != '\0' && state != IterativeParsingErrorState) {
|
||||||
state = Transit<parseFlags>(state, is, handler);
|
state = Transit<parseFlags>(state, is, handler);
|
||||||
SkipWhitespace(is);
|
SkipWhitespace(is);
|
||||||
}
|
}
|
||||||
|
|
||||||
stack_.Clear();
|
stack_.Clear();
|
||||||
return state == NonRecursiveParsingFinishState && !HasParseError();
|
return state == IterativeParsingFinishState && !HasParseError();
|
||||||
}
|
}
|
||||||
|
|
||||||
static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string.
|
static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string.
|
||||||
|
@ -706,163 +706,163 @@ TEST(Reader, Parse_IStreamWrapper_StringStream) {
|
|||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(Reader, NonRecursiveParsing) {
|
TEST(Reader, IterativeParsing) {
|
||||||
StringStream json("[1,true,false,null,\"string\",{\"array\":[1]}]");
|
StringStream json("[1,true,false,null,\"string\",{\"array\":[1]}]");
|
||||||
Reader reader;
|
Reader reader;
|
||||||
BaseReaderHandler<> handler;
|
BaseReaderHandler<> handler;
|
||||||
|
|
||||||
Reader::NonRecursiveParsingState r;
|
Reader::IterativeParsingState r;
|
||||||
|
|
||||||
// [
|
// [
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
Reader::NonRecursiveParsingStartState,
|
Reader::IterativeParsingStartState,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayInitialState, r);
|
EXPECT_EQ(Reader::IterativeParsingArrayInitialState, r);
|
||||||
|
|
||||||
// 1
|
// 1
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||||
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // element count
|
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // element count
|
||||||
|
|
||||||
// ,
|
// ,
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||||
EXPECT_EQ(1, *reader.stack_.template Top<int>()); // element count
|
EXPECT_EQ(1, *reader.stack_.template Top<int>()); // element count
|
||||||
|
|
||||||
// true
|
// true
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||||
EXPECT_EQ(1, *reader.stack_.template Top<int>()); // element count
|
EXPECT_EQ(1, *reader.stack_.template Top<int>()); // element count
|
||||||
|
|
||||||
// ,
|
// ,
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||||
EXPECT_EQ(2, *reader.stack_.template Top<int>()); // element count
|
EXPECT_EQ(2, *reader.stack_.template Top<int>()); // element count
|
||||||
|
|
||||||
// false
|
// false
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||||
EXPECT_EQ(2, *reader.stack_.template Top<int>()); // element count
|
EXPECT_EQ(2, *reader.stack_.template Top<int>()); // element count
|
||||||
|
|
||||||
// ,
|
// ,
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||||
EXPECT_EQ(3, *reader.stack_.template Top<int>()); // element count
|
EXPECT_EQ(3, *reader.stack_.template Top<int>()); // element count
|
||||||
|
|
||||||
// null
|
// null
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||||
EXPECT_EQ(3, *reader.stack_.template Top<int>()); // element count
|
EXPECT_EQ(3, *reader.stack_.template Top<int>()); // element count
|
||||||
|
|
||||||
// ,
|
// ,
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||||
EXPECT_EQ(4, *reader.stack_.template Top<int>()); // element count
|
EXPECT_EQ(4, *reader.stack_.template Top<int>()); // element count
|
||||||
|
|
||||||
// "string"
|
// "string"
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||||
EXPECT_EQ(4, *reader.stack_.template Top<int>()); // element count
|
EXPECT_EQ(4, *reader.stack_.template Top<int>()); // element count
|
||||||
|
|
||||||
// ,
|
// ,
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||||
EXPECT_EQ(5, *reader.stack_.template Top<int>()); // element count
|
EXPECT_EQ(5, *reader.stack_.template Top<int>()); // element count
|
||||||
|
|
||||||
// {
|
// {
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingObjectInitialState, r);
|
EXPECT_EQ(Reader::IterativeParsingObjectInitialState, r);
|
||||||
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // member count
|
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // member count
|
||||||
|
|
||||||
// "array":[
|
// "array":[
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayInitialState, r);
|
EXPECT_EQ(Reader::IterativeParsingArrayInitialState, r);
|
||||||
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // element count
|
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // element count
|
||||||
|
|
||||||
// 1
|
// 1
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||||
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // element count
|
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // element count
|
||||||
|
|
||||||
// ]
|
// ]
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingObjectContentState, r);
|
EXPECT_EQ(Reader::IterativeParsingObjectContentState, r);
|
||||||
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // member count
|
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // member count
|
||||||
|
|
||||||
// }
|
// }
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||||
EXPECT_EQ(5, *reader.stack_.template Top<int>()); // element count
|
EXPECT_EQ(5, *reader.stack_.template Top<int>()); // element count
|
||||||
|
|
||||||
// ]
|
// ]
|
||||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
r = reader.Transit<kParseIterativeFlag>(
|
||||||
r,
|
r,
|
||||||
json,
|
json,
|
||||||
handler);
|
handler);
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(Reader::NonRecursiveParsingFinishState, r);
|
EXPECT_EQ(Reader::IterativeParsingFinishState, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CountHandler : BaseReaderHandler<> {
|
struct CountHandler : BaseReaderHandler<> {
|
||||||
@ -878,23 +878,23 @@ struct CountHandler : BaseReaderHandler<> {
|
|||||||
SizeType ElementCount;
|
SizeType ElementCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST(Reader, NonRecursiveParsing_MemberCounting) {
|
TEST(Reader, IterativeParsing_MemberCounting) {
|
||||||
StringStream json("{\"array\": []}");
|
StringStream json("{\"array\": []}");
|
||||||
Reader reader;
|
Reader reader;
|
||||||
CountHandler handler;
|
CountHandler handler;
|
||||||
|
|
||||||
reader.NonRecursiveParse<kParseNonRecursiveFlag>(json, handler);
|
reader.IterativeParse<kParseIterativeFlag>(json, handler);
|
||||||
|
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(1, handler.MemberCount);
|
EXPECT_EQ(1, handler.MemberCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(Reader, NonRecursiveParsing_ElementCounting) {
|
TEST(Reader, IterativeParsing_ElementCounting) {
|
||||||
StringStream json("[{}]");
|
StringStream json("[{}]");
|
||||||
Reader reader;
|
Reader reader;
|
||||||
CountHandler handler;
|
CountHandler handler;
|
||||||
|
|
||||||
reader.NonRecursiveParse<kParseNonRecursiveFlag>(json, handler);
|
reader.IterativeParse<kParseIterativeFlag>(json, handler);
|
||||||
|
|
||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
EXPECT_EQ(1, handler.ElementCount);
|
EXPECT_EQ(1, handler.ElementCount);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user