Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
J
json
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
json
Commits
3a7585e7
Unverified
Commit
3a7585e7
authored
7 years ago
by
Niels Lohmann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
added more tests
parent
31bfabc4
Changes
2
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
690 additions
and
316 deletions
+690
-316
src/json.hpp
src/json.hpp
+77
-65
test/src/unit-ubjson.cpp
test/src/unit-ubjson.cpp
+613
-251
No files found.
src/json.hpp
View file @
3a7585e7
...
@@ -4549,7 +4549,7 @@ class binary_reader
...
@@ -4549,7 +4549,7 @@ class binary_reader
const
auto
res
=
parse_ubjson_internal
();
const
auto
res
=
parse_ubjson_internal
();
if
(
strict
)
if
(
strict
)
{
{
get
();
get
_ignore_noop
();
check_eof
(
true
);
check_eof
(
true
);
}
}
return
res
;
return
res
;
...
@@ -5591,11 +5591,9 @@ class binary_reader
...
@@ -5591,11 +5591,9 @@ class binary_reader
get_ignore_noop
();
get_ignore_noop
();
switch
(
current
)
if
(
current
==
'$'
)
{
{
case
'$'
:
get
();
// must not ignore 'N', because 'N' maybe the type
{
get_ignore_noop
();
check_eof
();
check_eof
();
tc
=
current
;
tc
=
current
;
...
@@ -5605,21 +5603,13 @@ class binary_reader
...
@@ -5605,21 +5603,13 @@ class binary_reader
assert
(
false
);
assert
(
false
);
}
}
sz
=
parse_ubjson_internal
();
sz
=
parse_ubjson_internal
();
break
;
}
}
else
if
(
current
==
'#'
)
case
'#'
:
{
{
sz
=
parse_ubjson_internal
();
sz
=
parse_ubjson_internal
();
break
;
}
default:
break
;
}
}
return
std
::
make_pair
(
sz
,
tc
);
return
std
::
make_pair
(
sz
,
tc
);
}
}
BasicJsonType
get_ubjson_value
(
const
int
prefix
)
BasicJsonType
get_ubjson_value
(
const
int
prefix
)
...
@@ -5656,6 +5646,7 @@ class binary_reader
...
@@ -5656,6 +5646,7 @@ class binary_reader
{
{
get
();
get
();
check_eof
();
check_eof
();
assert
(
0
<=
current
and
current
<=
127
);
return
std
::
string
(
1
,
static_cast
<
char
>
(
current
));
return
std
::
string
(
1
,
static_cast
<
char
>
(
current
));
}
}
...
@@ -5682,17 +5673,23 @@ class binary_reader
...
@@ -5682,17 +5673,23 @@ class binary_reader
const
auto
size_and_type
=
get_ubjson_size_type
();
const
auto
size_and_type
=
get_ubjson_size_type
();
if
(
size_and_type
.
first
!=
std
::
string
::
npos
)
if
(
size_and_type
.
first
!=
std
::
string
::
npos
)
{
for
(
std
::
size_t
i
=
0
;
i
<
size_and_type
.
first
;
++
i
)
{
{
if
(
size_and_type
.
second
!=
0
)
if
(
size_and_type
.
second
!=
0
)
{
{
result
.
push_back
(
get_ubjson_value
(
size_and_type
.
second
));
if
(
size_and_type
.
second
!=
'N'
)
std
::
generate_n
(
std
::
back_inserter
(
*
result
.
m_value
.
array
),
size_and_type
.
first
,
[
this
,
size_and_type
]()
{
return
get_ubjson_value
(
size_and_type
.
second
);
});
}
}
else
else
{
{
result
.
push_back
(
parse_ubjson_internal
());
std
::
generate_n
(
std
::
back_inserter
(
*
result
.
m_value
.
array
),
}
size_and_type
.
first
,
[
this
]()
{
return
parse_ubjson_internal
();
});
}
}
}
}
else
else
...
@@ -5714,17 +5711,28 @@ class binary_reader
...
@@ -5714,17 +5711,28 @@ class binary_reader
if
(
size_and_type
.
first
!=
std
::
string
::
npos
)
if
(
size_and_type
.
first
!=
std
::
string
::
npos
)
{
{
for
(
std
::
size_t
i
=
0
;
i
<
size_and_type
.
first
;
++
i
)
{
auto
key
=
get_ubjson_string
();
if
(
size_and_type
.
second
!=
0
)
if
(
size_and_type
.
second
!=
0
)
{
{
result
[
std
::
move
(
key
)]
=
get_ubjson_value
(
size_and_type
.
second
);
if
(
size_and_type
.
second
!=
'N'
)
std
::
generate_n
(
std
::
inserter
(
*
result
.
m_value
.
object
,
result
.
m_value
.
object
->
end
()),
size_and_type
.
first
,
[
this
,
size_and_type
]()
{
auto
key
=
get_ubjson_string
();
auto
val
=
get_ubjson_value
(
size_and_type
.
second
);
return
std
::
make_pair
(
std
::
move
(
key
),
std
::
move
(
val
));
});
}
}
else
else
{
{
result
[
std
::
move
(
key
)]
=
parse_ubjson_internal
();
std
::
generate_n
(
std
::
inserter
(
*
result
.
m_value
.
object
,
}
result
.
m_value
.
object
->
end
()),
size_and_type
.
first
,
[
this
]()
{
auto
key
=
get_ubjson_string
();
auto
val
=
parse_ubjson_internal
();
return
std
::
make_pair
(
std
::
move
(
key
),
std
::
move
(
val
));
});
}
}
}
}
else
else
...
@@ -6282,10 +6290,8 @@ class binary_writer
...
@@ -6282,10 +6290,8 @@ class binary_writer
@param[in] use_type whether to use '$' prefixes (optimized format)
@param[in] use_type whether to use '$' prefixes (optimized format)
@param[in] add_prefix whether prefixes need to be used for this value
@param[in] add_prefix whether prefixes need to be used for this value
*/
*/
void
write_ubjson
(
const
BasicJsonType
&
j
,
void
write_ubjson
(
const
BasicJsonType
&
j
,
const
bool
use_count
,
const
bool
use_count
=
false
,
const
bool
use_type
,
const
bool
add_prefix
=
true
)
const
bool
use_type
=
false
,
const
bool
add_prefix
=
true
)
{
{
switch
(
j
.
type
())
switch
(
j
.
type
())
{
{
...
@@ -6348,6 +6354,7 @@ class binary_writer
...
@@ -6348,6 +6354,7 @@ class binary_writer
bool
prefix_required
=
true
;
bool
prefix_required
=
true
;
if
(
use_type
and
not
j
.
m_value
.
array
->
empty
())
if
(
use_type
and
not
j
.
m_value
.
array
->
empty
())
{
{
assert
(
use_count
);
const
char
first_prefix
=
ubjson_prefix
(
j
.
front
());
const
char
first_prefix
=
ubjson_prefix
(
j
.
front
());
const
bool
same_prefix
=
std
::
all_of
(
j
.
begin
()
+
1
,
j
.
end
(),
const
bool
same_prefix
=
std
::
all_of
(
j
.
begin
()
+
1
,
j
.
end
(),
[
this
,
first_prefix
](
const
BasicJsonType
&
v
)
[
this
,
first_prefix
](
const
BasicJsonType
&
v
)
...
@@ -6392,6 +6399,7 @@ class binary_writer
...
@@ -6392,6 +6399,7 @@ class binary_writer
bool
prefix_required
=
true
;
bool
prefix_required
=
true
;
if
(
use_type
and
not
j
.
m_value
.
object
->
empty
())
if
(
use_type
and
not
j
.
m_value
.
object
->
empty
())
{
{
assert
(
use_count
);
const
char
first_prefix
=
ubjson_prefix
(
j
.
front
());
const
char
first_prefix
=
ubjson_prefix
(
j
.
front
());
const
bool
same_prefix
=
std
::
all_of
(
j
.
begin
(),
j
.
end
(),
const
bool
same_prefix
=
std
::
all_of
(
j
.
begin
(),
j
.
end
(),
[
this
,
first_prefix
](
const
BasicJsonType
&
v
)
[
this
,
first_prefix
](
const
BasicJsonType
&
v
)
...
@@ -6463,7 +6471,8 @@ class binary_writer
...
@@ -6463,7 +6471,8 @@ class binary_writer
}
}
template
<
typename
NumberType
>
template
<
typename
NumberType
>
void
write_number_with_ubjson_prefix
(
const
NumberType
n
,
const
bool
add_prefix
)
void
write_number_with_ubjson_prefix
(
const
NumberType
n
,
const
bool
add_prefix
)
{
{
if
(
std
::
is_floating_point
<
NumberType
>::
value
)
if
(
std
::
is_floating_point
<
NumberType
>::
value
)
{
{
...
@@ -6608,23 +6617,23 @@ class binary_writer
...
@@ -6608,23 +6617,23 @@ class binary_writer
case
value_t
:
:
number_unsigned
:
case
value_t
:
:
number_unsigned
:
{
{
if
(
(
std
::
numeric_limits
<
int8_t
>::
min
)()
<=
j
.
m_value
.
number_unsigned
and
j
.
m_value
.
number_unsigned
<=
(
std
::
numeric_limits
<
int8_t
>::
max
)())
if
(
j
.
m_value
.
number_unsigned
<=
(
std
::
numeric_limits
<
int8_t
>::
max
)())
{
{
return
'i'
;
return
'i'
;
}
}
else
if
(
(
std
::
numeric_limits
<
uint8_t
>::
min
)()
<=
j
.
m_value
.
number_unsigned
and
j
.
m_value
.
number_unsigned
<=
(
std
::
numeric_limits
<
uint8_t
>::
max
)())
else
if
(
j
.
m_value
.
number_unsigned
<=
(
std
::
numeric_limits
<
uint8_t
>::
max
)())
{
{
return
'U'
;
return
'U'
;
}
}
else
if
(
(
std
::
numeric_limits
<
int16_t
>::
min
)()
<=
j
.
m_value
.
number_unsigned
and
j
.
m_value
.
number_unsigned
<=
(
std
::
numeric_limits
<
int16_t
>::
max
)())
else
if
(
j
.
m_value
.
number_unsigned
<=
(
std
::
numeric_limits
<
int16_t
>::
max
)())
{
{
return
'I'
;
return
'I'
;
}
}
else
if
(
(
std
::
numeric_limits
<
int32_t
>::
min
)()
<=
j
.
m_value
.
number_unsigned
and
j
.
m_value
.
number_unsigned
<=
(
std
::
numeric_limits
<
int32_t
>::
max
)())
else
if
(
j
.
m_value
.
number_unsigned
<=
(
std
::
numeric_limits
<
int32_t
>::
max
)())
{
{
return
'l'
;
return
'l'
;
}
}
else
if
(
(
std
::
numeric_limits
<
int64_t
>::
min
)()
<=
j
.
m_value
.
number_unsigned
and
j
.
m_value
.
number_unsigned
<=
(
std
::
numeric_limits
<
int64_t
>::
max
)())
else
if
(
j
.
m_value
.
number_unsigned
<=
(
std
::
numeric_limits
<
int64_t
>::
max
)())
{
{
return
'L'
;
return
'L'
;
}
}
...
@@ -14103,21 +14112,24 @@ class basic_json
...
@@ -14103,21 +14112,24 @@ class basic_json
binary_writer
<
char
>
(
o
).
write_msgpack
(
j
);
binary_writer
<
char
>
(
o
).
write_msgpack
(
j
);
}
}
static
std
::
vector
<
uint8_t
>
to_ubjson
(
const
basic_json
&
j
)
static
std
::
vector
<
uint8_t
>
to_ubjson
(
const
basic_json
&
j
,
const
bool
use_size
=
false
,
const
bool
use_type
=
false
)
{
{
std
::
vector
<
uint8_t
>
result
;
std
::
vector
<
uint8_t
>
result
;
to_ubjson
(
j
,
result
);
to_ubjson
(
j
,
result
,
use_size
,
use_type
);
return
result
;
return
result
;
}
}
static
void
to_ubjson
(
const
basic_json
&
j
,
detail
::
output_adapter
<
uint8_t
>
o
)
static
void
to_ubjson
(
const
basic_json
&
j
,
detail
::
output_adapter
<
uint8_t
>
o
,
const
bool
use_size
=
false
,
const
bool
use_type
=
false
)
{
{
binary_writer
<
uint8_t
>
(
o
).
write_ubjson
(
j
);
binary_writer
<
uint8_t
>
(
o
).
write_ubjson
(
j
,
use_size
,
use_type
);
}
}
static
void
to_ubjson
(
const
basic_json
&
j
,
detail
::
output_adapter
<
char
>
o
)
static
void
to_ubjson
(
const
basic_json
&
j
,
detail
::
output_adapter
<
char
>
o
,
const
bool
use_size
=
false
,
const
bool
use_type
=
false
)
{
{
binary_writer
<
char
>
(
o
).
write_ubjson
(
j
);
binary_writer
<
char
>
(
o
).
write_ubjson
(
j
,
use_size
,
use_type
);
}
}
/*!
/*!
...
...
This diff is collapsed.
Click to expand it.
test/src/unit-ubjson.cpp
View file @
3a7585e7
This diff is collapsed.
Click to expand it.
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