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
ebb63bd1
Unverified
Commit
ebb63bd1
authored
Dec 30, 2020
by
Niels Lohmann
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' of
https://github.com/nlohmann/json
into feature/optional
Conflicts: test/src/unit-conversions.cpp
parents
5e55158d
a8398a71
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
243 additions
and
68 deletions
+243
-68
ubuntu.yml
.github/workflows/ubuntu.yml
+49
-1
Makefile
Makefile
+2
-0
hash.hpp
include/nlohmann/detail/hash.hpp
+2
-0
binary_reader.hpp
include/nlohmann/detail/input/binary_reader.hpp
+2
-1
input_adapters.hpp
include/nlohmann/detail/input/input_adapters.hpp
+27
-5
lexer.hpp
include/nlohmann/detail/input/lexer.hpp
+3
-3
iter_impl.hpp
include/nlohmann/detail/iterators/iter_impl.hpp
+22
-18
primitive_iterator.hpp
include/nlohmann/detail/iterators/primitive_iterator.hpp
+2
-0
type_traits.hpp
include/nlohmann/detail/meta/type_traits.hpp
+1
-0
hedley_undef.hpp
include/nlohmann/thirdparty/hedley/hedley_undef.hpp
+2
-0
json.hpp
single_include/nlohmann/json.hpp
+63
-27
unit-class_lexer.cpp
test/src/unit-class_lexer.cpp
+1
-1
unit-class_parser.cpp
test/src/unit-class_parser.cpp
+1
-1
unit-conversions.cpp
test/src/unit-conversions.cpp
+8
-0
unit-items.cpp
test/src/unit-items.cpp
+8
-0
unit-regression1.cpp
test/src/unit-regression1.cpp
+1
-1
unit-regression2.cpp
test/src/unit-regression2.cpp
+14
-0
unit-udt.cpp
test/src/unit-udt.cpp
+7
-7
unit-udt_macro.cpp
test/src/unit-udt_macro.cpp
+2
-2
unit-user_defined_input.cpp
test/src/unit-user_defined_input.cpp
+26
-1
No files found.
.github/workflows/ubuntu.yml
View file @
ebb63bd1
...
...
@@ -3,13 +3,61 @@ name: Ubuntu
on
:
[
push
,
pull_request
]
jobs
:
build
:
gcc_
build
:
runs-on
:
ubuntu-latest
steps
:
-
uses
:
actions/checkout@v1
-
name
:
install_gcc
run
:
|
sudo apt update
sudo apt install gcc-10 g++-10
shell
:
bash
-
name
:
cmake
run
:
cmake -S . -B build -D CMAKE_BUILD_TYPE=Debug -DJSON_BuildTests=On
env
:
CC
:
gcc-10
CXX
:
g++-10
-
name
:
build
run
:
cmake --build build --parallel 10
-
name
:
test
run
:
cd build ; ctest -j 10 --output-on-failure
clang_build
:
runs-on
:
ubuntu-latest
steps
:
-
uses
:
actions/checkout@v1
-
name
:
install_gcc
run
:
|
sudo apt update
sudo apt install clang-10
shell
:
bash
-
name
:
cmake
run
:
cmake -S . -B build -D CMAKE_BUILD_TYPE=Debug -DJSON_BuildTests=On
env
:
CC
:
clang-10
CXX
:
clang++-10
-
name
:
build
run
:
cmake --build build --parallel 10
-
name
:
test
run
:
cd build ; ctest -j 10 --output-on-failure
clang_build_cxx20
:
runs-on
:
ubuntu-latest
steps
:
-
uses
:
actions/checkout@v1
-
name
:
install_gcc
run
:
|
sudo apt update
sudo apt install clang-10
shell
:
bash
-
name
:
cmake
run
:
cmake -S . -B build -D CMAKE_BUILD_TYPE=Debug -DJSON_BuildTests=On -DCMAKE_CXX_STANDARD=20 -DCMAKE_CXX_STANDARD_REQUIRED=ON
env
:
CC
:
clang-10
CXX
:
clang++-10
-
name
:
build
run
:
cmake --build build --parallel 10
-
name
:
test
...
...
Makefile
View file @
ebb63bd1
...
...
@@ -84,6 +84,7 @@ doctest:
# -Wno-missing-prototypes: for NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE
# -Wno-padded: padding is nothing to warn about
# -Wno-range-loop-analysis: items tests "for(const auto i...)"
# -Wno-extra-semi-stmt: spurious warnings for semicolons after JSON_ASSERT()
# -Wno-switch-enum -Wno-covered-switch-default: pedantic/contradicting warnings about switches
# -Wno-weak-vtables: exception class is defined inline, but has virtual method
pedantic_clang
:
...
...
@@ -100,6 +101,7 @@ pedantic_clang:
-Wno-missing-prototypes
\
-Wno-padded
\
-Wno-range-loop-analysis
\
-Wno-extra-semi-stmt
\
-Wno-switch-enum -Wno-covered-switch-default
\
-Wno-weak-vtables"
cmake
-S
.
-B
cmake-build-pedantic
-GNinja
-DCMAKE_BUILD_TYPE
=
Debug
-DJSON_MultipleHeaders
=
ON
-DJSON_BuildTests
=
On
cmake
--build
cmake-build-pedantic
...
...
include/nlohmann/detail/hash.hpp
View file @
ebb63bd1
...
...
@@ -3,6 +3,8 @@
#include <cstddef> // size_t, uint8_t
#include <functional> // hash
#include <nlohmann/detail/macro_scope.hpp>
namespace
nlohmann
{
namespace
detail
...
...
include/nlohmann/detail/input/binary_reader.hpp
View file @
ebb63bd1
...
...
@@ -11,6 +11,7 @@
#include <limits> // numeric_limits
#include <string> // char_traits, string
#include <utility> // make_pair, move
#include <vector> // vector
#include <nlohmann/detail/exceptions.hpp>
#include <nlohmann/detail/input/input_adapters.hpp>
...
...
@@ -2340,7 +2341,7 @@ class binary_reader
break
;
}
result
.
push_back
(
static_cast
<
typename
string_t
::
value_type
>
(
current
));
}
;
}
return
success
;
}
...
...
include/nlohmann/detail/input/input_adapters.hpp
View file @
ebb63bd1
...
...
@@ -371,15 +371,37 @@ typename iterator_input_adapter_factory<IteratorType>::adapter_type input_adapte
}
// Convenience shorthand from container to iterator
template
<
typename
ContainerType
>
auto
input_adapter
(
const
ContainerType
&
container
)
->
decltype
(
input_adapter
(
begin
(
container
),
end
(
container
)))
// Enables ADL on begin(container) and end(container)
// Encloses the using declarations in namespace for not to leak them to outside scope
namespace
container_input_adapter_factory_impl
{
// Enable ADL
using
std
::
begin
;
using
std
::
end
;
using
std
::
begin
;
using
std
::
end
;
template
<
typename
ContainerType
,
typename
Enable
=
void
>
struct
container_input_adapter_factory
{};
template
<
typename
ContainerType
>
struct
container_input_adapter_factory
<
ContainerType
,
void_t
<
decltype
(
begin
(
std
::
declval
<
ContainerType
>
()),
end
(
std
::
declval
<
ContainerType
>
()))
>>
{
using
adapter_type
=
decltype
(
input_adapter
(
begin
(
std
::
declval
<
ContainerType
>
()),
end
(
std
::
declval
<
ContainerType
>
())));
static
adapter_type
create
(
const
ContainerType
&
container
)
{
return
input_adapter
(
begin
(
container
),
end
(
container
));
}
};
}
template
<
typename
ContainerType
>
typename
container_input_adapter_factory_impl
::
container_input_adapter_factory
<
ContainerType
>::
adapter_type
input_adapter
(
const
ContainerType
&
container
)
{
return
container_input_adapter_factory_impl
::
container_input_adapter_factory
<
ContainerType
>::
create
(
container
);
}
// Special cases with fast paths
inline
file_input_adapter
input_adapter
(
std
::
FILE
*
file
)
...
...
include/nlohmann/detail/input/lexer.hpp
View file @
ebb63bd1
...
...
@@ -1541,17 +1541,17 @@ scan_number_done:
// literals
case
't'
:
{
std
::
array
<
char_type
,
4
>
true_literal
=
{{
't'
,
'r'
,
'u'
,
'e'
}};
std
::
array
<
char_type
,
4
>
true_literal
=
{{
char_type
(
't'
),
char_type
(
'r'
),
char_type
(
'u'
),
char_type
(
'e'
)
}};
return
scan_literal
(
true_literal
.
data
(),
true_literal
.
size
(),
token_type
::
literal_true
);
}
case
'f'
:
{
std
::
array
<
char_type
,
5
>
false_literal
=
{{
'f'
,
'a'
,
'l'
,
's'
,
'e'
}};
std
::
array
<
char_type
,
5
>
false_literal
=
{{
char_type
(
'f'
),
char_type
(
'a'
),
char_type
(
'l'
),
char_type
(
's'
),
char_type
(
'e'
)
}};
return
scan_literal
(
false_literal
.
data
(),
false_literal
.
size
(),
token_type
::
literal_false
);
}
case
'n'
:
{
std
::
array
<
char_type
,
4
>
null_literal
=
{{
'n'
,
'u'
,
'l'
,
'l'
}};
std
::
array
<
char_type
,
4
>
null_literal
=
{{
char_type
(
'n'
),
char_type
(
'u'
),
char_type
(
'l'
),
char_type
(
'l'
)
}};
return
scan_literal
(
null_literal
.
data
(),
null_literal
.
size
(),
token_type
::
literal_null
);
}
...
...
include/nlohmann/detail/iterators/iter_impl.hpp
View file @
ebb63bd1
...
...
@@ -38,8 +38,10 @@ This class implements a both iterators (iterator and const_iterator) for the
template
<
typename
BasicJsonType
>
class
iter_impl
{
/// the iterator with BasicJsonType of different const-ness
using
other_iter_impl
=
iter_impl
<
typename
std
::
conditional
<
std
::
is_const
<
BasicJsonType
>::
value
,
typename
std
::
remove_const
<
BasicJsonType
>::
type
,
const
BasicJsonType
>::
type
>
;
/// allow basic_json to access private members
friend
iter_impl
<
typename
std
::
conditional
<
std
::
is_const
<
BasicJsonType
>::
value
,
typename
std
::
remove_const
<
BasicJsonType
>::
type
,
const
BasicJsonType
>::
type
>
;
friend
other_iter_impl
;
friend
BasicJsonType
;
friend
iteration_proxy
<
iter_impl
>
;
friend
iteration_proxy_value
<
iter_impl
>
;
...
...
@@ -390,10 +392,11 @@ class iter_impl
}
/*!
@brief
comparison: equal
@brief comparison: equal
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
bool
operator
==
(
const
iter_impl
&
other
)
const
template
<
typename
IterImpl
,
detail
::
enable_if_t
<
(
std
::
is_same
<
IterImpl
,
iter_impl
>::
value
||
std
::
is_same
<
IterImpl
,
other_iter_impl
>::
value
),
std
::
nullptr_t
>
=
nullptr
>
bool
operator
==
(
const
IterImpl
&
other
)
const
{
// if objects are not the same, the comparison is undefined
if
(
JSON_HEDLEY_UNLIKELY
(
m_object
!=
other
.
m_object
))
...
...
@@ -417,16 +420,17 @@ class iter_impl
}
/*!
@brief
comparison: not equal
@brief comparison: not equal
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
bool
operator
!=
(
const
iter_impl
&
other
)
const
template
<
typename
IterImpl
,
detail
::
enable_if_t
<
(
std
::
is_same
<
IterImpl
,
iter_impl
>::
value
||
std
::
is_same
<
IterImpl
,
other_iter_impl
>::
value
),
std
::
nullptr_t
>
=
nullptr
>
bool
operator
!=
(
const
IterImpl
&
other
)
const
{
return
!
operator
==
(
other
);
}
/*!
@brief
comparison: smaller
@brief comparison: smaller
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
bool
operator
<
(
const
iter_impl
&
other
)
const
...
...
@@ -453,7 +457,7 @@ class iter_impl
}
/*!
@brief
comparison: less than or equal
@brief comparison: less than or equal
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
bool
operator
<=
(
const
iter_impl
&
other
)
const
...
...
@@ -462,7 +466,7 @@ class iter_impl
}
/*!
@brief
comparison: greater than
@brief comparison: greater than
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
bool
operator
>
(
const
iter_impl
&
other
)
const
...
...
@@ -471,7 +475,7 @@ class iter_impl
}
/*!
@brief
comparison: greater than or equal
@brief comparison: greater than or equal
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
bool
operator
>=
(
const
iter_impl
&
other
)
const
...
...
@@ -480,7 +484,7 @@ class iter_impl
}
/*!
@brief
add to iterator
@brief add to iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
iter_impl
&
operator
+=
(
difference_type
i
)
...
...
@@ -509,7 +513,7 @@ class iter_impl
}
/*!
@brief
subtract from iterator
@brief subtract from iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
iter_impl
&
operator
-=
(
difference_type
i
)
...
...
@@ -518,7 +522,7 @@ class iter_impl
}
/*!
@brief
add to iterator
@brief add to iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
iter_impl
operator
+
(
difference_type
i
)
const
...
...
@@ -529,7 +533,7 @@ class iter_impl
}
/*!
@brief
addition of distance and iterator
@brief addition of distance and iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
friend
iter_impl
operator
+
(
difference_type
i
,
const
iter_impl
&
it
)
...
...
@@ -540,7 +544,7 @@ class iter_impl
}
/*!
@brief
subtract from iterator
@brief subtract from iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
iter_impl
operator
-
(
difference_type
i
)
const
...
...
@@ -551,7 +555,7 @@ class iter_impl
}
/*!
@brief
return difference
@brief return difference
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
difference_type
operator
-
(
const
iter_impl
&
other
)
const
...
...
@@ -572,7 +576,7 @@ class iter_impl
}
/*!
@brief
access to successor
@brief access to successor
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
reference
operator
[](
difference_type
n
)
const
...
...
@@ -603,7 +607,7 @@ class iter_impl
}
/*!
@brief
return the key of an object iterator
@brief return the key of an object iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
const
typename
object_t
::
key_type
&
key
()
const
...
...
@@ -619,7 +623,7 @@ class iter_impl
}
/*!
@brief
return the value of an iterator
@brief return the value of an iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
reference
value
()
const
...
...
include/nlohmann/detail/iterators/primitive_iterator.hpp
View file @
ebb63bd1
...
...
@@ -3,6 +3,8 @@
#include <cstddef> // ptrdiff_t
#include <limits> // numeric_limits
#include <nlohmann/detail/macro_scope.hpp>
namespace
nlohmann
{
namespace
detail
...
...
include/nlohmann/detail/meta/type_traits.hpp
View file @
ebb63bd1
...
...
@@ -3,6 +3,7 @@
#include <limits> // numeric_limits
#include <type_traits> // false_type, is_constructible, is_integral, is_same, true_type
#include <utility> // declval
#include <tuple> // tuple
#include <nlohmann/detail/iterators/iterator_traits.hpp>
#include <nlohmann/detail/macro_scope.hpp>
...
...
include/nlohmann/thirdparty/hedley/hedley_undef.hpp
View file @
ebb63bd1
#pragma once
#undef JSON_HEDLEY_ALWAYS_INLINE
#undef JSON_HEDLEY_ARM_VERSION
#undef JSON_HEDLEY_ARM_VERSION_CHECK
...
...
single_include/nlohmann/json.hpp
View file @
ebb63bd1
...
...
@@ -2826,6 +2826,7 @@ constexpr T static_const<T>::value;
#include <limits> // numeric_limits
#include <type_traits> // false_type, is_constructible, is_integral, is_same, true_type
#include <utility> // declval
#include <tuple> // tuple
// #include <nlohmann/detail/iterators/iterator_traits.hpp>
...
...
@@ -4710,6 +4711,9 @@ class byte_container_with_subtype : public BinaryType
#include <cstddef> // size_t, uint8_t
#include <functional> // hash
// #include <nlohmann/detail/macro_scope.hpp>
namespace
nlohmann
{
namespace
detail
...
...
@@ -4838,6 +4842,7 @@ std::size_t hash(const BasicJsonType& j)
#include <limits> // numeric_limits
#include <string> // char_traits, string
#include <utility> // make_pair, move
#include <vector> // vector
// #include <nlohmann/detail/exceptions.hpp>
...
...
@@ -5217,15 +5222,37 @@ typename iterator_input_adapter_factory<IteratorType>::adapter_type input_adapte
}
// Convenience shorthand from container to iterator
template
<
typename
ContainerType
>
auto
input_adapter
(
const
ContainerType
&
container
)
->
decltype
(
input_adapter
(
begin
(
container
),
end
(
container
)))
// Enables ADL on begin(container) and end(container)
// Encloses the using declarations in namespace for not to leak them to outside scope
namespace
container_input_adapter_factory_impl
{
// Enable ADL
using
std
::
begin
;
using
std
::
end
;
using
std
::
begin
;
using
std
::
end
;
template
<
typename
ContainerType
,
typename
Enable
=
void
>
struct
container_input_adapter_factory
{};
template
<
typename
ContainerType
>
struct
container_input_adapter_factory
<
ContainerType
,
void_t
<
decltype
(
begin
(
std
::
declval
<
ContainerType
>
()),
end
(
std
::
declval
<
ContainerType
>
()))
>>
{
using
adapter_type
=
decltype
(
input_adapter
(
begin
(
std
::
declval
<
ContainerType
>
()),
end
(
std
::
declval
<
ContainerType
>
())));
static
adapter_type
create
(
const
ContainerType
&
container
)
{
return
input_adapter
(
begin
(
container
),
end
(
container
));
}
};
}
template
<
typename
ContainerType
>
typename
container_input_adapter_factory_impl
::
container_input_adapter_factory
<
ContainerType
>::
adapter_type
input_adapter
(
const
ContainerType
&
container
)
{
return
container_input_adapter_factory_impl
::
container_input_adapter_factory
<
ContainerType
>::
create
(
container
);
}
// Special cases with fast paths
inline
file_input_adapter
input_adapter
(
std
::
FILE
*
file
)
...
...
@@ -7545,17 +7572,17 @@ scan_number_done:
// literals
case
't'
:
{
std
::
array
<
char_type
,
4
>
true_literal
=
{{
't'
,
'r'
,
'u'
,
'e'
}};
std
::
array
<
char_type
,
4
>
true_literal
=
{{
char_type
(
't'
),
char_type
(
'r'
),
char_type
(
'u'
),
char_type
(
'e'
)
}};
return
scan_literal
(
true_literal
.
data
(),
true_literal
.
size
(),
token_type
::
literal_true
);
}
case
'f'
:
{
std
::
array
<
char_type
,
5
>
false_literal
=
{{
'f'
,
'a'
,
'l'
,
's'
,
'e'
}};
std
::
array
<
char_type
,
5
>
false_literal
=
{{
char_type
(
'f'
),
char_type
(
'a'
),
char_type
(
'l'
),
char_type
(
's'
),
char_type
(
'e'
)
}};
return
scan_literal
(
false_literal
.
data
(),
false_literal
.
size
(),
token_type
::
literal_false
);
}
case
'n'
:
{
std
::
array
<
char_type
,
4
>
null_literal
=
{{
'n'
,
'u'
,
'l'
,
'l'
}};
std
::
array
<
char_type
,
4
>
null_literal
=
{{
char_type
(
'n'
),
char_type
(
'u'
),
char_type
(
'l'
),
char_type
(
'l'
)
}};
return
scan_literal
(
null_literal
.
data
(),
null_literal
.
size
(),
token_type
::
literal_null
);
}
...
...
@@ -10104,7 +10131,7 @@ class binary_reader
break
;
}
result
.
push_back
(
static_cast
<
typename
string_t
::
value_type
>
(
current
));
}
;
}
return
success
;
}
...
...
@@ -10746,6 +10773,9 @@ class parser
#include <cstddef> // ptrdiff_t
#include <limits> // numeric_limits
// #include <nlohmann/detail/macro_scope.hpp>
namespace
nlohmann
{
namespace
detail
...
...
@@ -10934,8 +10964,10 @@ This class implements a both iterators (iterator and const_iterator) for the
template
<
typename
BasicJsonType
>
class
iter_impl
{
/// the iterator with BasicJsonType of different const-ness
using
other_iter_impl
=
iter_impl
<
typename
std
::
conditional
<
std
::
is_const
<
BasicJsonType
>::
value
,
typename
std
::
remove_const
<
BasicJsonType
>::
type
,
const
BasicJsonType
>::
type
>
;
/// allow basic_json to access private members
friend
iter_impl
<
typename
std
::
conditional
<
std
::
is_const
<
BasicJsonType
>::
value
,
typename
std
::
remove_const
<
BasicJsonType
>::
type
,
const
BasicJsonType
>::
type
>
;
friend
other_iter_impl
;
friend
BasicJsonType
;
friend
iteration_proxy
<
iter_impl
>
;
friend
iteration_proxy_value
<
iter_impl
>
;
...
...
@@ -11286,10 +11318,11 @@ class iter_impl
}
/*!
@brief
comparison: equal
@brief comparison: equal
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
bool
operator
==
(
const
iter_impl
&
other
)
const
template
<
typename
IterImpl
,
detail
::
enable_if_t
<
(
std
::
is_same
<
IterImpl
,
iter_impl
>::
value
||
std
::
is_same
<
IterImpl
,
other_iter_impl
>::
value
),
std
::
nullptr_t
>
=
nullptr
>
bool
operator
==
(
const
IterImpl
&
other
)
const
{
// if objects are not the same, the comparison is undefined
if
(
JSON_HEDLEY_UNLIKELY
(
m_object
!=
other
.
m_object
))
...
...
@@ -11313,16 +11346,17 @@ class iter_impl
}
/*!
@brief
comparison: not equal
@brief comparison: not equal
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
bool
operator
!=
(
const
iter_impl
&
other
)
const
template
<
typename
IterImpl
,
detail
::
enable_if_t
<
(
std
::
is_same
<
IterImpl
,
iter_impl
>::
value
||
std
::
is_same
<
IterImpl
,
other_iter_impl
>::
value
),
std
::
nullptr_t
>
=
nullptr
>
bool
operator
!=
(
const
IterImpl
&
other
)
const
{
return
!
operator
==
(
other
);
}
/*!
@brief
comparison: smaller
@brief comparison: smaller
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
bool
operator
<
(
const
iter_impl
&
other
)
const
...
...
@@ -11349,7 +11383,7 @@ class iter_impl
}
/*!
@brief
comparison: less than or equal
@brief comparison: less than or equal
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
bool
operator
<=
(
const
iter_impl
&
other
)
const
...
...
@@ -11358,7 +11392,7 @@ class iter_impl
}
/*!
@brief
comparison: greater than
@brief comparison: greater than
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
bool
operator
>
(
const
iter_impl
&
other
)
const
...
...
@@ -11367,7 +11401,7 @@ class iter_impl
}
/*!
@brief
comparison: greater than or equal
@brief comparison: greater than or equal
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
bool
operator
>=
(
const
iter_impl
&
other
)
const
...
...
@@ -11376,7 +11410,7 @@ class iter_impl
}
/*!
@brief
add to iterator
@brief add to iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
iter_impl
&
operator
+=
(
difference_type
i
)
...
...
@@ -11405,7 +11439,7 @@ class iter_impl
}
/*!
@brief
subtract from iterator
@brief subtract from iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
iter_impl
&
operator
-=
(
difference_type
i
)
...
...
@@ -11414,7 +11448,7 @@ class iter_impl
}
/*!
@brief
add to iterator
@brief add to iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
iter_impl
operator
+
(
difference_type
i
)
const
...
...
@@ -11425,7 +11459,7 @@ class iter_impl
}
/*!
@brief
addition of distance and iterator
@brief addition of distance and iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
friend
iter_impl
operator
+
(
difference_type
i
,
const
iter_impl
&
it
)
...
...
@@ -11436,7 +11470,7 @@ class iter_impl
}
/*!
@brief
subtract from iterator
@brief subtract from iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
iter_impl
operator
-
(
difference_type
i
)
const
...
...
@@ -11447,7 +11481,7 @@ class iter_impl
}
/*!
@brief
return difference
@brief return difference
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
difference_type
operator
-
(
const
iter_impl
&
other
)
const
...
...
@@ -11468,7 +11502,7 @@ class iter_impl
}
/*!
@brief
access to successor
@brief access to successor
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
reference
operator
[](
difference_type
n
)
const
...
...
@@ -11499,7 +11533,7 @@ class iter_impl
}
/*!
@brief
return the key of an object iterator
@brief return the key of an object iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
const
typename
object_t
::
key_type
&
key
()
const
...
...
@@ -11515,7 +11549,7 @@ class iter_impl
}
/*!
@brief
return the value of an iterator
@brief return the value of an iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`.
*/
reference
value
()
const
...
...
@@ -25449,6 +25483,8 @@ inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std
#undef JSON_EXPLICIT
// #include <nlohmann/thirdparty/hedley/hedley_undef.hpp>
#undef JSON_HEDLEY_ALWAYS_INLINE
#undef JSON_HEDLEY_ARM_VERSION
#undef JSON_HEDLEY_ARM_VERSION_CHECK
...
...
test/src/unit-class_lexer.cpp
View file @
ebb63bd1
...
...
@@ -135,7 +135,7 @@ TEST_CASE("lexer class")
// store scan() result
const
auto
res
=
scan_string
(
s
.
c_str
());
CAPTURE
(
s
)
;
CAPTURE
(
s
)
switch
(
c
)
{
...
...
test/src/unit-class_parser.cpp
View file @
ebb63bd1
...
...
@@ -509,7 +509,7 @@ TEST_CASE("parser class")
CHECK
(
parser_helper
(
"
\"
€
\"
"
).
get
<
json
::
string_t
>
()
==
"€"
);
CHECK
(
parser_helper
(
"
\"
🎈
\"
"
).
get
<
json
::
string_t
>
()
==
"🎈"
);
CHECK
(
parser_helper
(
"
\"\\
ud80c
\\
udc60
\"
"
).
get
<
json
::
string_t
>
()
==
u8"\U0001306
0"
);
CHECK
(
parser_helper
(
"
\"\\
ud80c
\\
udc60
\"
"
).
get
<
json
::
string_t
>
()
==
"
\xf0\x93\x81\xa
0
"
);
CHECK
(
parser_helper
(
"
\"\\
ud83c
\\
udf1e
\"
"
).
get
<
json
::
string_t
>
()
==
"🌞"
);
}
}
...
...
test/src/unit-conversions.cpp
View file @
ebb63bd1
...
...
@@ -1761,3 +1761,11 @@ TEST_CASE("std::optional")
}
}
#endif
#ifdef JSON_HAS_CPP_17
#undef JSON_HAS_CPP_17
#endif
#ifdef JSON_HAS_CPP_14
#undef JSON_HAS_CPP_14
#endif
test/src/unit-items.cpp
View file @
ebb63bd1
...
...
@@ -1448,3 +1448,11 @@ TEST_CASE("items()")
}
}
}
#ifdef JSON_HAS_CPP_17
#undef JSON_HAS_CPP_17
#endif
#ifdef JSON_HAS_CPP_14
#undef JSON_HAS_CPP_14
#endif
test/src/unit-regression1.cpp
View file @
ebb63bd1
...
...
@@ -400,7 +400,7 @@ TEST_CASE("regression tests 1")
SECTION
(
"issue #146 - character following a surrogate pair is skipped"
)
{
CHECK
(
json
::
parse
(
"
\"\\
ud80c
\\
udc60abc
\"
"
).
get
<
json
::
string_t
>
()
==
u8"\U00013060abc
"
);
CHECK
(
json
::
parse
(
"
\"\\
ud80c
\\
udc60abc
\"
"
).
get
<
json
::
string_t
>
()
==
"
\xf0\x93\x81\xa0\x61\x62\x63
"
);
}
SECTION
(
"issue #171 - Cannot index by key of type static constexpr const char*"
)
...
...
test/src/unit-regression2.cpp
View file @
ebb63bd1
...
...
@@ -51,6 +51,10 @@ using nlohmann::json;
#include <variant>
#endif
#ifdef JSON_HAS_CPP_20
#include <span>
#endif
/////////////////////////////////////////////////////////////////////
// for #1021
/////////////////////////////////////////////////////////////////////
...
...
@@ -484,4 +488,14 @@ TEST_CASE("regression tests 2")
json
j
=
json
::
parse
(
ss
,
nullptr
,
true
,
true
);
CHECK
(
j
.
dump
()
==
"{}"
);
}
#ifdef JSON_HAS_CPP_20
SECTION
(
"issue #2546 - parsing containers of std::byte"
)
{
const
char
DATA
[]
=
R"("Hello, world!")"
;
const
auto
s
=
std
::
as_bytes
(
std
::
span
(
DATA
));
json
j
=
json
::
parse
(
s
);
CHECK
(
j
.
dump
()
==
"
\"
Hello, world!
\"
"
);
}
#endif
}
test/src/unit-udt.cpp
View file @
ebb63bd1
...
...
@@ -112,13 +112,13 @@ static void to_json(BasicJsonType& j, country c)
switch
(
c
)
{
case
country
:
:
china
:
j
=
u8
"中华人民共和国"
;
j
=
"中华人民共和国"
;
return
;
case
country
:
:
france
:
j
=
"France"
;
return
;
case
country
:
:
russia
:
j
=
u8
"Российская Федерация"
;
j
=
"Российская Федерация"
;
return
;
default
:
break
;
...
...
@@ -201,9 +201,9 @@ static void from_json(const BasicJsonType& j, country& c)
const
auto
str
=
j
.
template
get
<
std
::
string
>
();
static
const
std
::
map
<
std
::
string
,
country
>
m
=
{
{
u8
"中华人民共和国"
,
country
::
china
},
{
"中华人民共和国"
,
country
::
china
},
{
"France"
,
country
::
france
},
{
u8
"Российская Федерация"
,
country
::
russia
}
{
"Российская Федерация"
,
country
::
russia
}
};
const
auto
it
=
m
.
find
(
str
);
...
...
@@ -248,7 +248,7 @@ TEST_CASE("basic usage" * doctest::test_suite("udt"))
const
udt
::
name
n
{
"theo"
};
const
udt
::
country
c
{
udt
::
country
::
france
};
const
udt
::
person
sfinae_addict
{
a
,
n
,
c
};
const
udt
::
person
senior_programmer
{{
42
},
{
u8
"王芳"
},
udt
::
country
::
china
};
const
udt
::
person
senior_programmer
{{
42
},
{
"王芳"
},
udt
::
country
::
china
};
const
udt
::
address
addr
{
"Paris"
};
const
udt
::
contact
cpp_programmer
{
sfinae_addict
,
addr
};
const
udt
::
contact_book
book
{{
"C++"
},
{
cpp_programmer
,
{
senior_programmer
,
addr
}}};
...
...
@@ -265,14 +265,14 @@ TEST_CASE("basic usage" * doctest::test_suite("udt"))
CHECK
(
json
(
book
)
==
u8
R"({"name":"C++", "contacts" : [{"person" : {"age":23, "name":"theo", "country":"France"}, "address":"Paris"}, {"person" : {"age":42, "country":"中华人民共和国", "name":"王芳"}, "address":"Paris"}]})"
_json
);
R"({"name":"C++", "contacts" : [{"person" : {"age":23, "name":"theo", "country":"France"}, "address":"Paris"}, {"person" : {"age":42, "country":"中华人民共和国", "name":"王芳"}, "address":"Paris"}]})"
_json
);
}
SECTION
(
"conversion from json via free-functions"
)
{
const
auto
big_json
=
u8
R"({"name":"C++", "contacts" : [{"person" : {"age":23, "name":"theo", "country":"France"}, "address":"Paris"}, {"person" : {"age":42, "country":"中华人民共和国", "name":"王芳"}, "address":"Paris"}]})"
_json
;
R"({"name":"C++", "contacts" : [{"person" : {"age":23, "name":"theo", "country":"France"}, "address":"Paris"}, {"person" : {"age":42, "country":"中华人民共和国", "name":"王芳"}, "address":"Paris"}]})"
_json
;
SECTION
(
"via explicit calls to get"
)
{
const
auto
parsed_book
=
big_json
.
get
<
udt
::
contact_book
>
();
...
...
test/src/unit-udt_macro.cpp
View file @
ebb63bd1
...
...
@@ -106,7 +106,7 @@ NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(person_without_private_data_2, age, name, met
class
person_with_private_alphabet
{
public
:
bool
operator
==
(
const
person_with_private_alphabet
&
other
)
bool
operator
==
(
const
person_with_private_alphabet
&
other
)
const
{
return
a
==
other
.
a
&&
b
==
other
.
b
&&
...
...
@@ -169,7 +169,7 @@ class person_with_private_alphabet
class
person_with_public_alphabet
{
public
:
bool
operator
==
(
const
person_with_public_alphabet
&
other
)
bool
operator
==
(
const
person_with_public_alphabet
&
other
)
const
{
return
a
==
other
.
a
&&
b
==
other
.
b
&&
...
...
test/src/unit-user_defined_input.cpp
View file @
ebb63bd1
...
...
@@ -63,7 +63,7 @@ const char* end(const MyContainer& c)
return
c
.
data
+
strlen
(
c
.
data
);
}
TEST_CASE
(
"Custom container"
)
TEST_CASE
(
"Custom container
non-member begin/end
"
)
{
MyContainer
data
{
"[1,2,3,4]"
};
...
...
@@ -75,6 +75,31 @@ TEST_CASE("Custom container")
}
TEST_CASE
(
"Custom container member begin/end"
)
{
struct
MyContainer2
{
const
char
*
data
;
const
char
*
begin
()
const
{
return
data
;
}
const
char
*
end
()
const
{
return
data
+
strlen
(
data
);
}
};
MyContainer2
data
{
"[1,2,3,4]"
};
json
as_json
=
json
::
parse
(
data
);
CHECK
(
as_json
.
at
(
0
)
==
1
);
CHECK
(
as_json
.
at
(
1
)
==
2
);
CHECK
(
as_json
.
at
(
2
)
==
3
);
CHECK
(
as_json
.
at
(
3
)
==
4
);
}
TEST_CASE
(
"Custom iterator"
)
{
const
char
*
raw_data
=
"[1,2,3,4]"
;
...
...
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