Merge branch 'develop' into derived_macros

# Conflicts:
#	include/nlohmann/detail/macro_scope.hpp
#	single_include/nlohmann/json.hpp
This commit is contained in:
Niccolò Iardella 2023-09-16 08:40:06 +02:00
commit 358ba8b62d
No known key found for this signature in database
GPG Key ID: C13339F3B7755DA3
83 changed files with 2124 additions and 1629 deletions

View File

@ -17,6 +17,7 @@ Checks: '*,
-cppcoreguidelines-pro-bounds-pointer-arithmetic, -cppcoreguidelines-pro-bounds-pointer-arithmetic,
-cppcoreguidelines-pro-type-reinterpret-cast, -cppcoreguidelines-pro-type-reinterpret-cast,
-cppcoreguidelines-pro-type-union-access, -cppcoreguidelines-pro-type-union-access,
-cppcoreguidelines-rvalue-reference-param-not-moved,
-cppcoreguidelines-virtual-class-destructor, -cppcoreguidelines-virtual-class-destructor,
-fuchsia-default-arguments-calls, -fuchsia-default-arguments-calls,
-fuchsia-default-arguments-declarations, -fuchsia-default-arguments-declarations,
@ -35,10 +36,13 @@ Checks: '*,
-llvm-header-guard, -llvm-header-guard,
-llvm-include-order, -llvm-include-order,
-llvmlibc-*, -llvmlibc-*,
-misc-use-anonymous-namespace,
-misc-confusable-identifiers, -misc-confusable-identifiers,
-misc-include-cleaner,
-misc-no-recursion, -misc-no-recursion,
-misc-non-private-member-variables-in-classes, -misc-non-private-member-variables-in-classes,
-modernize-concat-nested-namespaces, -modernize-concat-nested-namespaces,
-modernize-type-traits,
-modernize-use-nodiscard, -modernize-use-nodiscard,
-modernize-use-trailing-return-type, -modernize-use-trailing-return-type,
-readability-function-cognitive-complexity, -readability-function-cognitive-complexity,

4
.github/CODEOWNERS vendored
View File

@ -1,5 +1,5 @@
# JSON for Modern C++ has been originally written by Niels Lohmann. # JSON for Modern C++ was originally written by Niels Lohmann.
# Since 2013 over 140 contributors have helped to improve the library. # Since 2013, over 250 contributors have helped to improve the library.
# This CODEOWNERS file is only to make sure that @nlohmann is requested # This CODEOWNERS file is only to make sure that @nlohmann is requested
# for a code review in case of a pull request. # for a code review in case of a pull request.

View File

@ -32,7 +32,7 @@ To make changes, you need to edit the following files:
1. [`include/nlohmann/*`](https://github.com/nlohmann/json/tree/develop/include/nlohmann) - These files are the sources of the library. Before testing or creating a pull request, execute `make amalgamate` to regenerate `single_include/nlohmann/json.hpp` and `single_include/nlohmann/json_fwd.hpp`. 1. [`include/nlohmann/*`](https://github.com/nlohmann/json/tree/develop/include/nlohmann) - These files are the sources of the library. Before testing or creating a pull request, execute `make amalgamate` to regenerate `single_include/nlohmann/json.hpp` and `single_include/nlohmann/json_fwd.hpp`.
2. [`tests/src/unit-*.cpp`](https://github.com/nlohmann/json/tree/develop/tests/src) - These files contain the [doctest](https://github.com/onqtam/doctest) unit tests which currently cover [100 %](https://coveralls.io/github/nlohmann/json) of the library's code. 2. [`tests/src/unit-*.cpp`](https://github.com/nlohmann/json/tree/develop/tests/src) - These files contain the [doctest](https://github.com/onqtam/doctest) unit tests which currently cover [100 %](https://coveralls.io/github/nlohmann/json) of the library's code. Before creating a pull request, execute `make pretty` to make sure that the style is correct, as this will be checked by the CI.
If you add or change a feature, please also add a unit test to this file. The unit tests can be compiled and executed with If you add or change a feature, please also add a unit test to this file. The unit tests can be compiled and executed with

View File

@ -55,7 +55,7 @@ jobs:
runs-on: macos-latest runs-on: macos-latest
strategy: strategy:
matrix: matrix:
standard: [11, 14, 17, 20] standard: [11, 14, 17, 20, 23]
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3

View File

@ -173,19 +173,35 @@ jobs:
- name: Build - name: Build
run: cmake --build build --target ci_test_compiler_${{ matrix.compiler }} run: cmake --build build --target ci_test_compiler_${{ matrix.compiler }}
ci_test_standards: ci_test_standards_gcc:
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: ghcr.io/nlohmann/json-ci:v2.4.0 container: ghcr.io/nlohmann/json-ci:v2.4.0
strategy: strategy:
matrix: matrix:
standard: [11, 14, 17, 20] standard: [11, 14, 17, 20, 23]
compiler: [gcc, clang]
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: Run CMake - name: Run CMake
run: cmake -S . -B build -DJSON_CI=On run: cmake -S . -B build -DJSON_CI=On
- name: Build - name: Build
run: cmake --build build --target ci_test_${{ matrix.compiler }}_cxx${{ matrix.standard }} run: cmake --build build --target ci_test_gcc_cxx${{ matrix.standard }}
ci_test_standards_clang:
runs-on: ubuntu-latest
container: silkeh/clang:latest
strategy:
matrix:
standard: [11, 14, 17, 20, 23]
steps:
- name: Install git and unzip
run: apt-get update ; apt-get install -y git unzip
- uses: actions/checkout@v3
- name: Get latest CMake and ninja
uses: lukka/get-cmake@latest
- name: Run CMake
run: cmake -S . -B build -DJSON_CI=On
- name: Build
run: cmake --build build --target ci_test_clang_cxx${{ matrix.standard }}
ci_cuda_example: ci_cuda_example:
runs-on: ubuntu-latest runs-on: ubuntu-latest

View File

@ -156,7 +156,8 @@ pretty:
--pad-header \ --pad-header \
--align-pointer=type \ --align-pointer=type \
--align-reference=type \ --align-reference=type \
--add-brackets \ --add-braces \
--squeeze-lines=2 \
--convert-tabs \ --convert-tabs \
--close-templates \ --close-templates \
--lineend=linux \ --lineend=linux \

View File

@ -86,6 +86,7 @@ You can sponsor this library at [GitHub Sponsors](https://github.com/sponsors/nl
- [Steve Sperandeo](https://github.com/homer6) - [Steve Sperandeo](https://github.com/homer6)
- [Robert Jefe Lindstädt](https://github.com/eljefedelrodeodeljefe) - [Robert Jefe Lindstädt](https://github.com/eljefedelrodeodeljefe)
- [Steve Wagner](https://github.com/ciroque) - [Steve Wagner](https://github.com/ciroque)
- [Lion Yang](https://github.com/LionNatsu)
Thanks everyone! Thanks everyone!
@ -301,7 +302,7 @@ Note the difference between serialization and assignment:
json j_string = "this is a string"; json j_string = "this is a string";
// retrieve the string value // retrieve the string value
auto cpp_string = j_string.get<std::string>(); auto cpp_string = j_string.template get<std::string>();
// retrieve the string value (alternative when a variable already exists) // retrieve the string value (alternative when a variable already exists)
std::string cpp_string2; std::string cpp_string2;
j_string.get_to(cpp_string2); j_string.get_to(cpp_string2);
@ -310,7 +311,7 @@ j_string.get_to(cpp_string2);
std::string serialized_string = j_string.dump(); std::string serialized_string = j_string.dump();
// output of original string // output of original string
std::cout << cpp_string << " == " << cpp_string2 << " == " << j_string.get<std::string>() << '\n'; std::cout << cpp_string << " == " << cpp_string2 << " == " << j_string.template get<std::string>() << '\n';
// output of serialized value // output of serialized value
std::cout << j_string << " == " << serialized_string << std::endl; std::cout << j_string << " == " << serialized_string << std::endl;
``` ```
@ -483,7 +484,7 @@ for (auto& element : j) {
} }
// getter/setter // getter/setter
const auto tmp = j[0].get<std::string>(); const auto tmp = j[0].template get<std::string>();
j[1] = 42; j[1] = 42;
bool foo = j.at(2); bool foo = j.at(2);
@ -691,7 +692,7 @@ You can switch off implicit conversions by defining `JSON_USE_IMPLICIT_CONVERSIO
// strings // strings
std::string s1 = "Hello, world!"; std::string s1 = "Hello, world!";
json js = s1; json js = s1;
auto s2 = js.get<std::string>(); auto s2 = js.template get<std::string>();
// NOT RECOMMENDED // NOT RECOMMENDED
std::string s3 = js; std::string s3 = js;
std::string s4; std::string s4;
@ -700,7 +701,7 @@ s4 = js;
// Booleans // Booleans
bool b1 = true; bool b1 = true;
json jb = b1; json jb = b1;
auto b2 = jb.get<bool>(); auto b2 = jb.template get<bool>();
// NOT RECOMMENDED // NOT RECOMMENDED
bool b3 = jb; bool b3 = jb;
bool b4; bool b4;
@ -709,7 +710,7 @@ b4 = jb;
// numbers // numbers
int i = 42; int i = 42;
json jn = i; json jn = i;
auto f = jn.get<double>(); auto f = jn.template get<double>();
// NOT RECOMMENDED // NOT RECOMMENDED
double f2 = jb; double f2 = jb;
double f3; double f3;
@ -752,9 +753,9 @@ j["age"] = p.age;
// convert from JSON: copy each value from the JSON object // convert from JSON: copy each value from the JSON object
ns::person p { ns::person p {
j["name"].get<std::string>(), j["name"].template get<std::string>(),
j["address"].get<std::string>(), j["address"].template get<std::string>(),
j["age"].get<int>() j["age"].template get<int>()
}; };
``` ```
@ -771,7 +772,7 @@ std::cout << j << std::endl;
// {"address":"744 Evergreen Terrace","age":60,"name":"Ned Flanders"} // {"address":"744 Evergreen Terrace","age":60,"name":"Ned Flanders"}
// conversion: json -> person // conversion: json -> person
auto p2 = j.get<ns::person>(); auto p2 = j.template get<ns::person>();
// that's it // that's it
assert(p == p2); assert(p == p2);
@ -798,13 +799,13 @@ namespace ns {
``` ```
That's all! When calling the `json` constructor with your type, your custom `to_json` method will be automatically called. That's all! When calling the `json` constructor with your type, your custom `to_json` method will be automatically called.
Likewise, when calling `get<your_type>()` or `get_to(your_type&)`, the `from_json` method will be called. Likewise, when calling `template get<your_type>()` or `get_to(your_type&)`, the `from_json` method will be called.
Some important things: Some important things:
* Those methods **MUST** be in your type's namespace (which can be the global namespace), or the library will not be able to locate them (in this example, they are in namespace `ns`, where `person` is defined). * Those methods **MUST** be in your type's namespace (which can be the global namespace), or the library will not be able to locate them (in this example, they are in namespace `ns`, where `person` is defined).
* Those methods **MUST** be available (e.g., proper headers must be included) everywhere you use these conversions. Look at [issue 1108](https://github.com/nlohmann/json/issues/1108) for errors that may occur otherwise. * Those methods **MUST** be available (e.g., proper headers must be included) everywhere you use these conversions. Look at [issue 1108](https://github.com/nlohmann/json/issues/1108) for errors that may occur otherwise.
* When using `get<your_type>()`, `your_type` **MUST** be [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). (There is a way to bypass this requirement described later.) * When using `template get<your_type>()`, `your_type` **MUST** be [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). (There is a way to bypass this requirement described later.)
* In function `from_json`, use function [`at()`](https://json.nlohmann.me/api/basic_json/at/) to access the object values rather than `operator[]`. In case a key does not exist, `at` throws an exception that you can handle, whereas `operator[]` exhibits undefined behavior. * In function `from_json`, use function [`at()`](https://json.nlohmann.me/api/basic_json/at/) to access the object values rather than `operator[]`. In case a key does not exist, `at` throws an exception that you can handle, whereas `operator[]` exhibits undefined behavior.
* You do not need to add serializers or deserializers for STL types like `std::vector`: the library already implements these. * You do not need to add serializers or deserializers for STL types like `std::vector`: the library already implements these.
@ -889,8 +890,8 @@ namespace nlohmann {
if (j.is_null()) { if (j.is_null()) {
opt = boost::none; opt = boost::none;
} else { } else {
opt = j.get<T>(); // same as above, but with opt = j.template get<T>(); // same as above, but with
// adl_serializer<T>::from_json // adl_serializer<T>::from_json
} }
} }
}; };
@ -917,7 +918,7 @@ namespace nlohmann {
// note: the return type is no longer 'void', and the method only takes // note: the return type is no longer 'void', and the method only takes
// one argument // one argument
static move_only_type from_json(const json& j) { static move_only_type from_json(const json& j) {
return {j.get<int>()}; return {j.template get<int>()};
} }
// Here's the catch! You must provide a to_json method! Otherwise, you // Here's the catch! You must provide a to_json method! Otherwise, you
@ -1021,11 +1022,11 @@ assert(j == "stopped");
// json string to enum // json string to enum
json j3 = "running"; json j3 = "running";
assert(j3.get<TaskState>() == TS_RUNNING); assert(j3.template get<TaskState>() == TS_RUNNING);
// undefined json value to enum (where the first map entry above is the default) // undefined json value to enum (where the first map entry above is the default)
json jPi = 3.14; json jPi = 3.14;
assert(jPi.get<TaskState>() == TS_INVALID ); assert(jPi.template get<TaskState>() == TS_INVALID );
``` ```
Just as in [Arbitrary Type Conversions](#arbitrary-types-conversions) above, Just as in [Arbitrary Type Conversions](#arbitrary-types-conversions) above,
@ -1033,7 +1034,7 @@ Just as in [Arbitrary Type Conversions](#arbitrary-types-conversions) above,
- It MUST be available (e.g., proper headers must be included) everywhere you use the conversions. - It MUST be available (e.g., proper headers must be included) everywhere you use the conversions.
Other Important points: Other Important points:
- When using `get<ENUM_TYPE>()`, undefined JSON values will default to the first pair specified in your map. Select this default pair carefully. - When using `template get<ENUM_TYPE>()`, undefined JSON values will default to the first pair specified in your map. Select this default pair carefully.
- If an enum or JSON value is specified more than once in your map, the first matching occurrence from the top of the map will be returned when converting to or from JSON. - If an enum or JSON value is specified more than once in your map, the first matching occurrence from the top of the map will be returned when converting to or from JSON.
### Binary formats (BSON, CBOR, MessagePack, UBJSON, and BJData) ### Binary formats (BSON, CBOR, MessagePack, UBJSON, and BJData)

View File

@ -13,12 +13,12 @@ execute_process(COMMAND ${ASTYLE_TOOL} --version OUTPUT_VARIABLE ASTYLE_TOOL_VER
string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" ASTYLE_TOOL_VERSION "${ASTYLE_TOOL_VERSION}") string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" ASTYLE_TOOL_VERSION "${ASTYLE_TOOL_VERSION}")
message(STATUS "🔖 Artistic Style ${ASTYLE_TOOL_VERSION} (${ASTYLE_TOOL})") message(STATUS "🔖 Artistic Style ${ASTYLE_TOOL_VERSION} (${ASTYLE_TOOL})")
find_program(CLANG_TOOL NAMES clang++-HEAD clang++-16 clang++-15 clang++-14 clang++-13 clang++-12 clang++-11 clang++) find_program(CLANG_TOOL NAMES clang++-HEAD clang++ clang++-17 clang++-16 clang++-15 clang++-14 clang++-13 clang++-12 clang++-11 clang++)
execute_process(COMMAND ${CLANG_TOOL} --version OUTPUT_VARIABLE CLANG_TOOL_VERSION ERROR_VARIABLE CLANG_TOOL_VERSION) execute_process(COMMAND ${CLANG_TOOL} --version OUTPUT_VARIABLE CLANG_TOOL_VERSION ERROR_VARIABLE CLANG_TOOL_VERSION)
string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CLANG_TOOL_VERSION "${CLANG_TOOL_VERSION}") string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CLANG_TOOL_VERSION "${CLANG_TOOL_VERSION}")
message(STATUS "🔖 Clang ${CLANG_TOOL_VERSION} (${CLANG_TOOL})") message(STATUS "🔖 Clang ${CLANG_TOOL_VERSION} (${CLANG_TOOL})")
find_program(CLANG_TIDY_TOOL NAMES clang-tidy-15 clang-tidy-14 clang-tidy-13 clang-tidy-12 clang-tidy-11 clang-tidy) find_program(CLANG_TIDY_TOOL NAMES clang-tidy-17 clang-tidy-16 clang-tidy-15 clang-tidy-14 clang-tidy-13 clang-tidy-12 clang-tidy-11 clang-tidy)
execute_process(COMMAND ${CLANG_TIDY_TOOL} --version OUTPUT_VARIABLE CLANG_TIDY_TOOL_VERSION ERROR_VARIABLE CLANG_TIDY_TOOL_VERSION) execute_process(COMMAND ${CLANG_TIDY_TOOL} --version OUTPUT_VARIABLE CLANG_TIDY_TOOL_VERSION ERROR_VARIABLE CLANG_TIDY_TOOL_VERSION)
string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CLANG_TIDY_TOOL_VERSION "${CLANG_TIDY_TOOL_VERSION}") string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CLANG_TIDY_TOOL_VERSION "${CLANG_TIDY_TOOL_VERSION}")
message(STATUS "🔖 Clang-Tidy ${CLANG_TIDY_TOOL_VERSION} (${CLANG_TIDY_TOOL})") message(STATUS "🔖 Clang-Tidy ${CLANG_TIDY_TOOL_VERSION} (${CLANG_TIDY_TOOL})")
@ -30,7 +30,7 @@ execute_process(COMMAND ${CPPCHECK_TOOL} --version OUTPUT_VARIABLE CPPCHECK_TOOL
string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CPPCHECK_TOOL_VERSION "${CPPCHECK_TOOL_VERSION}") string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CPPCHECK_TOOL_VERSION "${CPPCHECK_TOOL_VERSION}")
message(STATUS "🔖 Cppcheck ${CPPCHECK_TOOL_VERSION} (${CPPCHECK_TOOL})") message(STATUS "🔖 Cppcheck ${CPPCHECK_TOOL_VERSION} (${CPPCHECK_TOOL})")
find_program(GCC_TOOL NAMES g++-latest g++-HEAD g++-12 g++-11 g++-10) find_program(GCC_TOOL NAMES g++-latest g++-HEAD g++-13 g++-12 g++-11 g++-10)
execute_process(COMMAND ${GCC_TOOL} --version OUTPUT_VARIABLE GCC_TOOL_VERSION ERROR_VARIABLE GCC_TOOL_VERSION) execute_process(COMMAND ${GCC_TOOL} --version OUTPUT_VARIABLE GCC_TOOL_VERSION ERROR_VARIABLE GCC_TOOL_VERSION)
string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" GCC_TOOL_VERSION "${GCC_TOOL_VERSION}") string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" GCC_TOOL_VERSION "${GCC_TOOL_VERSION}")
message(STATUS "🔖 GCC ${GCC_TOOL_VERSION} (${GCC_TOOL})") message(STATUS "🔖 GCC ${GCC_TOOL_VERSION} (${GCC_TOOL})")
@ -95,6 +95,7 @@ file(GLOB_RECURSE SRC_FILES ${PROJECT_SOURCE_DIR}/include/nlohmann/*.hpp)
# -Wno-extra-semi-stmt The library uses std::assert which triggers this warning. # -Wno-extra-semi-stmt The library uses std::assert which triggers this warning.
# -Wno-padded We do not care about padding warnings. # -Wno-padded We do not care about padding warnings.
# -Wno-covered-switch-default All switches list all cases and a default case. # -Wno-covered-switch-default All switches list all cases and a default case.
# -Wno-unsafe-buffer-usage Otherwise Doctest would not compile.
# -Wno-weak-vtables The library is header-only. # -Wno-weak-vtables The library is header-only.
# -Wreserved-identifier See https://github.com/onqtam/doctest/issues/536. # -Wreserved-identifier See https://github.com/onqtam/doctest/issues/536.
@ -107,6 +108,7 @@ set(CLANG_CXXFLAGS
-Wno-extra-semi-stmt -Wno-extra-semi-stmt
-Wno-padded -Wno-padded
-Wno-covered-switch-default -Wno-covered-switch-default
-Wno-unsafe-buffer-usage
-Wno-weak-vtables -Wno-weak-vtables
-Wno-reserved-identifier -Wno-reserved-identifier
) )
@ -437,7 +439,7 @@ add_custom_target(ci_test_clang
# Different C++ Standards. # Different C++ Standards.
############################################################################### ###############################################################################
foreach(CXX_STANDARD 11 14 17 20) foreach(CXX_STANDARD 11 14 17 20 23)
add_custom_target(ci_test_gcc_cxx${CXX_STANDARD} add_custom_target(ci_test_gcc_cxx${CXX_STANDARD}
COMMAND CXX=${GCC_TOOL} CXXFLAGS="${GCC_CXXFLAGS}" ${CMAKE_COMMAND} COMMAND CXX=${GCC_TOOL} CXXFLAGS="${GCC_CXXFLAGS}" ${CMAKE_COMMAND}
-DCMAKE_BUILD_TYPE=Debug -GNinja -DCMAKE_BUILD_TYPE=Debug -GNinja
@ -898,7 +900,7 @@ add_custom_target(ci_cmake_flags
# Use more installed compilers. # Use more installed compilers.
############################################################################### ###############################################################################
foreach(COMPILER g++-4.8 g++-4.9 g++-5 g++-6 g++-7 g++-8 g++-9 g++-10 g++-11 clang++-3.5 clang++-3.6 clang++-3.7 clang++-3.8 clang++-3.9 clang++-4.0 clang++-5.0 clang++-6.0 clang++-7 clang++-8 clang++-9 clang++-10 clang++-11 clang++-12 clang++-13 clang++-14) foreach(COMPILER g++-4.8 g++-4.9 g++-5 g++-6 g++-7 g++-8 g++-9 g++-10 g++-11 clang++-3.5 clang++-3.6 clang++-3.7 clang++-3.8 clang++-3.9 clang++-4.0 clang++-5.0 clang++-6.0 clang++-7 clang++-8 clang++-9 clang++-10 clang++-11 clang++-12 clang++-13 clang++-14 clang++-15 clang++-16 clang++-17)
find_program(COMPILER_TOOL NAMES ${COMPILER}) find_program(COMPILER_TOOL NAMES ${COMPILER})
if (COMPILER_TOOL) if (COMPILER_TOOL)
unset(ADDITIONAL_FLAGS) unset(ADDITIONAL_FLAGS)

View File

@ -35,7 +35,6 @@ int main()
// output the changed array // output the changed array
std::cout << j["array"] << '\n'; std::cout << j["array"] << '\n';
// out_of_range.106 // out_of_range.106
try try
{ {

View File

@ -24,7 +24,6 @@ int main()
// output changed array // output changed array
std::cout << object << '\n'; std::cout << object << '\n';
// exception type_error.304 // exception type_error.304
try try
{ {

View File

@ -18,7 +18,6 @@ int main()
// output element with key "the ugly" using string_view // output element with key "the ugly" using string_view
std::cout << object.at("the ugly"sv) << '\n'; std::cout << object.at("the ugly"sv) << '\n';
// exception type_error.304 // exception type_error.304
try try
{ {

View File

@ -22,7 +22,6 @@ int main()
// output changed array // output changed array
std::cout << object << '\n'; std::cout << object << '\n';
// exception type_error.304 // exception type_error.304
try try
{ {

View File

@ -16,7 +16,6 @@ int main()
// output element with key "the ugly" // output element with key "the ugly"
std::cout << object.at("the ugly") << '\n'; std::cout << object.at("the ugly") << '\n';
// exception type_error.304 // exception type_error.304
try try
{ {

View File

@ -17,7 +17,6 @@ int main()
// output changed array // output changed array
std::cout << array << '\n'; std::cout << array << '\n';
// exception type_error.304 // exception type_error.304
try try
{ {

View File

@ -11,7 +11,6 @@ int main()
// output element at index 2 (third element) // output element at index 2 (third element)
std::cout << array.at(2) << '\n'; std::cout << array.at(2) << '\n';
// exception type_error.304 // exception type_error.304
try try
{ {

View File

@ -55,7 +55,6 @@ int main()
std::cout << j_mmap << '\n'; std::cout << j_mmap << '\n';
std::cout << j_ummap << "\n\n"; std::cout << j_ummap << "\n\n";
// =========== // ===========
// array types // array types
// =========== // ===========
@ -117,7 +116,6 @@ int main()
std::cout << j_mset << '\n'; std::cout << j_mset << '\n';
std::cout << j_umset << "\n\n"; std::cout << j_umset << "\n\n";
// ============ // ============
// string types // string types
// ============ // ============
@ -138,7 +136,6 @@ int main()
std::cout << j_string_literal << '\n'; std::cout << j_string_literal << '\n';
std::cout << j_stdstring << "\n\n"; std::cout << j_stdstring << "\n\n";
// ============ // ============
// number types // number types
// ============ // ============
@ -203,7 +200,6 @@ int main()
std::cout << j_float_nan << '\n'; std::cout << j_float_nan << '\n';
std::cout << j_double << "\n\n"; std::cout << j_double << "\n\n";
// ============= // =============
// boolean types // boolean types
// ============= // =============

View File

@ -31,7 +31,7 @@ int main()
j["address"] = "744 Evergreen Terrace"; j["address"] = "744 Evergreen Terrace";
j["age"] = 60; j["age"] = 60;
auto p = j.get<ns::person>(); auto p = j.template get<ns::person>();
std::cout << p.name << " (" << p.age << ") lives in " << p.address << std::endl; std::cout << p.name << " (" << p.age << ") lives in " << p.address << std::endl;
} }

View File

@ -47,7 +47,7 @@ int main()
j["address"] = "744 Evergreen Terrace"; j["address"] = "744 Evergreen Terrace";
j["age"] = 60; j["age"] = 60;
auto p = j.get<ns::person>(); auto p = j.template get<ns::person>();
std::cout << p.name << " (" << p.age << ") lives in " << p.address << std::endl; std::cout << p.name << " (" << p.age << ") lives in " << p.address << std::endl;
} }

View File

@ -9,11 +9,11 @@ int main()
json value = 17; json value = 17;
// explicitly getting pointers // explicitly getting pointers
auto p1 = value.get<const json::number_integer_t*>(); auto p1 = value.template get<const json::number_integer_t*>();
auto p2 = value.get<json::number_integer_t*>(); auto p2 = value.template get<json::number_integer_t*>();
auto p3 = value.get<json::number_integer_t* const>(); auto p3 = value.template get<json::number_integer_t* const>();
auto p4 = value.get<const json::number_integer_t* const>(); auto p4 = value.template get<const json::number_integer_t* const>();
auto p5 = value.get<json::number_float_t*>(); auto p5 = value.template get<json::number_float_t*>();
// print the pointees // print the pointees
std::cout << *p1 << ' ' << *p2 << ' ' << *p3 << ' ' << *p4 << '\n'; std::cout << *p1 << ' ' << *p2 << ' ' << *p3 << ' ' << *p4 << '\n';

View File

@ -22,14 +22,14 @@ int main()
}; };
// use explicit conversions // use explicit conversions
auto v1 = json_types["boolean"].get<bool>(); auto v1 = json_types["boolean"].template get<bool>();
auto v2 = json_types["number"]["integer"].get<int>(); auto v2 = json_types["number"]["integer"].template get<int>();
auto v3 = json_types["number"]["integer"].get<short>(); auto v3 = json_types["number"]["integer"].template get<short>();
auto v4 = json_types["number"]["floating-point"].get<float>(); auto v4 = json_types["number"]["floating-point"].template get<float>();
auto v5 = json_types["number"]["floating-point"].get<int>(); auto v5 = json_types["number"]["floating-point"].template get<int>();
auto v6 = json_types["string"].get<std::string>(); auto v6 = json_types["string"].template get<std::string>();
auto v7 = json_types["array"].get<std::vector<short>>(); auto v7 = json_types["array"].template get<std::vector<short>>();
auto v8 = json_types.get<std::unordered_map<std::string, json>>(); auto v8 = json_types.template get<std::unordered_map<std::string, json>>();
// print the conversion results // print the conversion results
std::cout << v1 << '\n'; std::cout << v1 << '\n';

View File

@ -30,7 +30,6 @@ int main()
std::vector<short> v7; std::vector<short> v7;
std::unordered_map<std::string, json> v8; std::unordered_map<std::string, json> v8;
// use explicit conversions // use explicit conversions
json_types["boolean"].get_to(v1); json_types["boolean"].get_to(v1);
json_types["number"]["integer"].get_to(v2); json_types["number"]["integer"].get_to(v2);

View File

@ -45,13 +45,13 @@ int main()
// deserialization: json -> person // deserialization: json -> person
json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json; json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json;
auto p2 = j2.get<ns::person>(); auto p2 = j2.template get<ns::person>();
// incomplete deserialization: // incomplete deserialization:
json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json; json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json;
try try
{ {
auto p3 = j3.get<ns::person>(); auto p3 = j3.template get<ns::person>();
} }
catch (json::exception& e) catch (json::exception& e)
{ {

View File

@ -33,13 +33,13 @@ int main()
// deserialization: json -> person // deserialization: json -> person
json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json; json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json;
auto p2 = j2.get<ns::person>(); auto p2 = j2.template get<ns::person>();
// incomplete deserialization: // incomplete deserialization:
json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json; json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json;
try try
{ {
auto p3 = j3.get<ns::person>(); auto p3 = j3.template get<ns::person>();
} }
catch (json::exception& e) catch (json::exception& e)
{ {

View File

@ -46,10 +46,10 @@ int main()
// deserialization: json -> person // deserialization: json -> person
json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json; json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json;
auto p2 = j2.get<ns::person>(); auto p2 = j2.template get<ns::person>();
// incomplete deserialization: // incomplete deserialization:
json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json; json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json;
auto p3 = j3.get<ns::person>(); auto p3 = j3.template get<ns::person>();
std::cout << "roundtrip: " << json(p3) << std::endl; std::cout << "roundtrip: " << json(p3) << std::endl;
} }

View File

@ -33,10 +33,10 @@ int main()
// deserialization: json -> person // deserialization: json -> person
json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json; json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json;
auto p2 = j2.get<ns::person>(); auto p2 = j2.template get<ns::person>();
// incomplete deserialization: // incomplete deserialization:
json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json; json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json;
auto p3 = j3.get<ns::person>(); auto p3 = j3.template get<ns::person>();
std::cout << "roundtrip: " << json(p3) << std::endl; std::cout << "roundtrip: " << json(p3) << std::endl;
} }

View File

@ -38,13 +38,13 @@ int main()
// deserialization: json -> person // deserialization: json -> person
json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json; json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json;
auto p2 = j2.get<ns::person>(); auto p2 = j2.template get<ns::person>();
// incomplete deserialization: // incomplete deserialization:
json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json; json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json;
try try
{ {
auto p3 = j3.get<ns::person>(); auto p3 = j3.template get<ns::person>();
} }
catch (json::exception& e) catch (json::exception& e)
{ {

View File

@ -26,13 +26,13 @@ int main()
// deserialization: json -> person // deserialization: json -> person
json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json; json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json;
auto p2 = j2.get<ns::person>(); auto p2 = j2.template get<ns::person>();
// incomplete deserialization: // incomplete deserialization:
json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json; json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json;
try try
{ {
auto p3 = j3.get<ns::person>(); auto p3 = j3.template get<ns::person>();
} }
catch (json::exception& e) catch (json::exception& e)
{ {

View File

@ -44,10 +44,10 @@ int main()
// deserialization: json -> person // deserialization: json -> person
json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json; json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json;
auto p2 = j2.get<ns::person>(); auto p2 = j2.template get<ns::person>();
// incomplete deserialization: // incomplete deserialization:
json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json; json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json;
auto p3 = j3.get<ns::person>(); auto p3 = j3.template get<ns::person>();
std::cout << "roundtrip: " << json(p3) << std::endl; std::cout << "roundtrip: " << json(p3) << std::endl;
} }

View File

@ -31,10 +31,10 @@ int main()
// deserialization: json -> person // deserialization: json -> person
json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json; json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json;
auto p2 = j2.get<ns::person>(); auto p2 = j2.template get<ns::person>();
// incomplete deserialization: // incomplete deserialization:
json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json; json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json;
auto p3 = j3.get<ns::person>(); auto p3 = j3.template get<ns::person>();
std::cout << "roundtrip: " << json(p3) << std::endl; std::cout << "roundtrip: " << json(p3) << std::endl;
} }

View File

@ -44,16 +44,16 @@ int main()
// deserialization // deserialization
json j_running = "running"; json j_running = "running";
json j_blue = "blue"; json j_blue = "blue";
auto running = j_running.get<ns::TaskState>(); auto running = j_running.template get<ns::TaskState>();
auto blue = j_blue.get<ns::Color>(); auto blue = j_blue.template get<ns::Color>();
std::cout << j_running << " -> " << running std::cout << j_running << " -> " << running
<< ", " << j_blue << " -> " << static_cast<int>(blue) << std::endl; << ", " << j_blue << " -> " << static_cast<int>(blue) << std::endl;
// deserializing undefined JSON value to enum // deserializing undefined JSON value to enum
// (where the first map entry above is the default) // (where the first map entry above is the default)
json j_pi = 3.14; json j_pi = 3.14;
auto invalid = j_pi.get<ns::TaskState>(); auto invalid = j_pi.template get<ns::TaskState>();
auto unknown = j_pi.get<ns::Color>(); auto unknown = j_pi.template get<ns::Color>();
std::cout << j_pi << " -> " << invalid << ", " std::cout << j_pi << " -> " << invalid << ", "
<< j_pi << " -> " << static_cast<int>(unknown) << std::endl; << j_pi << " -> " << static_cast<int>(unknown) << std::endl;
} }

View File

@ -26,8 +26,8 @@ int main()
// deserialization // deserialization
json j_rot = "rot"; json j_rot = "rot";
auto rot = j_rot.get<ns::Color>(); auto rot = j_rot.template get<ns::Color>();
auto red = j_red.get<ns::Color>(); auto red = j_red.template get<ns::Color>();
std::cout << j_rot << " -> " << static_cast<int>(rot) << std::endl; std::cout << j_rot << " -> " << static_cast<int>(rot) << std::endl;
std::cout << j_red << " -> " << static_cast<int>(red) << std::endl; std::cout << j_red << " -> " << static_cast<int>(red) << std::endl;
} }

View File

@ -32,7 +32,6 @@ int main()
json string = "foo"; json string = "foo";
json discarded = json(json::value_t::discarded); json discarded = json(json::value_t::discarded);
// output values and comparisons // output values and comparisons
std::cout << array_1 << " <=> " << array_2 << " := " << to_string(array_1 <=> array_2) << '\n'; // *NOPAD* std::cout << array_1 << " <=> " << array_2 << " := " << to_string(array_1 <=> array_2) << '\n'; // *NOPAD*
std::cout << object_1 << " <=> " << object_2 << " := " << to_string(object_1 <=> object_2) << '\n'; // *NOPAD* std::cout << object_1 << " <=> " << object_2 << " := " << to_string(object_1 <=> object_2) << '\n'; // *NOPAD*

View File

@ -31,7 +31,6 @@ int main()
json number = 17; json number = 17;
json string = "17"; json string = "17";
// output values and comparisons // output values and comparisons
std::cout << std::boolalpha << std::fixed; std::cout << std::boolalpha << std::fixed;
std::cout << boolean << " <=> " << true << " := " << to_string(boolean <=> true) << '\n'; // *NOPAD* std::cout << boolean << " <=> " << true << " := " << to_string(boolean <=> true) << '\n'; // *NOPAD*

View File

@ -33,7 +33,6 @@ int main()
json j_complete = json::parse(ss); json j_complete = json::parse(ss);
std::cout << std::setw(4) << j_complete << "\n\n"; std::cout << std::setw(4) << j_complete << "\n\n";
// define parser callback // define parser callback
json::parser_callback_t cb = [](int depth, json::parse_event_t event, json & parsed) json::parser_callback_t cb = [](int depth, json::parse_event_t event, json & parsed)
{ {

View File

@ -28,7 +28,6 @@ int main()
json j_complete = json::parse(text); json j_complete = json::parse(text);
std::cout << std::setw(4) << j_complete << "\n\n"; std::cout << std::setw(4) << j_complete << "\n\n";
// define parser callback // define parser callback
json::parser_callback_t cb = [](int depth, json::parse_event_t event, json & parsed) json::parser_callback_t cb = [](int depth, json::parse_event_t event, json & parsed)
{ {

View File

@ -37,7 +37,7 @@ Copy of the JSON value, converted to `ValueType`
??? example "Example: (1) Default-constructible type" ??? example "Example: (1) Default-constructible type"
The example below shows how a `from_json` function can be implemented for a user-defined type. This function is The example below shows how a `from_json` function can be implemented for a user-defined type. This function is
called by the `adl_serializer` when `get<ns::person>()` is called. called by the `adl_serializer` when `template get<ns::person>()` is called.
```cpp ```cpp
--8<-- "examples/from_json__default_constructible.cpp" --8<-- "examples/from_json__default_constructible.cpp"

View File

@ -13,7 +13,7 @@ template<
class NumberFloatType = double, class NumberFloatType = double,
template<typename U> class AllocatorType = std::allocator, template<typename U> class AllocatorType = std::allocator,
template<typename T, typename SFINAE = void> class JSONSerializer = adl_serializer, template<typename T, typename SFINAE = void> class JSONSerializer = adl_serializer,
class BinaryType = std::vector<std::uint8_t, class BinaryType = std::vector<std::uint8_t>,
class CustomBaseClass = void> class CustomBaseClass = void>
> >
class basic_json; class basic_json;

View File

@ -53,7 +53,7 @@ The default value is `0`.
const json j = Choice::first; const json j = Choice::first;
// normally invokes from_json parse function but with JSON_DISABLE_ENUM_SERIALIZATION defined, it does not // normally invokes from_json parse function but with JSON_DISABLE_ENUM_SERIALIZATION defined, it does not
Choice ch = j.get<Choice>(); Choice ch = j.template get<Choice>();
} }
``` ```
@ -86,7 +86,7 @@ The default value is `0`.
const json j = Choice::first; const json j = Choice::first;
// uses user-defined from_json function defined by macro // uses user-defined from_json function defined by macro
Choice ch = j.get<Choice>(); Choice ch = j.template get<Choice>();
} }
``` ```
@ -109,7 +109,7 @@ The default value is `0`.
void from_json(const json& j, Choice& ch) void from_json(const json& j, Choice& ch)
{ {
auto value = j.get<std::string>(); auto value = j.template get<std::string>();
if (value == "first") if (value == "first")
{ {
ch = Choice::first; ch = Choice::first;
@ -122,7 +122,7 @@ The default value is `0`.
void to_json(json& j, const Choice& ch) void to_json(json& j, const Choice& ch)
{ {
auto value = j.get<std::string>(); auto value = j.template get<std::string>();
if (value == "first") if (value == "first")
{ {
ch = Choice::first; ch = Choice::first;
@ -139,7 +139,7 @@ The default value is `0`.
const json j = Choice::first; const json j = Choice::first;
// uses user-defined from_json function // uses user-defined from_json function
Choice ch = j.get<Choice>(); Choice ch = j.template get<Choice>();
} }
``` ```

View File

@ -46,7 +46,7 @@ By default, implicit conversions are enabled.
```cpp ```cpp
json j = "Hello, world!"; json j = "Hello, world!";
auto s = j.get<std::string>(); auto s = j.template get<std::string>();
``` ```
## See also ## See also

View File

@ -37,7 +37,7 @@ inline void from_json(const BasicJsonType& j, type& e);
!!! important "Important notes" !!! important "Important notes"
- When using [`get<ENUM_TYPE>()`](../basic_json/get.md), undefined JSON values will default to the first specified - When using [`template get<ENUM_TYPE>()`](../basic_json/get.md), undefined JSON values will default to the first specified
conversion. Select this default pair carefully. See example 1 below. conversion. Select this default pair carefully. See example 1 below.
- If an enum or JSON value is specified in multiple conversions, the first matching conversion from the top of the - If an enum or JSON value is specified in multiple conversions, the first matching conversion from the top of the
list will be returned when converting to or from JSON. See example 2 below. list will be returned when converting to or from JSON. See example 2 below.

View File

@ -24,9 +24,9 @@ j["age"] = p.age;
// convert from JSON: copy each value from the JSON object // convert from JSON: copy each value from the JSON object
ns::person p { ns::person p {
j["name"].get<std::string>(), j["name"].template get<std::string>(),
j["address"].get<std::string>(), j["address"].template get<std::string>(),
j["age"].get<int>() j["age"].template get<int>()
}; };
``` ```
@ -43,7 +43,7 @@ std::cout << j << std::endl;
// {"address":"744 Evergreen Terrace","age":60,"name":"Ned Flanders"} // {"address":"744 Evergreen Terrace","age":60,"name":"Ned Flanders"}
// conversion: json -> person // conversion: json -> person
auto p2 = j.get<ns::person>(); auto p2 = j.template get<ns::person>();
// that's it // that's it
assert(p == p2); assert(p == p2);
@ -70,13 +70,13 @@ namespace ns {
``` ```
That's all! When calling the `json` constructor with your type, your custom `to_json` method will be automatically called. That's all! When calling the `json` constructor with your type, your custom `to_json` method will be automatically called.
Likewise, when calling `get<your_type>()` or `get_to(your_type&)`, the `from_json` method will be called. Likewise, when calling `template get<your_type>()` or `get_to(your_type&)`, the `from_json` method will be called.
Some important things: Some important things:
* Those methods **MUST** be in your type's namespace (which can be the global namespace), or the library will not be able to locate them (in this example, they are in namespace `ns`, where `person` is defined). * Those methods **MUST** be in your type's namespace (which can be the global namespace), or the library will not be able to locate them (in this example, they are in namespace `ns`, where `person` is defined).
* Those methods **MUST** be available (e.g., proper headers must be included) everywhere you use these conversions. Look at [issue 1108](https://github.com/nlohmann/json/issues/1108) for errors that may occur otherwise. * Those methods **MUST** be available (e.g., proper headers must be included) everywhere you use these conversions. Look at [issue 1108](https://github.com/nlohmann/json/issues/1108) for errors that may occur otherwise.
* When using `get<your_type>()`, `your_type` **MUST** be [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). (There is a way to bypass this requirement described later.) * When using `template get<your_type>()`, `your_type` **MUST** be [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). (There is a way to bypass this requirement described later.)
* In function `from_json`, use function [`at()`](../api/basic_json/at.md) to access the object values rather than `operator[]`. In case a key does not exist, `at` throws an exception that you can handle, whereas `operator[]` exhibits undefined behavior. * In function `from_json`, use function [`at()`](../api/basic_json/at.md) to access the object values rather than `operator[]`. In case a key does not exist, `at` throws an exception that you can handle, whereas `operator[]` exhibits undefined behavior.
* You do not need to add serializers or deserializers for STL types like `std::vector`: the library already implements these. * You do not need to add serializers or deserializers for STL types like `std::vector`: the library already implements these.
@ -171,7 +171,7 @@ struct adl_serializer<boost::optional<T>> {
if (j.is_null()) { if (j.is_null()) {
opt = boost::none; opt = boost::none;
} else { } else {
opt = j.get<T>(); // same as above, but with opt = j.template get<T>(); // same as above, but with
// adl_serializer<T>::from_json // adl_serializer<T>::from_json
} }
} }
@ -204,7 +204,7 @@ namespace nlohmann {
// note: the return type is no longer 'void', and the method only takes // note: the return type is no longer 'void', and the method only takes
// one argument // one argument
static move_only_type from_json(const json& j) { static move_only_type from_json(const json& j) {
return {j.get<int>()}; return {j.template get<int>()};
} }
// Here's the catch! You must provide a to_json method! Otherwise, you // Here's the catch! You must provide a to_json method! Otherwise, you
@ -268,7 +268,7 @@ struct bad_serializer
static void to_json(const BasicJsonType& j, T& value) { static void to_json(const BasicJsonType& j, T& value) {
// this calls BasicJsonType::json_serializer<T>::from_json(j, value); // this calls BasicJsonType::json_serializer<T>::from_json(j, value);
// if BasicJsonType::json_serializer == bad_serializer ... oops! // if BasicJsonType::json_serializer == bad_serializer ... oops!
value = j.template get<T>(); // oops! value = j.template template get<T>(); // oops!
} }
}; };
``` ```

View File

@ -36,11 +36,11 @@ assert(j == "stopped");
// json string to enum // json string to enum
json j3 = "running"; json j3 = "running";
assert(j3.get<TaskState>() == TS_RUNNING); assert(j3.template get<TaskState>() == TS_RUNNING);
// undefined json value to enum (where the first map entry above is the default) // undefined json value to enum (where the first map entry above is the default)
json jPi = 3.14; json jPi = 3.14;
assert(jPi.get<TaskState>() == TS_INVALID ); assert(jPi.template get<TaskState>() == TS_INVALID );
``` ```
## Notes ## Notes
@ -54,7 +54,7 @@ Just as in [Arbitrary Type Conversions](arbitrary_types.md) above,
Other Important points: Other Important points:
- When using `get<ENUM_TYPE>()`, undefined JSON values will default to the first pair specified in your map. Select this - When using `template get<ENUM_TYPE>()`, undefined JSON values will default to the first pair specified in your map. Select this
default pair carefully. default pair carefully.
- If an enum or JSON value is specified more than once in your map, the first matching occurrence from the top of the - If an enum or JSON value is specified more than once in your map, the first matching occurrence from the top of the
map will be returned when converting to or from JSON. map will be returned when converting to or from JSON.

View File

@ -235,9 +235,9 @@ integers, and between integers and floating-point values to integers. This beha
!!! warning "Unconditional number conversions" !!! warning "Unconditional number conversions"
```cpp hl_lines="3" ```cpp hl_lines="3"
double d = 42.3; // non-integer double value 42.3 double d = 42.3; // non-integer double value 42.3
json jd = d; // stores double value 42.3 json jd = d; // stores double value 42.3
std::int64_t i = jd.get<std::int64_t>(); // now i==42; no warning or error is produced std::int64_t i = jd.template get<std::int64_t>(); // now i==42; no warning or error is produced
``` ```
Note the last line with throw a [`json.exception.type_error.302`](../../home/exceptions.md#jsonexceptiontype_error302) Note the last line with throw a [`json.exception.type_error.302`](../../home/exceptions.md#jsonexceptiontype_error302)
@ -259,7 +259,7 @@ The rationale is twofold:
if (jd.is_number_integer()) if (jd.is_number_integer())
{ {
// if so, do the conversion and use i // if so, do the conversion and use i
std::int64_t i = jd.get<std::int64_t>(); std::int64_t i = jd.template get<std::int64_t>();
// ... // ...
} }
else else

View File

@ -187,7 +187,7 @@ conversions with calls to [`get`](../api/basic_json/get.md), [`get_to`](../api/b
```cpp ```cpp
nlohmann::json j = "Hello, world!"; nlohmann::json j = "Hello, world!";
auto s = j.get<std::string>(); auto s = j.template get<std::string>();
``` ```
=== "Future-proof (alternative)" === "Future-proof (alternative)"

View File

@ -909,7 +909,7 @@ void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value)
// NB: If the neighbors are computed for single-precision numbers, there is a single float // NB: If the neighbors are computed for single-precision numbers, there is a single float
// (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision // (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision
// value is off by 1 ulp. // value is off by 1 ulp.
#if 0 #if 0 // NOLINT(readability-avoid-unconditional-preprocessor-if)
const boundaries w = compute_boundaries(static_cast<double>(value)); const boundaries w = compute_boundaries(static_cast<double>(value));
#else #else
const boundaries w = compute_boundaries(value); const boundaries w = compute_boundaries(value);

View File

@ -25,7 +25,6 @@
#include <nlohmann/detail/meta/type_traits.hpp> #include <nlohmann/detail/meta/type_traits.hpp>
#include <nlohmann/detail/string_concat.hpp> #include <nlohmann/detail/string_concat.hpp>
NLOHMANN_JSON_NAMESPACE_BEGIN NLOHMANN_JSON_NAMESPACE_BEGIN
namespace detail namespace detail
{ {

View File

@ -55,7 +55,6 @@ static inline bool little_endianness(int num = 1) noexcept
return *reinterpret_cast<char*>(&num) == 1; return *reinterpret_cast<char*>(&num) == 1;
} }
/////////////////// ///////////////////
// binary reader // // binary reader //
/////////////////// ///////////////////

View File

@ -71,7 +71,6 @@ class file_input_adapter
std::FILE* m_file; std::FILE* m_file;
}; };
/*! /*!
Input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at Input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at
beginning of input. Does not support changing the underlying std::streambuf beginning of input. Does not support changing the underlying std::streambuf
@ -170,7 +169,6 @@ class iterator_input_adapter
} }
}; };
template<typename BaseInputAdapter, size_t T> template<typename BaseInputAdapter, size_t T>
struct wide_string_input_helper; struct wide_string_input_helper;
@ -339,7 +337,6 @@ class wide_string_input_adapter
std::size_t utf8_bytes_filled = 0; std::size_t utf8_bytes_filled = 0;
}; };
template<typename IteratorType, typename Enable = void> template<typename IteratorType, typename Enable = void>
struct iterator_input_adapter_factory struct iterator_input_adapter_factory
{ {

View File

@ -142,7 +142,6 @@ struct json_sax
virtual ~json_sax() = default; virtual ~json_sax() = default;
}; };
namespace detail namespace detail
{ {
/*! /*!
@ -591,7 +590,7 @@ class json_sax_dom_callback_parser
if (ref_stack.empty()) if (ref_stack.empty())
{ {
root = std::move(value); root = std::move(value);
return {true, &root}; return {true, & root};
} }
// skip this value if we already decided to skip the parent // skip this value if we already decided to skip the parent
@ -608,7 +607,7 @@ class json_sax_dom_callback_parser
if (ref_stack.back()->is_array()) if (ref_stack.back()->is_array())
{ {
ref_stack.back()->m_data.m_value.array->emplace_back(std::move(value)); ref_stack.back()->m_data.m_value.array->emplace_back(std::move(value));
return {true, &(ref_stack.back()->m_data.m_value.array->back())}; return {true, & (ref_stack.back()->m_data.m_value.array->back())};
} }
// object // object

View File

@ -69,10 +69,10 @@ template<typename IteratorType> class iteration_proxy_value
// older GCCs are a bit fussy and require explicit noexcept specifiers on defaulted functions // older GCCs are a bit fussy and require explicit noexcept specifiers on defaulted functions
iteration_proxy_value(iteration_proxy_value&&) iteration_proxy_value(iteration_proxy_value&&)
noexcept(std::is_nothrow_move_constructible<IteratorType>::value noexcept(std::is_nothrow_move_constructible<IteratorType>::value
&& std::is_nothrow_move_constructible<string_type>::value) = default; && std::is_nothrow_move_constructible<string_type>::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations)
iteration_proxy_value& operator=(iteration_proxy_value&&) iteration_proxy_value& operator=(iteration_proxy_value&&)
noexcept(std::is_nothrow_move_assignable<IteratorType>::value noexcept(std::is_nothrow_move_assignable<IteratorType>::value
&& std::is_nothrow_move_assignable<string_type>::value) = default; && std::is_nothrow_move_assignable<string_type>::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations)
~iteration_proxy_value() = default; ~iteration_proxy_value() = default;
/// dereference operator (needed for range-based for) /// dereference operator (needed for range-based for)

View File

@ -437,7 +437,6 @@
inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast<const BaseType &>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast<const BaseType &>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast<BaseType&>(nlohmann_json_t)); const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast<BaseType&>(nlohmann_json_t)); const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
// inspired from https://stackoverflow.com/a/26745591 // inspired from https://stackoverflow.com/a/26745591
// allows to call any std function as if (e.g. with begin): // allows to call any std function as if (e.g. with begin):
// using std::begin; begin(x); // using std::begin; begin(x);

View File

@ -217,7 +217,6 @@ template <typename... Ts>
struct is_default_constructible<const std::tuple<Ts...>> struct is_default_constructible<const std::tuple<Ts...>>
: conjunction<is_default_constructible<Ts>...> {}; : conjunction<is_default_constructible<Ts>...> {};
template <typename T, typename... Args> template <typename T, typename... Args>
struct is_constructible : std::is_constructible<T, Args...> {}; struct is_constructible : std::is_constructible<T, Args...> {};
@ -233,7 +232,6 @@ struct is_constructible<std::tuple<Ts...>> : is_default_constructible<std::tuple
template <typename... Ts> template <typename... Ts>
struct is_constructible<const std::tuple<Ts...>> : is_default_constructible<const std::tuple<Ts...>> {}; struct is_constructible<const std::tuple<Ts...>> : is_default_constructible<const std::tuple<Ts...>> {};
template<typename T, typename = void> template<typename T, typename = void>
struct is_iterator_traits : std::false_type {}; struct is_iterator_traits : std::false_type {};
@ -643,7 +641,6 @@ struct value_in_range_of_impl2<OfType, T, false, true>
} }
}; };
template<typename OfType, typename T> template<typename OfType, typename T>
struct value_in_range_of_impl2<OfType, T, true, true> struct value_in_range_of_impl2<OfType, T, true, true>
{ {

View File

@ -192,7 +192,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @} /// @}
///////////////////// /////////////////////
// container types // // container types //
///////////////////// /////////////////////
@ -234,7 +233,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @} /// @}
/// @brief returns the allocator associated with the container /// @brief returns the allocator associated with the container
/// @sa https://json.nlohmann.me/api/basic_json/get_allocator/ /// @sa https://json.nlohmann.me/api/basic_json/get_allocator/
static allocator_type get_allocator() static allocator_type get_allocator()
@ -297,7 +295,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
result["compiler"] = {{"family", "unknown"}, {"version", "unknown"}}; result["compiler"] = {{"family", "unknown"}, {"version", "unknown"}};
#endif #endif
#if defined(_MSVC_LANG) #if defined(_MSVC_LANG)
result["compiler"]["c++"] = std::to_string(_MSVC_LANG); result["compiler"]["c++"] = std::to_string(_MSVC_LANG);
#elif defined(__cplusplus) #elif defined(__cplusplus)
@ -308,7 +305,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
return result; return result;
} }
/////////////////////////// ///////////////////////////
// JSON value data types // // JSON value data types //
/////////////////////////// ///////////////////////////
@ -1130,7 +1126,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
assert_invariant(); assert_invariant();
} }
/////////////////////////////////////// ///////////////////////////////////////
// other constructors and destructor // // other constructors and destructor //
/////////////////////////////////////// ///////////////////////////////////////
@ -1212,11 +1207,11 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @brief move constructor /// @brief move constructor
/// @sa https://json.nlohmann.me/api/basic_json/basic_json/ /// @sa https://json.nlohmann.me/api/basic_json/basic_json/
basic_json(basic_json&& other) noexcept basic_json(basic_json&& other) noexcept
: json_base_class_t(std::move(other)), : json_base_class_t(std::forward<json_base_class_t>(other)),
m_data(std::move(other.m_data)) m_data(std::move(other.m_data))
{ {
// check that passed value is valid // check that passed value is valid
other.assert_invariant(false); // NOLINT(bugprone-use-after-move,hicpp-invalid-access-moved) other.assert_invariant(false);
// invalidate payload // invalidate payload
other.m_data.m_type = value_t::null; other.m_data.m_type = value_t::null;
@ -1925,7 +1920,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @} /// @}
//////////////////// ////////////////////
// element access // // element access //
//////////////////// ////////////////////
@ -2640,7 +2634,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @} /// @}
//////////// ////////////
// lookup // // lookup //
//////////// ////////////
@ -2758,7 +2751,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @} /// @}
/////////////// ///////////////
// iterators // // iterators //
/////////////// ///////////////
@ -2897,7 +2889,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @} /// @}
////////////// //////////////
// capacity // // capacity //
////////////// //////////////
@ -3019,7 +3010,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @} /// @}
/////////////// ///////////////
// modifiers // // modifiers //
/////////////// ///////////////
@ -3467,7 +3457,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
void swap(reference other) noexcept ( void swap(reference other) noexcept (
std::is_nothrow_move_constructible<value_t>::value&& std::is_nothrow_move_constructible<value_t>::value&&
std::is_nothrow_move_assignable<value_t>::value&& std::is_nothrow_move_assignable<value_t>::value&&
std::is_nothrow_move_constructible<json_value>::value&& std::is_nothrow_move_constructible<json_value>::value&& // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
std::is_nothrow_move_assignable<json_value>::value std::is_nothrow_move_assignable<json_value>::value
) )
{ {
@ -3484,7 +3474,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
friend void swap(reference left, reference right) noexcept ( friend void swap(reference left, reference right) noexcept (
std::is_nothrow_move_constructible<value_t>::value&& std::is_nothrow_move_constructible<value_t>::value&&
std::is_nothrow_move_assignable<value_t>::value&& std::is_nothrow_move_assignable<value_t>::value&&
std::is_nothrow_move_constructible<json_value>::value&& std::is_nothrow_move_constructible<json_value>::value&& // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
std::is_nothrow_move_assignable<json_value>::value std::is_nothrow_move_assignable<json_value>::value
) )
{ {
@ -3493,7 +3483,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @brief exchanges the values /// @brief exchanges the values
/// @sa https://json.nlohmann.me/api/basic_json/swap/ /// @sa https://json.nlohmann.me/api/basic_json/swap/
void swap(array_t& other) // NOLINT(bugprone-exception-escape) void swap(array_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
{ {
// swap only works for arrays // swap only works for arrays
if (JSON_HEDLEY_LIKELY(is_array())) if (JSON_HEDLEY_LIKELY(is_array()))
@ -3509,7 +3499,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @brief exchanges the values /// @brief exchanges the values
/// @sa https://json.nlohmann.me/api/basic_json/swap/ /// @sa https://json.nlohmann.me/api/basic_json/swap/
void swap(object_t& other) // NOLINT(bugprone-exception-escape) void swap(object_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
{ {
// swap only works for objects // swap only works for objects
if (JSON_HEDLEY_LIKELY(is_object())) if (JSON_HEDLEY_LIKELY(is_object()))
@ -3525,7 +3515,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @brief exchanges the values /// @brief exchanges the values
/// @sa https://json.nlohmann.me/api/basic_json/swap/ /// @sa https://json.nlohmann.me/api/basic_json/swap/
void swap(string_t& other) // NOLINT(bugprone-exception-escape) void swap(string_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
{ {
// swap only works for strings // swap only works for strings
if (JSON_HEDLEY_LIKELY(is_string())) if (JSON_HEDLEY_LIKELY(is_string()))
@ -3541,7 +3531,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @brief exchanges the values /// @brief exchanges the values
/// @sa https://json.nlohmann.me/api/basic_json/swap/ /// @sa https://json.nlohmann.me/api/basic_json/swap/
void swap(binary_t& other) // NOLINT(bugprone-exception-escape) void swap(binary_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
{ {
// swap only works for strings // swap only works for strings
if (JSON_HEDLEY_LIKELY(is_binary())) if (JSON_HEDLEY_LIKELY(is_binary()))
@ -4006,7 +3996,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
#endif // JSON_NO_IO #endif // JSON_NO_IO
/// @} /// @}
///////////////////// /////////////////////
// deserialization // // deserialization //
///////////////////// /////////////////////
@ -4187,7 +4176,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
} }
} }
JSON_PRIVATE_UNLESS_TESTED: JSON_PRIVATE_UNLESS_TESTED:
////////////////////// //////////////////////
// member variables // // member variables //
@ -4405,7 +4393,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler); return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler);
} }
JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_WARN_UNUSED_RESULT
JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len))
static basic_json from_cbor(detail::span_input_adapter&& i, static basic_json from_cbor(detail::span_input_adapter&& i,
@ -4529,7 +4516,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
return res ? result : basic_json(value_t::discarded); return res ? result : basic_json(value_t::discarded);
} }
/// @brief create a JSON value from an input in BJData format /// @brief create a JSON value from an input in BJData format
/// @sa https://json.nlohmann.me/api/basic_json/from_bjdata/ /// @sa https://json.nlohmann.me/api/basic_json/from_bjdata/
template<typename InputType> template<typename InputType>
@ -4810,7 +4796,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
}; };
// wrapper for "remove" operation; remove value at ptr // wrapper for "remove" operation; remove value at ptr
const auto operation_remove = [this, &result](json_pointer & ptr) const auto operation_remove = [this, & result](json_pointer & ptr)
{ {
// get reference to parent of JSON pointer ptr // get reference to parent of JSON pointer ptr
const auto last_path = ptr.back(); const auto last_path = ptr.back();
@ -5234,7 +5220,7 @@ struct less< ::nlohmann::detail::value_t> // do not remove the space after '<',
/// @sa https://json.nlohmann.me/api/basic_json/std_swap/ /// @sa https://json.nlohmann.me/api/basic_json/std_swap/
NLOHMANN_BASIC_JSON_TPL_DECLARATION NLOHMANN_BASIC_JSON_TPL_DECLARATION
inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC_JSON_TPL& j2) noexcept( // NOLINT(readability-inconsistent-declaration-parameter-name, cert-dcl58-cpp) inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC_JSON_TPL& j2) noexcept( // NOLINT(readability-inconsistent-declaration-parameter-name, cert-dcl58-cpp)
is_nothrow_move_constructible<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value&& // NOLINT(misc-redundant-expression) is_nothrow_move_constructible<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value&& // NOLINT(misc-redundant-expression,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
is_nothrow_move_assignable<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value) is_nothrow_move_assignable<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value)
{ {
j1.swap(j2); j1.swap(j2);

View File

@ -118,7 +118,7 @@ template <class Key, class T, class IgnoredLess = std::less<Key>,
template<class KeyType, detail::enable_if_t< template<class KeyType, detail::enable_if_t<
detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
T & at(KeyType && key) T & at(KeyType && key) // NOLINT(cppcoreguidelines-missing-std-forward)
{ {
for (auto it = this->begin(); it != this->end(); ++it) for (auto it = this->begin(); it != this->end(); ++it)
{ {
@ -146,7 +146,7 @@ template <class Key, class T, class IgnoredLess = std::less<Key>,
template<class KeyType, detail::enable_if_t< template<class KeyType, detail::enable_if_t<
detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
const T & at(KeyType && key) const const T & at(KeyType && key) const // NOLINT(cppcoreguidelines-missing-std-forward)
{ {
for (auto it = this->begin(); it != this->end(); ++it) for (auto it = this->begin(); it != this->end(); ++it)
{ {
@ -180,7 +180,7 @@ template <class Key, class T, class IgnoredLess = std::less<Key>,
template<class KeyType, detail::enable_if_t< template<class KeyType, detail::enable_if_t<
detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
size_type erase(KeyType && key) size_type erase(KeyType && key) // NOLINT(cppcoreguidelines-missing-std-forward)
{ {
for (auto it = this->begin(); it != this->end(); ++it) for (auto it = this->begin(); it != this->end(); ++it)
{ {
@ -271,7 +271,7 @@ template <class Key, class T, class IgnoredLess = std::less<Key>,
template<class KeyType, detail::enable_if_t< template<class KeyType, detail::enable_if_t<
detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
size_type count(KeyType && key) const size_type count(KeyType && key) const // NOLINT(cppcoreguidelines-missing-std-forward)
{ {
for (auto it = this->begin(); it != this->end(); ++it) for (auto it = this->begin(); it != this->end(); ++it)
{ {
@ -297,7 +297,7 @@ template <class Key, class T, class IgnoredLess = std::less<Key>,
template<class KeyType, detail::enable_if_t< template<class KeyType, detail::enable_if_t<
detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
iterator find(KeyType && key) iterator find(KeyType && key) // NOLINT(cppcoreguidelines-missing-std-forward)
{ {
for (auto it = this->begin(); it != this->end(); ++it) for (auto it = this->begin(); it != this->end(); ++it)
{ {

View File

@ -41,7 +41,6 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <utility> #include <utility>
// #include <nlohmann/detail/abi_macros.hpp> // #include <nlohmann/detail/abi_macros.hpp>
@ -54,7 +53,6 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
// This file contains all macro definitions affecting or depending on the ABI // This file contains all macro definitions affecting or depending on the ABI
#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK #ifndef JSON_SKIP_LIBRARY_VERSION_CHECK
@ -156,7 +154,6 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <algorithm> // transform #include <algorithm> // transform
#include <array> // array #include <array> // array
#include <forward_list> // forward_list #include <forward_list> // forward_list
@ -179,7 +176,6 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <cstddef> // nullptr_t #include <cstddef> // nullptr_t
#include <exception> // exception #include <exception> // exception
#if JSON_DIAGNOSTICS #if JSON_DIAGNOSTICS
@ -199,7 +195,6 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <array> // array #include <array> // array
#include <cstddef> // size_t #include <cstddef> // size_t
#include <cstdint> // uint8_t #include <cstdint> // uint8_t
@ -215,7 +210,6 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <utility> // declval, pair #include <utility> // declval, pair
// #include <nlohmann/detail/meta/detected.hpp> // #include <nlohmann/detail/meta/detected.hpp>
// __ _____ _____ _____ // __ _____ _____ _____
@ -227,7 +221,6 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <type_traits> #include <type_traits>
// #include <nlohmann/detail/meta/void_t.hpp> // #include <nlohmann/detail/meta/void_t.hpp>
@ -240,7 +233,6 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
// #include <nlohmann/detail/abi_macros.hpp> // #include <nlohmann/detail/abi_macros.hpp>
@ -2959,7 +2951,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
// #include <nlohmann/detail/abi_macros.hpp> // #include <nlohmann/detail/abi_macros.hpp>
@ -3034,7 +3025,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <cstddef> // size_t #include <cstddef> // size_t
// #include <nlohmann/detail/abi_macros.hpp> // #include <nlohmann/detail/abi_macros.hpp>
@ -3077,7 +3067,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <array> // array #include <array> // array
#include <cstddef> // size_t #include <cstddef> // size_t
#include <type_traits> // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type #include <type_traits> // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type
@ -3250,7 +3239,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <limits> // numeric_limits #include <limits> // numeric_limits
#include <type_traits> // false_type, is_constructible, is_integral, is_same, true_type #include <type_traits> // false_type, is_constructible, is_integral, is_same, true_type
#include <utility> // declval #include <utility> // declval
@ -3266,7 +3254,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <iterator> // random_access_iterator_tag #include <iterator> // random_access_iterator_tag
// #include <nlohmann/detail/abi_macros.hpp> // #include <nlohmann/detail/abi_macros.hpp>
@ -3334,7 +3321,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
// #include <nlohmann/detail/macro_scope.hpp> // #include <nlohmann/detail/macro_scope.hpp>
@ -3354,7 +3340,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
// #include <nlohmann/detail/macro_scope.hpp> // #include <nlohmann/detail/macro_scope.hpp>
@ -3643,7 +3628,6 @@ template <typename... Ts>
struct is_default_constructible<const std::tuple<Ts...>> struct is_default_constructible<const std::tuple<Ts...>>
: conjunction<is_default_constructible<Ts>...> {}; : conjunction<is_default_constructible<Ts>...> {};
template <typename T, typename... Args> template <typename T, typename... Args>
struct is_constructible : std::is_constructible<T, Args...> {}; struct is_constructible : std::is_constructible<T, Args...> {};
@ -3659,7 +3643,6 @@ struct is_constructible<std::tuple<Ts...>> : is_default_constructible<std::tuple
template <typename... Ts> template <typename... Ts>
struct is_constructible<const std::tuple<Ts...>> : is_default_constructible<const std::tuple<Ts...>> {}; struct is_constructible<const std::tuple<Ts...>> : is_default_constructible<const std::tuple<Ts...>> {};
template<typename T, typename = void> template<typename T, typename = void>
struct is_iterator_traits : std::false_type {}; struct is_iterator_traits : std::false_type {};
@ -4069,7 +4052,6 @@ struct value_in_range_of_impl2<OfType, T, false, true>
} }
}; };
template<typename OfType, typename T> template<typename OfType, typename T>
struct value_in_range_of_impl2<OfType, T, true, true> struct value_in_range_of_impl2<OfType, T, true, true>
{ {
@ -4175,7 +4157,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <cstring> // strlen #include <cstring> // strlen
#include <string> // string #include <string> // string
#include <utility> // forward #include <utility> // forward
@ -4316,7 +4297,6 @@ inline OutStringType concat(Args && ... args)
NLOHMANN_JSON_NAMESPACE_END NLOHMANN_JSON_NAMESPACE_END
NLOHMANN_JSON_NAMESPACE_BEGIN NLOHMANN_JSON_NAMESPACE_BEGIN
namespace detail namespace detail
{ {
@ -4562,7 +4542,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
// #include <nlohmann/detail/abi_macros.hpp> // #include <nlohmann/detail/abi_macros.hpp>
@ -4586,7 +4565,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
// #include <nlohmann/detail/macro_scope.hpp> // #include <nlohmann/detail/macro_scope.hpp>
@ -5092,7 +5070,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <algorithm> // copy #include <algorithm> // copy
#include <iterator> // begin, end #include <iterator> // begin, end
#include <string> // string #include <string> // string
@ -5112,7 +5089,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <cstddef> // size_t #include <cstddef> // size_t
#include <iterator> // input_iterator_tag #include <iterator> // input_iterator_tag
#include <string> // string, to_string #include <string> // string, to_string
@ -5177,10 +5153,10 @@ template<typename IteratorType> class iteration_proxy_value
// older GCCs are a bit fussy and require explicit noexcept specifiers on defaulted functions // older GCCs are a bit fussy and require explicit noexcept specifiers on defaulted functions
iteration_proxy_value(iteration_proxy_value&&) iteration_proxy_value(iteration_proxy_value&&)
noexcept(std::is_nothrow_move_constructible<IteratorType>::value noexcept(std::is_nothrow_move_constructible<IteratorType>::value
&& std::is_nothrow_move_constructible<string_type>::value) = default; && std::is_nothrow_move_constructible<string_type>::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations)
iteration_proxy_value& operator=(iteration_proxy_value&&) iteration_proxy_value& operator=(iteration_proxy_value&&)
noexcept(std::is_nothrow_move_assignable<IteratorType>::value noexcept(std::is_nothrow_move_assignable<IteratorType>::value
&& std::is_nothrow_move_assignable<string_type>::value) = default; && std::is_nothrow_move_assignable<string_type>::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations)
~iteration_proxy_value() = default; ~iteration_proxy_value() = default;
/// dereference operator (needed for range-based for) /// dereference operator (needed for range-based for)
@ -5833,7 +5809,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <cstdint> // uint8_t, uint64_t #include <cstdint> // uint8_t, uint64_t
#include <tuple> // tie #include <tuple> // tie
#include <utility> // move #include <utility> // move
@ -5945,7 +5920,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <cstdint> // uint8_t #include <cstdint> // uint8_t
#include <cstddef> // size_t #include <cstddef> // size_t
#include <functional> // hash #include <functional> // hash
@ -6078,7 +6052,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <algorithm> // generate_n #include <algorithm> // generate_n
#include <array> // array #include <array> // array
#include <cmath> // ldexp #include <cmath> // ldexp
@ -6104,7 +6077,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <array> // array #include <array> // array
#include <cstddef> // size_t #include <cstddef> // size_t
#include <cstring> // strlen #include <cstring> // strlen
@ -6170,7 +6142,6 @@ class file_input_adapter
std::FILE* m_file; std::FILE* m_file;
}; };
/*! /*!
Input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at Input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at
beginning of input. Does not support changing the underlying std::streambuf beginning of input. Does not support changing the underlying std::streambuf
@ -6269,7 +6240,6 @@ class iterator_input_adapter
} }
}; };
template<typename BaseInputAdapter, size_t T> template<typename BaseInputAdapter, size_t T>
struct wide_string_input_helper; struct wide_string_input_helper;
@ -6438,7 +6408,6 @@ class wide_string_input_adapter
std::size_t utf8_bytes_filled = 0; std::size_t utf8_bytes_filled = 0;
}; };
template<typename IteratorType, typename Enable = void> template<typename IteratorType, typename Enable = void>
struct iterator_input_adapter_factory struct iterator_input_adapter_factory
{ {
@ -6602,7 +6571,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <cstddef> #include <cstddef>
#include <string> // string #include <string> // string
#include <utility> // move #include <utility> // move
@ -6740,7 +6708,6 @@ struct json_sax
virtual ~json_sax() = default; virtual ~json_sax() = default;
}; };
namespace detail namespace detail
{ {
/*! /*!
@ -7189,7 +7156,7 @@ class json_sax_dom_callback_parser
if (ref_stack.empty()) if (ref_stack.empty())
{ {
root = std::move(value); root = std::move(value);
return {true, &root}; return {true, & root};
} }
// skip this value if we already decided to skip the parent // skip this value if we already decided to skip the parent
@ -7206,7 +7173,7 @@ class json_sax_dom_callback_parser
if (ref_stack.back()->is_array()) if (ref_stack.back()->is_array())
{ {
ref_stack.back()->m_data.m_value.array->emplace_back(std::move(value)); ref_stack.back()->m_data.m_value.array->emplace_back(std::move(value));
return {true, &(ref_stack.back()->m_data.m_value.array->back())}; return {true, & (ref_stack.back()->m_data.m_value.array->back())};
} }
// object // object
@ -7335,7 +7302,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <array> // array #include <array> // array
#include <clocale> // localeconv #include <clocale> // localeconv
#include <cstddef> // size_t #include <cstddef> // size_t
@ -8974,7 +8940,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <cstdint> // size_t #include <cstdint> // size_t
#include <utility> // declval #include <utility> // declval
#include <string> // string #include <string> // string
@ -9159,7 +9124,6 @@ static inline bool little_endianness(int num = 1) noexcept
return *reinterpret_cast<char*>(&num) == 1; return *reinterpret_cast<char*>(&num) == 1;
} }
/////////////////// ///////////////////
// binary reader // // binary reader //
/////////////////// ///////////////////
@ -12127,7 +12091,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <cmath> // isfinite #include <cmath> // isfinite
#include <cstdint> // uint8_t #include <cstdint> // uint8_t
#include <functional> // function #include <functional> // function
@ -12644,7 +12607,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
// #include <nlohmann/detail/abi_macros.hpp> // #include <nlohmann/detail/abi_macros.hpp>
// #include <nlohmann/detail/iterators/primitive_iterator.hpp> // #include <nlohmann/detail/iterators/primitive_iterator.hpp>
@ -12657,7 +12619,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <cstddef> // ptrdiff_t #include <cstddef> // ptrdiff_t
#include <limits> // numeric_limits #include <limits> // numeric_limits
@ -12816,7 +12777,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <iterator> // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next #include <iterator> // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next
#include <type_traits> // conditional, is_const, remove_const #include <type_traits> // conditional, is_const, remove_const
@ -13578,7 +13538,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <cstddef> // ptrdiff_t #include <cstddef> // ptrdiff_t
#include <iterator> // reverse_iterator #include <iterator> // reverse_iterator
#include <utility> // declval #include <utility> // declval
@ -13747,7 +13706,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <algorithm> // all_of #include <algorithm> // all_of
#include <cctype> // isdigit #include <cctype> // isdigit
#include <cerrno> // errno, ERANGE #include <cerrno> // errno, ERANGE
@ -14742,7 +14700,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <initializer_list> #include <initializer_list>
#include <utility> #include <utility>
@ -14834,7 +14791,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <algorithm> // reverse #include <algorithm> // reverse
#include <array> // array #include <array> // array
#include <map> // map #include <map> // map
@ -14860,7 +14816,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <algorithm> // copy #include <algorithm> // copy
#include <cstddef> // size_t #include <cstddef> // size_t
#include <iterator> // back_inserter #include <iterator> // back_inserter
@ -16829,7 +16784,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <algorithm> // reverse, remove, fill, find, none_of #include <algorithm> // reverse, remove, fill, find, none_of
#include <array> // array #include <array> // array
#include <clocale> // localeconv, lconv #include <clocale> // localeconv, lconv
@ -16854,7 +16808,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <array> // array #include <array> // array
#include <cmath> // signbit, isfinite #include <cmath> // signbit, isfinite
#include <cstdint> // intN_t, uintN_t #include <cstdint> // intN_t, uintN_t
@ -17756,7 +17709,7 @@ void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value)
// NB: If the neighbors are computed for single-precision numbers, there is a single float // NB: If the neighbors are computed for single-precision numbers, there is a single float
// (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision // (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision
// value is off by 1 ulp. // value is off by 1 ulp.
#if 0 #if 0 // NOLINT(readability-avoid-unconditional-preprocessor-if)
const boundaries w = compute_boundaries(static_cast<double>(value)); const boundaries w = compute_boundaries(static_cast<double>(value));
#else #else
const boundaries w = compute_boundaries(value); const boundaries w = compute_boundaries(value);
@ -18949,7 +18902,6 @@ NLOHMANN_JSON_NAMESPACE_END
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include <functional> // equal_to, less #include <functional> // equal_to, less
#include <initializer_list> // initializer_list #include <initializer_list> // initializer_list
#include <iterator> // input_iterator_tag, iterator_traits #include <iterator> // input_iterator_tag, iterator_traits
@ -19062,7 +19014,7 @@ template <class Key, class T, class IgnoredLess = std::less<Key>,
template<class KeyType, detail::enable_if_t< template<class KeyType, detail::enable_if_t<
detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
T & at(KeyType && key) T & at(KeyType && key) // NOLINT(cppcoreguidelines-missing-std-forward)
{ {
for (auto it = this->begin(); it != this->end(); ++it) for (auto it = this->begin(); it != this->end(); ++it)
{ {
@ -19090,7 +19042,7 @@ template <class Key, class T, class IgnoredLess = std::less<Key>,
template<class KeyType, detail::enable_if_t< template<class KeyType, detail::enable_if_t<
detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
const T & at(KeyType && key) const const T & at(KeyType && key) const // NOLINT(cppcoreguidelines-missing-std-forward)
{ {
for (auto it = this->begin(); it != this->end(); ++it) for (auto it = this->begin(); it != this->end(); ++it)
{ {
@ -19124,7 +19076,7 @@ template <class Key, class T, class IgnoredLess = std::less<Key>,
template<class KeyType, detail::enable_if_t< template<class KeyType, detail::enable_if_t<
detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
size_type erase(KeyType && key) size_type erase(KeyType && key) // NOLINT(cppcoreguidelines-missing-std-forward)
{ {
for (auto it = this->begin(); it != this->end(); ++it) for (auto it = this->begin(); it != this->end(); ++it)
{ {
@ -19215,7 +19167,7 @@ template <class Key, class T, class IgnoredLess = std::less<Key>,
template<class KeyType, detail::enable_if_t< template<class KeyType, detail::enable_if_t<
detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
size_type count(KeyType && key) const size_type count(KeyType && key) const // NOLINT(cppcoreguidelines-missing-std-forward)
{ {
for (auto it = this->begin(); it != this->end(); ++it) for (auto it = this->begin(); it != this->end(); ++it)
{ {
@ -19241,7 +19193,7 @@ template <class Key, class T, class IgnoredLess = std::less<Key>,
template<class KeyType, detail::enable_if_t< template<class KeyType, detail::enable_if_t<
detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
iterator find(KeyType && key) iterator find(KeyType && key) // NOLINT(cppcoreguidelines-missing-std-forward)
{ {
for (auto it = this->begin(); it != this->end(); ++it) for (auto it = this->begin(); it != this->end(); ++it)
{ {
@ -19434,7 +19386,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @} /// @}
///////////////////// /////////////////////
// container types // // container types //
///////////////////// /////////////////////
@ -19476,7 +19427,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @} /// @}
/// @brief returns the allocator associated with the container /// @brief returns the allocator associated with the container
/// @sa https://json.nlohmann.me/api/basic_json/get_allocator/ /// @sa https://json.nlohmann.me/api/basic_json/get_allocator/
static allocator_type get_allocator() static allocator_type get_allocator()
@ -19539,7 +19489,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
result["compiler"] = {{"family", "unknown"}, {"version", "unknown"}}; result["compiler"] = {{"family", "unknown"}, {"version", "unknown"}};
#endif #endif
#if defined(_MSVC_LANG) #if defined(_MSVC_LANG)
result["compiler"]["c++"] = std::to_string(_MSVC_LANG); result["compiler"]["c++"] = std::to_string(_MSVC_LANG);
#elif defined(__cplusplus) #elif defined(__cplusplus)
@ -19550,7 +19499,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
return result; return result;
} }
/////////////////////////// ///////////////////////////
// JSON value data types // // JSON value data types //
/////////////////////////// ///////////////////////////
@ -20372,7 +20320,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
assert_invariant(); assert_invariant();
} }
/////////////////////////////////////// ///////////////////////////////////////
// other constructors and destructor // // other constructors and destructor //
/////////////////////////////////////// ///////////////////////////////////////
@ -20454,11 +20401,11 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @brief move constructor /// @brief move constructor
/// @sa https://json.nlohmann.me/api/basic_json/basic_json/ /// @sa https://json.nlohmann.me/api/basic_json/basic_json/
basic_json(basic_json&& other) noexcept basic_json(basic_json&& other) noexcept
: json_base_class_t(std::move(other)), : json_base_class_t(std::forward<json_base_class_t>(other)),
m_data(std::move(other.m_data)) m_data(std::move(other.m_data))
{ {
// check that passed value is valid // check that passed value is valid
other.assert_invariant(false); // NOLINT(bugprone-use-after-move,hicpp-invalid-access-moved) other.assert_invariant(false);
// invalidate payload // invalidate payload
other.m_data.m_type = value_t::null; other.m_data.m_type = value_t::null;
@ -21167,7 +21114,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @} /// @}
//////////////////// ////////////////////
// element access // // element access //
//////////////////// ////////////////////
@ -21882,7 +21828,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @} /// @}
//////////// ////////////
// lookup // // lookup //
//////////// ////////////
@ -22000,7 +21945,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @} /// @}
/////////////// ///////////////
// iterators // // iterators //
/////////////// ///////////////
@ -22139,7 +22083,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @} /// @}
////////////// //////////////
// capacity // // capacity //
////////////// //////////////
@ -22261,7 +22204,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @} /// @}
/////////////// ///////////////
// modifiers // // modifiers //
/////////////// ///////////////
@ -22709,7 +22651,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
void swap(reference other) noexcept ( void swap(reference other) noexcept (
std::is_nothrow_move_constructible<value_t>::value&& std::is_nothrow_move_constructible<value_t>::value&&
std::is_nothrow_move_assignable<value_t>::value&& std::is_nothrow_move_assignable<value_t>::value&&
std::is_nothrow_move_constructible<json_value>::value&& std::is_nothrow_move_constructible<json_value>::value&& // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
std::is_nothrow_move_assignable<json_value>::value std::is_nothrow_move_assignable<json_value>::value
) )
{ {
@ -22726,7 +22668,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
friend void swap(reference left, reference right) noexcept ( friend void swap(reference left, reference right) noexcept (
std::is_nothrow_move_constructible<value_t>::value&& std::is_nothrow_move_constructible<value_t>::value&&
std::is_nothrow_move_assignable<value_t>::value&& std::is_nothrow_move_assignable<value_t>::value&&
std::is_nothrow_move_constructible<json_value>::value&& std::is_nothrow_move_constructible<json_value>::value&& // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
std::is_nothrow_move_assignable<json_value>::value std::is_nothrow_move_assignable<json_value>::value
) )
{ {
@ -22735,7 +22677,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @brief exchanges the values /// @brief exchanges the values
/// @sa https://json.nlohmann.me/api/basic_json/swap/ /// @sa https://json.nlohmann.me/api/basic_json/swap/
void swap(array_t& other) // NOLINT(bugprone-exception-escape) void swap(array_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
{ {
// swap only works for arrays // swap only works for arrays
if (JSON_HEDLEY_LIKELY(is_array())) if (JSON_HEDLEY_LIKELY(is_array()))
@ -22751,7 +22693,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @brief exchanges the values /// @brief exchanges the values
/// @sa https://json.nlohmann.me/api/basic_json/swap/ /// @sa https://json.nlohmann.me/api/basic_json/swap/
void swap(object_t& other) // NOLINT(bugprone-exception-escape) void swap(object_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
{ {
// swap only works for objects // swap only works for objects
if (JSON_HEDLEY_LIKELY(is_object())) if (JSON_HEDLEY_LIKELY(is_object()))
@ -22767,7 +22709,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @brief exchanges the values /// @brief exchanges the values
/// @sa https://json.nlohmann.me/api/basic_json/swap/ /// @sa https://json.nlohmann.me/api/basic_json/swap/
void swap(string_t& other) // NOLINT(bugprone-exception-escape) void swap(string_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
{ {
// swap only works for strings // swap only works for strings
if (JSON_HEDLEY_LIKELY(is_string())) if (JSON_HEDLEY_LIKELY(is_string()))
@ -22783,7 +22725,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
/// @brief exchanges the values /// @brief exchanges the values
/// @sa https://json.nlohmann.me/api/basic_json/swap/ /// @sa https://json.nlohmann.me/api/basic_json/swap/
void swap(binary_t& other) // NOLINT(bugprone-exception-escape) void swap(binary_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
{ {
// swap only works for strings // swap only works for strings
if (JSON_HEDLEY_LIKELY(is_binary())) if (JSON_HEDLEY_LIKELY(is_binary()))
@ -23248,7 +23190,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
#endif // JSON_NO_IO #endif // JSON_NO_IO
/// @} /// @}
///////////////////// /////////////////////
// deserialization // // deserialization //
///////////////////// /////////////////////
@ -23429,7 +23370,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
} }
} }
JSON_PRIVATE_UNLESS_TESTED: JSON_PRIVATE_UNLESS_TESTED:
////////////////////// //////////////////////
// member variables // // member variables //
@ -23647,7 +23587,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler); return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler);
} }
JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_WARN_UNUSED_RESULT
JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len))
static basic_json from_cbor(detail::span_input_adapter&& i, static basic_json from_cbor(detail::span_input_adapter&& i,
@ -23771,7 +23710,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
return res ? result : basic_json(value_t::discarded); return res ? result : basic_json(value_t::discarded);
} }
/// @brief create a JSON value from an input in BJData format /// @brief create a JSON value from an input in BJData format
/// @sa https://json.nlohmann.me/api/basic_json/from_bjdata/ /// @sa https://json.nlohmann.me/api/basic_json/from_bjdata/
template<typename InputType> template<typename InputType>
@ -24052,7 +23990,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
}; };
// wrapper for "remove" operation; remove value at ptr // wrapper for "remove" operation; remove value at ptr
const auto operation_remove = [this, &result](json_pointer & ptr) const auto operation_remove = [this, & result](json_pointer & ptr)
{ {
// get reference to parent of JSON pointer ptr // get reference to parent of JSON pointer ptr
const auto last_path = ptr.back(); const auto last_path = ptr.back();
@ -24476,7 +24414,7 @@ struct less< ::nlohmann::detail::value_t> // do not remove the space after '<',
/// @sa https://json.nlohmann.me/api/basic_json/std_swap/ /// @sa https://json.nlohmann.me/api/basic_json/std_swap/
NLOHMANN_BASIC_JSON_TPL_DECLARATION NLOHMANN_BASIC_JSON_TPL_DECLARATION
inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC_JSON_TPL& j2) noexcept( // NOLINT(readability-inconsistent-declaration-parameter-name, cert-dcl58-cpp) inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC_JSON_TPL& j2) noexcept( // NOLINT(readability-inconsistent-declaration-parameter-name, cert-dcl58-cpp)
is_nothrow_move_constructible<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value&& // NOLINT(misc-redundant-expression) is_nothrow_move_constructible<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value&& // NOLINT(misc-redundant-expression,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
is_nothrow_move_assignable<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value) is_nothrow_move_assignable<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value)
{ {
j1.swap(j2); j1.swap(j2);
@ -24501,7 +24439,6 @@ inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
// restore clang diagnostic settings // restore clang diagnostic settings
#if defined(__clang__) #if defined(__clang__)
#pragma clang diagnostic pop #pragma clang diagnostic pop
@ -24545,7 +24482,6 @@ inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#undef JSON_HEDLEY_ALWAYS_INLINE #undef JSON_HEDLEY_ALWAYS_INLINE
#undef JSON_HEDLEY_ARM_VERSION #undef JSON_HEDLEY_ARM_VERSION
#undef JSON_HEDLEY_ARM_VERSION_CHECK #undef JSON_HEDLEY_ARM_VERSION_CHECK
@ -24696,5 +24632,4 @@ inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC
#undef JSON_HEDLEY_FALL_THROUGH #undef JSON_HEDLEY_FALL_THROUGH
#endif // INCLUDE_NLOHMANN_JSON_HPP_ #endif // INCLUDE_NLOHMANN_JSON_HPP_

View File

@ -24,8 +24,6 @@
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me> // SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
// This file contains all macro definitions affecting or depending on the ABI // This file contains all macro definitions affecting or depending on the ABI
#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK #ifndef JSON_SKIP_LIBRARY_VERSION_CHECK
@ -117,7 +115,6 @@
} // namespace nlohmann } // namespace nlohmann
#endif #endif
/*! /*!
@brief namespace for Niels Lohmann @brief namespace for Niels Lohmann
@see https://github.com/nlohmann @see https://github.com/nlohmann

View File

@ -81,7 +81,6 @@ BENCHMARK_CAPTURE(ParseString, signed_ints, TEST_DATA_DIRECTORY "/regressi
BENCHMARK_CAPTURE(ParseString, unsigned_ints, TEST_DATA_DIRECTORY "/regression/unsigned_ints.json"); BENCHMARK_CAPTURE(ParseString, unsigned_ints, TEST_DATA_DIRECTORY "/regression/unsigned_ints.json");
BENCHMARK_CAPTURE(ParseString, small_signed_ints, TEST_DATA_DIRECTORY "/regression/small_signed_ints.json"); BENCHMARK_CAPTURE(ParseString, small_signed_ints, TEST_DATA_DIRECTORY "/regression/small_signed_ints.json");
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// serialize JSON // serialize JSON
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
@ -116,7 +115,6 @@ BENCHMARK_CAPTURE(Dump, unsigned_ints / 4, TEST_DATA_DIRECTORY "/regression/
BENCHMARK_CAPTURE(Dump, small_signed_ints / -, TEST_DATA_DIRECTORY "/regression/small_signed_ints.json", -1); BENCHMARK_CAPTURE(Dump, small_signed_ints / -, TEST_DATA_DIRECTORY "/regression/small_signed_ints.json", -1);
BENCHMARK_CAPTURE(Dump, small_signed_ints / 4, TEST_DATA_DIRECTORY "/regression/small_signed_ints.json", 4); BENCHMARK_CAPTURE(Dump, small_signed_ints / 4, TEST_DATA_DIRECTORY "/regression/small_signed_ints.json", 4);
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// serialize CBOR // serialize CBOR
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////

View File

@ -14,7 +14,6 @@ using nlohmann::json;
#include <climits> // SIZE_MAX #include <climits> // SIZE_MAX
#include <limits> // numeric_limits #include <limits> // numeric_limits
template <typename OfType, typename T, bool MinInRange, bool MaxInRange> template <typename OfType, typename T, bool MinInRange, bool MaxInRange>
struct trait_test_arg struct trait_test_arg
{ {
@ -88,7 +87,6 @@ TEST_CASE_TEMPLATE_DEFINE("value_in_range_of trait", T, value_in_range_of_test)
} }
} }
TEST_CASE("32bit") TEST_CASE("32bit")
{ {
REQUIRE(SIZE_MAX == 0xffffffff); REQUIRE(SIZE_MAX == 0xffffffff);

View File

@ -8,6 +8,7 @@
#include "doctest_compatibility.h" #include "doctest_compatibility.h"
#include <algorithm>
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
using nlohmann::json; using nlohmann::json;
@ -294,4 +295,71 @@ TEST_CASE("algorithms")
std::sort_heap(j_array.begin(), j_array.end()); std::sort_heap(j_array.begin(), j_array.end());
CHECK(j_array == json({false, true, 3, 13, 29, {{"one", 1}, {"two", 2}}, {1, 2, 3}, "baz", "foo"})); CHECK(j_array == json({false, true, 3, 13, 29, {{"one", 1}, {"two", 2}}, {1, 2, 3}, "baz", "foo"}));
} }
SECTION("iota")
{
SECTION("int")
{
json json_arr = {0, 5, 2, 4, 10, 20, 30, 40, 50, 1};
std::iota(json_arr.begin(), json_arr.end(), 0);
CHECK(json_arr == json({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}));
}
SECTION("double")
{
json json_arr = {0.5, 1.5, 1.3, 4.1, 10.2, 20.5, 30.6, 40.1, 50.22, 1.5};
std::iota(json_arr.begin(), json_arr.end(), 0.5);
CHECK(json_arr == json({0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5}));
}
SECTION("char")
{
json json_arr = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', '0', '1'};
std::iota(json_arr.begin(), json_arr.end(), '0');
CHECK(json_arr == json({'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}));
}
}
SECTION("copy")
{
SECTION("copy without if")
{
json dest_arr;
const json source_arr = {1, 2, 3, 4};
std::copy(source_arr.begin(), source_arr.end(), std::back_inserter(dest_arr));
CHECK(dest_arr == source_arr);
}
SECTION("copy if")
{
json dest_arr;
const json source_arr = {0, 3, 6, 9, 12, 15, 20};
std::copy_if(source_arr.begin(), source_arr.end(), std::back_inserter(dest_arr), [](const json & _value)
{
return _value.get<int>() % 3 == 0;
});
CHECK(dest_arr == json({0, 3, 6, 9, 12, 15}));
}
SECTION("copy n")
{
const json source_arr = {0, 1, 2, 3, 4, 5, 6, 7};
json dest_arr;
const unsigned char numToCopy = 2;
std::copy_n(source_arr.begin(), numToCopy, std::back_inserter(dest_arr));
CHECK(dest_arr == json{0, 1});
}
SECTION("copy n chars")
{
const json source_arr = {'1', '2', '3', '4', '5', '6', '7'};
json dest_arr;
const unsigned char numToCopy = 4;
std::copy_n(source_arr.begin(), numToCopy, std::back_inserter(dest_arr));
CHECK(dest_arr == json{'1', '2', '3', '4'});
}
}
} }

View File

@ -24,7 +24,7 @@ struct bad_allocator : std::allocator<T>
template<class U> bad_allocator(const bad_allocator<U>& /*unused*/) { } template<class U> bad_allocator(const bad_allocator<U>& /*unused*/) { }
template<class... Args> template<class... Args>
void construct(T* /*unused*/, Args&& ... /*unused*/) void construct(T* /*unused*/, Args&& ... /*unused*/) // NOLINT(cppcoreguidelines-missing-std-forward)
{ {
throw std::bad_alloc(); throw std::bad_alloc();
} }

View File

@ -14,7 +14,6 @@
#include <string> #include <string>
#include <utility> #include <utility>
/* forward declarations */ /* forward declarations */
class alt_string; class alt_string;
bool operator<(const char* op1, const alt_string& op2) noexcept; bool operator<(const char* op1, const alt_string& op2) noexcept;
@ -180,7 +179,6 @@ using alt_json = nlohmann::basic_json <
std::allocator, std::allocator,
nlohmann::adl_serializer >; nlohmann::adl_serializer >;
bool operator<(const char* op1, const alt_string& op2) noexcept bool operator<(const char* op1, const alt_string& op2) noexcept
{ {
return op1 < op2.str_impl; return op1 < op2.str_impl;

View File

@ -339,13 +339,13 @@ TEST_CASE("BJData")
std::vector<int32_t> const numbers std::vector<int32_t> const numbers
{ {
-32769, -32769,
-100000, -100000,
-1000000, -1000000,
-10000000, -10000000,
-100000000, -100000000,
-1000000000, -1000000000,
-2147483647 - 1, // https://stackoverflow.com/a/29356002/266378 -2147483647 - 1, // https://stackoverflow.com/a/29356002/266378
}; };
for (const auto i : numbers) for (const auto i : numbers)
{ {
CAPTURE(i) CAPTURE(i)
@ -1499,7 +1499,6 @@ TEST_CASE("BJData")
} }
} }
SECTION("binary") SECTION("binary")
{ {
SECTION("N = 0..127") SECTION("N = 0..127")

View File

@ -919,7 +919,6 @@ TEST_CASE("BSON numerical data")
} }
} }
SECTION("signed std::int32_t: INT32_MIN .. INT32_MAX") SECTION("signed std::int32_t: INT32_MIN .. INT32_MAX")
{ {
std::vector<int32_t> const numbers std::vector<int32_t> const numbers

View File

@ -241,13 +241,13 @@ TEST_CASE("CBOR")
const std::vector<int64_t> numbers const std::vector<int64_t> numbers
{ {
-65537, -65537,
-100000, -100000,
-1000000, -1000000,
-10000000, -10000000,
-100000000, -100000000,
-1000000000, -1000000000,
-4294967296, -4294967296,
}; };
for (const auto i : numbers) for (const auto i : numbers)
{ {
CAPTURE(i) CAPTURE(i)

View File

@ -172,7 +172,6 @@ TEST_CASE("constructors")
CHECK(j == j_reference); CHECK(j == j_reference);
} }
SECTION("std::multimap<json::string_t, json>") SECTION("std::multimap<json::string_t, json>")
{ {
std::multimap<json::string_t, json> const o {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}; std::multimap<json::string_t, json> const o {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}};
@ -279,7 +278,7 @@ TEST_CASE("constructors")
const auto t = j.get<std::tuple<int, float, std::string>>(); const auto t = j.get<std::tuple<int, float, std::string>>();
CHECK(std::get<0>(t) == j[0]); CHECK(std::get<0>(t) == j[0]);
CHECK(std::get<1>(t) == j[1]); CHECK(std::get<1>(t) == j[1]);
CHECK(std::get<2>(t) == j[2]); // CHECK(std::get<2>(t) == j[2]); // commented out due to CI issue, see https://github.com/nlohmann/json/pull/3985 and https://github.com/nlohmann/json/issues/4025
} }
SECTION("std::pair/tuple/array failures") SECTION("std::pair/tuple/array failures")

View File

@ -34,17 +34,17 @@ struct alt_string_iter
impl.append(first, last); impl.append(first, last);
} }
std::string::const_iterator begin() const std::string::const_iterator begin() const noexcept
{ {
return impl.begin(); return impl.begin();
} }
std::string::const_iterator end() const std::string::const_iterator end() const noexcept
{ {
return impl.end(); return impl.end();
} }
std::size_t size() const std::size_t size() const noexcept
{ {
return impl.size(); return impl.size();
} }

View File

@ -229,7 +229,6 @@ using json_with_visitor_t = nlohmann::basic_json <
visitor_adaptor visitor_adaptor
>; >;
template <class Fnc> template <class Fnc>
void visitor_adaptor::visit(const Fnc& fnc) const void visitor_adaptor::visit(const Fnc& fnc) const
{ {

View File

@ -72,7 +72,6 @@ TEST_CASE_TEMPLATE("element access 2", Json, nlohmann::json, nlohmann::ordered_j
CHECK_THROWS_WITH_AS(j.at("foo"), "[json.exception.out_of_range.403] key 'foo' not found", typename Json::out_of_range&); CHECK_THROWS_WITH_AS(j.at("foo"), "[json.exception.out_of_range.403] key 'foo' not found", typename Json::out_of_range&);
CHECK_THROWS_WITH_AS(j_const.at("foo"), "[json.exception.out_of_range.403] key 'foo' not found", typename Json::out_of_range&); CHECK_THROWS_WITH_AS(j_const.at("foo"), "[json.exception.out_of_range.403] key 'foo' not found", typename Json::out_of_range&);
#ifdef JSON_HAS_CPP_17 #ifdef JSON_HAS_CPP_17
CHECK_THROWS_WITH_AS(j.at(std::string_view("foo")), "[json.exception.out_of_range.403] key 'foo' not found", typename Json::out_of_range&); CHECK_THROWS_WITH_AS(j.at(std::string_view("foo")), "[json.exception.out_of_range.403] key 'foo' not found", typename Json::out_of_range&);
CHECK_THROWS_WITH_AS(j_const.at(std::string_view("foo")), "[json.exception.out_of_range.403] key 'foo' not found", typename Json::out_of_range&); CHECK_THROWS_WITH_AS(j_const.at(std::string_view("foo")), "[json.exception.out_of_range.403] key 'foo' not found", typename Json::out_of_range&);

View File

@ -873,7 +873,6 @@ TEST_CASE("iterators 2")
} }
} }
#if JSON_HAS_RANGES #if JSON_HAS_RANGES
// JSON_HAS_CPP_20 (do not remove; see note at top of file) // JSON_HAS_CPP_20 (do not remove; see note at top of file)
SECTION("ranges") SECTION("ranges")

View File

@ -479,11 +479,11 @@ TEST_CASE("MessagePack")
std::vector<int32_t> const numbers std::vector<int32_t> const numbers
{ {
-32769, -32769,
-65536, -65536,
-77777, -77777,
-1048576, -1048576,
-2147483648LL, -2147483648LL,
}; };
for (auto i : numbers) for (auto i : numbers)
{ {
CAPTURE(i) CAPTURE(i)

View File

@ -12,7 +12,6 @@
using nlohmann::json; using nlohmann::json;
using nlohmann::ordered_json; using nlohmann::ordered_json;
TEST_CASE("ordered_json") TEST_CASE("ordered_json")
{ {
json j; json j;

View File

@ -11,7 +11,6 @@
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
using nlohmann::ordered_map; using nlohmann::ordered_map;
TEST_CASE("ordered_map") TEST_CASE("ordered_map")
{ {
SECTION("constructor") SECTION("constructor")

View File

@ -119,13 +119,13 @@ TEST_CASE("README" * doctest::skip())
// serialization with pretty printing // serialization with pretty printing
// pass in the amount of spaces to indent // pass in the amount of spaces to indent
std::cout << j.dump(4) << std::endl; std::cout << j.dump(4) << std::endl; // NOLINT(performance-avoid-endl)
// { // {
// "happy": true, // "happy": true,
// "pi": 3.141 // "pi": 3.141
// } // }
std::cout << std::setw(2) << j << std::endl; std::cout << std::setw(2) << j << std::endl; // NOLINT(performance-avoid-endl)
} }
{ {

View File

@ -1203,7 +1203,6 @@ TEST_CASE("regression tests 1")
CHECK(j["a"] >= 3); CHECK(j["a"] >= 3);
CHECK(j["a"] > 3); CHECK(j["a"] > 3);
CHECK(!(j["a"] <= 4)); CHECK(!(j["a"] <= 4));
CHECK(!(j["a"] < 4)); CHECK(!(j["a"] < 4));
CHECK(!(j["a"] >= 6)); CHECK(!(j["a"] >= 6));

View File

@ -102,7 +102,7 @@ TEST_CASE("Unicode (1/5)" * doctest::skip())
} }
} }
#if 0 #if 0 // NOLINT(readability-avoid-unconditional-preprocessor-if)
SECTION("incorrect sequences") SECTION("incorrect sequences")
{ {
SECTION("high surrogate without low surrogate") SECTION("high surrogate without low surrogate")

View File

@ -123,7 +123,7 @@ void check_utf8string(bool success_expected, int byte1, int byte2 = -1, int byte
{ {
if (++calls % 100000 == 0) if (++calls % 100000 == 0)
{ {
std::cout << calls << " of 455355 UTF-8 strings checked" << std::endl; std::cout << calls << " of 455355 UTF-8 strings checked" << std::endl; // NOLINT(performance-avoid-endl)
} }
static std::string json_string; static std::string json_string;

View File

@ -123,7 +123,7 @@ void check_utf8string(bool success_expected, int byte1, int byte2 = -1, int byte
{ {
if (++calls % 100000 == 0) if (++calls % 100000 == 0)
{ {
std::cout << calls << " of 1641521 UTF-8 strings checked" << std::endl; std::cout << calls << " of 1641521 UTF-8 strings checked" << std::endl; // NOLINT(performance-avoid-endl)
} }
static std::string json_string; static std::string json_string;

View File

@ -123,7 +123,7 @@ void check_utf8string(bool success_expected, int byte1, int byte2 = -1, int byte
{ {
if (++calls % 100000 == 0) if (++calls % 100000 == 0)
{ {
std::cout << calls << " of 5517507 UTF-8 strings checked" << std::endl; std::cout << calls << " of 5517507 UTF-8 strings checked" << std::endl; // NOLINT(performance-avoid-endl)
} }
static std::string json_string; static std::string json_string;

View File

@ -123,7 +123,7 @@ void check_utf8string(bool success_expected, int byte1, int byte2 = -1, int byte
{ {
if (++calls % 100000 == 0) if (++calls % 100000 == 0)
{ {
std::cout << calls << " of 1246225 UTF-8 strings checked" << std::endl; std::cout << calls << " of 1246225 UTF-8 strings checked" << std::endl; // NOLINT(performance-avoid-endl)
} }
static std::string json_string; static std::string json_string;

View File

@ -71,7 +71,7 @@ statistics from the file. If that fails then the process will quit.
#endif #endif
// Used to avoid repeating error checking boilerplate. If cond is false, a // Used to avoid repeating error checking boilerplate. If cond is false, a
// fatal error has occured in the program. In this event print error_message // fatal error has occurred in the program. In this event print error_message
// to stderr and abort(). Otherwise do nothing. Note that setting // to stderr and abort(). Otherwise do nothing. Note that setting
// AFL_DRIVER_STDERR_DUPLICATE_FILENAME may cause error_message to be appended // AFL_DRIVER_STDERR_DUPLICATE_FILENAME may cause error_message to be appended
// to the file as well, if the error occurs after the duplication is performed. // to the file as well, if the error occurs after the duplication is performed.

File diff suppressed because it is too large Load Diff

View File

@ -300,7 +300,7 @@ template <
/// insert value /// insert value
template<class P> template<class P>
std::pair<iterator, bool> insert( P&& value ) std::pair<iterator, bool> insert( P&& value ) // NOLINT(cppcoreguidelines-missing-std-forward)
{ {
m_compare.add_key(value.first); m_compare.add_key(value.first);
return m_map.insert(value); return m_map.insert(value);

View File

@ -65,7 +65,7 @@ An annotated example configuration can be found in `tools/serve_header/serve_hea
`serve_header.py` was designed with the goal of supporting multiple project roots or working trees at the same time. `serve_header.py` was designed with the goal of supporting multiple project roots or working trees at the same time.
The recommended directory structure is shown below but `serve_header.py` can work with other structures as well, including a nested hierarchy. The recommended directory structure is shown below but `serve_header.py` can work with other structures as well, including a nested hierarchy.
``` ```
json/ ⮜ the parent or web server root directoy json/ ⮜ the parent or web server root directory
├── develop/ ⮜ the main git checkout ├── develop/ ⮜ the main git checkout
│ └── ... │ └── ...
├── feature1/ ├── feature1/