Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
J
json
Project
Overview
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
json
Commits
258f04c5
Commit
258f04c5
authored
Dec 14, 2015
by
Niels
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed #154 (no more warnings for incomplete switches)
parent
a70a7a80
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
745 additions
and
461 deletions
+745
-461
Makefile
Makefile
+1
-1
json.hpp
src/json.hpp
+352
-230
json.hpp.re2c
src/json.hpp.re2c
+352
-230
unit.cpp
test/unit.cpp
+40
-0
No files found.
Makefile
View file @
258f04c5
...
@@ -17,7 +17,7 @@ clean:
...
@@ -17,7 +17,7 @@ clean:
##########################################################################
##########################################################################
# additional flags
# additional flags
FLAGS
=
-Wall
-Wextra
-pedantic
-Weffc
++
-Wcast-align
-Wcast-qual
-Wctor-dtor-privacy
-Wdisabled-optimization
-Wformat
=
2
-Winit-self
-Wmissing-declarations
-Wmissing-include-dirs
-Wold-style-cast
-Woverloaded-virtual
-Wredundant-decls
-Wshadow
-Wsign-conversion
-Wsign-promo
-Wstrict-overflow
=
5
-Wswitch
-Wundef
-Wno-unused
-Wnon-virtual-dtor
-Wreorder
-Wdeprecated
-Wfloat-equal
FLAGS
=
-Wall
-Wextra
-pedantic
-Weffc
++
-Wcast-align
-Wcast-qual
-Wctor-dtor-privacy
-Wdisabled-optimization
-Wformat
=
2
-Winit-self
-Wmissing-declarations
-Wmissing-include-dirs
-Wold-style-cast
-Woverloaded-virtual
-Wredundant-decls
-Wshadow
-Wsign-conversion
-Wsign-promo
-Wstrict-overflow
=
5
-Wswitch
-W
switch-enum
-Wswitch-default
-W
undef
-Wno-unused
-Wnon-virtual-dtor
-Wreorder
-Wdeprecated
-Wfloat-equal
# build unit tests
# build unit tests
json_unit
:
test/unit.cpp src/json.hpp test/catch.hpp
json_unit
:
test/unit.cpp src/json.hpp test/catch.hpp
...
...
src/json.hpp
View file @
258f04c5
...
@@ -650,47 +650,48 @@ class basic_json
...
@@ -650,47 +650,48 @@ class basic_json
{
{
switch
(
t
)
switch
(
t
)
{
{
case
(
value_t
:
:
null
)
:
case
value_t
:
:
object
:
case
(
value_t
:
:
discarded
)
:
{
break
;
}
case
(
value_t
:
:
object
)
:
{
{
object
=
create
<
object_t
>
();
object
=
create
<
object_t
>
();
break
;
break
;
}
}
case
(
value_t
:
:
array
)
:
case
value_t
:
:
array
:
{
{
array
=
create
<
array_t
>
();
array
=
create
<
array_t
>
();
break
;
break
;
}
}
case
(
value_t
:
:
string
)
:
case
value_t
:
:
string
:
{
{
string
=
create
<
string_t
>
(
""
);
string
=
create
<
string_t
>
(
""
);
break
;
break
;
}
}
case
(
value_t
:
:
boolean
)
:
case
value_t
:
:
boolean
:
{
{
boolean
=
boolean_t
(
false
);
boolean
=
boolean_t
(
false
);
break
;
break
;
}
}
case
(
value_t
:
:
number_integer
)
:
case
value_t
:
:
number_integer
:
{
{
number_integer
=
number_integer_t
(
0
);
number_integer
=
number_integer_t
(
0
);
break
;
break
;
}
}
case
(
value_t
:
:
number_float
)
:
case
value_t
:
:
number_float
:
{
{
number_float
=
number_float_t
(
0.0
);
number_float
=
number_float_t
(
0.0
);
break
;
break
;
}
}
case
value_t
:
:
null
:
case
value_t
:
:
discarded
:
default
:
{
break
;
}
}
}
}
}
...
@@ -1481,9 +1482,9 @@ class basic_json
...
@@ -1481,9 +1482,9 @@ class basic_json
// check if iterator range is complete for primitive values
// check if iterator range is complete for primitive values
switch
(
m_type
)
switch
(
m_type
)
{
{
case
value_t
:
:
number_integer
:
case
value_t
:
:
number_float
:
case
value_t
:
:
boolean
:
case
value_t
:
:
boolean
:
case
value_t
:
:
number_float
:
case
value_t
:
:
number_integer
:
case
value_t
:
:
string
:
case
value_t
:
:
string
:
{
{
if
(
not
first
.
m_it
.
primitive_iterator
.
is_begin
()
or
not
last
.
m_it
.
primitive_iterator
.
is_end
())
if
(
not
first
.
m_it
.
primitive_iterator
.
is_begin
()
or
not
last
.
m_it
.
primitive_iterator
.
is_end
())
...
@@ -1493,6 +1494,10 @@ class basic_json
...
@@ -1493,6 +1494,10 @@ class basic_json
break
;
break
;
}
}
case
value_t
:
:
array
:
case
value_t
:
:
discarded
:
case
value_t
:
:
null
:
case
value_t
:
:
object
:
default
:
default
:
{
{
break
;
break
;
...
@@ -1537,6 +1542,8 @@ class basic_json
...
@@ -1537,6 +1542,8 @@ class basic_json
break
;
break
;
}
}
case
value_t
:
:
discarded
:
case
value_t
:
:
null
:
default
:
default
:
{
{
throw
std
::
domain_error
(
"cannot use construct with iterators from "
+
first
.
m_object
->
type_name
());
throw
std
::
domain_error
(
"cannot use construct with iterators from "
+
first
.
m_object
->
type_name
());
...
@@ -1571,47 +1578,48 @@ class basic_json
...
@@ -1571,47 +1578,48 @@ class basic_json
{
{
switch
(
m_type
)
switch
(
m_type
)
{
{
case
(
value_t
:
:
null
)
:
case
value_t
:
:
object
:
case
(
value_t
:
:
discarded
)
:
{
break
;
}
case
(
value_t
:
:
object
)
:
{
{
m_value
=
*
other
.
m_value
.
object
;
m_value
=
*
other
.
m_value
.
object
;
break
;
break
;
}
}
case
(
value_t
:
:
array
)
:
case
value_t
:
:
array
:
{
{
m_value
=
*
other
.
m_value
.
array
;
m_value
=
*
other
.
m_value
.
array
;
break
;
break
;
}
}
case
(
value_t
:
:
string
)
:
case
value_t
:
:
string
:
{
{
m_value
=
*
other
.
m_value
.
string
;
m_value
=
*
other
.
m_value
.
string
;
break
;
break
;
}
}
case
(
value_t
:
:
boolean
)
:
case
value_t
:
:
boolean
:
{
{
m_value
=
other
.
m_value
.
boolean
;
m_value
=
other
.
m_value
.
boolean
;
break
;
break
;
}
}
case
(
value_t
:
:
number_integer
)
:
case
value_t
:
:
number_integer
:
{
{
m_value
=
other
.
m_value
.
number_integer
;
m_value
=
other
.
m_value
.
number_integer
;
break
;
break
;
}
}
case
(
value_t
:
:
number_float
)
:
case
value_t
:
:
number_float
:
{
{
m_value
=
other
.
m_value
.
number_float
;
m_value
=
other
.
m_value
.
number_float
;
break
;
break
;
}
}
case
value_t
:
:
discarded
:
case
value_t
:
:
null
:
default
:
{
break
;
}
}
}
}
}
...
@@ -1687,7 +1695,7 @@ class basic_json
...
@@ -1687,7 +1695,7 @@ class basic_json
{
{
switch
(
m_type
)
switch
(
m_type
)
{
{
case
(
value_t
:
:
object
)
:
case
value_t
:
:
object
:
{
{
AllocatorType
<
object_t
>
alloc
;
AllocatorType
<
object_t
>
alloc
;
alloc
.
destroy
(
m_value
.
object
);
alloc
.
destroy
(
m_value
.
object
);
...
@@ -1695,7 +1703,7 @@ class basic_json
...
@@ -1695,7 +1703,7 @@ class basic_json
break
;
break
;
}
}
case
(
value_t
:
:
array
)
:
case
value_t
:
:
array
:
{
{
AllocatorType
<
array_t
>
alloc
;
AllocatorType
<
array_t
>
alloc
;
alloc
.
destroy
(
m_value
.
array
);
alloc
.
destroy
(
m_value
.
array
);
...
@@ -1703,7 +1711,7 @@ class basic_json
...
@@ -1703,7 +1711,7 @@ class basic_json
break
;
break
;
}
}
case
(
value_t
:
:
string
)
:
case
value_t
:
:
string
:
{
{
AllocatorType
<
string_t
>
alloc
;
AllocatorType
<
string_t
>
alloc
;
alloc
.
destroy
(
m_value
.
string
);
alloc
.
destroy
(
m_value
.
string
);
...
@@ -1711,6 +1719,11 @@ class basic_json
...
@@ -1711,6 +1719,11 @@ class basic_json
break
;
break
;
}
}
case
value_t
:
:
boolean
:
case
value_t
:
:
discarded
:
case
value_t
:
:
null
:
case
value_t
:
:
number_float
:
case
value_t
:
:
number_integer
:
default
:
default
:
{
{
// all other types need no specific destructor
// all other types need no specific destructor
...
@@ -2014,32 +2027,26 @@ class basic_json
...
@@ -2014,32 +2027,26 @@ class basic_json
,
int
>::
type
=
0
>
,
int
>::
type
=
0
>
T
get_impl
(
T
*
)
const
T
get_impl
(
T
*
)
const
{
{
switch
(
m_type
)
if
(
m_type
==
value_t
::
object
)
{
{
case
(
value_t
:
:
object
)
:
return
T
(
m_value
.
object
->
begin
(),
m_value
.
object
->
end
());
{
}
return
T
(
m_value
.
object
->
begin
(),
m_value
.
object
->
end
());
else
}
{
default
:
throw
std
::
domain_error
(
"type must be object, but is "
+
type_name
());
{
throw
std
::
domain_error
(
"type must be object, but is "
+
type_name
());
}
}
}
}
}
/// get an object (explicit)
/// get an object (explicit)
object_t
get_impl
(
object_t
*
)
const
object_t
get_impl
(
object_t
*
)
const
{
{
switch
(
m_type
)
if
(
m_type
==
value_t
::
object
)
{
{
case
(
value_t
:
:
object
)
:
return
*
(
m_value
.
object
);
{
}
return
*
(
m_value
.
object
);
else
}
{
default
:
throw
std
::
domain_error
(
"type must be object, but is "
+
type_name
());
{
throw
std
::
domain_error
(
"type must be object, but is "
+
type_name
());
}
}
}
}
}
...
@@ -2054,22 +2061,19 @@ class basic_json
...
@@ -2054,22 +2061,19 @@ class basic_json
,
int
>::
type
=
0
>
,
int
>::
type
=
0
>
T
get_impl
(
T
*
)
const
T
get_impl
(
T
*
)
const
{
{
switch
(
m_type
)
if
(
m_type
==
value_t
::
array
)
{
{
case
(
value_t
:
:
array
)
:
T
to_vector
;
{
std
::
transform
(
m_value
.
array
->
begin
(),
m_value
.
array
->
end
(),
T
to_vector
;
std
::
inserter
(
to_vector
,
to_vector
.
end
()),
[](
basic_json
i
)
std
::
transform
(
m_value
.
array
->
begin
(),
m_value
.
array
->
end
(),
std
::
inserter
(
to_vector
,
to_vector
.
end
()),
[](
basic_json
i
)
{
return
i
.
get
<
typename
T
::
value_type
>
();
});
return
to_vector
;
}
default
:
{
{
throw
std
::
domain_error
(
"type must be array, but is "
+
type_name
());
return
i
.
get
<
typename
T
::
value_type
>
();
}
});
return
to_vector
;
}
else
{
throw
std
::
domain_error
(
"type must be array, but is "
+
type_name
());
}
}
}
}
...
@@ -2081,23 +2085,20 @@ class basic_json
...
@@ -2081,23 +2085,20 @@ class basic_json
,
int
>::
type
=
0
>
,
int
>::
type
=
0
>
std
::
vector
<
T
>
get_impl
(
std
::
vector
<
T
>*
)
const
std
::
vector
<
T
>
get_impl
(
std
::
vector
<
T
>*
)
const
{
{
switch
(
m_type
)
if
(
m_type
==
value_t
::
array
)
{
{
case
(
value_t
:
:
array
)
:
std
::
vector
<
T
>
to_vector
;
to_vector
.
reserve
(
m_value
.
array
->
size
());
std
::
transform
(
m_value
.
array
->
begin
(),
m_value
.
array
->
end
(),
std
::
inserter
(
to_vector
,
to_vector
.
end
()),
[](
basic_json
i
)
{
{
std
::
vector
<
T
>
to_vector
;
return
i
.
get
<
T
>
();
to_vector
.
reserve
(
m_value
.
array
->
size
());
});
std
::
transform
(
m_value
.
array
->
begin
(),
m_value
.
array
->
end
(),
return
to_vector
;
std
::
inserter
(
to_vector
,
to_vector
.
end
()),
[](
basic_json
i
)
}
{
else
return
i
.
get
<
T
>
();
{
});
throw
std
::
domain_error
(
"type must be array, but is "
+
type_name
());
return
to_vector
;
}
default
:
{
throw
std
::
domain_error
(
"type must be array, but is "
+
type_name
());
}
}
}
}
}
...
@@ -2109,32 +2110,26 @@ class basic_json
...
@@ -2109,32 +2110,26 @@ class basic_json
,
int
>::
type
=
0
>
,
int
>::
type
=
0
>
T
get_impl
(
T
*
)
const
T
get_impl
(
T
*
)
const
{
{
switch
(
m_type
)
if
(
m_type
==
value_t
::
array
)
{
{
case
(
value_t
:
:
array
)
:
return
T
(
m_value
.
array
->
begin
(),
m_value
.
array
->
end
());
{
}
return
T
(
m_value
.
array
->
begin
(),
m_value
.
array
->
end
());
else
}
{
default
:
throw
std
::
domain_error
(
"type must be array, but is "
+
type_name
());
{
throw
std
::
domain_error
(
"type must be array, but is "
+
type_name
());
}
}
}
}
}
/// get an array (explicit)
/// get an array (explicit)
array_t
get_impl
(
array_t
*
)
const
array_t
get_impl
(
array_t
*
)
const
{
{
switch
(
m_type
)
if
(
m_type
==
value_t
::
array
)
{
{
case
(
value_t
:
:
array
)
:
return
*
(
m_value
.
array
);
{
}
return
*
(
m_value
.
array
);
else
}
{
default
:
throw
std
::
domain_error
(
"type must be array, but is "
+
type_name
());
{
throw
std
::
domain_error
(
"type must be array, but is "
+
type_name
());
}
}
}
}
}
...
@@ -2145,16 +2140,13 @@ class basic_json
...
@@ -2145,16 +2140,13 @@ class basic_json
,
int
>::
type
=
0
>
,
int
>::
type
=
0
>
T
get_impl
(
T
*
)
const
T
get_impl
(
T
*
)
const
{
{
switch
(
m_type
)
if
(
m_type
==
value_t
::
string
)
{
{
case
(
value_t
:
:
string
)
:
return
*
m_value
.
string
;
{
}
return
*
m_value
.
string
;
else
}
{
default
:
throw
std
::
domain_error
(
"type must be string, but is "
+
type_name
());
{
throw
std
::
domain_error
(
"type must be string, but is "
+
type_name
());
}
}
}
}
}
...
@@ -2167,14 +2159,22 @@ class basic_json
...
@@ -2167,14 +2159,22 @@ class basic_json
{
{
switch
(
m_type
)
switch
(
m_type
)
{
{
case
(
value_t
:
:
number_integer
)
:
case
value_t
:
:
number_integer
:
{
{
return
static_cast
<
T
>
(
m_value
.
number_integer
);
return
static_cast
<
T
>
(
m_value
.
number_integer
);
}
}
case
(
value_t
:
:
number_float
)
:
case
value_t
:
:
number_float
:
{
{
return
static_cast
<
T
>
(
m_value
.
number_float
);
return
static_cast
<
T
>
(
m_value
.
number_float
);
}
}
case
value_t
:
:
array
:
case
value_t
:
:
boolean
:
case
value_t
:
:
discarded
:
case
value_t
:
:
null
:
case
value_t
:
:
object
:
case
value_t
:
:
string
:
default
:
default
:
{
{
throw
std
::
domain_error
(
"type must be number, but is "
+
type_name
());
throw
std
::
domain_error
(
"type must be number, but is "
+
type_name
());
...
@@ -2185,16 +2185,13 @@ class basic_json
...
@@ -2185,16 +2185,13 @@ class basic_json
/// get a boolean (explicit)
/// get a boolean (explicit)
boolean_t
get_impl
(
boolean_t
*
)
const
boolean_t
get_impl
(
boolean_t
*
)
const
{
{
switch
(
m_type
)
if
(
m_type
==
value_t
::
boolean
)
{
{
case
(
value_t
:
:
boolean
)
:
return
m_value
.
boolean
;
{
}
return
m_value
.
boolean
;
else
}
{
default
:
throw
std
::
domain_error
(
"type must be boolean, but is "
+
type_name
());
{
throw
std
::
domain_error
(
"type must be boolean, but is "
+
type_name
());
}
}
}
}
}
...
@@ -2845,9 +2842,9 @@ class basic_json
...
@@ -2845,9 +2842,9 @@ class basic_json
switch
(
m_type
)
switch
(
m_type
)
{
{
case
value_t
:
:
number_integer
:
case
value_t
:
:
number_float
:
case
value_t
:
:
boolean
:
case
value_t
:
:
boolean
:
case
value_t
:
:
number_float
:
case
value_t
:
:
number_integer
:
case
value_t
:
:
string
:
case
value_t
:
:
string
:
{
{
if
(
not
pos
.
m_it
.
primitive_iterator
.
is_begin
())
if
(
not
pos
.
m_it
.
primitive_iterator
.
is_begin
())
...
@@ -2877,6 +2874,8 @@ class basic_json
...
@@ -2877,6 +2874,8 @@ class basic_json
break
;
break
;
}
}
case
value_t
:
:
discarded
:
case
value_t
:
:
null
:
default
:
default
:
{
{
throw
std
::
domain_error
(
"cannot use erase() with "
+
type_name
());
throw
std
::
domain_error
(
"cannot use erase() with "
+
type_name
());
...
@@ -2938,9 +2937,9 @@ class basic_json
...
@@ -2938,9 +2937,9 @@ class basic_json
switch
(
m_type
)
switch
(
m_type
)
{
{
case
value_t
:
:
number_integer
:
case
value_t
:
:
number_float
:
case
value_t
:
:
boolean
:
case
value_t
:
:
boolean
:
case
value_t
:
:
number_float
:
case
value_t
:
:
number_integer
:
case
value_t
:
:
string
:
case
value_t
:
:
string
:
{
{
if
(
not
first
.
m_it
.
primitive_iterator
.
is_begin
()
or
not
last
.
m_it
.
primitive_iterator
.
is_end
())
if
(
not
first
.
m_it
.
primitive_iterator
.
is_begin
()
or
not
last
.
m_it
.
primitive_iterator
.
is_end
())
...
@@ -2972,6 +2971,8 @@ class basic_json
...
@@ -2972,6 +2971,8 @@ class basic_json
break
;
break
;
}
}
case
value_t
:
:
discarded
:
case
value_t
:
:
null
:
default
:
default
:
{
{
throw
std
::
domain_error
(
"cannot use erase with "
+
type_name
());
throw
std
::
domain_error
(
"cannot use erase with "
+
type_name
());
...
@@ -3364,21 +3365,26 @@ class basic_json
...
@@ -3364,21 +3365,26 @@ class basic_json
{
{
switch
(
m_type
)
switch
(
m_type
)
{
{
case
(
value_t
:
:
null
)
:
case
value_t
:
:
null
:
{
{
return
true
;
return
true
;
}
}
case
(
value_t
:
:
array
)
:
case
value_t
:
:
array
:
{
{
return
m_value
.
array
->
empty
();
return
m_value
.
array
->
empty
();
}
}
case
(
value_t
:
:
object
)
:
case
value_t
:
:
object
:
{
{
return
m_value
.
object
->
empty
();
return
m_value
.
object
->
empty
();
}
}
case
basic_json
:
:
value_t
::
boolean
:
case
basic_json
:
:
value_t
::
discarded
:
case
basic_json
:
:
value_t
::
number_float
:
case
basic_json
:
:
value_t
::
number_integer
:
case
basic_json
:
:
value_t
::
string
:
default
:
default
:
{
{
// all other types are nonempty
// all other types are nonempty
...
@@ -3418,21 +3424,26 @@ class basic_json
...
@@ -3418,21 +3424,26 @@ class basic_json
{
{
switch
(
m_type
)
switch
(
m_type
)
{
{
case
(
value_t
:
:
null
)
:
case
value_t
:
:
null
:
{
{
return
0
;
return
0
;
}
}
case
(
value_t
:
:
array
)
:
case
value_t
:
:
array
:
{
{
return
m_value
.
array
->
size
();
return
m_value
.
array
->
size
();
}
}
case
(
value_t
:
:
object
)
:
case
value_t
:
:
object
:
{
{
return
m_value
.
object
->
size
();
return
m_value
.
object
->
size
();
}
}
case
value_t
:
:
boolean
:
case
value_t
:
:
discarded
:
case
value_t
:
:
number_float
:
case
value_t
:
:
number_integer
:
case
value_t
:
:
string
:
default
:
default
:
{
{
// all other types have size 1
// all other types have size 1
...
@@ -3475,16 +3486,22 @@ class basic_json
...
@@ -3475,16 +3486,22 @@ class basic_json
{
{
switch
(
m_type
)
switch
(
m_type
)
{
{
case
(
value_t
:
:
array
)
:
case
value_t
:
:
array
:
{
{
return
m_value
.
array
->
max_size
();
return
m_value
.
array
->
max_size
();
}
}
case
(
value_t
:
:
object
)
:
case
value_t
:
:
object
:
{
{
return
m_value
.
object
->
max_size
();
return
m_value
.
object
->
max_size
();
}
}
case
basic_json
:
:
value_t
::
boolean
:
case
basic_json
:
:
value_t
::
discarded
:
case
basic_json
:
:
value_t
::
null
:
case
basic_json
:
:
value_t
::
number_float
:
case
basic_json
:
:
value_t
::
number_integer
:
case
basic_json
:
:
value_t
::
string
:
default
:
default
:
{
{
// all other types have max_size() == size()
// all other types have max_size() == size()
...
@@ -3530,47 +3547,48 @@ class basic_json
...
@@ -3530,47 +3547,48 @@ class basic_json
{
{
switch
(
m_type
)
switch
(
m_type
)
{
{
case
(
value_t
:
:
null
)
:
case
value_t
:
:
number_integer
:
case
(
value_t
:
:
discarded
)
:
{
break
;
}
case
(
value_t
:
:
number_integer
)
:
{
{
m_value
.
number_integer
=
0
;
m_value
.
number_integer
=
0
;
break
;
break
;
}
}
case
(
value_t
:
:
number_float
)
:
case
value_t
:
:
number_float
:
{
{
m_value
.
number_float
=
0.0
;
m_value
.
number_float
=
0.0
;
break
;
break
;
}
}
case
(
value_t
:
:
boolean
)
:
case
value_t
:
:
boolean
:
{
{
m_value
.
boolean
=
false
;
m_value
.
boolean
=
false
;
break
;
break
;
}
}
case
(
value_t
:
:
string
)
:
case
value_t
:
:
string
:
{
{
m_value
.
string
->
clear
();
m_value
.
string
->
clear
();
break
;
break
;
}
}
case
(
value_t
:
:
array
)
:
case
value_t
:
:
array
:
{
{
m_value
.
array
->
clear
();
m_value
.
array
->
clear
();
break
;
break
;
}
}
case
(
value_t
:
:
object
)
:
case
value_t
:
:
object
:
{
{
m_value
.
object
->
clear
();
m_value
.
object
->
clear
();
break
;
break
;
}
}
case
value_t
:
:
discarded
:
case
value_t
:
:
null
:
default
:
{
break
;
}
}
}
}
}
...
@@ -4067,21 +4085,23 @@ class basic_json
...
@@ -4067,21 +4085,23 @@ class basic_json
{
{
switch
(
lhs_type
)
switch
(
lhs_type
)
{
{
case
(
value_t
:
:
array
)
:
case
value_t
:
:
array
:
return
*
lhs
.
m_value
.
array
==
*
rhs
.
m_value
.
array
;
return
*
lhs
.
m_value
.
array
==
*
rhs
.
m_value
.
array
;
case
(
value_t
:
:
object
)
:
case
value_t
:
:
object
:
return
*
lhs
.
m_value
.
object
==
*
rhs
.
m_value
.
object
;
return
*
lhs
.
m_value
.
object
==
*
rhs
.
m_value
.
object
;
case
(
value_t
:
:
null
)
:
case
value_t
:
:
null
:
return
true
;
return
true
;
case
(
value_t
:
:
string
)
:
case
value_t
:
:
string
:
return
*
lhs
.
m_value
.
string
==
*
rhs
.
m_value
.
string
;
return
*
lhs
.
m_value
.
string
==
*
rhs
.
m_value
.
string
;
case
(
value_t
:
:
boolean
)
:
case
value_t
:
:
boolean
:
return
lhs
.
m_value
.
boolean
==
rhs
.
m_value
.
boolean
;
return
lhs
.
m_value
.
boolean
==
rhs
.
m_value
.
boolean
;
case
(
value_t
:
:
number_integer
)
:
case
value_t
:
:
number_integer
:
return
lhs
.
m_value
.
number_integer
==
rhs
.
m_value
.
number_integer
;
return
lhs
.
m_value
.
number_integer
==
rhs
.
m_value
.
number_integer
;
case
(
value_t
:
:
number_float
)
:
case
value_t
:
:
number_float
:
return
approx
(
lhs
.
m_value
.
number_float
,
rhs
.
m_value
.
number_float
);
return
approx
(
lhs
.
m_value
.
number_float
,
rhs
.
m_value
.
number_float
);
case
(
value_t
:
:
discarded
)
:
case
value_t
:
:
discarded
:
return
false
;
default
:
return
false
;
return
false
;
}
}
}
}
...
@@ -4208,21 +4228,23 @@ class basic_json
...
@@ -4208,21 +4228,23 @@ class basic_json
{
{
switch
(
lhs_type
)
switch
(
lhs_type
)
{
{
case
(
value_t
:
:
array
)
:
case
value_t
:
:
array
:
return
*
lhs
.
m_value
.
array
<
*
rhs
.
m_value
.
array
;
return
*
lhs
.
m_value
.
array
<
*
rhs
.
m_value
.
array
;
case
(
value_t
:
:
object
)
:
case
value_t
:
:
object
:
return
*
lhs
.
m_value
.
object
<
*
rhs
.
m_value
.
object
;
return
*
lhs
.
m_value
.
object
<
*
rhs
.
m_value
.
object
;
case
(
value_t
:
:
null
)
:
case
value_t
:
:
null
:
return
false
;
return
false
;
case
(
value_t
:
:
string
)
:
case
value_t
:
:
string
:
return
*
lhs
.
m_value
.
string
<
*
rhs
.
m_value
.
string
;
return
*
lhs
.
m_value
.
string
<
*
rhs
.
m_value
.
string
;
case
(
value_t
:
:
boolean
)
:
case
value_t
:
:
boolean
:
return
lhs
.
m_value
.
boolean
<
rhs
.
m_value
.
boolean
;
return
lhs
.
m_value
.
boolean
<
rhs
.
m_value
.
boolean
;
case
(
value_t
:
:
number_integer
)
:
case
value_t
:
:
number_integer
:
return
lhs
.
m_value
.
number_integer
<
rhs
.
m_value
.
number_integer
;
return
lhs
.
m_value
.
number_integer
<
rhs
.
m_value
.
number_integer
;
case
(
value_t
:
:
number_float
)
:
case
value_t
:
:
number_float
:
return
lhs
.
m_value
.
number_float
<
rhs
.
m_value
.
number_float
;
return
lhs
.
m_value
.
number_float
<
rhs
.
m_value
.
number_float
;
case
(
value_t
:
:
discarded
)
:
case
value_t
:
:
discarded
:
return
false
;
default
:
return
false
;
return
false
;
}
}
}
}
...
@@ -4475,36 +4497,38 @@ class basic_json
...
@@ -4475,36 +4497,38 @@ class basic_json
{
{
switch
(
m_type
)
switch
(
m_type
)
{
{
case
(
value_t
:
:
null
)
:
case
value_t
:
:
null
:
{
{
return
"null"
;
return
"null"
;
}
}
case
(
value_t
:
:
object
)
:
case
value_t
:
:
object
:
{
{
return
"object"
;
return
"object"
;
}
}
case
(
value_t
:
:
array
)
:
case
value_t
:
:
array
:
{
{
return
"array"
;
return
"array"
;
}
}
case
(
value_t
:
:
string
)
:
case
value_t
:
:
string
:
{
{
return
"string"
;
return
"string"
;
}
}
case
(
value_t
:
:
boolean
)
:
case
value_t
:
:
boolean
:
{
{
return
"boolean"
;
return
"boolean"
;
}
}
case
(
value_t
:
:
discarded
)
:
case
value_t
:
:
discarded
:
{
{
return
"discarded"
;
return
"discarded"
;
}
}
case
value_t
:
:
number_float
:
case
value_t
:
:
number_integer
:
default
:
default
:
{
{
return
"number"
;
return
"number"
;
...
@@ -4699,7 +4723,7 @@ class basic_json
...
@@ -4699,7 +4723,7 @@ class basic_json
switch
(
m_type
)
switch
(
m_type
)
{
{
case
(
value_t
:
:
object
)
:
case
value_t
:
:
object
:
{
{
if
(
m_value
.
object
->
empty
())
if
(
m_value
.
object
->
empty
())
{
{
...
@@ -4739,7 +4763,7 @@ class basic_json
...
@@ -4739,7 +4763,7 @@ class basic_json
return
;
return
;
}
}
case
(
value_t
:
:
array
)
:
case
value_t
:
:
array
:
{
{
if
(
m_value
.
array
->
empty
())
if
(
m_value
.
array
->
empty
())
{
{
...
@@ -4777,25 +4801,25 @@ class basic_json
...
@@ -4777,25 +4801,25 @@ class basic_json
return
;
return
;
}
}
case
(
value_t
:
:
string
)
:
case
value_t
:
:
string
:
{
{
o
<<
string_t
(
"
\"
"
)
<<
escape_string
(
*
m_value
.
string
)
<<
"
\"
"
;
o
<<
string_t
(
"
\"
"
)
<<
escape_string
(
*
m_value
.
string
)
<<
"
\"
"
;
return
;
return
;
}
}
case
(
value_t
:
:
boolean
)
:
case
value_t
:
:
boolean
:
{
{
o
<<
(
m_value
.
boolean
?
"true"
:
"false"
);
o
<<
(
m_value
.
boolean
?
"true"
:
"false"
);
return
;
return
;
}
}
case
(
value_t
:
:
number_integer
)
:
case
value_t
:
:
number_integer
:
{
{
o
<<
m_value
.
number_integer
;
o
<<
m_value
.
number_integer
;
return
;
return
;
}
}
case
(
value_t
:
:
number_float
)
:
case
value_t
:
:
number_float
:
{
{
// 15 digits of precision allows round-trip IEEE 754
// 15 digits of precision allows round-trip IEEE 754
// string->double->string; to be safe, we read this value from
// string->double->string; to be safe, we read this value from
...
@@ -4804,17 +4828,22 @@ class basic_json
...
@@ -4804,17 +4828,22 @@ class basic_json
return
;
return
;
}
}
case
(
value_t
:
:
discarded
)
:
case
value_t
:
:
discarded
:
{
{
o
<<
"<discarded>"
;
o
<<
"<discarded>"
;
return
;
return
;
}
}
default
:
case
value_t
:
:
null
:
{
{
o
<<
"null"
;
o
<<
"null"
;
return
;
return
;
}
}
default
:
{
return
;
}
}
}
}
}
...
@@ -4950,16 +4979,24 @@ class basic_json
...
@@ -4950,16 +4979,24 @@ class basic_json
{
{
switch
(
m_object
->
m_type
)
switch
(
m_object
->
m_type
)
{
{
case
(
basic_json
:
:
value_t
::
object
)
:
case
basic_json
:
:
value_t
::
object
:
{
{
m_it
.
object_iterator
=
typename
object_t
::
iterator
();
m_it
.
object_iterator
=
typename
object_t
::
iterator
();
break
;
break
;
}
}
case
(
basic_json
:
:
value_t
::
array
)
:
case
basic_json
:
:
value_t
::
array
:
{
{
m_it
.
array_iterator
=
typename
array_t
::
iterator
();
m_it
.
array_iterator
=
typename
array_t
::
iterator
();
break
;
break
;
}
}
case
basic_json
:
:
value_t
::
boolean
:
case
basic_json
:
:
value_t
::
discarded
:
case
basic_json
:
:
value_t
::
null
:
case
basic_json
:
:
value_t
::
number_float
:
case
basic_json
:
:
value_t
::
number_integer
:
case
basic_json
:
:
value_t
::
string
:
default
:
default
:
{
{
m_it
.
primitive_iterator
=
primitive_iterator_t
();
m_it
.
primitive_iterator
=
primitive_iterator_t
();
...
@@ -4973,18 +5010,24 @@ class basic_json
...
@@ -4973,18 +5010,24 @@ class basic_json
{
{
switch
(
m_object
->
m_type
)
switch
(
m_object
->
m_type
)
{
{
case
(
basic_json
:
:
value_t
::
object
)
:
case
basic_json
:
:
value_t
::
object
:
{
{
m_it
.
object_iterator
=
other
.
m_it
.
object_iterator
;
m_it
.
object_iterator
=
other
.
m_it
.
object_iterator
;
break
;
break
;
}
}
case
(
basic_json
:
:
value_t
::
array
)
:
case
basic_json
:
:
value_t
::
array
:
{
{
m_it
.
array_iterator
=
other
.
m_it
.
array_iterator
;
m_it
.
array_iterator
=
other
.
m_it
.
array_iterator
;
break
;
break
;
}
}
case
value_t
:
:
boolean
:
case
value_t
:
:
discarded
:
case
value_t
:
:
null
:
case
value_t
:
:
number_float
:
case
value_t
:
:
number_integer
:
case
value_t
:
:
string
:
default
:
default
:
{
{
m_it
.
primitive_iterator
=
other
.
m_it
.
primitive_iterator
;
m_it
.
primitive_iterator
=
other
.
m_it
.
primitive_iterator
;
...
@@ -5017,25 +5060,30 @@ class basic_json
...
@@ -5017,25 +5060,30 @@ class basic_json
{
{
switch
(
m_object
->
m_type
)
switch
(
m_object
->
m_type
)
{
{
case
(
basic_json
:
:
value_t
::
object
)
:
case
basic_json
:
:
value_t
::
object
:
{
{
m_it
.
object_iterator
=
m_object
->
m_value
.
object
->
begin
();
m_it
.
object_iterator
=
m_object
->
m_value
.
object
->
begin
();
break
;
break
;
}
}
case
(
basic_json
:
:
value_t
::
array
)
:
case
basic_json
:
:
value_t
::
array
:
{
{
m_it
.
array_iterator
=
m_object
->
m_value
.
array
->
begin
();
m_it
.
array_iterator
=
m_object
->
m_value
.
array
->
begin
();
break
;
break
;
}
}
case
(
basic_json
:
:
value_t
::
null
)
:
case
basic_json
:
:
value_t
::
null
:
{
{
// set to end so begin()==end() is true: null is empty
// set to end so begin()==end() is true: null is empty
m_it
.
primitive_iterator
.
set_end
();
m_it
.
primitive_iterator
.
set_end
();
break
;
break
;
}
}
case
basic_json
:
:
value_t
::
boolean
:
case
basic_json
:
:
value_t
::
discarded
:
case
basic_json
:
:
value_t
::
number_float
:
case
basic_json
:
:
value_t
::
number_integer
:
case
basic_json
:
:
value_t
::
string
:
default
:
default
:
{
{
m_it
.
primitive_iterator
.
set_begin
();
m_it
.
primitive_iterator
.
set_begin
();
...
@@ -5049,18 +5097,24 @@ class basic_json
...
@@ -5049,18 +5097,24 @@ class basic_json
{
{
switch
(
m_object
->
m_type
)
switch
(
m_object
->
m_type
)
{
{
case
(
basic_json
:
:
value_t
::
object
)
:
case
basic_json
:
:
value_t
::
object
:
{
{
m_it
.
object_iterator
=
m_object
->
m_value
.
object
->
end
();
m_it
.
object_iterator
=
m_object
->
m_value
.
object
->
end
();
break
;
break
;
}
}
case
(
basic_json
:
:
value_t
::
array
)
:
case
basic_json
:
:
value_t
::
array
:
{
{
m_it
.
array_iterator
=
m_object
->
m_value
.
array
->
end
();
m_it
.
array_iterator
=
m_object
->
m_value
.
array
->
end
();
break
;
break
;
}
}
case
basic_json
:
:
value_t
::
boolean
:
case
basic_json
:
:
value_t
::
discarded
:
case
basic_json
:
:
value_t
::
null
:
case
basic_json
:
:
value_t
::
number_float
:
case
basic_json
:
:
value_t
::
number_integer
:
case
basic_json
:
:
value_t
::
string
:
default
:
default
:
{
{
m_it
.
primitive_iterator
.
set_end
();
m_it
.
primitive_iterator
.
set_end
();
...
@@ -5075,21 +5129,26 @@ class basic_json
...
@@ -5075,21 +5129,26 @@ class basic_json
{
{
switch
(
m_object
->
m_type
)
switch
(
m_object
->
m_type
)
{
{
case
(
basic_json
:
:
value_t
::
object
)
:
case
basic_json
:
:
value_t
::
object
:
{
{
return
m_it
.
object_iterator
->
second
;
return
m_it
.
object_iterator
->
second
;
}
}
case
(
basic_json
:
:
value_t
::
array
)
:
case
basic_json
:
:
value_t
::
array
:
{
{
return
*
m_it
.
array_iterator
;
return
*
m_it
.
array_iterator
;
}
}
case
(
basic_json
:
:
value_t
::
null
)
:
case
basic_json
:
:
value_t
::
null
:
{
{
throw
std
::
out_of_range
(
"cannot get value"
);
throw
std
::
out_of_range
(
"cannot get value"
);
}
}
case
value_t
:
:
boolean
:
case
value_t
:
:
discarded
:
case
value_t
:
:
number_float
:
case
value_t
:
:
number_integer
:
case
value_t
:
:
string
:
default
:
default
:
{
{
if
(
m_it
.
primitive_iterator
.
is_begin
())
if
(
m_it
.
primitive_iterator
.
is_begin
())
...
@@ -5109,16 +5168,22 @@ class basic_json
...
@@ -5109,16 +5168,22 @@ class basic_json
{
{
switch
(
m_object
->
m_type
)
switch
(
m_object
->
m_type
)
{
{
case
(
basic_json
:
:
value_t
::
object
)
:
case
basic_json
:
:
value_t
::
object
:
{
{
return
&
(
m_it
.
object_iterator
->
second
);
return
&
(
m_it
.
object_iterator
->
second
);
}
}
case
(
basic_json
:
:
value_t
::
array
)
:
case
basic_json
:
:
value_t
::
array
:
{
{
return
&*
m_it
.
array_iterator
;
return
&*
m_it
.
array_iterator
;
}
}
case
basic_json
:
:
value_t
::
boolean
:
case
basic_json
:
:
value_t
::
discarded
:
case
basic_json
:
:
value_t
::
null
:
case
basic_json
:
:
value_t
::
number_float
:
case
basic_json
:
:
value_t
::
number_integer
:
case
basic_json
:
:
value_t
::
string
:
default
:
default
:
{
{
if
(
m_it
.
primitive_iterator
.
is_begin
())
if
(
m_it
.
primitive_iterator
.
is_begin
())
...
@@ -5147,18 +5212,24 @@ class basic_json
...
@@ -5147,18 +5212,24 @@ class basic_json
{
{
switch
(
m_object
->
m_type
)
switch
(
m_object
->
m_type
)
{
{
case
(
basic_json
:
:
value_t
::
object
)
:
case
basic_json
:
:
value_t
::
object
:
{
{
++
m_it
.
object_iterator
;
++
m_it
.
object_iterator
;
break
;
break
;
}
}
case
(
basic_json
:
:
value_t
::
array
)
:
case
basic_json
:
:
value_t
::
array
:
{
{
++
m_it
.
array_iterator
;
++
m_it
.
array_iterator
;
break
;
break
;
}
}
case
value_t
:
:
boolean
:
case
value_t
:
:
discarded
:
case
value_t
:
:
null
:
case
value_t
:
:
number_float
:
case
value_t
:
:
number_integer
:
case
value_t
:
:
string
:
default
:
default
:
{
{
++
m_it
.
primitive_iterator
;
++
m_it
.
primitive_iterator
;
...
@@ -5183,18 +5254,24 @@ class basic_json
...
@@ -5183,18 +5254,24 @@ class basic_json
{
{
switch
(
m_object
->
m_type
)
switch
(
m_object
->
m_type
)
{
{
case
(
basic_json
:
:
value_t
::
object
)
:
case
basic_json
:
:
value_t
::
object
:
{
{
--
m_it
.
object_iterator
;
--
m_it
.
object_iterator
;
break
;
break
;
}
}
case
(
basic_json
:
:
value_t
::
array
)
:
case
basic_json
:
:
value_t
::
array
:
{
{
--
m_it
.
array_iterator
;
--
m_it
.
array_iterator
;
break
;
break
;
}
}
case
value_t
:
:
boolean
:
case
value_t
:
:
discarded
:
case
value_t
:
:
null
:
case
value_t
:
:
number_float
:
case
value_t
:
:
number_integer
:
case
value_t
:
:
string
:
default
:
default
:
{
{
--
m_it
.
primitive_iterator
;
--
m_it
.
primitive_iterator
;
...
@@ -5216,16 +5293,22 @@ class basic_json
...
@@ -5216,16 +5293,22 @@ class basic_json
switch
(
m_object
->
m_type
)
switch
(
m_object
->
m_type
)
{
{
case
(
basic_json
:
:
value_t
::
object
)
:
case
basic_json
:
:
value_t
::
object
:
{
{
return
(
m_it
.
object_iterator
==
other
.
m_it
.
object_iterator
);
return
(
m_it
.
object_iterator
==
other
.
m_it
.
object_iterator
);
}
}
case
(
basic_json
:
:
value_t
::
array
)
:
case
basic_json
:
:
value_t
::
array
:
{
{
return
(
m_it
.
array_iterator
==
other
.
m_it
.
array_iterator
);
return
(
m_it
.
array_iterator
==
other
.
m_it
.
array_iterator
);
}
}
case
value_t
:
:
boolean
:
case
value_t
:
:
discarded
:
case
value_t
:
:
null
:
case
value_t
:
:
number_float
:
case
value_t
:
:
number_integer
:
case
value_t
:
:
string
:
default
:
default
:
{
{
return
(
m_it
.
primitive_iterator
==
other
.
m_it
.
primitive_iterator
);
return
(
m_it
.
primitive_iterator
==
other
.
m_it
.
primitive_iterator
);
...
@@ -5250,16 +5333,22 @@ class basic_json
...
@@ -5250,16 +5333,22 @@ class basic_json
switch
(
m_object
->
m_type
)
switch
(
m_object
->
m_type
)
{
{
case
(
basic_json
:
:
value_t
::
object
)
:
case
basic_json
:
:
value_t
::
object
:
{
{
throw
std
::
domain_error
(
"cannot use operator< for object iterators"
);
throw
std
::
domain_error
(
"cannot use operator< for object iterators"
);
}
}
case
(
basic_json
:
:
value_t
::
array
)
:
case
basic_json
:
:
value_t
::
array
:
{
{
return
(
m_it
.
array_iterator
<
other
.
m_it
.
array_iterator
);
return
(
m_it
.
array_iterator
<
other
.
m_it
.
array_iterator
);
}
}
case
basic_json
:
:
value_t
::
boolean
:
case
basic_json
:
:
value_t
::
discarded
:
case
basic_json
:
:
value_t
::
null
:
case
basic_json
:
:
value_t
::
number_float
:
case
basic_json
:
:
value_t
::
number_integer
:
case
basic_json
:
:
value_t
::
string
:
default
:
default
:
{
{
return
(
m_it
.
primitive_iterator
<
other
.
m_it
.
primitive_iterator
);
return
(
m_it
.
primitive_iterator
<
other
.
m_it
.
primitive_iterator
);
...
@@ -5290,17 +5379,23 @@ class basic_json
...
@@ -5290,17 +5379,23 @@ class basic_json
{
{
switch
(
m_object
->
m_type
)
switch
(
m_object
->
m_type
)
{
{
case
(
basic_json
:
:
value_t
::
object
)
:
case
basic_json
:
:
value_t
::
object
:
{
{
throw
std
::
domain_error
(
"cannot use operator+= for object iterators"
);
throw
std
::
domain_error
(
"cannot use operator+= for object iterators"
);
}
}
case
(
basic_json
:
:
value_t
::
array
)
:
case
basic_json
:
:
value_t
::
array
:
{
{
m_it
.
array_iterator
+=
i
;
m_it
.
array_iterator
+=
i
;
break
;
break
;
}
}
case
basic_json
:
:
value_t
::
boolean
:
case
basic_json
:
:
value_t
::
discarded
:
case
basic_json
:
:
value_t
::
null
:
case
basic_json
:
:
value_t
::
number_float
:
case
basic_json
:
:
value_t
::
number_integer
:
case
basic_json
:
:
value_t
::
string
:
default
:
default
:
{
{
m_it
.
primitive_iterator
+=
i
;
m_it
.
primitive_iterator
+=
i
;
...
@@ -5338,16 +5433,22 @@ class basic_json
...
@@ -5338,16 +5433,22 @@ class basic_json
{
{
switch
(
m_object
->
m_type
)
switch
(
m_object
->
m_type
)
{
{
case
(
basic_json
:
:
value_t
::
object
)
:
case
basic_json
:
:
value_t
::
object
:
{
{
throw
std
::
domain_error
(
"cannot use operator- for object iterators"
);
throw
std
::
domain_error
(
"cannot use operator- for object iterators"
);
}
}
case
(
basic_json
:
:
value_t
::
array
)
:
case
basic_json
:
:
value_t
::
array
:
{
{
return
m_it
.
array_iterator
-
other
.
m_it
.
array_iterator
;
return
m_it
.
array_iterator
-
other
.
m_it
.
array_iterator
;
}
}
case
basic_json
:
:
value_t
::
boolean
:
case
basic_json
:
:
value_t
::
discarded
:
case
basic_json
:
:
value_t
::
null
:
case
basic_json
:
:
value_t
::
number_float
:
case
basic_json
:
:
value_t
::
number_integer
:
case
basic_json
:
:
value_t
::
string
:
default
:
default
:
{
{
return
m_it
.
primitive_iterator
-
other
.
m_it
.
primitive_iterator
;
return
m_it
.
primitive_iterator
-
other
.
m_it
.
primitive_iterator
;
...
@@ -5360,21 +5461,26 @@ class basic_json
...
@@ -5360,21 +5461,26 @@ class basic_json
{
{
switch
(
m_object
->
m_type
)
switch
(
m_object
->
m_type
)
{
{
case
(
basic_json
:
:
value_t
::
object
)
:
case
basic_json
:
:
value_t
::
object
:
{
{
throw
std
::
domain_error
(
"cannot use operator[] for object iterators"
);
throw
std
::
domain_error
(
"cannot use operator[] for object iterators"
);
}
}
case
(
basic_json
:
:
value_t
::
array
)
:
case
basic_json
:
:
value_t
::
array
:
{
{
return
*
(
m_it
.
array_iterator
+
n
);
return
*
(
m_it
.
array_iterator
+
n
);
}
}
case
(
basic_json
:
:
value_t
::
null
)
:
case
basic_json
:
:
value_t
::
null
:
{
{
throw
std
::
out_of_range
(
"cannot get value"
);
throw
std
::
out_of_range
(
"cannot get value"
);
}
}
case
basic_json
:
:
value_t
::
boolean
:
case
basic_json
:
:
value_t
::
discarded
:
case
basic_json
:
:
value_t
::
number_float
:
case
basic_json
:
:
value_t
::
number_integer
:
case
basic_json
:
:
value_t
::
string
:
default
:
default
:
{
{
if
(
m_it
.
primitive_iterator
==
-
n
)
if
(
m_it
.
primitive_iterator
==
-
n
)
...
@@ -5392,17 +5498,13 @@ class basic_json
...
@@ -5392,17 +5498,13 @@ class basic_json
/// return the key of an object iterator
/// return the key of an object iterator
typename
object_t
::
key_type
key
()
const
typename
object_t
::
key_type
key
()
const
{
{
switch
(
m_object
->
m_type
)
if
(
m_object
->
m_type
==
basic_json
::
value_t
::
object
)
{
{
case
(
basic_json
:
:
value_t
::
object
)
:
return
m_it
.
object_iterator
->
first
;
{
}
return
m_it
.
object_iterator
->
first
;
else
}
{
throw
std
::
domain_error
(
"cannot use key() for non-object iterators"
);
default
:
{
throw
std
::
domain_error
(
"cannot use key() for non-object iterators"
);
}
}
}
}
}
...
@@ -5713,18 +5815,24 @@ class basic_json
...
@@ -5713,18 +5815,24 @@ class basic_json
switch
(
anchor
.
m_object
->
type
())
switch
(
anchor
.
m_object
->
type
())
{
{
/// use integer array index as key
/// use integer array index as key
case
(
value_t
:
:
array
)
:
case
value_t
:
:
array
:
{
{
return
std
::
to_string
(
array_index
);
return
std
::
to_string
(
array_index
);
}
}
/// use key from the object
/// use key from the object
case
(
value_t
:
:
object
)
:
case
value_t
:
:
object
:
{
{
return
anchor
.
key
();
return
anchor
.
key
();
}
}
/// use an empty key for all primitive types
/// use an empty key for all primitive types
case
value_t
:
:
boolean
:
case
value_t
:
:
discarded
:
case
value_t
:
:
null
:
case
value_t
:
:
number_float
:
case
value_t
:
:
number_integer
:
case
value_t
:
:
string
:
default
:
default
:
{
{
return
""
;
return
""
;
...
@@ -5899,34 +6007,36 @@ class basic_json
...
@@ -5899,34 +6007,36 @@ class basic_json
{
{
switch
(
t
)
switch
(
t
)
{
{
case
(
token_type
:
:
uninitialized
)
:
case
token_type
:
:
uninitialized
:
return
"<uninitialized>"
;
return
"<uninitialized>"
;
case
(
token_type
:
:
literal_true
)
:
case
token_type
:
:
literal_true
:
return
"true literal"
;
return
"true literal"
;
case
(
token_type
:
:
literal_false
)
:
case
token_type
:
:
literal_false
:
return
"false literal"
;
return
"false literal"
;
case
(
token_type
:
:
literal_null
)
:
case
token_type
:
:
literal_null
:
return
"null literal"
;
return
"null literal"
;
case
(
token_type
:
:
value_string
)
:
case
token_type
:
:
value_string
:
return
"string literal"
;
return
"string literal"
;
case
(
token_type
:
:
value_number
)
:
case
token_type
:
:
value_number
:
return
"number literal"
;
return
"number literal"
;
case
(
token_type
:
:
begin_array
)
:
case
token_type
:
:
begin_array
:
return
"["
;
return
"["
;
case
(
token_type
:
:
begin_object
)
:
case
token_type
:
:
begin_object
:
return
"{"
;
return
"{"
;
case
(
token_type
:
:
end_array
)
:
case
token_type
:
:
end_array
:
return
"]"
;
return
"]"
;
case
(
token_type
:
:
end_object
)
:
case
token_type
:
:
end_object
:
return
"}"
;
return
"}"
;
case
(
token_type
:
:
name_separator
)
:
case
token_type
:
:
name_separator
:
return
":"
;
return
":"
;
case
(
token_type
:
:
value_separator
)
:
case
token_type
:
:
value_separator
:
return
","
;
return
","
;
case
(
token_type
:
:
end_of_input
)
:
case
token_type
:
:
end_of_input
:
return
"<end of input>"
;
return
"<end of input>"
;
default
:
case
token_type
:
:
parse_error
:
return
"<parse error>"
;
return
"<parse error>"
;
default
:
return
""
;
}
}
}
}
...
@@ -6877,6 +6987,11 @@ basic_json_parser_64:
...
@@ -6877,6 +6987,11 @@ basic_json_parser_64:
}
}
break
;
break
;
}
}
default
:
{
break
;
}
}
}
}
}
else
else
...
@@ -6978,7 +7093,7 @@ basic_json_parser_64:
...
@@ -6978,7 +7093,7 @@ basic_json_parser_64:
switch
(
last_token
)
switch
(
last_token
)
{
{
case
(
lexer
:
:
token_type
::
begin_object
)
:
case
lexer
:
:
token_type
::
begin_object
:
{
{
if
(
keep
and
(
not
callback
or
(
keep
=
callback
(
depth
++
,
parse_event_t
::
object_start
,
result
))))
if
(
keep
and
(
not
callback
or
(
keep
=
callback
(
depth
++
,
parse_event_t
::
object_start
,
result
))))
{
{
...
@@ -7056,7 +7171,7 @@ basic_json_parser_64:
...
@@ -7056,7 +7171,7 @@ basic_json_parser_64:
return
result
;
return
result
;
}
}
case
(
lexer
:
:
token_type
::
begin_array
)
:
case
lexer
:
:
token_type
::
begin_array
:
{
{
if
(
keep
and
(
not
callback
or
(
keep
=
callback
(
depth
++
,
parse_event_t
::
array_start
,
result
))))
if
(
keep
and
(
not
callback
or
(
keep
=
callback
(
depth
++
,
parse_event_t
::
array_start
,
result
))))
{
{
...
@@ -7111,14 +7226,14 @@ basic_json_parser_64:
...
@@ -7111,14 +7226,14 @@ basic_json_parser_64:
return
result
;
return
result
;
}
}
case
(
lexer
:
:
token_type
::
literal_null
)
:
case
lexer
:
:
token_type
::
literal_null
:
{
{
get_token
();
get_token
();
result
.
m_type
=
value_t
::
null
;
result
.
m_type
=
value_t
::
null
;
break
;
break
;
}
}
case
(
lexer
:
:
token_type
::
value_string
)
:
case
lexer
:
:
token_type
::
value_string
:
{
{
const
auto
s
=
m_lexer
.
get_string
();
const
auto
s
=
m_lexer
.
get_string
();
get_token
();
get_token
();
...
@@ -7126,7 +7241,7 @@ basic_json_parser_64:
...
@@ -7126,7 +7241,7 @@ basic_json_parser_64:
break
;
break
;
}
}
case
(
lexer
:
:
token_type
::
literal_true
)
:
case
lexer
:
:
token_type
::
literal_true
:
{
{
get_token
();
get_token
();
result
.
m_type
=
value_t
::
boolean
;
result
.
m_type
=
value_t
::
boolean
;
...
@@ -7134,7 +7249,7 @@ basic_json_parser_64:
...
@@ -7134,7 +7249,7 @@ basic_json_parser_64:
break
;
break
;
}
}
case
(
lexer
:
:
token_type
::
literal_false
)
:
case
lexer
:
:
token_type
::
literal_false
:
{
{
get_token
();
get_token
();
result
.
m_type
=
value_t
::
boolean
;
result
.
m_type
=
value_t
::
boolean
;
...
@@ -7142,7 +7257,7 @@ basic_json_parser_64:
...
@@ -7142,7 +7257,7 @@ basic_json_parser_64:
break
;
break
;
}
}
case
(
lexer
:
:
token_type
::
value_number
)
:
case
lexer
:
:
token_type
::
value_number
:
{
{
auto
float_val
=
m_lexer
.
get_number
();
auto
float_val
=
m_lexer
.
get_number
();
...
@@ -7173,6 +7288,13 @@ basic_json_parser_64:
...
@@ -7173,6 +7288,13 @@ basic_json_parser_64:
break
;
break
;
}
}
case
lexer
:
:
token_type
::
end_array
:
case
lexer
:
:
token_type
::
end_object
:
case
lexer
:
:
token_type
::
end_of_input
:
case
lexer
:
:
token_type
::
name_separator
:
case
lexer
:
:
token_type
::
parse_error
:
case
lexer
:
:
token_type
::
uninitialized
:
case
lexer
:
:
token_type
::
value_separator
:
default
:
default
:
{
{
// the last token was unexpected
// the last token was unexpected
...
...
src/json.hpp.re2c
View file @
258f04c5
...
@@ -650,47 +650,48 @@ class basic_json
...
@@ -650,47 +650,48 @@ class basic_json
{
{
switch (t)
switch (t)
{
{
case (value_t::null):
case value_t::object:
case (value_t::discarded):
{
break;
}
case (value_t::object):
{
{
object = create<object_t>();
object = create<object_t>();
break;
break;
}
}
case
(value_t::array)
:
case
value_t::array
:
{
{
array = create<array_t>();
array = create<array_t>();
break;
break;
}
}
case
(value_t::string)
:
case
value_t::string
:
{
{
string = create<string_t>("");
string = create<string_t>("");
break;
break;
}
}
case
(value_t::boolean)
:
case
value_t::boolean
:
{
{
boolean = boolean_t(false);
boolean = boolean_t(false);
break;
break;
}
}
case
(value_t::number_integer)
:
case
value_t::number_integer
:
{
{
number_integer = number_integer_t(0);
number_integer = number_integer_t(0);
break;
break;
}
}
case
(value_t::number_float)
:
case
value_t::number_float
:
{
{
number_float = number_float_t(0.0);
number_float = number_float_t(0.0);
break;
break;
}
}
case value_t::null:
case value_t::discarded:
default:
{
break;
}
}
}
}
}
...
@@ -1481,9 +1482,9 @@ class basic_json
...
@@ -1481,9 +1482,9 @@ class basic_json
// check if iterator range is complete for primitive values
// check if iterator range is complete for primitive values
switch (m_type)
switch (m_type)
{
{
case value_t::number_integer:
case value_t::number_float:
case value_t::boolean:
case value_t::boolean:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
case value_t::string:
{
{
if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())
if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())
...
@@ -1493,6 +1494,10 @@ class basic_json
...
@@ -1493,6 +1494,10 @@ class basic_json
break;
break;
}
}
case value_t::array:
case value_t::discarded:
case value_t::null:
case value_t::object:
default:
default:
{
{
break;
break;
...
@@ -1537,6 +1542,8 @@ class basic_json
...
@@ -1537,6 +1542,8 @@ class basic_json
break;
break;
}
}
case value_t::discarded:
case value_t::null:
default:
default:
{
{
throw std::domain_error("cannot use construct with iterators from " + first.m_object->type_name());
throw std::domain_error("cannot use construct with iterators from " + first.m_object->type_name());
...
@@ -1571,47 +1578,48 @@ class basic_json
...
@@ -1571,47 +1578,48 @@ class basic_json
{
{
switch (m_type)
switch (m_type)
{
{
case (value_t::null):
case value_t::object:
case (value_t::discarded):
{
break;
}
case (value_t::object):
{
{
m_value = *other.m_value.object;
m_value = *other.m_value.object;
break;
break;
}
}
case
(value_t::array)
:
case
value_t::array
:
{
{
m_value = *other.m_value.array;
m_value = *other.m_value.array;
break;
break;
}
}
case
(value_t::string)
:
case
value_t::string
:
{
{
m_value = *other.m_value.string;
m_value = *other.m_value.string;
break;
break;
}
}
case
(value_t::boolean)
:
case
value_t::boolean
:
{
{
m_value = other.m_value.boolean;
m_value = other.m_value.boolean;
break;
break;
}
}
case
(value_t::number_integer)
:
case
value_t::number_integer
:
{
{
m_value = other.m_value.number_integer;
m_value = other.m_value.number_integer;
break;
break;
}
}
case
(value_t::number_float)
:
case
value_t::number_float
:
{
{
m_value = other.m_value.number_float;
m_value = other.m_value.number_float;
break;
break;
}
}
case value_t::discarded:
case value_t::null:
default:
{
break;
}
}
}
}
}
...
@@ -1687,7 +1695,7 @@ class basic_json
...
@@ -1687,7 +1695,7 @@ class basic_json
{
{
switch (m_type)
switch (m_type)
{
{
case
(value_t::object)
:
case
value_t::object
:
{
{
AllocatorType<object_t> alloc;
AllocatorType<object_t> alloc;
alloc.destroy(m_value.object);
alloc.destroy(m_value.object);
...
@@ -1695,7 +1703,7 @@ class basic_json
...
@@ -1695,7 +1703,7 @@ class basic_json
break;
break;
}
}
case
(value_t::array)
:
case
value_t::array
:
{
{
AllocatorType<array_t> alloc;
AllocatorType<array_t> alloc;
alloc.destroy(m_value.array);
alloc.destroy(m_value.array);
...
@@ -1703,7 +1711,7 @@ class basic_json
...
@@ -1703,7 +1711,7 @@ class basic_json
break;
break;
}
}
case
(value_t::string)
:
case
value_t::string
:
{
{
AllocatorType<string_t> alloc;
AllocatorType<string_t> alloc;
alloc.destroy(m_value.string);
alloc.destroy(m_value.string);
...
@@ -1711,6 +1719,11 @@ class basic_json
...
@@ -1711,6 +1719,11 @@ class basic_json
break;
break;
}
}
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
default:
default:
{
{
// all other types need no specific destructor
// all other types need no specific destructor
...
@@ -2014,32 +2027,26 @@ class basic_json
...
@@ -2014,32 +2027,26 @@ class basic_json
, int>::type = 0>
, int>::type = 0>
T get_impl(T*) const
T get_impl(T*) const
{
{
switch (m_type
)
if (m_type == value_t::object
)
{
{
case (value_t::object):
return T(m_value.object->begin(), m_value.object->end());
{
}
return T(m_value.object->begin(), m_value.object->end());
else
}
{
default:
throw std::domain_error("type must be object, but is " + type_name());
{
throw std::domain_error("type must be object, but is " + type_name());
}
}
}
}
}
/// get an object (explicit)
/// get an object (explicit)
object_t get_impl(object_t*) const
object_t get_impl(object_t*) const
{
{
switch (m_type
)
if (m_type == value_t::object
)
{
{
case (value_t::object):
return *(m_value.object);
{
}
return *(m_value.object);
else
}
{
default:
throw std::domain_error("type must be object, but is " + type_name());
{
throw std::domain_error("type must be object, but is " + type_name());
}
}
}
}
}
...
@@ -2054,22 +2061,19 @@ class basic_json
...
@@ -2054,22 +2061,19 @@ class basic_json
, int>::type = 0>
, int>::type = 0>
T get_impl(T*) const
T get_impl(T*) const
{
{
switch (m_type
)
if (m_type == value_t::array
)
{
{
case (value_t::array):
T to_vector;
{
std::transform(m_value.array->begin(), m_value.array->end(),
T to_vector;
std::inserter(to_vector, to_vector.end()), [](basic_json i)
std::transform(m_value.array->begin(), m_value.array->end(),
std::inserter(to_vector, to_vector.end()), [](basic_json i)
{
return i.get<typename T::value_type>();
});
return to_vector;
}
default:
{
{
throw std::domain_error("type must be array, but is " + type_name());
return i.get<typename T::value_type>();
}
});
return to_vector;
}
else
{
throw std::domain_error("type must be array, but is " + type_name());
}
}
}
}
...
@@ -2081,23 +2085,20 @@ class basic_json
...
@@ -2081,23 +2085,20 @@ class basic_json
, int>::type = 0>
, int>::type = 0>
std::vector<T> get_impl(std::vector<T>*) const
std::vector<T> get_impl(std::vector<T>*) const
{
{
switch (m_type
)
if (m_type == value_t::array
)
{
{
case (value_t::array):
std::vector<T> to_vector;
to_vector.reserve(m_value.array->size());
std::transform(m_value.array->begin(), m_value.array->end(),
std::inserter(to_vector, to_vector.end()), [](basic_json i)
{
{
std::vector<T> to_vector;
return i.get<T>();
to_vector.reserve(m_value.array->size());
});
std::transform(m_value.array->begin(), m_value.array->end(),
return to_vector;
std::inserter(to_vector, to_vector.end()), [](basic_json i)
}
{
else
return i.get<T>();
{
});
throw std::domain_error("type must be array, but is " + type_name());
return to_vector;
}
default:
{
throw std::domain_error("type must be array, but is " + type_name());
}
}
}
}
}
...
@@ -2109,32 +2110,26 @@ class basic_json
...
@@ -2109,32 +2110,26 @@ class basic_json
, int>::type = 0>
, int>::type = 0>
T get_impl(T*) const
T get_impl(T*) const
{
{
switch (m_type
)
if (m_type == value_t::array
)
{
{
case (value_t::array):
return T(m_value.array->begin(), m_value.array->end());
{
}
return T(m_value.array->begin(), m_value.array->end());
else
}
{
default:
throw std::domain_error("type must be array, but is " + type_name());
{
throw std::domain_error("type must be array, but is " + type_name());
}
}
}
}
}
/// get an array (explicit)
/// get an array (explicit)
array_t get_impl(array_t*) const
array_t get_impl(array_t*) const
{
{
switch (m_type
)
if (m_type == value_t::array
)
{
{
case (value_t::array):
return *(m_value.array);
{
}
return *(m_value.array);
else
}
{
default:
throw std::domain_error("type must be array, but is " + type_name());
{
throw std::domain_error("type must be array, but is " + type_name());
}
}
}
}
}
...
@@ -2145,16 +2140,13 @@ class basic_json
...
@@ -2145,16 +2140,13 @@ class basic_json
, int>::type = 0>
, int>::type = 0>
T get_impl(T*) const
T get_impl(T*) const
{
{
switch (m_type
)
if (m_type == value_t::string
)
{
{
case (value_t::string):
return *m_value.string;
{
}
return *m_value.string;
else
}
{
default:
throw std::domain_error("type must be string, but is " + type_name());
{
throw std::domain_error("type must be string, but is " + type_name());
}
}
}
}
}
...
@@ -2167,14 +2159,22 @@ class basic_json
...
@@ -2167,14 +2159,22 @@ class basic_json
{
{
switch (m_type)
switch (m_type)
{
{
case
(value_t::number_integer)
:
case
value_t::number_integer
:
{
{
return static_cast<T>(m_value.number_integer);
return static_cast<T>(m_value.number_integer);
}
}
case (value_t::number_float):
case value_t::number_float:
{
{
return static_cast<T>(m_value.number_float);
return static_cast<T>(m_value.number_float);
}
}
case value_t::array:
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::object:
case value_t::string:
default:
default:
{
{
throw std::domain_error("type must be number, but is " + type_name());
throw std::domain_error("type must be number, but is " + type_name());
...
@@ -2185,16 +2185,13 @@ class basic_json
...
@@ -2185,16 +2185,13 @@ class basic_json
/// get a boolean (explicit)
/// get a boolean (explicit)
boolean_t get_impl(boolean_t*) const
boolean_t get_impl(boolean_t*) const
{
{
switch (m_type
)
if (m_type == value_t::boolean
)
{
{
case (value_t::boolean):
return m_value.boolean;
{
}
return m_value.boolean;
else
}
{
default:
throw std::domain_error("type must be boolean, but is " + type_name());
{
throw std::domain_error("type must be boolean, but is " + type_name());
}
}
}
}
}
...
@@ -2845,9 +2842,9 @@ class basic_json
...
@@ -2845,9 +2842,9 @@ class basic_json
switch (m_type)
switch (m_type)
{
{
case value_t::number_integer:
case value_t::number_float:
case value_t::boolean:
case value_t::boolean:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
case value_t::string:
{
{
if (not pos.m_it.primitive_iterator.is_begin())
if (not pos.m_it.primitive_iterator.is_begin())
...
@@ -2877,6 +2874,8 @@ class basic_json
...
@@ -2877,6 +2874,8 @@ class basic_json
break;
break;
}
}
case value_t::discarded:
case value_t::null:
default:
default:
{
{
throw std::domain_error("cannot use erase() with " + type_name());
throw std::domain_error("cannot use erase() with " + type_name());
...
@@ -2938,9 +2937,9 @@ class basic_json
...
@@ -2938,9 +2937,9 @@ class basic_json
switch (m_type)
switch (m_type)
{
{
case value_t::number_integer:
case value_t::number_float:
case value_t::boolean:
case value_t::boolean:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
case value_t::string:
{
{
if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())
if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())
...
@@ -2972,6 +2971,8 @@ class basic_json
...
@@ -2972,6 +2971,8 @@ class basic_json
break;
break;
}
}
case value_t::discarded:
case value_t::null:
default:
default:
{
{
throw std::domain_error("cannot use erase with " + type_name());
throw std::domain_error("cannot use erase with " + type_name());
...
@@ -3364,21 +3365,26 @@ class basic_json
...
@@ -3364,21 +3365,26 @@ class basic_json
{
{
switch (m_type)
switch (m_type)
{
{
case
(value_t::null)
:
case
value_t::null
:
{
{
return true;
return true;
}
}
case
(value_t::array)
:
case
value_t::array
:
{
{
return m_value.array->empty();
return m_value.array->empty();
}
}
case
(value_t::object)
:
case
value_t::object
:
{
{
return m_value.object->empty();
return m_value.object->empty();
}
}
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default:
default:
{
{
// all other types are nonempty
// all other types are nonempty
...
@@ -3418,21 +3424,26 @@ class basic_json
...
@@ -3418,21 +3424,26 @@ class basic_json
{
{
switch (m_type)
switch (m_type)
{
{
case
(value_t::null)
:
case
value_t::null
:
{
{
return 0;
return 0;
}
}
case
(value_t::array)
:
case
value_t::array
:
{
{
return m_value.array->size();
return m_value.array->size();
}
}
case
(value_t::object)
:
case
value_t::object
:
{
{
return m_value.object->size();
return m_value.object->size();
}
}
case value_t::boolean:
case value_t::discarded:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default:
default:
{
{
// all other types have size 1
// all other types have size 1
...
@@ -3475,16 +3486,22 @@ class basic_json
...
@@ -3475,16 +3486,22 @@ class basic_json
{
{
switch (m_type)
switch (m_type)
{
{
case
(value_t::array)
:
case
value_t::array
:
{
{
return m_value.array->max_size();
return m_value.array->max_size();
}
}
case
(value_t::object)
:
case
value_t::object
:
{
{
return m_value.object->max_size();
return m_value.object->max_size();
}
}
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default:
default:
{
{
// all other types have max_size() == size()
// all other types have max_size() == size()
...
@@ -3530,47 +3547,48 @@ class basic_json
...
@@ -3530,47 +3547,48 @@ class basic_json
{
{
switch (m_type)
switch (m_type)
{
{
case (value_t::null):
case value_t::number_integer:
case (value_t::discarded):
{
break;
}
case (value_t::number_integer):
{
{
m_value.number_integer = 0;
m_value.number_integer = 0;
break;
break;
}
}
case
(value_t::number_float)
:
case
value_t::number_float
:
{
{
m_value.number_float = 0.0;
m_value.number_float = 0.0;
break;
break;
}
}
case
(value_t::boolean)
:
case
value_t::boolean
:
{
{
m_value.boolean = false;
m_value.boolean = false;
break;
break;
}
}
case
(value_t::string)
:
case
value_t::string
:
{
{
m_value.string->clear();
m_value.string->clear();
break;
break;
}
}
case
(value_t::array)
:
case
value_t::array
:
{
{
m_value.array->clear();
m_value.array->clear();
break;
break;
}
}
case
(value_t::object)
:
case
value_t::object
:
{
{
m_value.object->clear();
m_value.object->clear();
break;
break;
}
}
case value_t::discarded:
case value_t::null:
default:
{
break;
}
}
}
}
}
...
@@ -4067,21 +4085,23 @@ class basic_json
...
@@ -4067,21 +4085,23 @@ class basic_json
{
{
switch (lhs_type)
switch (lhs_type)
{
{
case
(value_t::array)
:
case
value_t::array
:
return *lhs.m_value.array == *rhs.m_value.array;
return *lhs.m_value.array == *rhs.m_value.array;
case
(value_t::object)
:
case
value_t::object
:
return *lhs.m_value.object == *rhs.m_value.object;
return *lhs.m_value.object == *rhs.m_value.object;
case
(value_t::null)
:
case
value_t::null
:
return true;
return true;
case
(value_t::string)
:
case
value_t::string
:
return *lhs.m_value.string == *rhs.m_value.string;
return *lhs.m_value.string == *rhs.m_value.string;
case
(value_t::boolean)
:
case
value_t::boolean
:
return lhs.m_value.boolean == rhs.m_value.boolean;
return lhs.m_value.boolean == rhs.m_value.boolean;
case
(value_t::number_integer)
:
case
value_t::number_integer
:
return lhs.m_value.number_integer == rhs.m_value.number_integer;
return lhs.m_value.number_integer == rhs.m_value.number_integer;
case
(value_t::number_float)
:
case
value_t::number_float
:
return approx(lhs.m_value.number_float, rhs.m_value.number_float);
return approx(lhs.m_value.number_float, rhs.m_value.number_float);
case (value_t::discarded):
case value_t::discarded:
return false;
default:
return false;
return false;
}
}
}
}
...
@@ -4208,21 +4228,23 @@ class basic_json
...
@@ -4208,21 +4228,23 @@ class basic_json
{
{
switch (lhs_type)
switch (lhs_type)
{
{
case
(value_t::array)
:
case
value_t::array
:
return *lhs.m_value.array < *rhs.m_value.array;
return *lhs.m_value.array < *rhs.m_value.array;
case
(value_t::object)
:
case
value_t::object
:
return *lhs.m_value.object < *rhs.m_value.object;
return *lhs.m_value.object < *rhs.m_value.object;
case
(value_t::null)
:
case
value_t::null
:
return false;
return false;
case
(value_t::string)
:
case
value_t::string
:
return *lhs.m_value.string < *rhs.m_value.string;
return *lhs.m_value.string < *rhs.m_value.string;
case
(value_t::boolean)
:
case
value_t::boolean
:
return lhs.m_value.boolean < rhs.m_value.boolean;
return lhs.m_value.boolean < rhs.m_value.boolean;
case
(value_t::number_integer)
:
case
value_t::number_integer
:
return lhs.m_value.number_integer < rhs.m_value.number_integer;
return lhs.m_value.number_integer < rhs.m_value.number_integer;
case
(value_t::number_float)
:
case
value_t::number_float
:
return lhs.m_value.number_float < rhs.m_value.number_float;
return lhs.m_value.number_float < rhs.m_value.number_float;
case (value_t::discarded):
case value_t::discarded:
return false;
default:
return false;
return false;
}
}
}
}
...
@@ -4475,36 +4497,38 @@ class basic_json
...
@@ -4475,36 +4497,38 @@ class basic_json
{
{
switch (m_type)
switch (m_type)
{
{
case
(value_t::null)
:
case
value_t::null
:
{
{
return "null";
return "null";
}
}
case
(value_t::object)
:
case
value_t::object
:
{
{
return "object";
return "object";
}
}
case
(value_t::array)
:
case
value_t::array
:
{
{
return "array";
return "array";
}
}
case
(value_t::string)
:
case
value_t::string
:
{
{
return "string";
return "string";
}
}
case
(value_t::boolean)
:
case
value_t::boolean
:
{
{
return "boolean";
return "boolean";
}
}
case
(value_t::discarded)
:
case
value_t::discarded
:
{
{
return "discarded";
return "discarded";
}
}
case value_t::number_float:
case value_t::number_integer:
default:
default:
{
{
return "number";
return "number";
...
@@ -4699,7 +4723,7 @@ class basic_json
...
@@ -4699,7 +4723,7 @@ class basic_json
switch (m_type)
switch (m_type)
{
{
case
(value_t::object)
:
case
value_t::object
:
{
{
if (m_value.object->empty())
if (m_value.object->empty())
{
{
...
@@ -4739,7 +4763,7 @@ class basic_json
...
@@ -4739,7 +4763,7 @@ class basic_json
return;
return;
}
}
case
(value_t::array)
:
case
value_t::array
:
{
{
if (m_value.array->empty())
if (m_value.array->empty())
{
{
...
@@ -4777,25 +4801,25 @@ class basic_json
...
@@ -4777,25 +4801,25 @@ class basic_json
return;
return;
}
}
case
(value_t::string)
:
case
value_t::string
:
{
{
o << string_t("\"") << escape_string(*m_value.string) << "\"";
o << string_t("\"") << escape_string(*m_value.string) << "\"";
return;
return;
}
}
case
(value_t::boolean)
:
case
value_t::boolean
:
{
{
o << (m_value.boolean ? "true" : "false");
o << (m_value.boolean ? "true" : "false");
return;
return;
}
}
case
(value_t::number_integer)
:
case
value_t::number_integer
:
{
{
o << m_value.number_integer;
o << m_value.number_integer;
return;
return;
}
}
case
(value_t::number_float)
:
case
value_t::number_float
:
{
{
// 15 digits of precision allows round-trip IEEE 754
// 15 digits of precision allows round-trip IEEE 754
// string->double->string; to be safe, we read this value from
// string->double->string; to be safe, we read this value from
...
@@ -4804,17 +4828,22 @@ class basic_json
...
@@ -4804,17 +4828,22 @@ class basic_json
return;
return;
}
}
case
(value_t::discarded)
:
case
value_t::discarded
:
{
{
o << "<discarded>";
o << "<discarded>";
return;
return;
}
}
default
:
case value_t::null
:
{
{
o << "null";
o << "null";
return;
return;
}
}
default:
{
return;
}
}
}
}
}
...
@@ -4950,16 +4979,24 @@ class basic_json
...
@@ -4950,16 +4979,24 @@ class basic_json
{
{
switch (m_object->m_type)
switch (m_object->m_type)
{
{
case
(basic_json::value_t::object)
:
case
basic_json::value_t::object
:
{
{
m_it.object_iterator = typename object_t::iterator();
m_it.object_iterator = typename object_t::iterator();
break;
break;
}
}
case (basic_json::value_t::array):
case basic_json::value_t::array:
{
{
m_it.array_iterator = typename array_t::iterator();
m_it.array_iterator = typename array_t::iterator();
break;
break;
}
}
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default:
default:
{
{
m_it.primitive_iterator = primitive_iterator_t();
m_it.primitive_iterator = primitive_iterator_t();
...
@@ -4973,18 +5010,24 @@ class basic_json
...
@@ -4973,18 +5010,24 @@ class basic_json
{
{
switch (m_object->m_type)
switch (m_object->m_type)
{
{
case
(basic_json::value_t::object)
:
case
basic_json::value_t::object
:
{
{
m_it.object_iterator = other.m_it.object_iterator;
m_it.object_iterator = other.m_it.object_iterator;
break;
break;
}
}
case
(basic_json::value_t::array)
:
case
basic_json::value_t::array
:
{
{
m_it.array_iterator = other.m_it.array_iterator;
m_it.array_iterator = other.m_it.array_iterator;
break;
break;
}
}
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default:
default:
{
{
m_it.primitive_iterator = other.m_it.primitive_iterator;
m_it.primitive_iterator = other.m_it.primitive_iterator;
...
@@ -5017,25 +5060,30 @@ class basic_json
...
@@ -5017,25 +5060,30 @@ class basic_json
{
{
switch (m_object->m_type)
switch (m_object->m_type)
{
{
case
(basic_json::value_t::object)
:
case
basic_json::value_t::object
:
{
{
m_it.object_iterator = m_object->m_value.object->begin();
m_it.object_iterator = m_object->m_value.object->begin();
break;
break;
}
}
case
(basic_json::value_t::array)
:
case
basic_json::value_t::array
:
{
{
m_it.array_iterator = m_object->m_value.array->begin();
m_it.array_iterator = m_object->m_value.array->begin();
break;
break;
}
}
case
(basic_json::value_t::null)
:
case
basic_json::value_t::null
:
{
{
// set to end so begin()==end() is true: null is empty
// set to end so begin()==end() is true: null is empty
m_it.primitive_iterator.set_end();
m_it.primitive_iterator.set_end();
break;
break;
}
}
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default:
default:
{
{
m_it.primitive_iterator.set_begin();
m_it.primitive_iterator.set_begin();
...
@@ -5049,18 +5097,24 @@ class basic_json
...
@@ -5049,18 +5097,24 @@ class basic_json
{
{
switch (m_object->m_type)
switch (m_object->m_type)
{
{
case
(basic_json::value_t::object)
:
case
basic_json::value_t::object
:
{
{
m_it.object_iterator = m_object->m_value.object->end();
m_it.object_iterator = m_object->m_value.object->end();
break;
break;
}
}
case
(basic_json::value_t::array)
:
case
basic_json::value_t::array
:
{
{
m_it.array_iterator = m_object->m_value.array->end();
m_it.array_iterator = m_object->m_value.array->end();
break;
break;
}
}
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default:
default:
{
{
m_it.primitive_iterator.set_end();
m_it.primitive_iterator.set_end();
...
@@ -5075,21 +5129,26 @@ class basic_json
...
@@ -5075,21 +5129,26 @@ class basic_json
{
{
switch (m_object->m_type)
switch (m_object->m_type)
{
{
case
(basic_json::value_t::object)
:
case
basic_json::value_t::object
:
{
{
return m_it.object_iterator->second;
return m_it.object_iterator->second;
}
}
case
(basic_json::value_t::array)
:
case
basic_json::value_t::array
:
{
{
return *m_it.array_iterator;
return *m_it.array_iterator;
}
}
case
(basic_json::value_t::null)
:
case
basic_json::value_t::null
:
{
{
throw std::out_of_range("cannot get value");
throw std::out_of_range("cannot get value");
}
}
case value_t::boolean:
case value_t::discarded:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default:
default:
{
{
if (m_it.primitive_iterator.is_begin())
if (m_it.primitive_iterator.is_begin())
...
@@ -5109,16 +5168,22 @@ class basic_json
...
@@ -5109,16 +5168,22 @@ class basic_json
{
{
switch (m_object->m_type)
switch (m_object->m_type)
{
{
case
(basic_json::value_t::object)
:
case
basic_json::value_t::object
:
{
{
return &(m_it.object_iterator->second);
return &(m_it.object_iterator->second);
}
}
case
(basic_json::value_t::array)
:
case
basic_json::value_t::array
:
{
{
return &*m_it.array_iterator;
return &*m_it.array_iterator;
}
}
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default:
default:
{
{
if (m_it.primitive_iterator.is_begin())
if (m_it.primitive_iterator.is_begin())
...
@@ -5147,18 +5212,24 @@ class basic_json
...
@@ -5147,18 +5212,24 @@ class basic_json
{
{
switch (m_object->m_type)
switch (m_object->m_type)
{
{
case
(basic_json::value_t::object)
:
case
basic_json::value_t::object
:
{
{
++m_it.object_iterator;
++m_it.object_iterator;
break;
break;
}
}
case
(basic_json::value_t::array)
:
case
basic_json::value_t::array
:
{
{
++m_it.array_iterator;
++m_it.array_iterator;
break;
break;
}
}
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default:
default:
{
{
++m_it.primitive_iterator;
++m_it.primitive_iterator;
...
@@ -5183,18 +5254,24 @@ class basic_json
...
@@ -5183,18 +5254,24 @@ class basic_json
{
{
switch (m_object->m_type)
switch (m_object->m_type)
{
{
case
(basic_json::value_t::object)
:
case
basic_json::value_t::object
:
{
{
--m_it.object_iterator;
--m_it.object_iterator;
break;
break;
}
}
case
(basic_json::value_t::array)
:
case
basic_json::value_t::array
:
{
{
--m_it.array_iterator;
--m_it.array_iterator;
break;
break;
}
}
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default:
default:
{
{
--m_it.primitive_iterator;
--m_it.primitive_iterator;
...
@@ -5216,16 +5293,22 @@ class basic_json
...
@@ -5216,16 +5293,22 @@ class basic_json
switch (m_object->m_type)
switch (m_object->m_type)
{
{
case
(basic_json::value_t::object)
:
case
basic_json::value_t::object
:
{
{
return (m_it.object_iterator == other.m_it.object_iterator);
return (m_it.object_iterator == other.m_it.object_iterator);
}
}
case
(basic_json::value_t::array)
:
case
basic_json::value_t::array
:
{
{
return (m_it.array_iterator == other.m_it.array_iterator);
return (m_it.array_iterator == other.m_it.array_iterator);
}
}
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default:
default:
{
{
return (m_it.primitive_iterator == other.m_it.primitive_iterator);
return (m_it.primitive_iterator == other.m_it.primitive_iterator);
...
@@ -5250,16 +5333,22 @@ class basic_json
...
@@ -5250,16 +5333,22 @@ class basic_json
switch (m_object->m_type)
switch (m_object->m_type)
{
{
case
(basic_json::value_t::object)
:
case
basic_json::value_t::object
:
{
{
throw std::domain_error("cannot use operator< for object iterators");
throw std::domain_error("cannot use operator< for object iterators");
}
}
case
(basic_json::value_t::array)
:
case
basic_json::value_t::array
:
{
{
return (m_it.array_iterator < other.m_it.array_iterator);
return (m_it.array_iterator < other.m_it.array_iterator);
}
}
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default:
default:
{
{
return (m_it.primitive_iterator < other.m_it.primitive_iterator);
return (m_it.primitive_iterator < other.m_it.primitive_iterator);
...
@@ -5290,17 +5379,23 @@ class basic_json
...
@@ -5290,17 +5379,23 @@ class basic_json
{
{
switch (m_object->m_type)
switch (m_object->m_type)
{
{
case
(basic_json::value_t::object)
:
case
basic_json::value_t::object
:
{
{
throw std::domain_error("cannot use operator+= for object iterators");
throw std::domain_error("cannot use operator+= for object iterators");
}
}
case
(basic_json::value_t::array)
:
case
basic_json::value_t::array
:
{
{
m_it.array_iterator += i;
m_it.array_iterator += i;
break;
break;
}
}
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default:
default:
{
{
m_it.primitive_iterator += i;
m_it.primitive_iterator += i;
...
@@ -5338,16 +5433,22 @@ class basic_json
...
@@ -5338,16 +5433,22 @@ class basic_json
{
{
switch (m_object->m_type)
switch (m_object->m_type)
{
{
case
(basic_json::value_t::object)
:
case
basic_json::value_t::object
:
{
{
throw std::domain_error("cannot use operator- for object iterators");
throw std::domain_error("cannot use operator- for object iterators");
}
}
case
(basic_json::value_t::array)
:
case
basic_json::value_t::array
:
{
{
return m_it.array_iterator - other.m_it.array_iterator;
return m_it.array_iterator - other.m_it.array_iterator;
}
}
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default:
default:
{
{
return m_it.primitive_iterator - other.m_it.primitive_iterator;
return m_it.primitive_iterator - other.m_it.primitive_iterator;
...
@@ -5360,21 +5461,26 @@ class basic_json
...
@@ -5360,21 +5461,26 @@ class basic_json
{
{
switch (m_object->m_type)
switch (m_object->m_type)
{
{
case
(basic_json::value_t::object)
:
case
basic_json::value_t::object
:
{
{
throw std::domain_error("cannot use operator[] for object iterators");
throw std::domain_error("cannot use operator[] for object iterators");
}
}
case
(basic_json::value_t::array)
:
case
basic_json::value_t::array
:
{
{
return *(m_it.array_iterator + n);
return *(m_it.array_iterator + n);
}
}
case
(basic_json::value_t::null)
:
case
basic_json::value_t::null
:
{
{
throw std::out_of_range("cannot get value");
throw std::out_of_range("cannot get value");
}
}
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default:
default:
{
{
if (m_it.primitive_iterator == -n)
if (m_it.primitive_iterator == -n)
...
@@ -5392,17 +5498,13 @@ class basic_json
...
@@ -5392,17 +5498,13 @@ class basic_json
/// return the key of an object iterator
/// return the key of an object iterator
typename object_t::key_type key() const
typename object_t::key_type key() const
{
{
switch (m_object->m_type
)
if (m_object->m_type == basic_json::value_t::object
)
{
{
case (basic_json::value_t::object):
return m_it.object_iterator->first;
{
}
return m_it.object_iterator->first;
else
}
{
throw std::domain_error("cannot use key() for non-object iterators");
default:
{
throw std::domain_error("cannot use key() for non-object iterators");
}
}
}
}
}
...
@@ -5713,18 +5815,24 @@ class basic_json
...
@@ -5713,18 +5815,24 @@ class basic_json
switch (anchor.m_object->type())
switch (anchor.m_object->type())
{
{
/// use integer array index as key
/// use integer array index as key
case
(value_t::array)
:
case
value_t::array
:
{
{
return std::to_string(array_index);
return std::to_string(array_index);
}
}
/// use key from the object
/// use key from the object
case
(value_t::object)
:
case
value_t::object
:
{
{
return anchor.key();
return anchor.key();
}
}
/// use an empty key for all primitive types
/// use an empty key for all primitive types
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default:
default:
{
{
return "";
return "";
...
@@ -5899,34 +6007,36 @@ class basic_json
...
@@ -5899,34 +6007,36 @@ class basic_json
{
{
switch (t)
switch (t)
{
{
case
(token_type::uninitialized)
:
case
token_type::uninitialized
:
return "<uninitialized>";
return "<uninitialized>";
case
(token_type::literal_true)
:
case
token_type::literal_true
:
return "true literal";
return "true literal";
case
(token_type::literal_false)
:
case
token_type::literal_false
:
return "false literal";
return "false literal";
case
(token_type::literal_null)
:
case
token_type::literal_null
:
return "null literal";
return "null literal";
case
(token_type::value_string)
:
case
token_type::value_string
:
return "string literal";
return "string literal";
case
(token_type::value_number)
:
case
token_type::value_number
:
return "number literal";
return "number literal";
case
(token_type::begin_array)
:
case
token_type::begin_array
:
return "[";
return "[";
case
(token_type::begin_object)
:
case
token_type::begin_object
:
return "{";
return "{";
case
(token_type::end_array)
:
case
token_type::end_array
:
return "]";
return "]";
case
(token_type::end_object)
:
case
token_type::end_object
:
return "}";
return "}";
case
(token_type::name_separator)
:
case
token_type::name_separator
:
return ":";
return ":";
case
(token_type::value_separator)
:
case
token_type::value_separator
:
return ",";
return ",";
case
(token_type::end_of_input)
:
case
token_type::end_of_input
:
return "<end of input>";
return "<end of input>";
default
:
case token_type::parse_error
:
return "<parse error>";
return "<parse error>";
default:
return "";
}
}
}
}
...
@@ -6156,6 +6266,11 @@ class basic_json
...
@@ -6156,6 +6266,11 @@ class basic_json
}
}
break;
break;
}
}
default:
{
break;
}
}
}
}
}
else
else
...
@@ -6257,7 +6372,7 @@ class basic_json
...
@@ -6257,7 +6372,7 @@ class basic_json
switch (last_token)
switch (last_token)
{
{
case
(lexer::token_type::begin_object)
:
case
lexer::token_type::begin_object
:
{
{
if (keep and (not callback or (keep = callback(depth++, parse_event_t::object_start, result))))
if (keep and (not callback or (keep = callback(depth++, parse_event_t::object_start, result))))
{
{
...
@@ -6335,7 +6450,7 @@ class basic_json
...
@@ -6335,7 +6450,7 @@ class basic_json
return result;
return result;
}
}
case
(lexer::token_type::begin_array)
:
case
lexer::token_type::begin_array
:
{
{
if (keep and (not callback or (keep = callback(depth++, parse_event_t::array_start, result))))
if (keep and (not callback or (keep = callback(depth++, parse_event_t::array_start, result))))
{
{
...
@@ -6390,14 +6505,14 @@ class basic_json
...
@@ -6390,14 +6505,14 @@ class basic_json
return result;
return result;
}
}
case
(lexer::token_type::literal_null)
:
case
lexer::token_type::literal_null
:
{
{
get_token();
get_token();
result.m_type = value_t::null;
result.m_type = value_t::null;
break;
break;
}
}
case
(lexer::token_type::value_string)
:
case
lexer::token_type::value_string
:
{
{
const auto s = m_lexer.get_string();
const auto s = m_lexer.get_string();
get_token();
get_token();
...
@@ -6405,7 +6520,7 @@ class basic_json
...
@@ -6405,7 +6520,7 @@ class basic_json
break;
break;
}
}
case
(lexer::token_type::literal_true)
:
case
lexer::token_type::literal_true
:
{
{
get_token();
get_token();
result.m_type = value_t::boolean;
result.m_type = value_t::boolean;
...
@@ -6413,7 +6528,7 @@ class basic_json
...
@@ -6413,7 +6528,7 @@ class basic_json
break;
break;
}
}
case
(lexer::token_type::literal_false)
:
case
lexer::token_type::literal_false
:
{
{
get_token();
get_token();
result.m_type = value_t::boolean;
result.m_type = value_t::boolean;
...
@@ -6421,7 +6536,7 @@ class basic_json
...
@@ -6421,7 +6536,7 @@ class basic_json
break;
break;
}
}
case
(lexer::token_type::value_number)
:
case
lexer::token_type::value_number
:
{
{
auto float_val = m_lexer.get_number();
auto float_val = m_lexer.get_number();
...
@@ -6452,6 +6567,13 @@ class basic_json
...
@@ -6452,6 +6567,13 @@ class basic_json
break;
break;
}
}
case lexer::token_type::end_array:
case lexer::token_type::end_object:
case lexer::token_type::end_of_input:
case lexer::token_type::name_separator:
case lexer::token_type::parse_error:
case lexer::token_type::uninitialized:
case lexer::token_type::value_separator:
default:
default:
{
{
// the last token was unexpected
// the last token was unexpected
...
...
test/unit.cpp
View file @
258f04c5
...
@@ -9263,6 +9263,11 @@ TEST_CASE("iterator_wrapper")
...
@@ -9263,6 +9263,11 @@ TEST_CASE("iterator_wrapper")
CHECK
(
i
.
value
()
==
json
(
2
));
CHECK
(
i
.
value
()
==
json
(
2
));
break
;
break
;
}
}
default
:
{
break
;
}
}
}
}
}
...
@@ -9291,6 +9296,11 @@ TEST_CASE("iterator_wrapper")
...
@@ -9291,6 +9296,11 @@ TEST_CASE("iterator_wrapper")
CHECK
(
i
.
value
()
==
json
(
2
));
CHECK
(
i
.
value
()
==
json
(
2
));
break
;
break
;
}
}
default
:
{
break
;
}
}
}
}
}
...
@@ -9319,6 +9329,11 @@ TEST_CASE("iterator_wrapper")
...
@@ -9319,6 +9329,11 @@ TEST_CASE("iterator_wrapper")
CHECK
(
i
.
value
()
==
json
(
2
));
CHECK
(
i
.
value
()
==
json
(
2
));
break
;
break
;
}
}
default
:
{
break
;
}
}
}
}
}
...
@@ -9347,6 +9362,11 @@ TEST_CASE("iterator_wrapper")
...
@@ -9347,6 +9362,11 @@ TEST_CASE("iterator_wrapper")
CHECK
(
i
.
value
()
==
json
(
2
));
CHECK
(
i
.
value
()
==
json
(
2
));
break
;
break
;
}
}
default
:
{
break
;
}
}
}
}
}
...
@@ -9378,6 +9398,11 @@ TEST_CASE("iterator_wrapper")
...
@@ -9378,6 +9398,11 @@ TEST_CASE("iterator_wrapper")
CHECK
(
i
.
value
()
==
"B"
);
CHECK
(
i
.
value
()
==
"B"
);
break
;
break
;
}
}
default
:
{
break
;
}
}
}
}
}
...
@@ -9406,6 +9431,11 @@ TEST_CASE("iterator_wrapper")
...
@@ -9406,6 +9431,11 @@ TEST_CASE("iterator_wrapper")
CHECK
(
i
.
value
()
==
"B"
);
CHECK
(
i
.
value
()
==
"B"
);
break
;
break
;
}
}
default
:
{
break
;
}
}
}
}
}
...
@@ -9434,6 +9464,11 @@ TEST_CASE("iterator_wrapper")
...
@@ -9434,6 +9464,11 @@ TEST_CASE("iterator_wrapper")
CHECK
(
i
.
value
()
==
"B"
);
CHECK
(
i
.
value
()
==
"B"
);
break
;
break
;
}
}
default
:
{
break
;
}
}
}
}
}
...
@@ -9462,6 +9497,11 @@ TEST_CASE("iterator_wrapper")
...
@@ -9462,6 +9497,11 @@ TEST_CASE("iterator_wrapper")
CHECK
(
i
.
value
()
==
"B"
);
CHECK
(
i
.
value
()
==
"B"
);
break
;
break
;
}
}
default
:
{
break
;
}
}
}
}
}
...
...
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