Merge branch 'develop' into derived_macros
# Conflicts: # include/nlohmann/detail/macro_scope.hpp # single_include/nlohmann/json.hpp
This commit is contained in:
commit
358ba8b62d
@ -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
4
.github/CODEOWNERS
vendored
@ -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.
|
||||||
|
|
||||||
|
|||||||
2
.github/CONTRIBUTING.md
vendored
2
.github/CONTRIBUTING.md
vendored
@ -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
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/macos.yml
vendored
2
.github/workflows/macos.yml
vendored
@ -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
|
||||||
|
|||||||
24
.github/workflows/ubuntu.yml
vendored
24
.github/workflows/ubuntu.yml
vendored
@ -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
|
||||||
|
|||||||
3
Makefile
3
Makefile
@ -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 \
|
||||||
|
|||||||
37
README.md
37
README.md
@ -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)
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
// =============
|
// =============
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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';
|
||||||
|
|||||||
@ -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';
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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*
|
||||||
|
|||||||
@ -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*
|
||||||
|
|||||||
@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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>();
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
@ -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!
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)"
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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 //
|
||||||
///////////////////
|
///////////////////
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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>
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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_
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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'});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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&);
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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));
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
2
tests/thirdparty/Fuzzer/afl/afl_driver.cpp
vendored
2
tests/thirdparty/Fuzzer/afl/afl_driver.cpp
vendored
@ -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.
|
||||||
|
|||||||
3200
tests/thirdparty/doctest/doctest.h
vendored
3200
tests/thirdparty/doctest/doctest.h
vendored
File diff suppressed because it is too large
Load Diff
2
tests/thirdparty/fifo_map/fifo_map.hpp
vendored
2
tests/thirdparty/fifo_map/fifo_map.hpp
vendored
@ -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);
|
||||||
|
|||||||
@ -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/
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user