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
83b427ad
Commit
83b427ad
authored
7 years ago
by
Julian Becker
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
BSON: unsigned integers
parent
c0d8921a
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
136 additions
and
4 deletions
+136
-4
include/nlohmann/detail/output/binary_writer.hpp
include/nlohmann/detail/output/binary_writer.hpp
+32
-2
single_include/nlohmann/json.hpp
single_include/nlohmann/json.hpp
+32
-2
test/src/unit-bson.cpp
test/src/unit-bson.cpp
+72
-0
No files found.
include/nlohmann/detail/output/binary_writer.hpp
View file @
83b427ad
...
...
@@ -723,14 +723,42 @@ class binary_writer
std
::
size_t
write_bson_integer
(
const
typename
BasicJsonType
::
string_t
&
name
,
const
BasicJsonType
&
j
)
{
if
(
j
.
m_value
.
number_integer
<=
static_cast
<
uint64_t
>
((
std
::
numeric_limits
<
int32_t
>::
max
)()))
auto
n
=
j
.
m_value
.
number_integer
;
if
((
std
::
numeric_limits
<
int32_t
>::
min
)()
<=
n
and
n
<=
(
std
::
numeric_limits
<
int32_t
>::
max
)())
{
oa
->
write_character
(
static_cast
<
CharType
>
(
0x10
));
// int32
oa
->
write_characters
(
reinterpret_cast
<
const
CharType
*>
(
name
.
c_str
()),
name
.
size
()
+
1u
);
write_number_little_endian
(
static_cast
<
std
::
int32_t
>
(
j
.
m_value
.
number_integer
));
write_number_little_endian
(
static_cast
<
std
::
int32_t
>
(
n
));
return
/*id*/
1ul
+
name
.
size
()
+
1ul
+
sizeof
(
std
::
int32_t
);
}
else
{
oa
->
write_character
(
static_cast
<
CharType
>
(
0x12
));
// int64
oa
->
write_characters
(
reinterpret_cast
<
const
CharType
*>
(
name
.
c_str
()),
name
.
size
()
+
1u
);
write_number_little_endian
(
static_cast
<
std
::
int64_t
>
(
j
.
m_value
.
number_integer
));
return
/*id*/
1ul
+
name
.
size
()
+
1ul
+
sizeof
(
std
::
int64_t
);
}
}
std
::
size_t
write_bson_unsigned
(
const
typename
BasicJsonType
::
string_t
&
name
,
const
BasicJsonType
&
j
)
{
auto
n
=
j
.
m_value
.
number_integer
;
if
(
n
<=
static_cast
<
uint64_t
>
((
std
::
numeric_limits
<
uint32_t
>::
max
)()))
{
oa
->
write_character
(
static_cast
<
CharType
>
(
0x10
));
// int32
oa
->
write_characters
(
reinterpret_cast
<
const
CharType
*>
(
name
.
c_str
()),
name
.
size
()
+
1u
);
write_number_little_endian
(
static_cast
<
std
::
int32_t
>
(
n
));
return
/*id*/
1ul
+
name
.
size
()
+
1ul
+
sizeof
(
std
::
int32_t
);
}
...
...
@@ -760,6 +788,8 @@ class binary_writer
return
write_bson_double
(
name
,
j
);
case
value_t
:
:
number_integer
:
return
write_bson_integer
(
name
,
j
);
case
value_t
:
:
number_unsigned
:
return
write_bson_unsigned
(
name
,
j
);
case
value_t
:
:
string
:
return
write_bson_string
(
name
,
j
);
case
value_t
:
:
null
:
...
...
This diff is collapsed.
Click to expand it.
single_include/nlohmann/json.hpp
View file @
83b427ad
...
...
@@ -8557,14 +8557,42 @@ class binary_writer
std
::
size_t
write_bson_integer
(
const
typename
BasicJsonType
::
string_t
&
name
,
const
BasicJsonType
&
j
)
{
if
(
j
.
m_value
.
number_integer
<=
static_cast
<
uint64_t
>
((
std
::
numeric_limits
<
int32_t
>::
max
)()))
auto
n
=
j
.
m_value
.
number_integer
;
if
((
std
::
numeric_limits
<
int32_t
>::
min
)()
<=
n
and
n
<=
(
std
::
numeric_limits
<
int32_t
>::
max
)())
{
oa
->
write_character
(
static_cast
<
CharType
>
(
0x10
));
// int32
oa
->
write_characters
(
reinterpret_cast
<
const
CharType
*>
(
name
.
c_str
()),
name
.
size
()
+
1u
);
write_number_little_endian
(
static_cast
<
std
::
int32_t
>
(
j
.
m_value
.
number_integer
));
write_number_little_endian
(
static_cast
<
std
::
int32_t
>
(
n
));
return
/*id*/
1ul
+
name
.
size
()
+
1ul
+
sizeof
(
std
::
int32_t
);
}
else
{
oa
->
write_character
(
static_cast
<
CharType
>
(
0x12
));
// int64
oa
->
write_characters
(
reinterpret_cast
<
const
CharType
*>
(
name
.
c_str
()),
name
.
size
()
+
1u
);
write_number_little_endian
(
static_cast
<
std
::
int64_t
>
(
j
.
m_value
.
number_integer
));
return
/*id*/
1ul
+
name
.
size
()
+
1ul
+
sizeof
(
std
::
int64_t
);
}
}
std
::
size_t
write_bson_unsigned
(
const
typename
BasicJsonType
::
string_t
&
name
,
const
BasicJsonType
&
j
)
{
auto
n
=
j
.
m_value
.
number_integer
;
if
(
n
<=
static_cast
<
uint64_t
>
((
std
::
numeric_limits
<
uint32_t
>::
max
)()))
{
oa
->
write_character
(
static_cast
<
CharType
>
(
0x10
));
// int32
oa
->
write_characters
(
reinterpret_cast
<
const
CharType
*>
(
name
.
c_str
()),
name
.
size
()
+
1u
);
write_number_little_endian
(
static_cast
<
std
::
int32_t
>
(
n
));
return
/*id*/
1ul
+
name
.
size
()
+
1ul
+
sizeof
(
std
::
int32_t
);
}
...
...
@@ -8594,6 +8622,8 @@ class binary_writer
return
write_bson_double
(
name
,
j
);
case
value_t
:
:
number_integer
:
return
write_bson_integer
(
name
,
j
);
case
value_t
:
:
number_unsigned
:
return
write_bson_unsigned
(
name
,
j
);
case
value_t
:
:
string
:
return
write_bson_string
(
name
,
j
);
case
value_t
:
:
null
:
...
...
This diff is collapsed.
Click to expand it.
test/src/unit-bson.cpp
View file @
83b427ad
...
...
@@ -279,5 +279,77 @@ TEST_CASE("BSON")
CHECK
(
json
::
from_bson
(
result
,
true
,
false
)
==
j
);
}
SECTION
(
"non-empty object with negative integer (32-bit) member"
)
{
json
j
=
{
{
"entry"
,
std
::
int32_t
{
-
1
}
}
};
std
::
vector
<
uint8_t
>
expected
=
{
0x10
,
0x00
,
0x00
,
0x00
,
// size (little endian)
0x10
,
/// entry: int32
'e'
,
'n'
,
't'
,
'r'
,
'y'
,
'\x00'
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
// end marker
};
const
auto
result
=
json
::
to_bson
(
j
);
CHECK
(
result
==
expected
);
// roundtrip
CHECK
(
json
::
from_bson
(
result
)
==
j
);
CHECK
(
json
::
from_bson
(
result
,
true
,
false
)
==
j
);
}
SECTION
(
"non-empty object with negative integer (64-bit) member"
)
{
json
j
=
{
{
"entry"
,
std
::
int64_t
{
-
1
}
}
};
std
::
vector
<
uint8_t
>
expected
=
{
0x10
,
0x00
,
0x00
,
0x00
,
// size (little endian)
0x10
,
/// entry: int32
'e'
,
'n'
,
't'
,
'r'
,
'y'
,
'\x00'
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
// end marker
};
const
auto
result
=
json
::
to_bson
(
j
);
CHECK
(
result
==
expected
);
// roundtrip
CHECK
(
json
::
from_bson
(
result
)
==
j
);
CHECK
(
json
::
from_bson
(
result
,
true
,
false
)
==
j
);
}
SECTION
(
"non-empty object with unsigned integer (64-bit) member"
)
{
// directly encoding uint64 is not supported in bson (only for timestamp values)
json
j
=
{
{
"entry"
,
std
::
uint64_t
{
0x1234567804030201
}
}
};
std
::
vector
<
uint8_t
>
expected
=
{
0x14
,
0x00
,
0x00
,
0x00
,
// size (little endian)
0x12
,
/// entry: int64
'e'
,
'n'
,
't'
,
'r'
,
'y'
,
'\x00'
,
0x01
,
0x02
,
0x03
,
0x04
,
0x78
,
0x56
,
0x34
,
0x12
,
0x00
// end marker
};
const
auto
result
=
json
::
to_bson
(
j
);
CHECK
(
result
==
expected
);
// roundtrip
CHECK
(
json
::
from_bson
(
result
)
==
j
);
CHECK
(
json
::
from_bson
(
result
,
true
,
false
)
==
j
);
}
}
}
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