From 8f9dc7eabe8d873c13ed8e9ba069afc18b1580ce Mon Sep 17 00:00:00 2001 From: Vitaly Zaitsev Date: Mon, 27 Jul 2020 16:54:16 +0200 Subject: [PATCH 01/10] Fixed installation of pkg-config file on other than Ubuntu distributions. Signed-off-by: Vitaly Zaitsev --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d5d0ae34..6c91ee67 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,7 @@ set(NLOHMANN_JSON_CMAKE_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}") set(NLOHMANN_JSON_CMAKE_VERSION_CONFIG_FILE "${NLOHMANN_JSON_CMAKE_CONFIG_DIR}/${PROJECT_NAME}ConfigVersion.cmake") set(NLOHMANN_JSON_CMAKE_PROJECT_CONFIG_FILE "${NLOHMANN_JSON_CMAKE_CONFIG_DIR}/${PROJECT_NAME}Config.cmake") set(NLOHMANN_JSON_CMAKE_PROJECT_TARGETS_FILE "${NLOHMANN_JSON_CMAKE_CONFIG_DIR}/${PROJECT_NAME}Targets.cmake") +set(NLOHMANN_JSON_PKGCONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig") if (JSON_MultipleHeaders) set(NLOHMANN_JSON_INCLUDE_BUILD_DIR "${PROJECT_SOURCE_DIR}/include/") @@ -158,6 +159,6 @@ endif() ) install( FILES "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc" - DESTINATION lib/pkgconfig + DESTINATION ${NLOHMANN_JSON_PKGCONFIG_INSTALL_DIR} ) endif() From aa06a4761e24e59ceaa00e81be450b4d9a0c4d26 Mon Sep 17 00:00:00 2001 From: Eli Schwartz Date: Mon, 27 Jul 2020 18:15:18 -0400 Subject: [PATCH 02/10] cmake: install pkg-config file relative to current_binary_dir When the testsuite is enabled, the "cmake_add_subdirectory" test adds a second copy of the project into the build configuration, and the project files are installed twice. This becomes super problematic when it tries to install a file from CMAKE_BINARY_DIR which is only available in CMAKE_CURRENT_BINARY_DIR and bombs out with the following error message: ``` [...] -- Installing: /usr/lib/cmake/nlohmann_json/nlohmann_jsonTargets.cmake CMake Error at test/cmake_add_subdirectory/nlohmann_json/cmake_install.cmake:73 (file): file INSTALL cannot find "......./nlohmann-json/builddir/test/cmake_add_subdirectory/nlohmann_json.pc": No such file or directory. Call Stack (most recent call first): test/cmake_add_subdirectory/cmake_install.cmake:47 (include) test/cmake_install.cmake:49 (include) cmake_install.cmake:94 (include) ``` --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d5d0ae34..1afcc257 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -157,7 +157,7 @@ endif() DESTINATION ${NLOHMANN_JSON_CONFIG_INSTALL_DIR} ) install( - FILES "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc" + FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc" DESTINATION lib/pkgconfig ) endif() From e590604822b6a62fb8555fd0f6da3fc82da9bc20 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 28 Jul 2020 14:20:31 +0200 Subject: [PATCH 03/10] :bug: fix a bug due to missing overloads in ordered_map container --- include/nlohmann/ordered_map.hpp | 37 ++++++++- single_include/nlohmann/json.hpp | 37 ++++++++- test/CMakeLists.txt | 1 + test/src/unit-ordered_map.cpp | 125 +++++++++++++++++++++++++++++++ test/src/unit-regression.cpp | 19 +++++ 5 files changed, 213 insertions(+), 6 deletions(-) create mode 100644 test/src/unit-ordered_map.cpp diff --git a/include/nlohmann/ordered_map.hpp b/include/nlohmann/ordered_map.hpp index 2a72fefd..5b88834f 100644 --- a/include/nlohmann/ordered_map.hpp +++ b/include/nlohmann/ordered_map.hpp @@ -30,7 +30,7 @@ template , ordered_map(std::initializer_list init, const Allocator& alloc = Allocator() ) : Container{init, alloc} {} - std::pair emplace(key_type&& key, T&& t) + std::pair emplace(const key_type& key, T&& t) { for (auto it = this->begin(); it != this->end(); ++it) { @@ -43,9 +43,40 @@ template , return {--this->end(), true}; } - T& operator[](Key&& key) + T& operator[](const Key& key) { - return emplace(std::move(key), T{}).first->second; + return emplace(key, T{}).first->second; + } + + const T& operator[](const Key& key) const + { + return at(key); + } + + T& at(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it->second; + } + } + + throw std::out_of_range("key not found"); + } + + const T& at(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it->second; + } + } + + throw std::out_of_range("key not found"); } size_type erase(const Key& key) diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 6a0f47ab..dfdde16f 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -16420,7 +16420,7 @@ template , ordered_map(std::initializer_list init, const Allocator& alloc = Allocator() ) : Container{init, alloc} {} - std::pair emplace(key_type&& key, T&& t) + std::pair emplace(const key_type& key, T&& t) { for (auto it = this->begin(); it != this->end(); ++it) { @@ -16433,9 +16433,40 @@ template , return {--this->end(), true}; } - T& operator[](Key&& key) + T& operator[](const Key& key) { - return emplace(std::move(key), T{}).first->second; + return emplace(key, T{}).first->second; + } + + const T& operator[](const Key& key) const + { + return at(key); + } + + T& at(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it->second; + } + } + + throw std::out_of_range("key not found"); + } + + const T& at(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it->second; + } + } + + throw std::out_of_range("key not found"); } size_type erase(const Key& key) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 76ba31d8..28834291 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -126,6 +126,7 @@ set(files src/unit-msgpack.cpp src/unit-noexcept.cpp src/unit-ordered_json.cpp + src/unit-ordered_map.cpp src/unit-pointer_access.cpp src/unit-readme.cpp src/unit-reference_access.cpp diff --git a/test/src/unit-ordered_map.cpp b/test/src/unit-ordered_map.cpp new file mode 100644 index 00000000..78871af0 --- /dev/null +++ b/test/src/unit-ordered_map.cpp @@ -0,0 +1,125 @@ +/* + __ _____ _____ _____ + __| | __| | | | JSON for Modern C++ (test suite) +| | |__ | | | | | | version 3.9.0 +|_____|_____|_____|_|___| https://github.com/nlohmann/json + +Licensed under the MIT License . +SPDX-License-Identifier: MIT +Copyright (c) 2013-2019 Niels Lohmann . + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#include "doctest_compatibility.h" + +#include +using nlohmann::ordered_map; + + +TEST_CASE("ordered_map") +{ + SECTION("constructor") + { + SECTION("constructor from iterator range") + { + std::map m {{"eins", "one"}, {"zwei", "two"}, {"drei", "three"}}; + ordered_map om(m.begin(), m.end()); + CHECK(om.size() == 3); + } + + SECTION("copy assignment") + { + std::map m {{"eins", "one"}, {"zwei", "two"}, {"drei", "three"}}; + ordered_map om(m.begin(), m.end()); + const auto com = om; + CHECK(com.size() == 3); + } + } + + SECTION("at") + { + std::map m {{"eins", "one"}, {"zwei", "two"}, {"drei", "three"}}; + ordered_map om(m.begin(), m.end()); + const auto com = om; + + SECTION("with Key&&") + { + CHECK(om.at(std::string("eins")) == std::string("one")); + CHECK(com.at(std::string("eins")) == std::string("one")); + CHECK_THROWS_AS(om.at(std::string("vier")), std::out_of_range); + CHECK_THROWS_AS(com.at(std::string("vier")), std::out_of_range); + } + + SECTION("with const Key&&") + { + const std::string eins = "eins"; + const std::string vier = "vier"; + CHECK(om.at(eins) == std::string("one")); + CHECK(com.at(eins) == std::string("one")); + CHECK_THROWS_AS(om.at(vier), std::out_of_range); + CHECK_THROWS_AS(com.at(vier), std::out_of_range); + } + + SECTION("with string literal") + { + CHECK(om.at("eins") == std::string("one")); + CHECK(com.at("eins") == std::string("one")); + CHECK_THROWS_AS(om.at("vier"), std::out_of_range); + CHECK_THROWS_AS(com.at("vier"), std::out_of_range); + } + } + + SECTION("operator[]") + { + std::map m {{"eins", "one"}, {"zwei", "two"}, {"drei", "three"}}; + ordered_map om(m.begin(), m.end()); + const auto com = om; + + SECTION("with Key&&") + { + CHECK(om[std::string("eins")] == std::string("one")); + CHECK(com[std::string("eins")] == std::string("one")); + + CHECK(om[std::string("vier")] == std::string("")); + CHECK(om.size() == 4); + } + + SECTION("with const Key&&") + { + const std::string eins = "eins"; + const std::string vier = "vier"; + + CHECK(om[eins] == std::string("one")); + CHECK(com[eins] == std::string("one")); + + CHECK(om[vier] == std::string("")); + CHECK(om.size() == 4); + } + + SECTION("with string literal") + { + CHECK(om["eins"] == std::string("one")); + CHECK(com["eins"] == std::string("one")); + + CHECK(om["vier"] == std::string("")); + CHECK(om.size() == 4); + } + } +} diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp index 223466a4..0199a0fb 100644 --- a/test/src/unit-regression.cpp +++ b/test/src/unit-regression.cpp @@ -1976,6 +1976,25 @@ TEST_CASE("regression tests") json result = json::from_cbor(data, true, false); CHECK(result.is_discarded()); } + + SECTION("issue #2315 - json.update and vectordoes not work with ordered_json") + { + nlohmann::ordered_json jsonAnimals = {{"animal", "dog"}}; + nlohmann::ordered_json jsonCat = {{"animal", "cat"}}; + jsonAnimals.update(jsonCat); + CHECK(jsonAnimals["animal"] == "cat"); + + std::vector> intData = {std::make_pair("aaaa", 11), + std::make_pair("bbb", 222) + }; + nlohmann::ordered_json jsonObj; + for (const auto& data : intData) + { + jsonObj[data.first] = data.second; + } + CHECK(jsonObj["aaaa"] == 11); + CHECK(jsonObj["bbb"] == 222); + } } #if !defined(JSON_NOEXCEPTION) From 2d3fe9d135fb4ba8a73d699f0e40f9b7c8d68be4 Mon Sep 17 00:00:00 2001 From: I Date: Tue, 28 Jul 2020 21:54:53 +0900 Subject: [PATCH 04/10] fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 07933a5b..ba257d94 100644 --- a/README.md +++ b/README.md @@ -1611,7 +1611,7 @@ Here is a related issue [#1924](https://github.com/nlohmann/json/issues/1924). - The code contains numerous debug **assertions** which can be switched off by defining the preprocessor macro `NDEBUG`, see the [documentation of `assert`](https://en.cppreference.com/w/cpp/error/assert). In particular, note [`operator[]`](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a233b02b0839ef798942dd46157cc0fe6.html#a233b02b0839ef798942dd46157cc0fe6) implements **unchecked access** for const objects: If the given key is not present, the behavior is undefined (think of a dereferenced null pointer) and yields an [assertion failure](https://github.com/nlohmann/json/issues/289) if assertions are switched on. If you are not sure whether an element in an object exists, use checked access with the [`at()` function](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a73ae333487310e3302135189ce8ff5d8.html#a73ae333487310e3302135189ce8ff5d8). Furthermore, you can define `JSON_ASSERT(x)` to replace calls to `assert(x)`. - As the exact type of a number is not defined in the [JSON specification](https://tools.ietf.org/html/rfc8259.html), this library tries to choose the best fitting C++ number type automatically. As a result, the type `double` may be used to store numbers which may yield [**floating-point exceptions**](https://github.com/nlohmann/json/issues/181) in certain rare situations if floating-point exceptions have been unmasked in the calling code. These exceptions are not caused by the library and need to be fixed in the calling code, such as by re-masking the exceptions prior to calling library functions. - The code can be compiled without C++ **runtime type identification** features; that is, you can use the `-fno-rtti` compiler flag. -- **Exceptions** are used widely within the library. They can, however, be switched off with either using the compiler flag `-fno-exceptions` or by defining the symbol `JSON_NOEXCEPTION`. In this case, exceptions are replaced by `abort()` calls. You can further control this behavior by defining `JSON_THROW_USERĀ“` (overriding `throw`), `JSON_TRY_USER` (overriding `try`), and `JSON_CATCH_USER` (overriding `catch`). Note that `JSON_THROW_USER` should leave the current scope (e.g., by throwing or aborting), as continuing after it may yield undefined behavior. +- **Exceptions** are used widely within the library. They can, however, be switched off with either using the compiler flag `-fno-exceptions` or by defining the symbol `JSON_NOEXCEPTION`. In this case, exceptions are replaced by `abort()` calls. You can further control this behavior by defining `JSON_THROW_USER` (overriding `throw`), `JSON_TRY_USER` (overriding `try`), and `JSON_CATCH_USER` (overriding `catch`). Note that `JSON_THROW_USER` should leave the current scope (e.g., by throwing or aborting), as continuing after it may yield undefined behavior. ## Execute unit tests From f13af83a9499dd26998f482111ca3c654a231279 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 28 Jul 2020 21:47:06 +0200 Subject: [PATCH 05/10] :bug: add more functions from std::map to nlohmann::ordered_map --- include/nlohmann/ordered_map.hpp | 69 +++++++++++++ single_include/nlohmann/json.hpp | 69 +++++++++++++ test/src/unit-ordered_map.cpp | 167 +++++++++++++++++++++++++++++++ test/src/unit-regression.cpp | 3 + 4 files changed, 308 insertions(+) diff --git a/include/nlohmann/ordered_map.hpp b/include/nlohmann/ordered_map.hpp index 5b88834f..57679091 100644 --- a/include/nlohmann/ordered_map.hpp +++ b/include/nlohmann/ordered_map.hpp @@ -18,6 +18,7 @@ template , using mapped_type = T; using Container = std::vector, Allocator>; using typename Container::iterator; + using typename Container::const_iterator; using typename Container::size_type; using typename Container::value_type; @@ -97,6 +98,74 @@ template , } return 0; } + + iterator erase(iterator pos) + { + auto it = pos; + + // Since we cannot move const Keys, re-construct them in place + for (auto next = it; ++next != this->end(); ++it) + { + it->~value_type(); // Destroy but keep allocation + new (&*it) value_type{std::move(*next)}; + } + Container::pop_back(); + return pos; + } + + size_type count(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return 1; + } + } + return 0; + } + + iterator find(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it; + } + } + return Container::end(); + } + + const_iterator find(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it; + } + } + return Container::end(); + } + + std::pair insert( value_type&& value ) + { + return emplace(value.first, std::move(value.second)); + } + + std::pair insert( const value_type& value ) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == value.first) + { + return {it, false}; + } + } + Container::push_back(value); + return {--this->end(), true}; + } }; } // namespace nlohmann diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index dfdde16f..9c66a845 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -16408,6 +16408,7 @@ template , using mapped_type = T; using Container = std::vector, Allocator>; using typename Container::iterator; + using typename Container::const_iterator; using typename Container::size_type; using typename Container::value_type; @@ -16487,6 +16488,74 @@ template , } return 0; } + + iterator erase(iterator pos) + { + auto it = pos; + + // Since we cannot move const Keys, re-construct them in place + for (auto next = it; ++next != this->end(); ++it) + { + it->~value_type(); // Destroy but keep allocation + new (&*it) value_type{std::move(*next)}; + } + Container::pop_back(); + return pos; + } + + size_type count(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return 1; + } + } + return 0; + } + + iterator find(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it; + } + } + return Container::end(); + } + + const_iterator find(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it; + } + } + return Container::end(); + } + + std::pair insert( value_type&& value ) + { + return emplace(value.first, std::move(value.second)); + } + + std::pair insert( const value_type& value ) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == value.first) + { + return {it, false}; + } + } + Container::push_back(value); + return {--this->end(), true}; + } }; } // namespace nlohmann diff --git a/test/src/unit-ordered_map.cpp b/test/src/unit-ordered_map.cpp index 78871af0..49937aa2 100644 --- a/test/src/unit-ordered_map.cpp +++ b/test/src/unit-ordered_map.cpp @@ -122,4 +122,171 @@ TEST_CASE("ordered_map") CHECK(om.size() == 4); } } + + SECTION("erase") + { + ordered_map om; + om["eins"] = "one"; + om["zwei"] = "two"; + om["drei"] = "three"; + + { + auto it = om.begin(); + CHECK(it->first == "eins"); + ++it; + CHECK(it->first == "zwei"); + ++it; + CHECK(it->first == "drei"); + ++it; + CHECK(it == om.end()); + } + + SECTION("with Key&&") + { + CHECK(om.size() == 3); + CHECK(om.erase(std::string("eins")) == 1); + CHECK(om.size() == 2); + CHECK(om.erase(std::string("vier")) == 0); + CHECK(om.size() == 2); + + auto it = om.begin(); + CHECK(it->first == "zwei"); + ++it; + CHECK(it->first == "drei"); + ++it; + CHECK(it == om.end()); + } + + SECTION("with const Key&&") + { + const std::string eins = "eins"; + const std::string vier = "vier"; + CHECK(om.size() == 3); + CHECK(om.erase(eins) == 1); + CHECK(om.size() == 2); + CHECK(om.erase(vier) == 0); + CHECK(om.size() == 2); + + auto it = om.begin(); + CHECK(it->first == "zwei"); + ++it; + CHECK(it->first == "drei"); + ++it; + CHECK(it == om.end()); + } + + SECTION("with string literal") + { + CHECK(om.size() == 3); + CHECK(om.erase("eins") == 1); + CHECK(om.size() == 2); + CHECK(om.erase("vier") == 0); + CHECK(om.size() == 2); + + auto it = om.begin(); + CHECK(it->first == "zwei"); + ++it; + CHECK(it->first == "drei"); + ++it; + CHECK(it == om.end()); + } + + SECTION("with iterator") + { + CHECK(om.size() == 3); + CHECK(om.begin()->first == "eins"); + CHECK(std::next(om.begin(), 1)->first == "zwei"); + CHECK(std::next(om.begin(), 2)->first == "drei"); + + auto it = om.erase(om.begin()); + CHECK(it->first == "zwei"); + CHECK(om.size() == 2); + + auto it2 = om.begin(); + CHECK(it2->first == "zwei"); + ++it2; + CHECK(it2->first == "drei"); + ++it2; + CHECK(it2 == om.end()); + } + } + + SECTION("count") + { + ordered_map om; + om["eins"] = "one"; + om["zwei"] = "two"; + om["drei"] = "three"; + + const std::string eins("eins"); + const std::string vier("vier"); + CHECK(om.count("eins") == 1); + CHECK(om.count(std::string("eins")) == 1); + CHECK(om.count(eins) == 1); + CHECK(om.count("vier") == 0); + CHECK(om.count(std::string("vier")) == 0); + CHECK(om.count(vier) == 0); + } + + SECTION("find") + { + ordered_map om; + om["eins"] = "one"; + om["zwei"] = "two"; + om["drei"] = "three"; + const auto com = om; + + const std::string eins("eins"); + const std::string vier("vier"); + CHECK(om.find("eins") == om.begin()); + CHECK(om.find(std::string("eins")) == om.begin()); + CHECK(om.find(eins) == om.begin()); + CHECK(om.find("vier") == om.end()); + CHECK(om.find(std::string("vier")) == om.end()); + CHECK(om.find(vier) == om.end()); + + CHECK(com.find("eins") == com.begin()); + CHECK(com.find(std::string("eins")) == com.begin()); + CHECK(com.find(eins) == com.begin()); + CHECK(com.find("vier") == com.end()); + CHECK(com.find(std::string("vier")) == com.end()); + CHECK(com.find(vier) == com.end()); + } + + SECTION("insert") + { + ordered_map om; + om["eins"] = "one"; + om["zwei"] = "two"; + om["drei"] = "three"; + + SECTION("const value_type&") + { + ordered_map::value_type vt1 {"eins", "1"}; + ordered_map::value_type vt4 {"vier", "four"}; + + auto res1 = om.insert(vt1); + CHECK(res1.first == om.begin()); + CHECK(res1.second == false); + CHECK(om.size() == 3); + + auto res4 = om.insert(vt4); + CHECK(res4.first == om.begin() + 3); + CHECK(res4.second == true); + CHECK(om.size() == 4); + } + + SECTION("value_type&&") + { + auto res1 = om.insert({"eins", "1"}); + CHECK(res1.first == om.begin()); + CHECK(res1.second == false); + CHECK(om.size() == 3); + + auto res4 = om.insert({"vier", "four"}); + CHECK(res4.first == om.begin() + 3); + CHECK(res4.second == true); + CHECK(om.size() == 4); + } + } } diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp index 0199a0fb..f0fdd41c 100644 --- a/test/src/unit-regression.cpp +++ b/test/src/unit-regression.cpp @@ -1984,6 +1984,9 @@ TEST_CASE("regression tests") jsonAnimals.update(jsonCat); CHECK(jsonAnimals["animal"] == "cat"); + auto jsonAnimals_parsed = nlohmann::ordered_json::parse(jsonAnimals.dump()); + CHECK(jsonAnimals == jsonAnimals_parsed); + std::vector> intData = {std::make_pair("aaaa", 11), std::make_pair("bbb", 222) }; From 2326abc5478dda3910fa1388f03c29bc4b1aab57 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 30 Jul 2020 12:13:05 +0200 Subject: [PATCH 06/10] :recycle: split regression tests --- test/CMakeLists.txt | 3 +- ...it-regression.cpp => unit-regression1.cpp} | 423 +-------------- test/src/unit-regression2.cpp | 481 ++++++++++++++++++ 3 files changed, 484 insertions(+), 423 deletions(-) rename test/src/{unit-regression.cpp => unit-regression1.cpp} (80%) create mode 100644 test/src/unit-regression2.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 28834291..3d8bceb7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -130,7 +130,8 @@ set(files src/unit-pointer_access.cpp src/unit-readme.cpp src/unit-reference_access.cpp - src/unit-regression.cpp + src/unit-regression1.cpp + src/unit-regression2.cpp src/unit-serialization.cpp src/unit-testsuites.cpp src/unit-to_chars.cpp diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression1.cpp similarity index 80% rename from test/src/unit-regression.cpp rename to test/src/unit-regression1.cpp index f0fdd41c..97f64e71 100644 --- a/test/src/unit-regression.cpp +++ b/test/src/unit-regression1.cpp @@ -128,83 +128,9 @@ struct nocopy j = {{"val", n.val}}; } }; - -struct Data -{ - Data() = default; - Data(const std::string& a_, const std::string b_) : a(a_), b(b_) {} - std::string a {}; - std::string b {}; -}; - -void from_json(const json& j, Data& data) -{ - j["a"].get_to(data.a); - j["b"].get_to(data.b); } -bool operator==(Data const& lhs, Data const& rhs) -{ - return lhs.a == rhs.a && lhs.b == rhs.b; -} - -//bool operator!=(Data const& lhs, Data const& rhs) -//{ -// return !(lhs == rhs); -//} -} - -///////////////////////////////////////////////////////////////////// -// for #1021 -///////////////////////////////////////////////////////////////////// - -using float_json = nlohmann::basic_json; - -///////////////////////////////////////////////////////////////////// -// for #1647 -///////////////////////////////////////////////////////////////////// -namespace -{ -struct NonDefaultFromJsonStruct { }; - -inline bool operator== (NonDefaultFromJsonStruct const&, NonDefaultFromJsonStruct const&) -{ - return true; -} - -enum class for_1647 { one, two }; - -NLOHMANN_JSON_SERIALIZE_ENUM(for_1647, -{ - {for_1647::one, "one"}, - {for_1647::two, "two"}, -}) -} - -namespace nlohmann -{ -template <> -struct adl_serializer -{ - static NonDefaultFromJsonStruct from_json (json const&) noexcept - { - return {}; - } -}; -} - -///////////////////////////////////////////////////////////////////// -// for #1805 -///////////////////////////////////////////////////////////////////// - -struct NotSerializableData -{ - int mydata; - float myfloat; -}; - - -TEST_CASE("regression tests") +TEST_CASE("regression tests 1") { SECTION("issue #60 - Double quotation mark is not parsed correctly") { @@ -1651,353 +1577,6 @@ TEST_CASE("regression tests") CHECK(ff.x == 3); nlohmann::json nj = lj; // This line works as expected } - - SECTION("issue #1001 - Fix memory leak during parser callback") - { - auto geojsonExample = R"( - { "type": "FeatureCollection", - "features": [ - { "type": "Feature", - "geometry": {"type": "Point", "coordinates": [102.0, 0.5]}, - "properties": {"prop0": "value0"} - }, - { "type": "Feature", - "geometry": { - "type": "LineString", - "coordinates": [ - [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0] - ] - }, - "properties": { - "prop0": "value0", - "prop1": 0.0 - } - }, - { "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [ - [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], - [100.0, 1.0], [100.0, 0.0] ] - ] - }, - "properties": { - "prop0": "value0", - "prop1": {"this": "that"} - } - } - ] - })"; - - json::parser_callback_t cb = [&](int, json::parse_event_t event, json & parsed) - { - // skip uninteresting events - if (event == json::parse_event_t::value && !parsed.is_primitive()) - { - return false; - } - - switch (event) - { - case json::parse_event_t::key: - { - return true; - } - case json::parse_event_t::value: - { - return false; - } - case json::parse_event_t::object_start: - { - return true; - } - case json::parse_event_t::object_end: - { - return false; - } - case json::parse_event_t::array_start: - { - return true; - } - case json::parse_event_t::array_end: - { - return false; - } - - default: - { - return true; - } - } - }; - - auto j = json::parse(geojsonExample, cb, true); - CHECK(j == json()); - } - - SECTION("issue #1021 - to/from_msgpack only works with standard typization") - { - float_json j = 1000.0; - CHECK(float_json::from_cbor(float_json::to_cbor(j)) == j); - CHECK(float_json::from_msgpack(float_json::to_msgpack(j)) == j); - CHECK(float_json::from_ubjson(float_json::to_ubjson(j)) == j); - - float_json j2 = {1000.0, 2000.0, 3000.0}; - CHECK(float_json::from_ubjson(float_json::to_ubjson(j2, true, true)) == j2); - } - - SECTION("issue #1045 - Using STL algorithms with JSON containers with expected results?") - { - json diffs = nlohmann::json::array(); - json m1{{"key1", 42}}; - json m2{{"key2", 42}}; - auto p1 = m1.items(); - auto p2 = m2.items(); - - using it_type = decltype(p1.begin()); - - std::set_difference( - p1.begin(), p1.end(), - p2.begin(), p2.end(), - std::inserter(diffs, diffs.end()), [&](const it_type & e1, const it_type & e2) -> bool - { - using comper_pair = std::pair; // Trying to avoid unneeded copy - return comper_pair(e1.key(), e1.value()) < comper_pair(e2.key(), e2.value()); // Using pair comper - }); - - CHECK(diffs.size() == 1); // Note the change here, was 2 - } - -#ifdef JSON_HAS_CPP_17 - SECTION("issue #1292 - Serializing std::variant causes stack overflow") - { - static_assert( - !std::is_constructible>::value, ""); - } -#endif - - SECTION("issue #1299 - compile error in from_json converting to container " - "with std::pair") - { - json j = - { - {"1", {{"a", "testa_1"}, {"b", "testb_1"}}}, - {"2", {{"a", "testa_2"}, {"b", "testb_2"}}}, - {"3", {{"a", "testa_3"}, {"b", "testb_3"}}}, - }; - - std::map expected - { - {"1", {"testa_1", "testb_1"}}, - {"2", {"testa_2", "testb_2"}}, - {"3", {"testa_3", "testb_3"}}, - }; - const auto data = j.get(); - CHECK(expected == data); - } - - SECTION("issue #1445 - buffer overflow in dumping invalid utf-8 strings") - { - SECTION("a bunch of -1, ensure_ascii=true") - { - const auto length = 300; - - json dump_test; - dump_test["1"] = std::string(length, -1); - - std::string expected = "{\"1\":\""; - for (int i = 0; i < length; ++i) - { - expected += "\\ufffd"; - } - expected += "\"}"; - - auto s = dump_test.dump(-1, ' ', true, nlohmann::json::error_handler_t::replace); - CHECK(s == expected); - } - SECTION("a bunch of -2, ensure_ascii=false") - { - const auto length = 500; - - json dump_test; - dump_test["1"] = std::string(length, -2); - - std::string expected = "{\"1\":\""; - for (int i = 0; i < length; ++i) - { - expected += "\xEF\xBF\xBD"; - } - expected += "\"}"; - - auto s = dump_test.dump(-1, ' ', false, nlohmann::json::error_handler_t::replace); - CHECK(s == expected); - } - SECTION("test case in issue #1445") - { - nlohmann::json dump_test; - const int data[] = - { - 109, 108, 103, 125, -122, -53, 115, - 18, 3, 0, 102, 19, 1, 15, - -110, 13, -3, -1, -81, 32, 2, - 0, 0, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -80, 2, - 0, 0, 96, -118, 46, -116, 46, - 109, -84, -87, 108, 14, 109, -24, - -83, 13, -18, -51, -83, -52, -115, - 14, 6, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - 64, 3, 0, 0, 0, 35, -74, - -73, 55, 57, -128, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - 0, 0, 33, 0, 0, 0, -96, - -54, -28, -26 - }; - std::string s; - for (unsigned i = 0; i < sizeof(data) / sizeof(int); i++) - { - s += static_cast(data[i]); - } - dump_test["1"] = s; - dump_test.dump(-1, ' ', true, nlohmann::json::error_handler_t::replace); - } - } - - SECTION("issue #1447 - Integer Overflow (OSS-Fuzz 12506)") - { - json j = json::parse("[-9223372036854775808]"); - CHECK(j.dump() == "[-9223372036854775808]"); - } - - SECTION("issue #1708 - minimum value of int64_t can be outputted") - { - constexpr auto smallest = (std::numeric_limits::min)(); - json j = smallest; - CHECK(j.dump() == std::to_string(smallest)); - } - - SECTION("issue #1727 - Contains with non-const lvalue json_pointer picks the wrong overload") - { - json j = {{"root", {{"settings", {{"logging", true}}}}}}; - - auto jptr1 = "/root/settings/logging"_json_pointer; - auto jptr2 = json::json_pointer{"/root/settings/logging"}; - - CHECK(j.contains(jptr1)); - CHECK(j.contains(jptr2)); - } - - SECTION("issue #1647 - compile error when deserializing enum if both non-default from_json and non-member operator== exists for other type") - { - { - json j; - NonDefaultFromJsonStruct x(j); - NonDefaultFromJsonStruct y; - CHECK(x == y); - } - - auto val = nlohmann::json("one").get(); - CHECK(val == for_1647::one); - json j = val; - } - - SECTION("issue #1715 - json::from_cbor does not respect allow_exceptions = false when input is string literal") - { - SECTION("string literal") - { - json cbor = json::from_cbor("B", true, false); - CHECK(cbor.is_discarded()); - } - - SECTION("string array") - { - const char input[] = { 'B', 0x00 }; - json cbor = json::from_cbor(input, true, false); - CHECK(cbor.is_discarded()); - } - - SECTION("std::string") - { - json cbor = json::from_cbor(std::string("B"), true, false); - CHECK(cbor.is_discarded()); - } - } - - SECTION("issue #1805 - A pair is json constructible only if T1 and T2 are json constructible") - { - static_assert(!std::is_constructible>::value, ""); - static_assert(!std::is_constructible>::value, ""); - static_assert(std::is_constructible>::value, ""); - } - SECTION("issue #1825 - A tuple is json constructible only if all T in Args are json constructible") - { - static_assert(!std::is_constructible>::value, ""); - static_assert(!std::is_constructible>::value, ""); - static_assert(std::is_constructible>::value, ""); - } - - SECTION("issue #1983 - JSON patch diff for op=add formation is not as per standard (RFC 6902)") - { - const auto source = R"({ "foo": [ "1", "2" ] })"_json; - const auto target = R"({"foo": [ "1", "2", "3" ]})"_json; - const auto result = json::diff(source, target); - CHECK(result.dump() == R"([{"op":"add","path":"/foo/-","value":"3"}])"); - } - - SECTION("issue #2067 - cannot serialize binary data to text JSON") - { - const unsigned char data[] = {0x81, 0xA4, 0x64, 0x61, 0x74, 0x61, 0xC4, 0x0F, 0x33, 0x30, 0x30, 0x32, 0x33, 0x34, 0x30, 0x31, 0x30, 0x37, 0x30, 0x35, 0x30, 0x31, 0x30}; - json j = json::from_msgpack(data, sizeof(data) / sizeof(data[0])); - CHECK_NOTHROW( - j.dump(4, // Indent - ' ', // Indent char - false, // Ensure ascii - json::error_handler_t::strict // Error - ) - ); - } - - SECTION("PR #2181 - regression bug with lvalue") - { - // see https://github.com/nlohmann/json/pull/2181#issuecomment-653326060 - json j{{"x", "test"}}; - std::string defval = "default value"; - auto val = j.value("x", defval); - auto val2 = j.value("y", defval); - } - - SECTION("issue #2293 - eof doesnt cause parsing to stop") - { - std::vector data = - { - 0x7B, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x20, 0x4F, 0x42 - }; - json result = json::from_cbor(data, true, false); - CHECK(result.is_discarded()); - } - - SECTION("issue #2315 - json.update and vectordoes not work with ordered_json") - { - nlohmann::ordered_json jsonAnimals = {{"animal", "dog"}}; - nlohmann::ordered_json jsonCat = {{"animal", "cat"}}; - jsonAnimals.update(jsonCat); - CHECK(jsonAnimals["animal"] == "cat"); - - auto jsonAnimals_parsed = nlohmann::ordered_json::parse(jsonAnimals.dump()); - CHECK(jsonAnimals == jsonAnimals_parsed); - - std::vector> intData = {std::make_pair("aaaa", 11), - std::make_pair("bbb", 222) - }; - nlohmann::ordered_json jsonObj; - for (const auto& data : intData) - { - jsonObj[data.first] = data.second; - } - CHECK(jsonObj["aaaa"] == 11); - CHECK(jsonObj["bbb"] == 222); - } } #if !defined(JSON_NOEXCEPTION) diff --git a/test/src/unit-regression2.cpp b/test/src/unit-regression2.cpp new file mode 100644 index 00000000..d445f068 --- /dev/null +++ b/test/src/unit-regression2.cpp @@ -0,0 +1,481 @@ +/* + __ _____ _____ _____ + __| | __| | | | JSON for Modern C++ (test suite) +| | |__ | | | | | | version 3.9.0 +|_____|_____|_____|_|___| https://github.com/nlohmann/json + +Licensed under the MIT License . +SPDX-License-Identifier: MIT +Copyright (c) 2013-2019 Niels Lohmann . + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#include "doctest_compatibility.h" +DOCTEST_GCC_SUPPRESS_WARNING("-Wfloat-equal") + +// for some reason including this after the json header leads to linker errors with VS 2017... +#include + +#define private public +#include +using nlohmann::json; +#undef private + +#include +#include +#include +#include +#include + +#if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 + #define JSON_HAS_CPP_17 +#endif + +#ifdef JSON_HAS_CPP_17 + #include +#endif + +///////////////////////////////////////////////////////////////////// +// for #1021 +///////////////////////////////////////////////////////////////////// + +using float_json = nlohmann::basic_json; + +///////////////////////////////////////////////////////////////////// +// for #1647 +///////////////////////////////////////////////////////////////////// +namespace +{ +struct NonDefaultFromJsonStruct { }; + +inline bool operator== (NonDefaultFromJsonStruct const&, NonDefaultFromJsonStruct const&) +{ + return true; +} + +enum class for_1647 { one, two }; + +NLOHMANN_JSON_SERIALIZE_ENUM(for_1647, +{ + {for_1647::one, "one"}, + {for_1647::two, "two"}, +}) +} + +///////////////////////////////////////////////////////////////////// +// for #1299 +///////////////////////////////////////////////////////////////////// + +struct Data +{ + Data() = default; + Data(const std::string& a_, const std::string b_) : a(a_), b(b_) {} + std::string a {}; + std::string b {}; +}; + +void from_json(const json& j, Data& data) +{ + j["a"].get_to(data.a); + j["b"].get_to(data.b); +} + +bool operator==(Data const& lhs, Data const& rhs) +{ + return lhs.a == rhs.a && lhs.b == rhs.b; +} + +//bool operator!=(Data const& lhs, Data const& rhs) +//{ +// return !(lhs == rhs); +//} + +namespace nlohmann +{ +template <> +struct adl_serializer +{ + static NonDefaultFromJsonStruct from_json (json const&) noexcept + { + return {}; + } +}; +} + +///////////////////////////////////////////////////////////////////// +// for #1805 +///////////////////////////////////////////////////////////////////// + +struct NotSerializableData +{ + int mydata; + float myfloat; +}; + + +TEST_CASE("regression tests 2") +{ + SECTION("issue #1001 - Fix memory leak during parser callback") + { + auto geojsonExample = R"( + { "type": "FeatureCollection", + "features": [ + { "type": "Feature", + "geometry": {"type": "Point", "coordinates": [102.0, 0.5]}, + "properties": {"prop0": "value0"} + }, + { "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0] + ] + }, + "properties": { + "prop0": "value0", + "prop1": 0.0 + } + }, + { "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], + [100.0, 1.0], [100.0, 0.0] ] + ] + }, + "properties": { + "prop0": "value0", + "prop1": {"this": "that"} + } + } + ] + })"; + + json::parser_callback_t cb = [&](int, json::parse_event_t event, json & parsed) + { + // skip uninteresting events + if (event == json::parse_event_t::value && !parsed.is_primitive()) + { + return false; + } + + switch (event) + { + case json::parse_event_t::key: + { + return true; + } + case json::parse_event_t::value: + { + return false; + } + case json::parse_event_t::object_start: + { + return true; + } + case json::parse_event_t::object_end: + { + return false; + } + case json::parse_event_t::array_start: + { + return true; + } + case json::parse_event_t::array_end: + { + return false; + } + + default: + { + return true; + } + } + }; + + auto j = json::parse(geojsonExample, cb, true); + CHECK(j == json()); + } + + SECTION("issue #1021 - to/from_msgpack only works with standard typization") + { + float_json j = 1000.0; + CHECK(float_json::from_cbor(float_json::to_cbor(j)) == j); + CHECK(float_json::from_msgpack(float_json::to_msgpack(j)) == j); + CHECK(float_json::from_ubjson(float_json::to_ubjson(j)) == j); + + float_json j2 = {1000.0, 2000.0, 3000.0}; + CHECK(float_json::from_ubjson(float_json::to_ubjson(j2, true, true)) == j2); + } + + SECTION("issue #1045 - Using STL algorithms with JSON containers with expected results?") + { + json diffs = nlohmann::json::array(); + json m1{{"key1", 42}}; + json m2{{"key2", 42}}; + auto p1 = m1.items(); + auto p2 = m2.items(); + + using it_type = decltype(p1.begin()); + + std::set_difference( + p1.begin(), p1.end(), + p2.begin(), p2.end(), + std::inserter(diffs, diffs.end()), [&](const it_type & e1, const it_type & e2) -> bool + { + using comper_pair = std::pair; // Trying to avoid unneeded copy + return comper_pair(e1.key(), e1.value()) < comper_pair(e2.key(), e2.value()); // Using pair comper + }); + + CHECK(diffs.size() == 1); // Note the change here, was 2 + } + +#ifdef JSON_HAS_CPP_17 + SECTION("issue #1292 - Serializing std::variant causes stack overflow") + { + static_assert( + !std::is_constructible>::value, ""); + } +#endif + + SECTION("issue #1299 - compile error in from_json converting to container " + "with std::pair") + { + json j = + { + {"1", {{"a", "testa_1"}, {"b", "testb_1"}}}, + {"2", {{"a", "testa_2"}, {"b", "testb_2"}}}, + {"3", {{"a", "testa_3"}, {"b", "testb_3"}}}, + }; + + std::map expected + { + {"1", {"testa_1", "testb_1"}}, + {"2", {"testa_2", "testb_2"}}, + {"3", {"testa_3", "testb_3"}}, + }; + const auto data = j.get(); + CHECK(expected == data); + } + + SECTION("issue #1445 - buffer overflow in dumping invalid utf-8 strings") + { + SECTION("a bunch of -1, ensure_ascii=true") + { + const auto length = 300; + + json dump_test; + dump_test["1"] = std::string(length, -1); + + std::string expected = "{\"1\":\""; + for (int i = 0; i < length; ++i) + { + expected += "\\ufffd"; + } + expected += "\"}"; + + auto s = dump_test.dump(-1, ' ', true, nlohmann::json::error_handler_t::replace); + CHECK(s == expected); + } + SECTION("a bunch of -2, ensure_ascii=false") + { + const auto length = 500; + + json dump_test; + dump_test["1"] = std::string(length, -2); + + std::string expected = "{\"1\":\""; + for (int i = 0; i < length; ++i) + { + expected += "\xEF\xBF\xBD"; + } + expected += "\"}"; + + auto s = dump_test.dump(-1, ' ', false, nlohmann::json::error_handler_t::replace); + CHECK(s == expected); + } + SECTION("test case in issue #1445") + { + nlohmann::json dump_test; + const int data[] = + { + 109, 108, 103, 125, -122, -53, 115, + 18, 3, 0, 102, 19, 1, 15, + -110, 13, -3, -1, -81, 32, 2, + 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -80, 2, + 0, 0, 96, -118, 46, -116, 46, + 109, -84, -87, 108, 14, 109, -24, + -83, 13, -18, -51, -83, -52, -115, + 14, 6, 32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 64, 3, 0, 0, 0, 35, -74, + -73, 55, 57, -128, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 33, 0, 0, 0, -96, + -54, -28, -26 + }; + std::string s; + for (unsigned i = 0; i < sizeof(data) / sizeof(int); i++) + { + s += static_cast(data[i]); + } + dump_test["1"] = s; + dump_test.dump(-1, ' ', true, nlohmann::json::error_handler_t::replace); + } + } + + SECTION("issue #1447 - Integer Overflow (OSS-Fuzz 12506)") + { + json j = json::parse("[-9223372036854775808]"); + CHECK(j.dump() == "[-9223372036854775808]"); + } + + SECTION("issue #1708 - minimum value of int64_t can be outputted") + { + constexpr auto smallest = (std::numeric_limits::min)(); + json j = smallest; + CHECK(j.dump() == std::to_string(smallest)); + } + + SECTION("issue #1727 - Contains with non-const lvalue json_pointer picks the wrong overload") + { + json j = {{"root", {{"settings", {{"logging", true}}}}}}; + + auto jptr1 = "/root/settings/logging"_json_pointer; + auto jptr2 = json::json_pointer{"/root/settings/logging"}; + + CHECK(j.contains(jptr1)); + CHECK(j.contains(jptr2)); + } + + SECTION("issue #1647 - compile error when deserializing enum if both non-default from_json and non-member operator== exists for other type") + { + { + json j; + NonDefaultFromJsonStruct x(j); + NonDefaultFromJsonStruct y; + CHECK(x == y); + } + + auto val = nlohmann::json("one").get(); + CHECK(val == for_1647::one); + json j = val; + } + + SECTION("issue #1715 - json::from_cbor does not respect allow_exceptions = false when input is string literal") + { + SECTION("string literal") + { + json cbor = json::from_cbor("B", true, false); + CHECK(cbor.is_discarded()); + } + + SECTION("string array") + { + const char input[] = { 'B', 0x00 }; + json cbor = json::from_cbor(input, true, false); + CHECK(cbor.is_discarded()); + } + + SECTION("std::string") + { + json cbor = json::from_cbor(std::string("B"), true, false); + CHECK(cbor.is_discarded()); + } + } + + SECTION("issue #1805 - A pair is json constructible only if T1 and T2 are json constructible") + { + static_assert(!std::is_constructible>::value, ""); + static_assert(!std::is_constructible>::value, ""); + static_assert(std::is_constructible>::value, ""); + } + SECTION("issue #1825 - A tuple is json constructible only if all T in Args are json constructible") + { + static_assert(!std::is_constructible>::value, ""); + static_assert(!std::is_constructible>::value, ""); + static_assert(std::is_constructible>::value, ""); + } + + SECTION("issue #1983 - JSON patch diff for op=add formation is not as per standard (RFC 6902)") + { + const auto source = R"({ "foo": [ "1", "2" ] })"_json; + const auto target = R"({"foo": [ "1", "2", "3" ]})"_json; + const auto result = json::diff(source, target); + CHECK(result.dump() == R"([{"op":"add","path":"/foo/-","value":"3"}])"); + } + + SECTION("issue #2067 - cannot serialize binary data to text JSON") + { + const unsigned char data[] = {0x81, 0xA4, 0x64, 0x61, 0x74, 0x61, 0xC4, 0x0F, 0x33, 0x30, 0x30, 0x32, 0x33, 0x34, 0x30, 0x31, 0x30, 0x37, 0x30, 0x35, 0x30, 0x31, 0x30}; + json j = json::from_msgpack(data, sizeof(data) / sizeof(data[0])); + CHECK_NOTHROW( + j.dump(4, // Indent + ' ', // Indent char + false, // Ensure ascii + json::error_handler_t::strict // Error + ) + ); + } + + SECTION("PR #2181 - regression bug with lvalue") + { + // see https://github.com/nlohmann/json/pull/2181#issuecomment-653326060 + json j{{"x", "test"}}; + std::string defval = "default value"; + auto val = j.value("x", defval); + auto val2 = j.value("y", defval); + } + + SECTION("issue #2293 - eof doesnt cause parsing to stop") + { + std::vector data = + { + 0x7B, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x20, 0x4F, 0x42 + }; + json result = json::from_cbor(data, true, false); + CHECK(result.is_discarded()); + } + + SECTION("issue #2315 - json.update and vectordoes not work with ordered_json") + { + nlohmann::ordered_json jsonAnimals = {{"animal", "dog"}}; + nlohmann::ordered_json jsonCat = {{"animal", "cat"}}; + jsonAnimals.update(jsonCat); + CHECK(jsonAnimals["animal"] == "cat"); + + auto jsonAnimals_parsed = nlohmann::ordered_json::parse(jsonAnimals.dump()); + CHECK(jsonAnimals == jsonAnimals_parsed); + + std::vector> intData = {std::make_pair("aaaa", 11), + std::make_pair("bbb", 222) + }; + nlohmann::ordered_json jsonObj; + for (const auto& data : intData) + { + jsonObj[data.first] = data.second; + } + CHECK(jsonObj["aaaa"] == 11); + CHECK(jsonObj["bbb"] == 222); + } +} From 501ad6fc5958d9776514994837d6d470982bd0e8 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 30 Jul 2020 13:31:00 +0200 Subject: [PATCH 07/10] :memo: fix name of Homebrew formula #2326 --- doc/mkdocs/docs/integration/package_managers.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/mkdocs/docs/integration/package_managers.md b/doc/mkdocs/docs/integration/package_managers.md index 17f2005e..58b3eab5 100644 --- a/doc/mkdocs/docs/integration/package_managers.md +++ b/doc/mkdocs/docs/integration/package_managers.md @@ -12,14 +12,14 @@ If you are using OS X and [Homebrew](http://brew.sh), just type ```sh brew tap nlohmann/json -brew install nlohmann_json +brew install nlohmann-json ``` and you're set. If you want the bleeding edge rather than the latest release, use ```sh brew tap nlohmann/json -brew install nlohmann_json --HEAD +brew install nlohmann-json --HEAD ``` instead. @@ -38,19 +38,19 @@ instead. ```sh brew tap nlohmann/json - brew install nlohmann_json + brew install nlohmann-json ``` - 3. Determine the include path, which defaults to `/usr/local/Cellar/nlohmann_json/$version/include`, where `$version` is the version of the library, e.g. `3.7.3`. The path of the library can be determined with + 3. Determine the include path, which defaults to `/usr/local/Cellar/nlohmann-json/$version/include`, where `$version` is the version of the library, e.g. `3.7.3`. The path of the library can be determined with ```sh - brew list nlohmann_json + brew list nlohmann-json ``` 4. Compile the code. For instance, the code can be compiled using Clang with ```sh - clang++ example.cpp -I/usr/local/Cellar/nlohmann_json/3.7.3/include -std=c++11 -o example + clang++ example.cpp -I/usr/local/Cellar/nlohmann-json/3.7.3/include -std=c++11 -o example ``` ## Meson From 3888b1642a35990ecc70b46b30d38a2b4bc61bd9 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Fri, 31 Jul 2020 18:59:22 +0200 Subject: [PATCH 08/10] :bug: fix lexer to properly cope with repeated comments #2330 --- include/nlohmann/detail/input/lexer.hpp | 2 +- single_include/nlohmann/json.hpp | 2 +- test/src/unit-class_lexer.cpp | 3 +++ test/src/unit-regression2.cpp | 7 +++++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/nlohmann/detail/input/lexer.hpp b/include/nlohmann/detail/input/lexer.hpp index 60eb3526..b255b9d2 100644 --- a/include/nlohmann/detail/input/lexer.hpp +++ b/include/nlohmann/detail/input/lexer.hpp @@ -1511,7 +1511,7 @@ scan_number_done: skip_whitespace(); // ignore comments - if (ignore_comments && current == '/') + while (ignore_comments && current == '/') { if (!scan_comment()) { diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 9c66a845..723773de 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -7390,7 +7390,7 @@ scan_number_done: skip_whitespace(); // ignore comments - if (ignore_comments && current == '/') + while (ignore_comments && current == '/') { if (!scan_comment()) { diff --git a/test/src/unit-class_lexer.cpp b/test/src/unit-class_lexer.cpp index 0f544d55..6d4ede8a 100644 --- a/test/src/unit-class_lexer.cpp +++ b/test/src/unit-class_lexer.cpp @@ -241,5 +241,8 @@ TEST_CASE("lexer class") CHECK((scan_string("/* true */", true) == json::lexer::token_type::end_of_input)); CHECK((scan_string("/*/**/", true) == json::lexer::token_type::end_of_input)); CHECK((scan_string("/*/* */", true) == json::lexer::token_type::end_of_input)); + + CHECK((scan_string("//\n//\n", true) == json::lexer::token_type::end_of_input)); + CHECK((scan_string("/**//**//**/", true) == json::lexer::token_type::end_of_input)); } } diff --git a/test/src/unit-regression2.cpp b/test/src/unit-regression2.cpp index d445f068..1f8c527d 100644 --- a/test/src/unit-regression2.cpp +++ b/test/src/unit-regression2.cpp @@ -478,4 +478,11 @@ TEST_CASE("regression tests 2") CHECK(jsonObj["aaaa"] == 11); CHECK(jsonObj["bbb"] == 222); } + + SECTION("issue #2330 - ignore_comment=true fails on multiple consecutive lines starting with comments") + { + std::string ss = "//\n//\n{\n}\n"; + json j = json::parse(ss, nullptr, true, true); + CHECK(j.dump() == "{}"); + } } From 0326e4e2a69d5cbb3d92b5b982b077a54084731b Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Fri, 31 Jul 2020 19:24:03 +0200 Subject: [PATCH 09/10] :rotating_light: fix fallthrough warning --- include/nlohmann/detail/input/lexer.hpp | 4 ++-- single_include/nlohmann/json.hpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/nlohmann/detail/input/lexer.hpp b/include/nlohmann/detail/input/lexer.hpp index 60eb3526..f53ebfeb 100644 --- a/include/nlohmann/detail/input/lexer.hpp +++ b/include/nlohmann/detail/input/lexer.hpp @@ -880,13 +880,13 @@ class lexer : public lexer_base default: { unget(); - break; + continue; } } } default: - break; + continue; } } } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 9c66a845..4462da8f 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -6759,13 +6759,13 @@ class lexer : public lexer_base default: { unget(); - break; + continue; } } } default: - break; + continue; } } } From b3e5cb7f20dcc5c806e418df34324eca60d17d4e Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 6 Aug 2020 13:45:29 +0200 Subject: [PATCH 10/10] :bookmark: set version to 3.9.1 --- .github/ISSUE_TEMPLATE/Bug_report.md | 2 +- CMakeLists.txt | 2 +- ChangeLog.md | 41 +++++++++++++++++++------ doc/Doxyfile | 2 +- doc/examples/README.link | 2 +- doc/examples/meta.output | 4 +-- doc/index.md | 2 +- doc/json.gif | Bin 1710419 -> 1710522 bytes include/nlohmann/json.hpp | 6 ++-- meson.build | 2 +- single_include/nlohmann/json.hpp | 6 ++-- test/src/fuzzer-driver_afl.cpp | 2 +- test/src/fuzzer-parse_bson.cpp | 2 +- test/src/fuzzer-parse_cbor.cpp | 2 +- test/src/fuzzer-parse_json.cpp | 2 +- test/src/fuzzer-parse_msgpack.cpp | 2 +- test/src/fuzzer-parse_ubjson.cpp | 2 +- test/src/unit-algorithms.cpp | 2 +- test/src/unit-allocator.cpp | 2 +- test/src/unit-alt-string.cpp | 2 +- test/src/unit-assert_macro.cpp | 2 +- test/src/unit-bson.cpp | 2 +- test/src/unit-capacity.cpp | 2 +- test/src/unit-cbor.cpp | 2 +- test/src/unit-class_const_iterator.cpp | 2 +- test/src/unit-class_iterator.cpp | 2 +- test/src/unit-class_lexer.cpp | 2 +- test/src/unit-class_parser.cpp | 2 +- test/src/unit-comparison.cpp | 2 +- test/src/unit-concepts.cpp | 2 +- test/src/unit-constructor1.cpp | 2 +- test/src/unit-constructor2.cpp | 2 +- test/src/unit-convenience.cpp | 2 +- test/src/unit-conversions.cpp | 2 +- test/src/unit-deserialization.cpp | 2 +- test/src/unit-element_access1.cpp | 2 +- test/src/unit-element_access2.cpp | 2 +- test/src/unit-hash.cpp | 2 +- test/src/unit-inspection.cpp | 2 +- test/src/unit-items.cpp | 2 +- test/src/unit-iterators1.cpp | 2 +- test/src/unit-iterators2.cpp | 2 +- test/src/unit-json_patch.cpp | 2 +- test/src/unit-json_pointer.cpp | 2 +- test/src/unit-large_json.cpp | 2 +- test/src/unit-merge_patch.cpp | 2 +- test/src/unit-meta.cpp | 6 ++-- test/src/unit-modifiers.cpp | 2 +- test/src/unit-msgpack.cpp | 2 +- test/src/unit-noexcept.cpp | 2 +- test/src/unit-ordered_json.cpp | 2 +- test/src/unit-ordered_map.cpp | 2 +- test/src/unit-pointer_access.cpp | 2 +- test/src/unit-readme.cpp | 2 +- test/src/unit-reference_access.cpp | 2 +- test/src/unit-regression1.cpp | 2 +- test/src/unit-regression2.cpp | 2 +- test/src/unit-serialization.cpp | 2 +- test/src/unit-testsuites.cpp | 2 +- test/src/unit-to_chars.cpp | 2 +- test/src/unit-ubjson.cpp | 2 +- test/src/unit-udt.cpp | 2 +- test/src/unit-udt_macro.cpp | 2 +- test/src/unit-unicode.cpp | 2 +- test/src/unit-user_defined_input.cpp | 2 +- test/src/unit-wstring.cpp | 2 +- test/src/unit.cpp | 2 +- wsjcpp.yml | 2 +- 68 files changed, 104 insertions(+), 83 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md index a2df8dca..6dfa7d2d 100644 --- a/.github/ISSUE_TEMPLATE/Bug_report.md +++ b/.github/ISSUE_TEMPLATE/Bug_report.md @@ -47,7 +47,7 @@ assignees: '' -- [ ] latest release version 3.9.0 +- [ ] latest release version 3.9.1 - [ ] other release - please state the version: ___ - [ ] the `develop` branch diff --git a/CMakeLists.txt b/CMakeLists.txt index 4784466b..fa77a5ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.1) ## PROJECT ## name and version ## -project(nlohmann_json VERSION 3.9.0 LANGUAGES CXX) +project(nlohmann_json VERSION 3.9.1 LANGUAGES CXX) ## ## INCLUDE diff --git a/ChangeLog.md b/ChangeLog.md index 7a762275..e4cec7c5 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,6 +1,29 @@ # Changelog All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [v3.9.1](https://github.com/nlohmann/json/releases/tag/v3.9.1) (2020-08-06) + +[Full Changelog](https://github.com/nlohmann/json/compare/v3.9.0...v3.9.1) + +- Can't parse not formatted JSON. [\#2340](https://github.com/nlohmann/json/issues/2340) +- parse returns desired array contained in array when JSON text begins with square bracket on gcc 7.5.0 [\#2339](https://github.com/nlohmann/json/issues/2339) +- Unexpected deserialization difference between Mac and Linux [\#2338](https://github.com/nlohmann/json/issues/2338) +- Reading ordered\_json from file causes compile error [\#2331](https://github.com/nlohmann/json/issues/2331) +- ignore\_comment=true fails on multiple consecutive lines starting with comments [\#2330](https://github.com/nlohmann/json/issues/2330) +- Update documentation about Homebrew installation and CMake integration - Homebrew [\#2326](https://github.com/nlohmann/json/issues/2326) +- Chinese character initialize error [\#2325](https://github.com/nlohmann/json/issues/2325) +- json.update and vector\does not work with ordered\_json [\#2315](https://github.com/nlohmann/json/issues/2315) +- Ambiguous call to overloaded function [\#2210](https://github.com/nlohmann/json/issues/2210) + +- Fix fallthrough warning [\#2333](https://github.com/nlohmann/json/pull/2333) ([nlohmann](https://github.com/nlohmann)) +- Fix lexer to properly cope with repeated comments [\#2332](https://github.com/nlohmann/json/pull/2332) ([nlohmann](https://github.com/nlohmann)) +- Fix name of Homebrew formula in documentation [\#2327](https://github.com/nlohmann/json/pull/2327) ([nlohmann](https://github.com/nlohmann)) +- fix typo [\#2320](https://github.com/nlohmann/json/pull/2320) ([wx257osn2](https://github.com/wx257osn2)) +- Fix a bug due to missing overloads in ordered\_map container [\#2319](https://github.com/nlohmann/json/pull/2319) ([nlohmann](https://github.com/nlohmann)) +- cmake: install pkg-config file relative to current\_binary\_dir [\#2318](https://github.com/nlohmann/json/pull/2318) ([eli-schwartz](https://github.com/eli-schwartz)) +- Fixed installation of pkg-config file on other than Ubuntu [\#2314](https://github.com/nlohmann/json/pull/2314) ([xvitaly](https://github.com/xvitaly)) +- Cleanup [\#2303](https://github.com/nlohmann/json/pull/2303) ([nlohmann](https://github.com/nlohmann)) + ## [v3.9.0](https://github.com/nlohmann/json/releases/tag/v3.9.0) (2020-07-27) [Full Changelog](https://github.com/nlohmann/json/compare/v3.8.0...v3.9.0) @@ -80,7 +103,6 @@ All notable changes to this project will be documented in this file. This projec - Fix bug in CBOR tag handling [\#2308](https://github.com/nlohmann/json/pull/2308) ([nlohmann](https://github.com/nlohmann)) - added inline to NLOHMANN\_DEFINE\_TYPE\_NON\_INTRUSIVE macro [\#2306](https://github.com/nlohmann/json/pull/2306) ([jwittbrodt](https://github.com/jwittbrodt)) - fixes unused variable 'ex' for \#2304 [\#2305](https://github.com/nlohmann/json/pull/2305) ([AODQ](https://github.com/AODQ)) -- Cleanup [\#2303](https://github.com/nlohmann/json/pull/2303) ([nlohmann](https://github.com/nlohmann)) - Add test with multiple translation units [\#2301](https://github.com/nlohmann/json/pull/2301) ([nlohmann](https://github.com/nlohmann)) - Merge GitHub actions [\#2300](https://github.com/nlohmann/json/pull/2300) ([nlohmann](https://github.com/nlohmann)) - Fix unused parameter [\#2299](https://github.com/nlohmann/json/pull/2299) ([nlohmann](https://github.com/nlohmann)) @@ -741,6 +763,8 @@ All notable changes to this project will be documented in this file. This projec - Added to\_string and added basic tests [\#1585](https://github.com/nlohmann/json/pull/1585) ([Macr0Nerd](https://github.com/Macr0Nerd)) - Regression tests for MSVC [\#1570](https://github.com/nlohmann/json/pull/1570) ([nickaein](https://github.com/nickaein)) - Fix/1511 [\#1555](https://github.com/nlohmann/json/pull/1555) ([theodelrieu](https://github.com/theodelrieu)) +- Remove C++17 extension warning from clang; \#1535 [\#1551](https://github.com/nlohmann/json/pull/1551) ([heavywatal](https://github.com/heavywatal)) +- moved from Catch to doctest for unit tests [\#1439](https://github.com/nlohmann/json/pull/1439) ([onqtam](https://github.com/onqtam)) ## [v3.6.1](https://github.com/nlohmann/json/releases/tag/v3.6.1) (2019-03-20) @@ -843,7 +867,6 @@ All notable changes to this project will be documented in this file. This projec - Implicit type conversion error on MSVC [\#1333](https://github.com/nlohmann/json/issues/1333) - NuGet Package [\#1132](https://github.com/nlohmann/json/issues/1132) -- Remove C++17 extension warning from clang; \#1535 [\#1551](https://github.com/nlohmann/json/pull/1551) ([heavywatal](https://github.com/heavywatal)) - Change macros to numeric\_limits [\#1514](https://github.com/nlohmann/json/pull/1514) ([naszta](https://github.com/naszta)) - fix GCC 7.1.1 - 7.2.1 on CentOS [\#1496](https://github.com/nlohmann/json/pull/1496) ([lieff](https://github.com/lieff)) - Update Buckaroo instructions in README.md [\#1495](https://github.com/nlohmann/json/pull/1495) ([njlr](https://github.com/njlr)) @@ -859,7 +882,6 @@ All notable changes to this project will be documented in this file. This projec - remove extra semicolon from readme [\#1451](https://github.com/nlohmann/json/pull/1451) ([Afforix](https://github.com/Afforix)) - attempt to fix \#1445, flush buffer in serializer::dump\_escaped in UTF8\_REJECT case. [\#1446](https://github.com/nlohmann/json/pull/1446) ([scinart](https://github.com/scinart)) - Use C++11 features supported by CMake 3.1. [\#1441](https://github.com/nlohmann/json/pull/1441) ([iwanders](https://github.com/iwanders)) -- moved from Catch to doctest for unit tests [\#1439](https://github.com/nlohmann/json/pull/1439) ([onqtam](https://github.com/onqtam)) - :rotating\_light: fixed unused variable warning [\#1435](https://github.com/nlohmann/json/pull/1435) ([pboettch](https://github.com/pboettch)) - allow push\_back\(\) and pop\_back\(\) calls on json\_pointer [\#1434](https://github.com/nlohmann/json/pull/1434) ([pboettch](https://github.com/pboettch)) - Add instructions about using nlohmann/json with the conda package manager [\#1430](https://github.com/nlohmann/json/pull/1430) ([nicoddemus](https://github.com/nicoddemus)) @@ -870,6 +892,7 @@ All notable changes to this project will be documented in this file. This projec - Fix x64 target platform for appveyor [\#1414](https://github.com/nlohmann/json/pull/1414) ([nickaein](https://github.com/nickaein)) - Improve dump\_integer performance [\#1411](https://github.com/nlohmann/json/pull/1411) ([nickaein](https://github.com/nickaein)) - buildsystem: relax requirement on cmake version [\#1409](https://github.com/nlohmann/json/pull/1409) ([yann-morin-1998](https://github.com/yann-morin-1998)) +- Added Support for Structured Bindings [\#1391](https://github.com/nlohmann/json/pull/1391) ([pratikpc](https://github.com/pratikpc)) - CMake: Optional Install if Embedded [\#1330](https://github.com/nlohmann/json/pull/1330) ([ax3l](https://github.com/ax3l)) ## [v3.5.0](https://github.com/nlohmann/json/releases/tag/v3.5.0) (2018-12-21) @@ -939,7 +962,6 @@ All notable changes to this project will be documented in this file. This projec - Check value for existence by json\_pointer [\#1194](https://github.com/nlohmann/json/issues/1194) - Feature/add file input adapter [\#1392](https://github.com/nlohmann/json/pull/1392) ([dumarjo](https://github.com/dumarjo)) -- Added Support for Structured Bindings [\#1391](https://github.com/nlohmann/json/pull/1391) ([pratikpc](https://github.com/pratikpc)) - Link to issue \#958 broken [\#1382](https://github.com/nlohmann/json/pull/1382) ([kjpus](https://github.com/kjpus)) - readme: fix typo [\#1380](https://github.com/nlohmann/json/pull/1380) ([manu-chroma](https://github.com/manu-chroma)) - recommend using explicit from JSON conversions [\#1363](https://github.com/nlohmann/json/pull/1363) ([theodelrieu](https://github.com/theodelrieu)) @@ -948,6 +970,7 @@ All notable changes to this project will be documented in this file. This projec - Set eofbit on exhausted input stream. [\#1343](https://github.com/nlohmann/json/pull/1343) ([mefyl](https://github.com/mefyl)) - Add a SFINAE friendly iterator\_traits and use that instead. [\#1342](https://github.com/nlohmann/json/pull/1342) ([dgavedissian](https://github.com/dgavedissian)) - Fix EOL Whitespaces & CMake Spelling [\#1329](https://github.com/nlohmann/json/pull/1329) ([ax3l](https://github.com/ax3l)) +- Add BSON support [\#1320](https://github.com/nlohmann/json/pull/1320) ([nlohmann](https://github.com/nlohmann)) ## [v3.4.0](https://github.com/nlohmann/json/releases/tag/v3.4.0) (2018-10-30) @@ -987,7 +1010,6 @@ All notable changes to this project will be documented in this file. This projec - Soften the landing when dumping non-UTF8 strings \(type\_error.316 exception\) [\#1198](https://github.com/nlohmann/json/issues/1198) - Add macro to define enum/JSON mapping [\#1323](https://github.com/nlohmann/json/pull/1323) ([nlohmann](https://github.com/nlohmann)) -- Add BSON support [\#1320](https://github.com/nlohmann/json/pull/1320) ([nlohmann](https://github.com/nlohmann)) - Properly convert constants to CharType [\#1315](https://github.com/nlohmann/json/pull/1315) ([nlohmann](https://github.com/nlohmann)) - Allow to set error handler for decoding errors [\#1314](https://github.com/nlohmann/json/pull/1314) ([nlohmann](https://github.com/nlohmann)) - Add Meson related info to README [\#1305](https://github.com/nlohmann/json/pull/1305) ([koponomarenko](https://github.com/koponomarenko)) @@ -1975,6 +1997,7 @@ All notable changes to this project will be documented in this file. This projec - Fix usage examples' comments for std::multiset [\#321](https://github.com/nlohmann/json/pull/321) ([vasild](https://github.com/vasild)) - Include dir relocation [\#318](https://github.com/nlohmann/json/pull/318) ([ChristophJud](https://github.com/ChristophJud)) - trivial documentation fix [\#313](https://github.com/nlohmann/json/pull/313) ([5tefan](https://github.com/5tefan)) +- unit-constructor1.cpp: Fix floating point truncation warning [\#300](https://github.com/nlohmann/json/pull/300) ([t-b](https://github.com/t-b)) ## [v2.0.5](https://github.com/nlohmann/json/releases/tag/v2.0.5) (2016-09-14) @@ -2007,8 +2030,6 @@ All notable changes to this project will be documented in this file. This projec - Incorrect parsing of large int64\_t numbers [\#287](https://github.com/nlohmann/json/issues/287) - \[question\]: macro to disable floating point support [\#284](https://github.com/nlohmann/json/issues/284) -- unit-constructor1.cpp: Fix floating point truncation warning [\#300](https://github.com/nlohmann/json/pull/300) ([t-b](https://github.com/t-b)) - ## [v2.0.2](https://github.com/nlohmann/json/releases/tag/v2.0.2) (2016-07-31) [Full Changelog](https://github.com/nlohmann/json/compare/v2.0.1...v2.0.2) @@ -2085,7 +2106,6 @@ All notable changes to this project will be documented in this file. This projec - What is within scope? [\#192](https://github.com/nlohmann/json/issues/192) - Bugs in miloyip/nativejson-benchmark: roundtrips [\#187](https://github.com/nlohmann/json/issues/187) - Floating point exceptions [\#181](https://github.com/nlohmann/json/issues/181) -- Integer conversion to unsigned [\#178](https://github.com/nlohmann/json/issues/178) - map string string fails to compile [\#176](https://github.com/nlohmann/json/issues/176) - In basic\_json::basic\_json\(const CompatibleArrayType& val\), the requirement of CompatibleArrayType is not strict enough. [\#174](https://github.com/nlohmann/json/issues/174) - Provide a FAQ [\#163](https://github.com/nlohmann/json/issues/163) @@ -2104,7 +2124,6 @@ All notable changes to this project will be documented in this file. This projec - fixed noexcept; added constexpr [\#208](https://github.com/nlohmann/json/pull/208) ([nlohmann](https://github.com/nlohmann)) - Add support for afl-fuzz testing [\#207](https://github.com/nlohmann/json/pull/207) ([mykter](https://github.com/mykter)) - replaced ssize\_t occurrences with auto \(addresses \#204\) [\#205](https://github.com/nlohmann/json/pull/205) ([nlohmann](https://github.com/nlohmann)) -- Fixed issue \#199 - Small bugs in json.hpp \(get\_number\) and unit.cpp \(non-standard integer type test\) [\#200](https://github.com/nlohmann/json/pull/200) ([twelsby](https://github.com/twelsby)) - Fix broken link [\#197](https://github.com/nlohmann/json/pull/197) ([vog](https://github.com/vog)) - Issue \#195 - update Travis to Trusty due to gcc/clang strtod\(\) bug [\#196](https://github.com/nlohmann/json/pull/196) ([twelsby](https://github.com/twelsby)) - Issue \#178 - Extending support to full uint64\_t/int64\_t range and unsigned type \(updated\) [\#193](https://github.com/nlohmann/json/pull/193) ([twelsby](https://github.com/twelsby)) @@ -2118,6 +2137,7 @@ All notable changes to this project will be documented in this file. This projec - Floating point equality [\#185](https://github.com/nlohmann/json/issues/185) - Unused variables in catch [\#180](https://github.com/nlohmann/json/issues/180) - Typo in documentation [\#179](https://github.com/nlohmann/json/issues/179) +- Integer conversion to unsigned [\#178](https://github.com/nlohmann/json/issues/178) - JSON performance benchmark comparision [\#177](https://github.com/nlohmann/json/issues/177) - Since re2c is often ignored in pull requests, it may make sense to make a contributing.md file [\#175](https://github.com/nlohmann/json/issues/175) - Question about exceptions [\#173](https://github.com/nlohmann/json/issues/173) @@ -2131,11 +2151,11 @@ All notable changes to this project will be documented in this file. This projec - range based for loop for objects [\#83](https://github.com/nlohmann/json/issues/83) - Consider submitting this to the Boost Library Incubator [\#66](https://github.com/nlohmann/json/issues/66) +- Fixed issue \#199 - Small bugs in json.hpp \(get\_number\) and unit.cpp \(non-standard integer type test\) [\#200](https://github.com/nlohmann/json/pull/200) ([twelsby](https://github.com/twelsby)) - Fixed Issue \#186 - add strto\(f|d|ld\) overload wrappers, "-0.0" special case and FP trailing zero [\#191](https://github.com/nlohmann/json/pull/191) ([twelsby](https://github.com/twelsby)) - Issue \#185 - remove approx\(\) and use \#pragma to kill warnings [\#190](https://github.com/nlohmann/json/pull/190) ([twelsby](https://github.com/twelsby)) - Fixed Issue \#171 - added two extra template overloads of operator\[\] for T\* arguments [\#189](https://github.com/nlohmann/json/pull/189) ([twelsby](https://github.com/twelsby)) - Fixed issue \#167 - removed operator ValueType\(\) condition for VS2015 [\#188](https://github.com/nlohmann/json/pull/188) ([twelsby](https://github.com/twelsby)) -- Implementation of get\_ref\(\) [\#184](https://github.com/nlohmann/json/pull/184) ([dariomt](https://github.com/dariomt)) - Fixed some typos in CONTRIBUTING.md [\#182](https://github.com/nlohmann/json/pull/182) ([nibroc](https://github.com/nibroc)) ## [v1.0.0](https://github.com/nlohmann/json/releases/tag/v1.0.0) (2015-12-27) @@ -2177,6 +2197,7 @@ All notable changes to this project will be documented in this file. This projec - Wishlist [\#65](https://github.com/nlohmann/json/issues/65) - Windows/Visual Studio \(through 2013\) is unsupported [\#62](https://github.com/nlohmann/json/issues/62) +- Implementation of get\_ref\(\) [\#184](https://github.com/nlohmann/json/pull/184) ([dariomt](https://github.com/dariomt)) - Replace sprintf with hex function, this fixes \#149 [\#153](https://github.com/nlohmann/json/pull/153) ([whackashoe](https://github.com/whackashoe)) - Fix character skipping after a surrogate pair [\#146](https://github.com/nlohmann/json/pull/146) ([robertmrk](https://github.com/robertmrk)) - Detect correctly pointer-to-const [\#137](https://github.com/nlohmann/json/pull/137) ([dariomt](https://github.com/dariomt)) diff --git a/doc/Doxyfile b/doc/Doxyfile index e6207fb0..9884f959 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -5,7 +5,7 @@ #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = "JSON for Modern C++" -PROJECT_NUMBER = 3.9.0 +PROJECT_NUMBER = 3.9.1 PROJECT_BRIEF = PROJECT_LOGO = OUTPUT_DIRECTORY = . diff --git a/doc/examples/README.link b/doc/examples/README.link index 786b27be..2bb56a02 100644 --- a/doc/examples/README.link +++ b/doc/examples/README.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/meta.output b/doc/examples/meta.output index ffadccbe..0fac5b41 100644 --- a/doc/examples/meta.output +++ b/doc/examples/meta.output @@ -11,7 +11,7 @@ "version": { "major": 3, "minor": 9, - "patch": 0, - "string": "3.9.0" + "patch": 1, + "string": "3.9.1" } } diff --git a/doc/index.md b/doc/index.md index e990e7a3..66a13ef2 100644 --- a/doc/index.md +++ b/doc/index.md @@ -332,4 +332,4 @@ Note that this table only lists those exceptions thrown due to the type. For ins @author [Niels Lohmann](http://nlohmann.me) @see https://github.com/nlohmann/json to download the source code -@version 3.9.0 +@version 3.9.1 diff --git a/doc/json.gif b/doc/json.gif index d3dfb91c0325a5cd1c5da12fc4ec600b421b14d0..7542048ed96bb4edd4af897523cc4d37d0ec426d 100644 GIT binary patch delta 33267 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 DCmvbi delta 33111 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 diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 3b122b0c..a9e6c76d 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . @@ -32,7 +32,7 @@ SOFTWARE. #define NLOHMANN_JSON_VERSION_MAJOR 3 #define NLOHMANN_JSON_VERSION_MINOR 9 -#define NLOHMANN_JSON_VERSION_PATCH 0 +#define NLOHMANN_JSON_VERSION_PATCH 1 #include // all_of, find, for_each #include // nullptr_t, ptrdiff_t, size_t @@ -1052,7 +1052,7 @@ class basic_json object = nullptr; // silence warning, see #821 if (JSON_HEDLEY_UNLIKELY(t == value_t::null)) { - JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.9.0")); // LCOV_EXCL_LINE + JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.9.1")); // LCOV_EXCL_LINE } break; } diff --git a/meson.build b/meson.build index 6f95c9b6..c7b2cb41 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('nlohmann_json', 'cpp', - version : '3.9.0', + version : '3.9.1', license : 'MIT', ) diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 41c17111..a70aaf8c 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . @@ -32,7 +32,7 @@ SOFTWARE. #define NLOHMANN_JSON_VERSION_MAJOR 3 #define NLOHMANN_JSON_VERSION_MINOR 9 -#define NLOHMANN_JSON_VERSION_PATCH 0 +#define NLOHMANN_JSON_VERSION_PATCH 1 #include // all_of, find, for_each #include // nullptr_t, ptrdiff_t, size_t @@ -17540,7 +17540,7 @@ class basic_json object = nullptr; // silence warning, see #821 if (JSON_HEDLEY_UNLIKELY(t == value_t::null)) { - JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.9.0")); // LCOV_EXCL_LINE + JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.9.1")); // LCOV_EXCL_LINE } break; } diff --git a/test/src/fuzzer-driver_afl.cpp b/test/src/fuzzer-driver_afl.cpp index a9368ca9..06ac3af9 100644 --- a/test/src/fuzzer-driver_afl.cpp +++ b/test/src/fuzzer-driver_afl.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (fuzz test support) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json This file implements a driver for American Fuzzy Lop (afl-fuzz). It relies on diff --git a/test/src/fuzzer-parse_bson.cpp b/test/src/fuzzer-parse_bson.cpp index 1d26a776..8ebb1f10 100644 --- a/test/src/fuzzer-parse_bson.cpp +++ b/test/src/fuzzer-parse_bson.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (fuzz test support) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json This file implements a parser test suitable for fuzz testing. Given a byte diff --git a/test/src/fuzzer-parse_cbor.cpp b/test/src/fuzzer-parse_cbor.cpp index 7d312306..8f2e5969 100644 --- a/test/src/fuzzer-parse_cbor.cpp +++ b/test/src/fuzzer-parse_cbor.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (fuzz test support) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json This file implements a parser test suitable for fuzz testing. Given a byte diff --git a/test/src/fuzzer-parse_json.cpp b/test/src/fuzzer-parse_json.cpp index 4bc54bab..803152d0 100644 --- a/test/src/fuzzer-parse_json.cpp +++ b/test/src/fuzzer-parse_json.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (fuzz test support) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json This file implements a parser test suitable for fuzz testing. Given a byte diff --git a/test/src/fuzzer-parse_msgpack.cpp b/test/src/fuzzer-parse_msgpack.cpp index 8d17b5d9..32366c2a 100644 --- a/test/src/fuzzer-parse_msgpack.cpp +++ b/test/src/fuzzer-parse_msgpack.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (fuzz test support) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json This file implements a parser test suitable for fuzz testing. Given a byte diff --git a/test/src/fuzzer-parse_ubjson.cpp b/test/src/fuzzer-parse_ubjson.cpp index 3d99abbe..4ec69c32 100644 --- a/test/src/fuzzer-parse_ubjson.cpp +++ b/test/src/fuzzer-parse_ubjson.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (fuzz test support) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json This file implements a parser test suitable for fuzz testing. Given a byte diff --git a/test/src/unit-algorithms.cpp b/test/src/unit-algorithms.cpp index d59c090c..c08e858a 100644 --- a/test/src/unit-algorithms.cpp +++ b/test/src/unit-algorithms.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-allocator.cpp b/test/src/unit-allocator.cpp index 58f4c63a..40361ce0 100644 --- a/test/src/unit-allocator.cpp +++ b/test/src/unit-allocator.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-alt-string.cpp b/test/src/unit-alt-string.cpp index d5131040..b51a5a91 100644 --- a/test/src/unit-alt-string.cpp +++ b/test/src/unit-alt-string.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-assert_macro.cpp b/test/src/unit-assert_macro.cpp index b2a71be9..826638fe 100644 --- a/test/src/unit-assert_macro.cpp +++ b/test/src/unit-assert_macro.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-bson.cpp b/test/src/unit-bson.cpp index 42dae1f2..6b2e76da 100644 --- a/test/src/unit-bson.cpp +++ b/test/src/unit-bson.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-capacity.cpp b/test/src/unit-capacity.cpp index cbe0d6b0..9be901bf 100644 --- a/test/src/unit-capacity.cpp +++ b/test/src/unit-capacity.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-cbor.cpp b/test/src/unit-cbor.cpp index 0a8dbf6f..ca4b781a 100644 --- a/test/src/unit-cbor.cpp +++ b/test/src/unit-cbor.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-class_const_iterator.cpp b/test/src/unit-class_const_iterator.cpp index f75c4831..608e6a54 100644 --- a/test/src/unit-class_const_iterator.cpp +++ b/test/src/unit-class_const_iterator.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-class_iterator.cpp b/test/src/unit-class_iterator.cpp index 0a85e7ad..c06ef0a4 100644 --- a/test/src/unit-class_iterator.cpp +++ b/test/src/unit-class_iterator.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-class_lexer.cpp b/test/src/unit-class_lexer.cpp index 6d4ede8a..15b390cf 100644 --- a/test/src/unit-class_lexer.cpp +++ b/test/src/unit-class_lexer.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index 2c93a753..07044ed5 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-comparison.cpp b/test/src/unit-comparison.cpp index b0984a5b..e375feca 100644 --- a/test/src/unit-comparison.cpp +++ b/test/src/unit-comparison.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-concepts.cpp b/test/src/unit-concepts.cpp index 49f2f865..deffc9a4 100644 --- a/test/src/unit-concepts.cpp +++ b/test/src/unit-concepts.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-constructor1.cpp b/test/src/unit-constructor1.cpp index 70f52fd2..33bd92c3 100644 --- a/test/src/unit-constructor1.cpp +++ b/test/src/unit-constructor1.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-constructor2.cpp b/test/src/unit-constructor2.cpp index a7bf0e50..27f4dfdc 100644 --- a/test/src/unit-constructor2.cpp +++ b/test/src/unit-constructor2.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-convenience.cpp b/test/src/unit-convenience.cpp index 41955b3f..162ad56d 100644 --- a/test/src/unit-convenience.cpp +++ b/test/src/unit-convenience.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index 32e15ace..de8040c8 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-deserialization.cpp b/test/src/unit-deserialization.cpp index 66556617..716564c0 100644 --- a/test/src/unit-deserialization.cpp +++ b/test/src/unit-deserialization.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-element_access1.cpp b/test/src/unit-element_access1.cpp index a619b249..e3f06302 100644 --- a/test/src/unit-element_access1.cpp +++ b/test/src/unit-element_access1.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-element_access2.cpp b/test/src/unit-element_access2.cpp index 4abf3dba..18fc6a20 100644 --- a/test/src/unit-element_access2.cpp +++ b/test/src/unit-element_access2.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-hash.cpp b/test/src/unit-hash.cpp index ea35300f..b74990d7 100644 --- a/test/src/unit-hash.cpp +++ b/test/src/unit-hash.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-inspection.cpp b/test/src/unit-inspection.cpp index 02502e07..004f14d1 100644 --- a/test/src/unit-inspection.cpp +++ b/test/src/unit-inspection.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-items.cpp b/test/src/unit-items.cpp index a3f808b2..10621ce7 100644 --- a/test/src/unit-items.cpp +++ b/test/src/unit-items.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-iterators1.cpp b/test/src/unit-iterators1.cpp index d389b9f6..45a84a07 100644 --- a/test/src/unit-iterators1.cpp +++ b/test/src/unit-iterators1.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-iterators2.cpp b/test/src/unit-iterators2.cpp index c3378e0d..85eb7beb 100644 --- a/test/src/unit-iterators2.cpp +++ b/test/src/unit-iterators2.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-json_patch.cpp b/test/src/unit-json_patch.cpp index 23f59b0f..2ad7aadb 100644 --- a/test/src/unit-json_patch.cpp +++ b/test/src/unit-json_patch.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-json_pointer.cpp b/test/src/unit-json_pointer.cpp index 7d320bcc..61b6e323 100644 --- a/test/src/unit-json_pointer.cpp +++ b/test/src/unit-json_pointer.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-large_json.cpp b/test/src/unit-large_json.cpp index 175b0cd6..600a9915 100644 --- a/test/src/unit-large_json.cpp +++ b/test/src/unit-large_json.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-merge_patch.cpp b/test/src/unit-merge_patch.cpp index c664f8f3..34551c75 100644 --- a/test/src/unit-merge_patch.cpp +++ b/test/src/unit-merge_patch.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-meta.cpp b/test/src/unit-meta.cpp index 48ef35c1..50dd6b4b 100644 --- a/test/src/unit-meta.cpp +++ b/test/src/unit-meta.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . @@ -43,10 +43,10 @@ TEST_CASE("version information") CHECK(j["url"] == "https://github.com/nlohmann/json"); CHECK(j["version"] == json( { - {"string", "3.9.0"}, + {"string", "3.9.1"}, {"major", 3}, {"minor", 9}, - {"patch", 0} + {"patch", 1} })); CHECK(j.find("platform") != j.end()); diff --git a/test/src/unit-modifiers.cpp b/test/src/unit-modifiers.cpp index 4f5b5729..d66621d8 100644 --- a/test/src/unit-modifiers.cpp +++ b/test/src/unit-modifiers.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-msgpack.cpp b/test/src/unit-msgpack.cpp index 42089555..e49a4203 100644 --- a/test/src/unit-msgpack.cpp +++ b/test/src/unit-msgpack.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-noexcept.cpp b/test/src/unit-noexcept.cpp index 4ed0f709..7e657bf9 100644 --- a/test/src/unit-noexcept.cpp +++ b/test/src/unit-noexcept.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-ordered_json.cpp b/test/src/unit-ordered_json.cpp index 0c8e7154..9b242c82 100644 --- a/test/src/unit-ordered_json.cpp +++ b/test/src/unit-ordered_json.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-ordered_map.cpp b/test/src/unit-ordered_map.cpp index 49937aa2..645183d8 100644 --- a/test/src/unit-ordered_map.cpp +++ b/test/src/unit-ordered_map.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-pointer_access.cpp b/test/src/unit-pointer_access.cpp index c353c17c..95478b2c 100644 --- a/test/src/unit-pointer_access.cpp +++ b/test/src/unit-pointer_access.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-readme.cpp b/test/src/unit-readme.cpp index 729ee954..ed2a4dce 100644 --- a/test/src/unit-readme.cpp +++ b/test/src/unit-readme.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-reference_access.cpp b/test/src/unit-reference_access.cpp index 9cbc7aea..c9836776 100644 --- a/test/src/unit-reference_access.cpp +++ b/test/src/unit-reference_access.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-regression1.cpp b/test/src/unit-regression1.cpp index 97f64e71..18820d17 100644 --- a/test/src/unit-regression1.cpp +++ b/test/src/unit-regression1.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-regression2.cpp b/test/src/unit-regression2.cpp index 1f8c527d..69e3dea9 100644 --- a/test/src/unit-regression2.cpp +++ b/test/src/unit-regression2.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-serialization.cpp b/test/src/unit-serialization.cpp index 2308dd2a..3a733d2f 100644 --- a/test/src/unit-serialization.cpp +++ b/test/src/unit-serialization.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-testsuites.cpp b/test/src/unit-testsuites.cpp index f5e0ec10..da8b27d7 100644 --- a/test/src/unit-testsuites.cpp +++ b/test/src/unit-testsuites.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-to_chars.cpp b/test/src/unit-to_chars.cpp index 386c4cc2..2861928f 100644 --- a/test/src/unit-to_chars.cpp +++ b/test/src/unit-to_chars.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-ubjson.cpp b/test/src/unit-ubjson.cpp index 3c72ddbb..42954479 100644 --- a/test/src/unit-ubjson.cpp +++ b/test/src/unit-ubjson.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-udt.cpp b/test/src/unit-udt.cpp index 2374b3e3..7f74ac5f 100644 --- a/test/src/unit-udt.cpp +++ b/test/src/unit-udt.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-udt_macro.cpp b/test/src/unit-udt_macro.cpp index 45eeca2e..b56a5d15 100644 --- a/test/src/unit-udt_macro.cpp +++ b/test/src/unit-udt_macro.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-unicode.cpp b/test/src/unit-unicode.cpp index 0b60b359..8e122d5d 100644 --- a/test/src/unit-unicode.cpp +++ b/test/src/unit-unicode.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-user_defined_input.cpp b/test/src/unit-user_defined_input.cpp index 967f9c06..5a1138b0 100644 --- a/test/src/unit-user_defined_input.cpp +++ b/test/src/unit-user_defined_input.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit-wstring.cpp b/test/src/unit-wstring.cpp index 2ebe99fb..a5b80be7 100644 --- a/test/src/unit-wstring.cpp +++ b/test/src/unit-wstring.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/test/src/unit.cpp b/test/src/unit.cpp index b0b20d79..f54819e1 100644 --- a/test/src/unit.cpp +++ b/test/src/unit.cpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 3.9.0 +| | |__ | | | | | | version 3.9.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . diff --git a/wsjcpp.yml b/wsjcpp.yml index 629ae388..d8184952 100644 --- a/wsjcpp.yml +++ b/wsjcpp.yml @@ -2,7 +2,7 @@ wsjcpp_version: "v0.1.1" cmake_minimum_required: "3.0" cmake_cxx_standard: "11" name: "nlohmann/json" -version: "v3.9.0" +version: "v3.9.1" description: "JSON for Modern C++" issues: "https://github.com/nlohmann/json/issues" keywords: