Commit 7acb0c18 authored by thebusytypist's avatar thebusytypist

Rename flags/state names/functions/test cases from 'NonRecursive' to 'Iterative'.

parent 3006fa7d
...@@ -47,7 +47,7 @@ enum ParseFlag { ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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) { ...@@ -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<> { ...@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment