Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
R
rapidjson
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
rapidjson
Commits
7acb0c18
Commit
7acb0c18
authored
Jul 07, 2014
by
thebusytypist
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Rename flags/state names/functions/test cases from 'NonRecursive' to 'Iterative'.
parent
3006fa7d
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
107 additions
and
107 deletions
+107
-107
reader.h
include/rapidjson/reader.h
+66
-66
readertest.cpp
test/unittest/readertest.cpp
+41
-41
No files found.
include/rapidjson/reader.h
View file @
7acb0c18
...
...
@@ -47,7 +47,7 @@ enum ParseFlag {
kParseDefaultFlags
=
0
,
//!< Default parse flags. Non-destructive parsing. Text strings are decoded into allocated buffer.
kParseInsituFlag
=
1
,
//!< In-situ(destructive) parsing.
kParseValidateEncodingFlag
=
2
,
//!< Validate encoding of JSON strings.
kParse
NonRecursiveFlag
=
4
//!< Non-recurs
ive(constant complexity in terms of function call stack size) parsing.
kParse
IterativeFlag
=
4
//!< Iterat
ive(constant complexity in terms of function call stack size) parsing.
};
//! Error code of parsing.
...
...
@@ -298,8 +298,8 @@ public:
parseErrorCode_
=
kParseErrorNone
;
errorOffset_
=
0
;
if
(
parseFlags
&
kParse
NonRecurs
iveFlag
)
return
NonRecurs
iveParse
<
parseFlags
>
(
is
,
handler
);
if
(
parseFlags
&
kParse
Iterat
iveFlag
)
return
Iterat
iveParse
<
parseFlags
>
(
is
,
handler
);
SkipWhitespace
(
is
);
...
...
@@ -753,37 +753,37 @@ private:
}
// Non-recursive parsing
enum
NonRecurs
iveParsingState
{
NonRecurs
iveParsingStartState
,
NonRecurs
iveParsingFinishState
,
NonRecurs
iveParsingErrorState
,
enum
Iterat
iveParsingState
{
Iterat
iveParsingStartState
,
Iterat
iveParsingFinishState
,
Iterat
iveParsingErrorState
,
// Object states
NonRecurs
iveParsingObjectInitialState
,
NonRecurs
iveParsingObjectContentState
,
Iterat
iveParsingObjectInitialState
,
Iterat
iveParsingObjectContentState
,
// Array states
NonRecurs
iveParsingArrayInitialState
,
NonRecurs
iveParsingArrayContentState
Iterat
iveParsingArrayInitialState
,
Iterat
iveParsingArrayContentState
};
template
<
typename
InputStream
,
typename
Handler
>
NonRecursiveParsingState
TransitToCompoundValueTypeState
(
NonRecurs
iveParsingState
state
,
InputStream
&
is
,
Handler
&
handler
)
{
IterativeParsingState
TransitToCompoundValueTypeState
(
Iterat
iveParsingState
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.
NonRecursiveParsingState
r
=
NonRecurs
iveParsingErrorState
;
IterativeParsingState
r
=
Iterat
iveParsingErrorState
;
switch
(
is
.
Take
())
{
case
'{'
:
handler
.
StartObject
();
r
=
NonRecurs
iveParsingObjectInitialState
;
r
=
Iterat
iveParsingObjectInitialState
;
// Push current state.
*
stack_
.
template
Push
<
NonRecurs
iveParsingState
>
(
1
)
=
state
;
*
stack_
.
template
Push
<
Iterat
iveParsingState
>
(
1
)
=
state
;
// Initialize and push member count.
*
stack_
.
template
Push
<
int
>
(
1
)
=
0
;
break
;
case
'['
:
handler
.
StartArray
();
r
=
NonRecurs
iveParsingArrayInitialState
;
r
=
Iterat
iveParsingArrayInitialState
;
// Push current state.
*
stack_
.
template
Push
<
NonRecurs
iveParsingState
>
(
1
)
=
state
;
*
stack_
.
template
Push
<
Iterat
iveParsingState
>
(
1
)
=
state
;
// Initialize and push element count.
*
stack_
.
template
Push
<
int
>
(
1
)
=
0
;
break
;
...
...
@@ -793,22 +793,22 @@ private:
// Inner transition of object or array states(ObjectInitial->ObjectContent, ArrayInitial->ArrayContent).
template
<
unsigned
parseFlags
,
typename
InputStream
,
typename
Handler
>
NonRecursiveParsingState
TransitByValue
(
NonRecurs
iveParsingState
state
,
InputStream
&
is
,
Handler
&
handler
)
{
IterativeParsingState
TransitByValue
(
Iterat
iveParsingState
state
,
InputStream
&
is
,
Handler
&
handler
)
{
RAPIDJSON_ASSERT
(
state
==
NonRecurs
iveParsingObjectInitialState
||
state
==
NonRecurs
iveParsingArrayInitialState
||
state
==
NonRecurs
iveParsingObjectContentState
||
state
==
NonRecurs
iveParsingArrayContentState
);
NonRecurs
iveParsingState
t
;
if
(
state
==
NonRecurs
iveParsingObjectInitialState
)
t
=
NonRecurs
iveParsingObjectContentState
;
else
if
(
state
==
NonRecurs
iveParsingArrayInitialState
)
t
=
NonRecurs
iveParsingArrayContentState
;
state
==
Iterat
iveParsingObjectInitialState
||
state
==
Iterat
iveParsingArrayInitialState
||
state
==
Iterat
iveParsingObjectContentState
||
state
==
Iterat
iveParsingArrayContentState
);
Iterat
iveParsingState
t
;
if
(
state
==
Iterat
iveParsingObjectInitialState
)
t
=
Iterat
iveParsingObjectContentState
;
else
if
(
state
==
Iterat
iveParsingArrayInitialState
)
t
=
Iterat
iveParsingArrayContentState
;
else
t
=
state
;
NonRecursiveParsingState
r
=
NonRecurs
iveParsingErrorState
;
IterativeParsingState
r
=
Iterat
iveParsingErrorState
;
switch
(
is
.
Peek
())
{
// For plain value state is not changed.
...
...
@@ -824,39 +824,39 @@ private:
}
if
(
HasParseError
())
r
=
NonRecurs
iveParsingErrorState
;
r
=
Iterat
iveParsingErrorState
;
return
r
;
}
// Transit from object related states(ObjectInitial, ObjectContent).
template
<
unsigned
parseFlags
,
typename
InputStream
,
typename
Handler
>
NonRecursiveParsingState
TransitFromObjectStates
(
NonRecurs
iveParsingState
state
,
InputStream
&
is
,
Handler
&
handler
)
{
NonRecursiveParsingState
r
=
NonRecurs
iveParsingErrorState
;
IterativeParsingState
TransitFromObjectStates
(
Iterat
iveParsingState
state
,
InputStream
&
is
,
Handler
&
handler
)
{
IterativeParsingState
r
=
Iterat
iveParsingErrorState
;
switch
(
is
.
Peek
())
{
case
'}'
:
{
is
.
Take
();
// Get member count(include an extra one for non-empty object).
int
memberCount
=
*
stack_
.
template
Pop
<
int
>
(
1
);
if
(
state
==
NonRecurs
iveParsingObjectContentState
)
if
(
state
==
Iterat
iveParsingObjectContentState
)
++
memberCount
;
// Restore the parent stack frame.
r
=
*
stack_
.
template
Pop
<
NonRecurs
iveParsingState
>
(
1
);
r
=
*
stack_
.
template
Pop
<
Iterat
iveParsingState
>
(
1
);
// Transit to ContentState since a member/an element was just parsed.
if
(
r
==
NonRecurs
iveParsingArrayInitialState
)
r
=
NonRecurs
iveParsingArrayContentState
;
else
if
(
r
==
NonRecurs
iveParsingObjectInitialState
)
r
=
NonRecurs
iveParsingObjectContentState
;
if
(
r
==
Iterat
iveParsingArrayInitialState
)
r
=
Iterat
iveParsingArrayContentState
;
else
if
(
r
==
Iterat
iveParsingObjectInitialState
)
r
=
Iterat
iveParsingObjectContentState
;
// If we return to the topmost frame mark it finished.
if
(
r
==
NonRecurs
iveParsingStartState
)
r
=
NonRecurs
iveParsingFinishState
;
if
(
r
==
Iterat
iveParsingStartState
)
r
=
Iterat
iveParsingFinishState
;
handler
.
EndObject
(
memberCount
);
break
;
}
case
','
:
is
.
Take
();
r
=
NonRecurs
iveParsingObjectContentState
;
r
=
Iterat
iveParsingObjectContentState
;
// Update member count.
*
stack_
.
template
Top
<
int
>
()
=
*
stack_
.
template
Top
<
int
>
()
+
1
;
break
;
...
...
@@ -864,7 +864,7 @@ private:
// Should be a key-value pair.
ParseString
<
parseFlags
>
(
is
,
handler
);
if
(
HasParseError
())
{
r
=
NonRecurs
iveParsingErrorState
;
r
=
Iterat
iveParsingErrorState
;
RAPIDJSON_PARSE_ERROR_NORETURN
(
kParseErrorObjectMissName
,
is
.
Tell
());
break
;
}
...
...
@@ -872,7 +872,7 @@ private:
SkipWhitespace
(
is
);
if
(
is
.
Take
()
!=
':'
)
{
r
=
NonRecurs
iveParsingErrorState
;
r
=
Iterat
iveParsingErrorState
;
RAPIDJSON_PARSE_ERROR_NORETURN
(
kParseErrorObjectMissColon
,
is
.
Tell
());
break
;
}
...
...
@@ -883,7 +883,7 @@ private:
break
;
default
:
r
=
NonRecurs
iveParsingErrorState
;
r
=
Iterat
iveParsingErrorState
;
RAPIDJSON_PARSE_ERROR_NORETURN
(
kParseErrorObjectMissCommaOrCurlyBracket
,
is
.
Tell
());
break
;
}
...
...
@@ -893,32 +893,32 @@ private:
// Transit from array related states(ArrayInitial, ArrayContent).
template
<
unsigned
parseFlags
,
typename
InputStream
,
typename
Handler
>
NonRecursiveParsingState
TransitFromArrayStates
(
NonRecurs
iveParsingState
state
,
InputStream
&
is
,
Handler
&
handler
)
{
NonRecursiveParsingState
r
=
NonRecurs
iveParsingErrorState
;
IterativeParsingState
TransitFromArrayStates
(
Iterat
iveParsingState
state
,
InputStream
&
is
,
Handler
&
handler
)
{
IterativeParsingState
r
=
Iterat
iveParsingErrorState
;
switch
(
is
.
Peek
())
{
case
']'
:
{
is
.
Take
();
// Get element count(include an extra one for non-empty array).
int
elementCount
=
*
stack_
.
template
Pop
<
int
>
(
1
);
if
(
state
==
NonRecurs
iveParsingArrayContentState
)
if
(
state
==
Iterat
iveParsingArrayContentState
)
++
elementCount
;
// Restore the parent stack frame.
r
=
*
stack_
.
template
Pop
<
NonRecurs
iveParsingState
>
(
1
);
r
=
*
stack_
.
template
Pop
<
Iterat
iveParsingState
>
(
1
);
// Transit to ContentState since a member/an element was just parsed.
if
(
r
==
NonRecurs
iveParsingArrayInitialState
)
r
=
NonRecurs
iveParsingArrayContentState
;
else
if
(
r
==
NonRecurs
iveParsingObjectInitialState
)
r
=
NonRecurs
iveParsingObjectContentState
;
if
(
r
==
Iterat
iveParsingArrayInitialState
)
r
=
Iterat
iveParsingArrayContentState
;
else
if
(
r
==
Iterat
iveParsingObjectInitialState
)
r
=
Iterat
iveParsingObjectContentState
;
// If we return to the topmost frame mark it finished.
if
(
r
==
NonRecurs
iveParsingStartState
)
r
=
NonRecurs
iveParsingFinishState
;
if
(
r
==
Iterat
iveParsingStartState
)
r
=
Iterat
iveParsingFinishState
;
handler
.
EndArray
(
elementCount
);
break
;
}
case
','
:
is
.
Take
();
r
=
NonRecurs
iveParsingArrayContentState
;
r
=
Iterat
iveParsingArrayContentState
;
// Update element count.
*
stack_
.
template
Top
<
int
>
()
=
*
stack_
.
template
Top
<
int
>
()
+
1
;
break
;
...
...
@@ -932,19 +932,19 @@ private:
}
template
<
unsigned
parseFlags
,
typename
InputStream
,
typename
Handler
>
NonRecursiveParsingState
Transit
(
NonRecurs
iveParsingState
state
,
InputStream
&
is
,
Handler
&
handler
)
{
NonRecursiveParsingState
r
=
NonRecurs
iveParsingErrorState
;
IterativeParsingState
Transit
(
Iterat
iveParsingState
state
,
InputStream
&
is
,
Handler
&
handler
)
{
IterativeParsingState
r
=
Iterat
iveParsingErrorState
;
switch
(
state
)
{
case
NonRecurs
iveParsingStartState
:
case
Iterat
iveParsingStartState
:
r
=
TransitToCompoundValueTypeState
(
state
,
is
,
handler
);
break
;
case
NonRecurs
iveParsingObjectInitialState
:
case
NonRecurs
iveParsingObjectContentState
:
case
Iterat
iveParsingObjectInitialState
:
case
Iterat
iveParsingObjectContentState
:
r
=
TransitFromObjectStates
<
parseFlags
>
(
state
,
is
,
handler
);
break
;
case
NonRecurs
iveParsingArrayInitialState
:
case
NonRecurs
iveParsingArrayContentState
:
case
Iterat
iveParsingArrayInitialState
:
case
Iterat
iveParsingArrayContentState
:
r
=
TransitFromArrayStates
<
parseFlags
>
(
state
,
is
,
handler
);
break
;
}
...
...
@@ -953,17 +953,17 @@ private:
}
template
<
unsigned
parseFlags
,
typename
InputStream
,
typename
Handler
>
bool
NonRecurs
iveParse
(
InputStream
&
is
,
Handler
&
handler
)
{
NonRecursiveParsingState
state
=
NonRecurs
iveParsingStartState
;
bool
Iterat
iveParse
(
InputStream
&
is
,
Handler
&
handler
)
{
IterativeParsingState
state
=
Iterat
iveParsingStartState
;
SkipWhitespace
(
is
);
while
(
is
.
Peek
()
!=
'\0'
&&
state
!=
NonRecurs
iveParsingErrorState
)
{
while
(
is
.
Peek
()
!=
'\0'
&&
state
!=
Iterat
iveParsingErrorState
)
{
state
=
Transit
<
parseFlags
>
(
state
,
is
,
handler
);
SkipWhitespace
(
is
);
}
stack_
.
Clear
();
return
state
==
NonRecurs
iveParsingFinishState
&&
!
HasParseError
();
return
state
==
Iterat
iveParsingFinishState
&&
!
HasParseError
();
}
static
const
size_t
kDefaultStackCapacity
=
256
;
//!< Default stack capacity in bytes for storing a single decoded string.
...
...
test/unittest/readertest.cpp
View file @
7acb0c18
...
...
@@ -706,163 +706,163 @@ TEST(Reader, Parse_IStreamWrapper_StringStream) {
EXPECT_FALSE
(
reader
.
HasParseError
());
}
TEST
(
Reader
,
NonRecurs
iveParsing
)
{
TEST
(
Reader
,
Iterat
iveParsing
)
{
StringStream
json
(
"[1,true,false,null,
\"
string
\"
,{
\"
array
\"
:[1]}]"
);
Reader
reader
;
BaseReaderHandler
<>
handler
;
Reader
::
NonRecurs
iveParsingState
r
;
Reader
::
Iterat
iveParsingState
r
;
// [
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
Reader
::
NonRecurs
iveParsingStartState
,
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
Reader
::
Iterat
iveParsingStartState
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingArrayInitialState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingArrayInitialState
,
r
);
// 1
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
0
,
*
reader
.
stack_
.
template
Top
<
int
>
());
// element count
// ,
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
1
,
*
reader
.
stack_
.
template
Top
<
int
>
());
// element count
// true
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
1
,
*
reader
.
stack_
.
template
Top
<
int
>
());
// element count
// ,
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
2
,
*
reader
.
stack_
.
template
Top
<
int
>
());
// element count
// false
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
2
,
*
reader
.
stack_
.
template
Top
<
int
>
());
// element count
// ,
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
3
,
*
reader
.
stack_
.
template
Top
<
int
>
());
// element count
// null
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
3
,
*
reader
.
stack_
.
template
Top
<
int
>
());
// element count
// ,
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
4
,
*
reader
.
stack_
.
template
Top
<
int
>
());
// element count
// "string"
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
4
,
*
reader
.
stack_
.
template
Top
<
int
>
());
// element count
// ,
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
5
,
*
reader
.
stack_
.
template
Top
<
int
>
());
// element count
// {
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingObjectInitialState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingObjectInitialState
,
r
);
EXPECT_EQ
(
0
,
*
reader
.
stack_
.
template
Top
<
int
>
());
// member count
// "array":[
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingArrayInitialState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingArrayInitialState
,
r
);
EXPECT_EQ
(
0
,
*
reader
.
stack_
.
template
Top
<
int
>
());
// element count
// 1
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
0
,
*
reader
.
stack_
.
template
Top
<
int
>
());
// element count
// ]
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingObjectContentState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingObjectContentState
,
r
);
EXPECT_EQ
(
0
,
*
reader
.
stack_
.
template
Top
<
int
>
());
// member count
// }
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingArrayContentState
,
r
);
EXPECT_EQ
(
5
,
*
reader
.
stack_
.
template
Top
<
int
>
());
// element count
// ]
r
=
reader
.
Transit
<
kParse
NonRecurs
iveFlag
>
(
r
=
reader
.
Transit
<
kParse
Iterat
iveFlag
>
(
r
,
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
Reader
::
NonRecurs
iveParsingFinishState
,
r
);
EXPECT_EQ
(
Reader
::
Iterat
iveParsingFinishState
,
r
);
}
struct
CountHandler
:
BaseReaderHandler
<>
{
...
...
@@ -878,23 +878,23 @@ struct CountHandler : BaseReaderHandler<> {
SizeType
ElementCount
;
};
TEST
(
Reader
,
NonRecurs
iveParsing_MemberCounting
)
{
TEST
(
Reader
,
Iterat
iveParsing_MemberCounting
)
{
StringStream
json
(
"{
\"
array
\"
: []}"
);
Reader
reader
;
CountHandler
handler
;
reader
.
NonRecursiveParse
<
kParseNonRecurs
iveFlag
>
(
json
,
handler
);
reader
.
IterativeParse
<
kParseIterat
iveFlag
>
(
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
1
,
handler
.
MemberCount
);
}
TEST
(
Reader
,
NonRecurs
iveParsing_ElementCounting
)
{
TEST
(
Reader
,
Iterat
iveParsing_ElementCounting
)
{
StringStream
json
(
"[{}]"
);
Reader
reader
;
CountHandler
handler
;
reader
.
NonRecursiveParse
<
kParseNonRecurs
iveFlag
>
(
json
,
handler
);
reader
.
IterativeParse
<
kParseIterat
iveFlag
>
(
json
,
handler
);
EXPECT_FALSE
(
reader
.
HasParseError
());
EXPECT_EQ
(
1
,
handler
.
ElementCount
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment