From 15f8c848fa5a25e8f4cc1ecb90ef4a1b2eb5d062 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 10 Apr 2016 18:23:43 +0200 Subject: [PATCH 001/133] fixed typo and indentation --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2fadefff6..8c100333a 100644 --- a/README.md +++ b/README.md @@ -55,13 +55,13 @@ Please note: - GCC 4.8 does not work because of two bugs ([55817](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55817) and [57824](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57824)) in the C++11 support. Note there is a [pull request](https://github.com/nlohmann/json/pull/212) to fix some of the issues. - Android defaults to using very old compilers and C++ libraries. To fix this, add the following to your `Application.mk`. This will switch to the LLVM C++ library, the Clang compiler, and enable C++11 and other features disabled by default. -``` -APP_STL := c++_shared -NDK_TOOLCHAIN_VERSION := clang3.6 -APP_CPPFLAGS += -frtti -fexceptions -``` + ``` + APP_STL := c++_shared + NDK_TOOLCHAIN_VERSION := clang3.6 + APP_CPPFLAGS += -frtti -fexceptions + ``` -- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MingW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. +- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. ## Examples From 507322e6f2f63d028c68b2a666aefe902b77f66e Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 10 Apr 2016 19:36:09 +0200 Subject: [PATCH 002/133] updated ChangeLog --- ChangeLog.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index bb325598b..0acd10f5a 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,17 +6,32 @@ All notable changes to this project will be documented in this file. This projec [Full Changelog](https://github.com/nlohmann/json/compare/v1.1.0...HEAD) - Provide a FAQ [\#163](https://github.com/nlohmann/json/issues/163) +- Create PULL\_REQUEST\_TEMPLATE.md [\#213](https://github.com/nlohmann/json/pull/213) ([whackashoe](https://github.com/whackashoe)) +- 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) ([msm-](https://github.com/msm-)) - 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)) +- double values are serialized with commas as decimal points [\#228](https://github.com/nlohmann/json/issues/228) +- Move semantics with std::initializer\_list [\#225](https://github.com/nlohmann/json/issues/225) +- abort during getline in yyfill [\#223](https://github.com/nlohmann/json/issues/223) +- Wrong link in the README.md [\#217](https://github.com/nlohmann/json/issues/217) - Small bugs in json.hpp \(get\_number\) and unit.cpp \(non-standard integer type test\) [\#199](https://github.com/nlohmann/json/issues/199) - GCC/clang floating point parsing bug in strtod\(\) [\#195](https://github.com/nlohmann/json/issues/195) - 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) +- In basic\_json::basic\_json\(const CompatibleArrayType& val\), the requirement of CompatibleArrayType is not strict enough. [\#174](https://github.com/nlohmann/json/issues/174) - Implicit assignment to std::string fails [\#144](https://github.com/nlohmann/json/issues/144) - 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)) +- Conflicting typedef of ssize\_t on Windows 32 bit when using Boost.Python [\#204](https://github.com/nlohmann/json/issues/204) - Integer conversion to unsigned [\#178](https://github.com/nlohmann/json/issues/178) +- make serialization locale-independent [\#232](https://github.com/nlohmann/json/pull/232) ([nlohmann](https://github.com/nlohmann)) +- fixes \#223 by updating README.md [\#227](https://github.com/nlohmann/json/pull/227) ([kevin--](https://github.com/kevin--)) +- Use namespace std for int64\_t and uint64\_t [\#226](https://github.com/nlohmann/json/pull/226) ([lv-zheng](https://github.com/lv-zheng)) +- Added missing cerrno header to fix ERANGE compile error on android [\#222](https://github.com/nlohmann/json/pull/222) ([Teemperor](https://github.com/Teemperor)) +- Corrected readme [\#218](https://github.com/nlohmann/json/pull/218) ([Annihil](https://github.com/Annihil)) +- 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)) From 726051e9b75009e68bb216171ac8e1ad56fdb99a Mon Sep 17 00:00:00 2001 From: Niels Date: Mon, 11 Apr 2016 23:17:03 +0200 Subject: [PATCH 003/133] very first draft of a JSON pointer API --- src/json.hpp | 73 +++++++++++++++++++++++++++++++++++++++++++++++ src/json.hpp.re2c | 73 +++++++++++++++++++++++++++++++++++++++++++++++ test/unit.cpp | 29 +++++++++++++++++++ 3 files changed, 175 insertions(+) diff --git a/src/json.hpp b/src/json.hpp index 8f671fb01..c8b815048 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8844,6 +8844,79 @@ basic_json_parser_64: /// the lexer lexer m_lexer; }; + + public: + class json_pointer + { + public: + /// empty reference token + json_pointer() = default; + + /// nonempty reference token + json_pointer(const std::string& s) + { + split(s); + } + + /// return referenced value + reference get(reference j) + { + reference result = j; + + for (const auto& reference_token : reference_tokens) + { + switch (result.m_type) + { + case value_t::object: + result = result[reference_token]; + continue; + + case value_t::array: + result = result[std::stoi(reference_token)]; + continue; + + default: + throw std::domain_error("unresolved reference token '" + reference_token + "'"); + } + } + + return result; + } + + private: + /// the reference tokens + std::vector reference_tokens {}; + + /// split the string input to reference tokens + void split(std::string reference_string) + { + // special case: empty reference string -> no reference tokens + if (reference_string.empty()) + { + return; + } + + // check if nonempty reference string begins with slash + if (reference_string[0] != '/') + { + throw std::domain_error("JSON pointer must be empty or begin with '/'"); + } + + // tokenize reference string + auto ptr = std::strtok(&reference_string[0], "/"); + while (ptr != nullptr) + { + reference_tokens.push_back(ptr); + ptr = std::strtok(NULL, "/"); + } + + // special case: reference string was just "/" + if (reference_tokens.empty()) + { + reference_tokens.push_back(""); + } + } + }; }; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index ebf83d831..164f49628 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8123,6 +8123,79 @@ class basic_json /// the lexer lexer m_lexer; }; + + public: + class json_pointer + { + public: + /// empty reference token + json_pointer() = default; + + /// nonempty reference token + json_pointer(const std::string& s) + { + split(s); + } + + /// return referenced value + reference get(reference j) + { + reference result = j; + + for (const auto& reference_token : reference_tokens) + { + switch (result.m_type) + { + case value_t::object: + result = result[reference_token]; + continue; + + case value_t::array: + result = result[std::stoi(reference_token)]; + continue; + + default: + throw std::domain_error("unresolved reference token '" + reference_token + "'"); + } + } + + return result; + } + + private: + /// the reference tokens + std::vector reference_tokens {}; + + /// split the string input to reference tokens + void split(std::string reference_string) + { + // special case: empty reference string -> no reference tokens + if (reference_string.empty()) + { + return; + } + + // check if nonempty reference string begins with slash + if (reference_string[0] != '/') + { + throw std::domain_error("JSON pointer must be empty or begin with '/'"); + } + + // tokenize reference string + auto ptr = std::strtok(&reference_string[0], "/"); + while (ptr != nullptr) + { + reference_tokens.push_back(ptr); + ptr = std::strtok(NULL, "/"); + } + + // special case: reference string was just "/" + if (reference_tokens.empty()) + { + reference_tokens.push_back(""); + } + } + }; }; diff --git a/test/unit.cpp b/test/unit.cpp index ab96364c8..6051ee3e5 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12052,6 +12052,35 @@ TEST_CASE("Unicode", "[hide]") } } +TEST_CASE("JSON pointers") +{ + SECTION("examples from RFC 6901") + { + json j = R"( + { + "foo": ["bar", "baz"], + "": 0, + "a/b": 1, + "c%d": 2, + "e^f": 3, + "g|h": 4, + "i\\j": 5, + "k\"l": 6, + " ": 7, + "m~n": 8 + } + )"_json; + + json::json_pointer jp0(""); + json::json_pointer jp1("/foo"); + //json::json_pointer jp2("/foo/0"); + + auto jp0_ = jp0.get(j); + auto jp1_ = jp1.get(j); + //auto jp2_ = jp2.get(j); + } +} + TEST_CASE("regression tests") { SECTION("issue #60 - Double quotation mark is not parsed correctly") From 2197f5f0a6ed9ff1894f1494ca05c1646d46267c Mon Sep 17 00:00:00 2001 From: Robert Marki Date: Wed, 13 Apr 2016 13:49:53 +0200 Subject: [PATCH 004/133] Make the indirection and dereference operators of iterator const fixes #233 --- src/json.hpp | 4 ++-- src/json.hpp.re2c | 4 ++-- test/unit.cpp | 11 +++++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 8f671fb01..6ed82738b 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -7000,13 +7000,13 @@ class basic_json } /// return a reference to the value pointed to by the iterator - reference operator*() + reference operator*() const { return const_cast(base_iterator::operator*()); } /// dereference the iterator - pointer operator->() + pointer operator->() const { return const_cast(base_iterator::operator->()); } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index ebf83d831..33e1a4eb8 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -7000,13 +7000,13 @@ class basic_json } /// return a reference to the value pointed to by the iterator - reference operator*() + reference operator*() const { return const_cast(base_iterator::operator*()); } /// dereference the iterator - pointer operator->() + pointer operator->() const { return const_cast(base_iterator::operator->()); } diff --git a/test/unit.cpp b/test/unit.cpp index ab96364c8..2fa63ea9b 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12407,5 +12407,16 @@ TEST_CASE("regression tests") CHECK(j3b.dump() == "1E04"); CHECK(j3c.dump() == "1e04"); } + + SECTION("issue #233 - Can't use basic_json::iterator as a base iterator for std::move_iterator") + { + json source = {"a", "b", "c"}; + json expected = {"a", "b"}; + json dest; + + std::copy_n(std::make_move_iterator(source.begin()), 2, std::back_inserter(dest)); + + CHECK(dest == expected); + } } From 2cb925c186e623f19b61fe0ce41bb772406df462 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 13 Apr 2016 17:41:19 +0200 Subject: [PATCH 005/133] adding support for escaped reference tokens --- src/json.hpp | 57 ++++++++++++++++++++++++++++++++++++++++++----- src/json.hpp.re2c | 57 ++++++++++++++++++++++++++++++++++++++++++----- test/unit.cpp | 53 +++++++++++++++++++++++++++++++++++++------ 3 files changed, 150 insertions(+), 17 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index c8b815048..f2c3813ac 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8861,18 +8861,18 @@ basic_json_parser_64: /// return referenced value reference get(reference j) { - reference result = j; + pointer result = &j; for (const auto& reference_token : reference_tokens) { - switch (result.m_type) + switch (result->m_type) { case value_t::object: - result = result[reference_token]; + result = &result->at(reference_token); continue; case value_t::array: - result = result[std::stoi(reference_token)]; + result = &result->at(static_cast(std::stoi(reference_token))); continue; default: @@ -8880,13 +8880,52 @@ basic_json_parser_64: } } - return result; + return *result; + } + + const_reference get(const_reference j) const + { + const_pointer result = &j; + + for (const auto& reference_token : reference_tokens) + { + switch (result->m_type) + { + case value_t::object: + result = &result->at(reference_token); + continue; + + case value_t::array: + result = &result->at(static_cast(std::stoi(reference_token))); + continue; + + default: + throw std::domain_error("unresolved reference token '" + reference_token + "'"); + } + } + + return *result; } private: /// the reference tokens std::vector reference_tokens {}; + /// replace all occurrences of a substring by another string + void replace_substring(std::string& s, + const std::string& f, + const std::string& t) + { + assert(not f.empty()); + + for ( + size_t pos = s.find(f); // find first occurrence of f + pos != std::string::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t + pos = s.find(f, pos + t.size()) // find next occurrence of f + ); + } + /// split the string input to reference tokens void split(std::string reference_string) { @@ -8915,6 +8954,14 @@ basic_json_parser_64: { reference_tokens.push_back(""); } + + for (auto& reference_token : reference_tokens) + { + // first transform any occurrence of the sequence '~1' to '/' + replace_substring(reference_token, "~1", "/"); + // then transform any occurrence of the sequence '~0' to '~' + replace_substring(reference_token, "~0", "~"); + } } }; }; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 164f49628..ea62dca57 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8140,18 +8140,18 @@ class basic_json /// return referenced value reference get(reference j) { - reference result = j; + pointer result = &j; for (const auto& reference_token : reference_tokens) { - switch (result.m_type) + switch (result->m_type) { case value_t::object: - result = result[reference_token]; + result = &result->at(reference_token); continue; case value_t::array: - result = result[std::stoi(reference_token)]; + result = &result->at(static_cast(std::stoi(reference_token))); continue; default: @@ -8159,13 +8159,52 @@ class basic_json } } - return result; + return *result; + } + + const_reference get(const_reference j) const + { + const_pointer result = &j; + + for (const auto& reference_token : reference_tokens) + { + switch (result->m_type) + { + case value_t::object: + result = &result->at(reference_token); + continue; + + case value_t::array: + result = &result->at(static_cast(std::stoi(reference_token))); + continue; + + default: + throw std::domain_error("unresolved reference token '" + reference_token + "'"); + } + } + + return *result; } private: /// the reference tokens std::vector reference_tokens {}; + /// replace all occurrences of a substring by another string + void replace_substring(std::string& s, + const std::string& f, + const std::string& t) + { + assert(not f.empty()); + + for ( + size_t pos = s.find(f); // find first occurrence of f + pos != std::string::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t + pos = s.find(f, pos + t.size()) // find next occurrence of f + ); + } + /// split the string input to reference tokens void split(std::string reference_string) { @@ -8194,6 +8233,14 @@ class basic_json { reference_tokens.push_back(""); } + + for (auto& reference_token : reference_tokens) + { + // first transform any occurrence of the sequence '~1' to '/' + replace_substring(reference_token, "~1", "/"); + // then transform any occurrence of the sequence '~0' to '~' + replace_substring(reference_token, "~0", "~"); + } } }; }; diff --git a/test/unit.cpp b/test/unit.cpp index 6051ee3e5..d6ec00a79 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12071,13 +12071,53 @@ TEST_CASE("JSON pointers") } )"_json; - json::json_pointer jp0(""); - json::json_pointer jp1("/foo"); - //json::json_pointer jp2("/foo/0"); + const json j_const = j; - auto jp0_ = jp0.get(j); - auto jp1_ = jp1.get(j); - //auto jp2_ = jp2.get(j); + SECTION("nonconst access") + { + // the whole document + CHECK(json::json_pointer().get(j) == j); + CHECK(json::json_pointer("").get(j) == j); + + // array access + CHECK(json::json_pointer("/foo").get(j) == j["foo"]); + CHECK(json::json_pointer("/foo/0").get(j) == j["foo"][0]); + CHECK(json::json_pointer("/foo/1").get(j) == j["foo"][1]); + + // empty string access + CHECK(json::json_pointer("/").get(j) == j[""]); + + // other cases + CHECK(json::json_pointer("/ ").get(j) == j[" "]); + CHECK(json::json_pointer("/c%d").get(j) == j["c%d"]); + CHECK(json::json_pointer("/e^f").get(j) == j["e^f"]); + CHECK(json::json_pointer("/g|h").get(j) == j["g|h"]); + CHECK(json::json_pointer("/i\\j").get(j) == j["i\\j"]); + CHECK(json::json_pointer("/k\"l").get(j) == j["k\"l"]); + + // escaped access + CHECK(json::json_pointer("/a~1b").get(j) == j["a/b"]); + CHECK(json::json_pointer("/m~0n").get(j) == j["m~n"]); + + // unescaped access + CHECK_THROWS_AS(json::json_pointer("/a/b").get(j), std::out_of_range); + CHECK_THROWS_WITH(json::json_pointer("/a/b").get(j), "key 'a' not found"); + // "/a/b" works for JSON {"a": {"b": 42}} + CHECK(json::json_pointer("/a/b").get({{"a", {{"b", 42}}}}) == json(42)); + } + + SECTION("const access") + { + CHECK(j_const == json::json_pointer().get(j_const)); + CHECK(j_const == json::json_pointer("").get(j_const)); + + CHECK(j_const["foo"] == json::json_pointer("/foo").get(j_const)); + CHECK(j_const["foo"][0] == json::json_pointer("/foo/0").get(j_const)); + CHECK(j_const["foo"][1] == json::json_pointer("/foo/1").get(j_const)); + + CHECK(j_const[""] == json::json_pointer("/").get(j_const)); + CHECK(j_const[" "] == json::json_pointer("/ ").get(j_const)); + } } } @@ -12437,4 +12477,3 @@ TEST_CASE("regression tests") CHECK(j3c.dump() == "1e04"); } } - From 94af8abdff77de3526aca2c2ccfd03517ee678e5 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 13 Apr 2016 23:23:54 +0200 Subject: [PATCH 006/133] overworked reference token parsing --- src/json.hpp | 84 ++++++++++++++++++++++++++++++++++++----------- src/json.hpp.re2c | 84 ++++++++++++++++++++++++++++++++++++----------- test/unit.cpp | 23 +++++++++++++ 3 files changed, 151 insertions(+), 40 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index f2c3813ac..84e10064f 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8911,10 +8911,21 @@ basic_json_parser_64: /// the reference tokens std::vector reference_tokens {}; - /// replace all occurrences of a substring by another string - void replace_substring(std::string& s, - const std::string& f, - const std::string& t) + /*! + @brief replace all occurrences of a substring by another string + + @param[in,out] s the string to manipulate + @param[in] f the substring to replace with @a t + @param[out] t the string to replace @a f + + @return The string @a s where all occurrences of @a f are replaced + with @a t. + + @pre The search string @f must not be empty. + */ + static void replace_substring(std::string& s, + const std::string& f, + const std::string& t) { assert(not f.empty()); @@ -8941,26 +8952,49 @@ basic_json_parser_64: throw std::domain_error("JSON pointer must be empty or begin with '/'"); } - // tokenize reference string - auto ptr = std::strtok(&reference_string[0], "/"); - while (ptr != nullptr) + // extract the reference tokens: + // - slash: position of the last read slash (or end of string) + // - start: position after the previous slash + for ( + // search for the first slash after the first character + size_t slash = reference_string.find_first_of("/", 1), + // set the beginning of the first reference token + start = 1; + // we can stop if start == string::npos+1 = 0 + start != 0; + // set the beginning of the next reference token + // (could be 0 if slash == std::string::npos) + start = slash + 1, + // find next slash + slash = reference_string.find_first_of("/", start)) { - reference_tokens.push_back(ptr); - ptr = std::strtok(NULL, "/"); - } + // use the text between the beginning of the reference token + // (start) and the last slash (slash). + auto reference_token = reference_string.substr(start, slash - start); - // special case: reference string was just "/" - if (reference_tokens.empty()) - { - reference_tokens.push_back(""); - } + // check reference tokens are properly escaped + for (size_t pos = reference_token.find_first_of("~"); + pos != std::string::npos; + pos = reference_token.find_first_of("~", pos + 1)) + { + assert(reference_token[pos] == '~'); + + // ~ must be followed by 0 or 1 + if (pos == reference_token.size() - 1 or + (reference_token[pos + 1] != '0' and + reference_token[pos + 1] != '1')) + { + throw std::domain_error("escape error: '~' must be followed with '0' or '1'"); + } + } - for (auto& reference_token : reference_tokens) - { // first transform any occurrence of the sequence '~1' to '/' replace_substring(reference_token, "~1", "/"); // then transform any occurrence of the sequence '~0' to '~' replace_substring(reference_token, "~0", "~"); + + // store the reference token + reference_tokens.push_back(reference_token); } } }; @@ -9026,9 +9060,9 @@ struct hash /*! @brief user-defined string literal for JSON values -This operator implements a user-defined string literal for JSON objects. It can -be used by adding \p "_json" to a string literal and returns a JSON object if -no parse error occurred. +This operator implements a user-defined string literal for JSON objects. It +can be used by adding \p "_json" to a string literal and returns a JSON object +if no parse error occurred. @param[in] s a string representation of a JSON object @return a JSON object @@ -9040,6 +9074,16 @@ inline nlohmann::json operator "" _json(const char* s, std::size_t) return nlohmann::json::parse(reinterpret_cast(s)); } +/*! +@brief user-defined string literal for JSON pointer + +@since version 2.0.0 +*/ +inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t) +{ + return nlohmann::json::json_pointer(s); +} + // restore GCC/clang diagnostic settings #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) #pragma GCC diagnostic pop diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index ea62dca57..5501b35c1 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8190,10 +8190,21 @@ class basic_json /// the reference tokens std::vector reference_tokens {}; - /// replace all occurrences of a substring by another string - void replace_substring(std::string& s, - const std::string& f, - const std::string& t) + /*! + @brief replace all occurrences of a substring by another string + + @param[in,out] s the string to manipulate + @param[in] f the substring to replace with @a t + @param[out] t the string to replace @a f + + @return The string @a s where all occurrences of @a f are replaced + with @a t. + + @pre The search string @f must not be empty. + */ + static void replace_substring(std::string& s, + const std::string& f, + const std::string& t) { assert(not f.empty()); @@ -8220,26 +8231,49 @@ class basic_json throw std::domain_error("JSON pointer must be empty or begin with '/'"); } - // tokenize reference string - auto ptr = std::strtok(&reference_string[0], "/"); - while (ptr != nullptr) + // extract the reference tokens: + // - slash: position of the last read slash (or end of string) + // - start: position after the previous slash + for ( + // search for the first slash after the first character + size_t slash = reference_string.find_first_of("/", 1), + // set the beginning of the first reference token + start = 1; + // we can stop if start == string::npos+1 = 0 + start != 0; + // set the beginning of the next reference token + // (could be 0 if slash == std::string::npos) + start = slash + 1, + // find next slash + slash = reference_string.find_first_of("/", start)) { - reference_tokens.push_back(ptr); - ptr = std::strtok(NULL, "/"); - } + // use the text between the beginning of the reference token + // (start) and the last slash (slash). + auto reference_token = reference_string.substr(start, slash - start); - // special case: reference string was just "/" - if (reference_tokens.empty()) - { - reference_tokens.push_back(""); - } + // check reference tokens are properly escaped + for (size_t pos = reference_token.find_first_of("~"); + pos != std::string::npos; + pos = reference_token.find_first_of("~", pos + 1)) + { + assert(reference_token[pos] == '~'); + + // ~ must be followed by 0 or 1 + if (pos == reference_token.size() - 1 or + (reference_token[pos + 1] != '0' and + reference_token[pos + 1] != '1')) + { + throw std::domain_error("escape error: '~' must be followed with '0' or '1'"); + } + } - for (auto& reference_token : reference_tokens) - { // first transform any occurrence of the sequence '~1' to '/' replace_substring(reference_token, "~1", "/"); // then transform any occurrence of the sequence '~0' to '~' replace_substring(reference_token, "~0", "~"); + + // store the reference token + reference_tokens.push_back(reference_token); } } }; @@ -8305,9 +8339,9 @@ struct hash /*! @brief user-defined string literal for JSON values -This operator implements a user-defined string literal for JSON objects. It can -be used by adding \p "_json" to a string literal and returns a JSON object if -no parse error occurred. +This operator implements a user-defined string literal for JSON objects. It +can be used by adding \p "_json" to a string literal and returns a JSON object +if no parse error occurred. @param[in] s a string representation of a JSON object @return a JSON object @@ -8319,6 +8353,16 @@ inline nlohmann::json operator "" _json(const char* s, std::size_t) return nlohmann::json::parse(reinterpret_cast(s)); } +/*! +@brief user-defined string literal for JSON pointer + +@since version 2.0.0 +*/ +inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t) +{ + return nlohmann::json::json_pointer(s); +} + // restore GCC/clang diagnostic settings #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) #pragma GCC diagnostic pop diff --git a/test/unit.cpp b/test/unit.cpp index d6ec00a79..7c8fd8b77 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12118,6 +12118,29 @@ TEST_CASE("JSON pointers") CHECK(j_const[""] == json::json_pointer("/").get(j_const)); CHECK(j_const[" "] == json::json_pointer("/ ").get(j_const)); } + + SECTION("user-defined string literal") + { + // the whole document + CHECK(""_json_pointer.get(j) == j); + + // array access + CHECK("/foo"_json_pointer.get(j) == j["foo"]); + CHECK("/foo/0"_json_pointer.get(j) == j["foo"][0]); + CHECK("/foo/1"_json_pointer.get(j) == j["foo"][1]); + } + + SECTION("errors") + { + CHECK_THROWS_AS(json::json_pointer("foo"), std::domain_error); + CHECK_THROWS_WITH(json::json_pointer("foo"), "JSON pointer must be empty or begin with '/'"); + + CHECK_THROWS_AS(json::json_pointer("/~~"), std::domain_error); + CHECK_THROWS_WITH(json::json_pointer("/~~"), "escape error: '~' must be followed with '0' or '1'"); + + CHECK_THROWS_AS(json::json_pointer("/~"), std::domain_error); + CHECK_THROWS_WITH(json::json_pointer("/~"), "escape error: '~' must be followed with '0' or '1'"); + } } } From 76a5a776eb45a5e2471ef1074bcea1a660895b1d Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 16 Apr 2016 12:19:10 +0200 Subject: [PATCH 007/133] cleanup after #234 --- Makefile | 4 +- README.md | 3 +- src/json.hpp | 817 ++++++++++++++++++++++++-------------------------- test/unit.cpp | 2 +- 4 files changed, 398 insertions(+), 428 deletions(-) diff --git a/Makefile b/Makefile index 91d4fc586..d0a80379c 100644 --- a/Makefile +++ b/Makefile @@ -66,7 +66,7 @@ cppcheck: # create scanner with re2c re2c: src/json.hpp.re2c - $(RE2C) -b -s -i --no-generation-date $< | $(SED) '1d' > src/json.hpp + $(RE2C) --bit-vectors --nested-ifs --no-debug-info $< | $(SED) '1d' > src/json.hpp # pretty printer pretty: @@ -74,7 +74,7 @@ pretty: --indent-switches --indent-preproc-block --indent-preproc-define \ --indent-col1-comments --pad-oper --pad-header --align-pointer=type \ --align-reference=type --add-brackets --convert-tabs --close-templates \ - --lineend=linux --preserve-date --suffix=none \ + --lineend=linux --preserve-date --suffix=none --formatted \ src/json.hpp src/json.hpp.re2c test/unit.cpp test/fuzz.cpp benchmarks/benchmarks.cpp doc/examples/*.cpp diff --git a/README.md b/README.md index 8c100333a..d39663ee3 100644 --- a/README.md +++ b/README.md @@ -410,6 +410,7 @@ I deeply appreciate the help of the following people. - [Lv Zheng](https://github.com/lv-zheng) fixed a namespace issue with `int64_t` and `uint64_t`. - [abc100m](https://github.com/abc100m) analyzed the issues with GCC 4.8 and proposed a [partial solution](https://github.com/nlohmann/json/pull/212). - [zewt](https://github.com/zewt) added useful notes to the README file about Android. +- [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators. Thanks a lot for helping out! @@ -427,7 +428,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (3344278 assertions in 29 test cases) +All tests passed (3344299 assertions in 29 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/src/json.hpp b/src/json.hpp index 6ed82738b..0fdaa281d 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -7416,322 +7416,323 @@ class basic_json { 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 0, 0, 32, 0, 0, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 96, 64, 0, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 160, 128, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 0, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, + 192, 192, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 0, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, }; if ((m_limit - m_cursor) < 5) { yyfill(); // LCOV_EXCL_LINE; } yych = *m_cursor; - if (yych <= ':') + if (yybm[0 + yych] & 32) { - if (yych <= ' ') + goto basic_json_parser_6; + } + if (yych <= '\\') + { + if (yych <= '-') { - if (yych <= '\n') + if (yych <= '"') { if (yych <= 0x00) { - goto basic_json_parser_28; + goto basic_json_parser_2; } - if (yych <= 0x08) - { - goto basic_json_parser_30; - } - if (yych >= '\n') + if (yych <= '!') { goto basic_json_parser_4; } + goto basic_json_parser_9; } else { - if (yych == '\r') + if (yych <= '+') { - goto basic_json_parser_2; + goto basic_json_parser_4; } - if (yych <= 0x1F) + if (yych <= ',') { - goto basic_json_parser_30; + goto basic_json_parser_10; } + goto basic_json_parser_12; } } else { - if (yych <= ',') - { - if (yych == '"') - { - goto basic_json_parser_27; - } - if (yych <= '+') - { - goto basic_json_parser_30; - } - goto basic_json_parser_16; - } - else + if (yych <= '9') { if (yych <= '/') { - if (yych <= '-') - { - goto basic_json_parser_23; - } - goto basic_json_parser_30; + goto basic_json_parser_4; } - else + if (yych <= '0') { - if (yych <= '0') - { - goto basic_json_parser_24; - } - if (yych <= '9') - { - goto basic_json_parser_26; - } - goto basic_json_parser_18; + goto basic_json_parser_13; } + goto basic_json_parser_15; + } + else + { + if (yych <= ':') + { + goto basic_json_parser_17; + } + if (yych == '[') + { + goto basic_json_parser_19; + } + goto basic_json_parser_4; } } } else { - if (yych <= 'n') + if (yych <= 't') { - if (yych <= ']') + if (yych <= 'f') { - if (yych == '[') + if (yych <= ']') { - goto basic_json_parser_8; + goto basic_json_parser_21; } - if (yych <= '\\') + if (yych <= 'e') { - goto basic_json_parser_30; + goto basic_json_parser_4; } - goto basic_json_parser_10; + goto basic_json_parser_23; } else { - if (yych == 'f') + if (yych == 'n') { - goto basic_json_parser_22; + goto basic_json_parser_24; } - if (yych <= 'm') + if (yych <= 's') { - goto basic_json_parser_30; + goto basic_json_parser_4; } - goto basic_json_parser_20; + goto basic_json_parser_25; } } else { - if (yych <= '{') + if (yych <= '|') { - if (yych == 't') + if (yych == '{') { - goto basic_json_parser_21; + goto basic_json_parser_26; } - if (yych <= 'z') - { - goto basic_json_parser_30; - } - goto basic_json_parser_12; + goto basic_json_parser_4; } else { if (yych <= '}') { - if (yych <= '|') - { - goto basic_json_parser_30; - } - goto basic_json_parser_14; + goto basic_json_parser_28; } - else + if (yych == 0xEF) { - if (yych == 0xEF) - { - goto basic_json_parser_6; - } goto basic_json_parser_30; } + goto basic_json_parser_4; } } } basic_json_parser_2: ++m_cursor; - yych = *m_cursor; - goto basic_json_parser_5; -basic_json_parser_3: { - return scan(); + return token_type::end_of_input; } basic_json_parser_4: ++m_cursor; +basic_json_parser_5: + { + return token_type::parse_error; + } +basic_json_parser_6: + ++m_cursor; if (m_limit <= m_cursor) { yyfill(); // LCOV_EXCL_LINE; } yych = *m_cursor; -basic_json_parser_5: if (yybm[0 + yych] & 32) { - goto basic_json_parser_4; + goto basic_json_parser_6; } - goto basic_json_parser_3; -basic_json_parser_6: + { + return scan(); + } +basic_json_parser_9: yyaccept = 0; yych = *(m_marker = ++m_cursor); - if (yych == 0xBB) + if (yych <= 0x0F) { - goto basic_json_parser_64; - } -basic_json_parser_7: - { - return token_type::parse_error; - } -basic_json_parser_8: - ++m_cursor; - { - return token_type::begin_array; + goto basic_json_parser_5; } + goto basic_json_parser_32; basic_json_parser_10: - ++m_cursor; - { - return token_type::end_array; - } -basic_json_parser_12: - ++m_cursor; - { - return token_type::begin_object; - } -basic_json_parser_14: - ++m_cursor; - { - return token_type::end_object; - } -basic_json_parser_16: ++m_cursor; { return token_type::value_separator; } -basic_json_parser_18: - ++m_cursor; - { - return token_type::name_separator; - } -basic_json_parser_20: - yyaccept = 0; - yych = *(m_marker = ++m_cursor); - if (yych == 'u') - { - goto basic_json_parser_60; - } - goto basic_json_parser_7; -basic_json_parser_21: - yyaccept = 0; - yych = *(m_marker = ++m_cursor); - if (yych == 'r') - { - goto basic_json_parser_56; - } - goto basic_json_parser_7; -basic_json_parser_22: - yyaccept = 0; - yych = *(m_marker = ++m_cursor); - if (yych == 'a') - { - goto basic_json_parser_51; - } - goto basic_json_parser_7; -basic_json_parser_23: +basic_json_parser_12: yych = *++m_cursor; if (yych <= '/') { - goto basic_json_parser_7; + goto basic_json_parser_5; } if (yych <= '0') { - goto basic_json_parser_50; + goto basic_json_parser_13; } if (yych <= '9') { - goto basic_json_parser_41; + goto basic_json_parser_15; } - goto basic_json_parser_7; -basic_json_parser_24: + goto basic_json_parser_5; +basic_json_parser_13: yyaccept = 1; yych = *(m_marker = ++m_cursor); if (yych <= 'D') { if (yych == '.') { - goto basic_json_parser_43; + goto basic_json_parser_37; } } else { if (yych <= 'E') { - goto basic_json_parser_44; + goto basic_json_parser_38; } if (yych == 'e') { - goto basic_json_parser_44; + goto basic_json_parser_38; } } -basic_json_parser_25: +basic_json_parser_14: { return token_type::value_number; } -basic_json_parser_26: +basic_json_parser_15: yyaccept = 1; - yych = *(m_marker = ++m_cursor); - goto basic_json_parser_42; -basic_json_parser_27: + m_marker = ++m_cursor; + if ((m_limit - m_cursor) < 3) + { + yyfill(); // LCOV_EXCL_LINE; + } + yych = *m_cursor; + if (yybm[0 + yych] & 64) + { + goto basic_json_parser_15; + } + if (yych <= 'D') + { + if (yych == '.') + { + goto basic_json_parser_37; + } + goto basic_json_parser_14; + } + else + { + if (yych <= 'E') + { + goto basic_json_parser_38; + } + if (yych == 'e') + { + goto basic_json_parser_38; + } + goto basic_json_parser_14; + } +basic_json_parser_17: + ++m_cursor; + { + return token_type::name_separator; + } +basic_json_parser_19: + ++m_cursor; + { + return token_type::begin_array; + } +basic_json_parser_21: + ++m_cursor; + { + return token_type::end_array; + } +basic_json_parser_23: yyaccept = 0; yych = *(m_marker = ++m_cursor); - if (yych <= 0x0F) + if (yych == 'a') { - goto basic_json_parser_7; + goto basic_json_parser_39; + } + goto basic_json_parser_5; +basic_json_parser_24: + yyaccept = 0; + yych = *(m_marker = ++m_cursor); + if (yych == 'u') + { + goto basic_json_parser_40; + } + goto basic_json_parser_5; +basic_json_parser_25: + yyaccept = 0; + yych = *(m_marker = ++m_cursor); + if (yych == 'r') + { + goto basic_json_parser_41; + } + goto basic_json_parser_5; +basic_json_parser_26: + ++m_cursor; + { + return token_type::begin_object; } - goto basic_json_parser_32; basic_json_parser_28: ++m_cursor; { - return token_type::end_of_input; + return token_type::end_object; } basic_json_parser_30: - yych = *++m_cursor; - goto basic_json_parser_7; + yyaccept = 0; + yych = *(m_marker = ++m_cursor); + if (yych == 0xBB) + { + goto basic_json_parser_42; + } + goto basic_json_parser_5; basic_json_parser_31: ++m_cursor; if (m_limit <= m_cursor) @@ -7740,7 +7741,7 @@ basic_json_parser_31: } yych = *m_cursor; basic_json_parser_32: - if (yybm[0 + yych] & 64) + if (yybm[0 + yych] & 128) { goto basic_json_parser_31; } @@ -7750,20 +7751,25 @@ basic_json_parser_32: } if (yych <= '"') { - goto basic_json_parser_35; + goto basic_json_parser_34; } - goto basic_json_parser_34; + goto basic_json_parser_36; basic_json_parser_33: m_cursor = m_marker; if (yyaccept == 0) { - goto basic_json_parser_7; + goto basic_json_parser_5; } else { - goto basic_json_parser_25; + goto basic_json_parser_14; } basic_json_parser_34: + ++m_cursor; + { + return token_type::value_string; + } +basic_json_parser_36: ++m_cursor; if (m_limit <= m_cursor) { @@ -7836,18 +7842,78 @@ basic_json_parser_34: } if (yych <= 'u') { - goto basic_json_parser_37; + goto basic_json_parser_43; } goto basic_json_parser_33; } } } -basic_json_parser_35: - ++m_cursor; - { - return token_type::value_string; - } basic_json_parser_37: + yych = *++m_cursor; + if (yych <= '/') + { + goto basic_json_parser_33; + } + if (yych <= '9') + { + goto basic_json_parser_44; + } + goto basic_json_parser_33; +basic_json_parser_38: + yych = *++m_cursor; + if (yych <= ',') + { + if (yych == '+') + { + goto basic_json_parser_46; + } + goto basic_json_parser_33; + } + else + { + if (yych <= '-') + { + goto basic_json_parser_46; + } + if (yych <= '/') + { + goto basic_json_parser_33; + } + if (yych <= '9') + { + goto basic_json_parser_47; + } + goto basic_json_parser_33; + } +basic_json_parser_39: + yych = *++m_cursor; + if (yych == 'l') + { + goto basic_json_parser_49; + } + goto basic_json_parser_33; +basic_json_parser_40: + yych = *++m_cursor; + if (yych == 'l') + { + goto basic_json_parser_50; + } + goto basic_json_parser_33; +basic_json_parser_41: + yych = *++m_cursor; + if (yych == 'u') + { + goto basic_json_parser_51; + } + goto basic_json_parser_33; +basic_json_parser_42: + yych = *++m_cursor; + if (yych == 0xBF) + { + goto basic_json_parser_52; + } + goto basic_json_parser_33; +basic_json_parser_43: ++m_cursor; if (m_limit <= m_cursor) { @@ -7860,27 +7926,113 @@ basic_json_parser_37: { goto basic_json_parser_33; } - if (yych >= ':') + if (yych <= '9') { - goto basic_json_parser_33; + goto basic_json_parser_54; } + goto basic_json_parser_33; } else { if (yych <= 'F') + { + goto basic_json_parser_54; + } + if (yych <= '`') + { + goto basic_json_parser_33; + } + if (yych <= 'f') + { + goto basic_json_parser_54; + } + goto basic_json_parser_33; + } +basic_json_parser_44: + yyaccept = 1; + m_marker = ++m_cursor; + if ((m_limit - m_cursor) < 3) + { + yyfill(); // LCOV_EXCL_LINE; + } + yych = *m_cursor; + if (yych <= 'D') + { + if (yych <= '/') + { + goto basic_json_parser_14; + } + if (yych <= '9') + { + goto basic_json_parser_44; + } + goto basic_json_parser_14; + } + else + { + if (yych <= 'E') { goto basic_json_parser_38; } - if (yych <= '`') + if (yych == 'e') { - goto basic_json_parser_33; - } - if (yych >= 'g') - { - goto basic_json_parser_33; + goto basic_json_parser_38; } + goto basic_json_parser_14; } -basic_json_parser_38: +basic_json_parser_46: + yych = *++m_cursor; + if (yych <= '/') + { + goto basic_json_parser_33; + } + if (yych >= ':') + { + goto basic_json_parser_33; + } +basic_json_parser_47: + ++m_cursor; + if (m_limit <= m_cursor) + { + yyfill(); // LCOV_EXCL_LINE; + } + yych = *m_cursor; + if (yych <= '/') + { + goto basic_json_parser_14; + } + if (yych <= '9') + { + goto basic_json_parser_47; + } + goto basic_json_parser_14; +basic_json_parser_49: + yych = *++m_cursor; + if (yych == 's') + { + goto basic_json_parser_55; + } + goto basic_json_parser_33; +basic_json_parser_50: + yych = *++m_cursor; + if (yych == 'l') + { + goto basic_json_parser_56; + } + goto basic_json_parser_33; +basic_json_parser_51: + yych = *++m_cursor; + if (yych == 'e') + { + goto basic_json_parser_58; + } + goto basic_json_parser_33; +basic_json_parser_52: + ++m_cursor; + { + return scan(); + } +basic_json_parser_54: ++m_cursor; if (m_limit <= m_cursor) { @@ -7893,27 +8045,46 @@ basic_json_parser_38: { goto basic_json_parser_33; } - if (yych >= ':') + if (yych <= '9') { - goto basic_json_parser_33; + goto basic_json_parser_60; } + goto basic_json_parser_33; } else { if (yych <= 'F') { - goto basic_json_parser_39; + goto basic_json_parser_60; } if (yych <= '`') { goto basic_json_parser_33; } - if (yych >= 'g') + if (yych <= 'f') { - goto basic_json_parser_33; + goto basic_json_parser_60; } + goto basic_json_parser_33; } -basic_json_parser_39: +basic_json_parser_55: + yych = *++m_cursor; + if (yych == 'e') + { + goto basic_json_parser_61; + } + goto basic_json_parser_33; +basic_json_parser_56: + ++m_cursor; + { + return token_type::literal_null; + } +basic_json_parser_58: + ++m_cursor; + { + return token_type::literal_true; + } +basic_json_parser_60: ++m_cursor; if (m_limit <= m_cursor) { @@ -7926,27 +8097,34 @@ basic_json_parser_39: { goto basic_json_parser_33; } - if (yych >= ':') + if (yych <= '9') { - goto basic_json_parser_33; + goto basic_json_parser_63; } + goto basic_json_parser_33; } else { if (yych <= 'F') { - goto basic_json_parser_40; + goto basic_json_parser_63; } if (yych <= '`') { goto basic_json_parser_33; } - if (yych >= 'g') + if (yych <= 'f') { - goto basic_json_parser_33; + goto basic_json_parser_63; } + goto basic_json_parser_33; } -basic_json_parser_40: +basic_json_parser_61: + ++m_cursor; + { + return token_type::literal_false; + } +basic_json_parser_63: ++m_cursor; if (m_limit <= m_cursor) { @@ -7981,215 +8159,6 @@ basic_json_parser_40: } goto basic_json_parser_33; } -basic_json_parser_41: - yyaccept = 1; - m_marker = ++m_cursor; - if ((m_limit - m_cursor) < 3) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; -basic_json_parser_42: - if (yybm[0 + yych] & 128) - { - goto basic_json_parser_41; - } - if (yych <= 'D') - { - if (yych != '.') - { - goto basic_json_parser_25; - } - } - else - { - if (yych <= 'E') - { - goto basic_json_parser_44; - } - if (yych == 'e') - { - goto basic_json_parser_44; - } - goto basic_json_parser_25; - } -basic_json_parser_43: - yych = *++m_cursor; - if (yych <= '/') - { - goto basic_json_parser_33; - } - if (yych <= '9') - { - goto basic_json_parser_48; - } - goto basic_json_parser_33; -basic_json_parser_44: - yych = *++m_cursor; - if (yych <= ',') - { - if (yych != '+') - { - goto basic_json_parser_33; - } - } - else - { - if (yych <= '-') - { - goto basic_json_parser_45; - } - if (yych <= '/') - { - goto basic_json_parser_33; - } - if (yych <= '9') - { - goto basic_json_parser_46; - } - goto basic_json_parser_33; - } -basic_json_parser_45: - yych = *++m_cursor; - if (yych <= '/') - { - goto basic_json_parser_33; - } - if (yych >= ':') - { - goto basic_json_parser_33; - } -basic_json_parser_46: - ++m_cursor; - if (m_limit <= m_cursor) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; - if (yych <= '/') - { - goto basic_json_parser_25; - } - if (yych <= '9') - { - goto basic_json_parser_46; - } - goto basic_json_parser_25; -basic_json_parser_48: - yyaccept = 1; - m_marker = ++m_cursor; - if ((m_limit - m_cursor) < 3) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; - if (yych <= 'D') - { - if (yych <= '/') - { - goto basic_json_parser_25; - } - if (yych <= '9') - { - goto basic_json_parser_48; - } - goto basic_json_parser_25; - } - else - { - if (yych <= 'E') - { - goto basic_json_parser_44; - } - if (yych == 'e') - { - goto basic_json_parser_44; - } - goto basic_json_parser_25; - } -basic_json_parser_50: - yyaccept = 1; - yych = *(m_marker = ++m_cursor); - if (yych <= 'D') - { - if (yych == '.') - { - goto basic_json_parser_43; - } - goto basic_json_parser_25; - } - else - { - if (yych <= 'E') - { - goto basic_json_parser_44; - } - if (yych == 'e') - { - goto basic_json_parser_44; - } - goto basic_json_parser_25; - } -basic_json_parser_51: - yych = *++m_cursor; - if (yych != 'l') - { - goto basic_json_parser_33; - } - yych = *++m_cursor; - if (yych != 's') - { - goto basic_json_parser_33; - } - yych = *++m_cursor; - if (yych != 'e') - { - goto basic_json_parser_33; - } - ++m_cursor; - { - return token_type::literal_false; - } -basic_json_parser_56: - yych = *++m_cursor; - if (yych != 'u') - { - goto basic_json_parser_33; - } - yych = *++m_cursor; - if (yych != 'e') - { - goto basic_json_parser_33; - } - ++m_cursor; - { - return token_type::literal_true; - } -basic_json_parser_60: - yych = *++m_cursor; - if (yych != 'l') - { - goto basic_json_parser_33; - } - yych = *++m_cursor; - if (yych != 'l') - { - goto basic_json_parser_33; - } - ++m_cursor; - { - return token_type::literal_null; - } -basic_json_parser_64: - yych = *++m_cursor; - if (yych != 0xBF) - { - goto basic_json_parser_33; - } - ++m_cursor; - { - return scan(); - } } } diff --git a/test/unit.cpp b/test/unit.cpp index 2fa63ea9b..f6b670d86 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12410,7 +12410,7 @@ TEST_CASE("regression tests") SECTION("issue #233 - Can't use basic_json::iterator as a base iterator for std::move_iterator") { - json source = {"a", "b", "c"}; + json source = {"a", "b", "c"}; json expected = {"a", "b"}; json dest; From 3401954f5b3b163c7b152a314f8e78b534eb54e1 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 16 Apr 2016 14:02:14 +0200 Subject: [PATCH 008/133] cleaned up API --- src/json.hpp | 45 ++++++++++++++++++++++++++++++++++++--------- src/json.hpp.re2c | 45 ++++++++++++++++++++++++++++++++++++--------- test/unit.cpp | 40 +++++++++++++++++++++++++++++++++------- 3 files changed, 105 insertions(+), 25 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 347508842..2d3831362 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -198,6 +198,9 @@ class basic_json AllocatorType>; public: + // forward declarations + template class json_reverse_iterator; + class json_pointer; ///////////////////// // container types // @@ -227,9 +230,6 @@ class basic_json /// the type of an element const pointer using const_pointer = typename std::allocator_traits::const_pointer; - // forward declaration - template class json_reverse_iterator; - /// an iterator for a basic_json container class iterator; /// a const iterator for a basic_json container @@ -3595,6 +3595,28 @@ class basic_json } } + /*! + @brief access specified element via JSON Pointer + + Returns a reference to the element at with specified JSON pointer @a ptr. + + @param p JSON pointer to the desired element + + @since version 2.0.0 + */ + reference operator[](const json_pointer& ptr) + { + return ptr.get(*this); + } + + /*! + @copydoc basic_json::operator[](const json_pointer&) + */ + const_reference operator[](const json_pointer& ptr) const + { + return ptr.get(*this); + } + /*! @brief access specified object element with default value @@ -8815,6 +8837,11 @@ basic_json_parser_63: }; public: + /*! + @brief JSON Pointer + + @sa [RFC 6901](https://tools.ietf.org/html/rfc6901) + */ class json_pointer { public: @@ -8822,13 +8849,14 @@ basic_json_parser_63: json_pointer() = default; /// nonempty reference token - json_pointer(const std::string& s) + explicit json_pointer(const std::string& s) { split(s); } + private: /// return referenced value - reference get(reference j) + reference get(reference j) const { pointer result = &j; @@ -8876,7 +8904,6 @@ basic_json_parser_63: return *result; } - private: /// the reference tokens std::vector reference_tokens {}; @@ -8890,7 +8917,7 @@ basic_json_parser_63: @return The string @a s where all occurrences of @a f are replaced with @a t. - @pre The search string @f must not be empty. + @pre The search string @a f must not be empty. */ static void replace_substring(std::string& s, const std::string& f, @@ -8932,7 +8959,7 @@ basic_json_parser_63: // we can stop if start == string::npos+1 = 0 start != 0; // set the beginning of the next reference token - // (could be 0 if slash == std::string::npos) + // (will eventually be 0 if slash == std::string::npos) start = slash + 1, // find next slash slash = reference_string.find_first_of("/", start)) @@ -8962,7 +8989,7 @@ basic_json_parser_63: // then transform any occurrence of the sequence '~0' to '~' replace_substring(reference_token, "~0", "~"); - // store the reference token + // finally, store the reference token reference_tokens.push_back(reference_token); } } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 8364d03bc..dd4eeb838 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -198,6 +198,9 @@ class basic_json AllocatorType>; public: + // forward declarations + template class json_reverse_iterator; + class json_pointer; ///////////////////// // container types // @@ -227,9 +230,6 @@ class basic_json /// the type of an element const pointer using const_pointer = typename std::allocator_traits::const_pointer; - // forward declaration - template class json_reverse_iterator; - /// an iterator for a basic_json container class iterator; /// a const iterator for a basic_json container @@ -3595,6 +3595,28 @@ class basic_json } } + /*! + @brief access specified element via JSON Pointer + + Returns a reference to the element at with specified JSON pointer @a ptr. + + @param p JSON pointer to the desired element + + @since version 2.0.0 + */ + reference operator[](const json_pointer& ptr) + { + return ptr.get(*this); + } + + /*! + @copydoc basic_json::operator[](const json_pointer&) + */ + const_reference operator[](const json_pointer& ptr) const + { + return ptr.get(*this); + } + /*! @brief access specified object element with default value @@ -8125,6 +8147,11 @@ class basic_json }; public: + /*! + @brief JSON Pointer + + @sa [RFC 6901](https://tools.ietf.org/html/rfc6901) + */ class json_pointer { public: @@ -8132,13 +8159,14 @@ class basic_json json_pointer() = default; /// nonempty reference token - json_pointer(const std::string& s) + explicit json_pointer(const std::string& s) { split(s); } + private: /// return referenced value - reference get(reference j) + reference get(reference j) const { pointer result = &j; @@ -8186,7 +8214,6 @@ class basic_json return *result; } - private: /// the reference tokens std::vector reference_tokens {}; @@ -8200,7 +8227,7 @@ class basic_json @return The string @a s where all occurrences of @a f are replaced with @a t. - @pre The search string @f must not be empty. + @pre The search string @a f must not be empty. */ static void replace_substring(std::string& s, const std::string& f, @@ -8242,7 +8269,7 @@ class basic_json // we can stop if start == string::npos+1 = 0 start != 0; // set the beginning of the next reference token - // (could be 0 if slash == std::string::npos) + // (will eventually be 0 if slash == std::string::npos) start = slash + 1, // find next slash slash = reference_string.find_first_of("/", start)) @@ -8272,7 +8299,7 @@ class basic_json // then transform any occurrence of the sequence '~0' to '~' replace_substring(reference_token, "~0", "~"); - // store the reference token + // finally, store the reference token reference_tokens.push_back(reference_token); } } diff --git a/test/unit.cpp b/test/unit.cpp index 628c27553..223de2c24 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12078,11 +12078,17 @@ TEST_CASE("JSON pointers") // the whole document CHECK(json::json_pointer().get(j) == j); CHECK(json::json_pointer("").get(j) == j); + CHECK(j[json::json_pointer()] == j); + CHECK(j[json::json_pointer("")] == j); // array access CHECK(json::json_pointer("/foo").get(j) == j["foo"]); CHECK(json::json_pointer("/foo/0").get(j) == j["foo"][0]); CHECK(json::json_pointer("/foo/1").get(j) == j["foo"][1]); + CHECK(j[json::json_pointer("/foo")] == j["foo"]); + CHECK(j[json::json_pointer("/foo/0")] == j["foo"][0]); + CHECK(j[json::json_pointer("/foo/1")] == j["foo"][1]); + CHECK(j["/foo/1"_json_pointer] == j["foo"][1]); // empty string access CHECK(json::json_pointer("/").get(j) == j[""]); @@ -12108,15 +12114,35 @@ TEST_CASE("JSON pointers") SECTION("const access") { - CHECK(j_const == json::json_pointer().get(j_const)); - CHECK(j_const == json::json_pointer("").get(j_const)); + // the whole document + CHECK(json::json_pointer().get(j_const) == j_const); + CHECK(json::json_pointer("").get(j_const) == j_const); - CHECK(j_const["foo"] == json::json_pointer("/foo").get(j_const)); - CHECK(j_const["foo"][0] == json::json_pointer("/foo/0").get(j_const)); - CHECK(j_const["foo"][1] == json::json_pointer("/foo/1").get(j_const)); + // array access + CHECK(json::json_pointer("/foo").get(j_const) == j_const["foo"]); + CHECK(json::json_pointer("/foo/0").get(j_const) == j_const["foo"][0]); + CHECK(json::json_pointer("/foo/1").get(j_const) == j_const["foo"][1]); - CHECK(j_const[""] == json::json_pointer("/").get(j_const)); - CHECK(j_const[" "] == json::json_pointer("/ ").get(j_const)); + // empty string access + CHECK(json::json_pointer("/").get(j_const) == j_const[""]); + + // other cases + CHECK(json::json_pointer("/ ").get(j_const) == j_const[" "]); + CHECK(json::json_pointer("/c%d").get(j_const) == j_const["c%d"]); + CHECK(json::json_pointer("/e^f").get(j_const) == j_const["e^f"]); + CHECK(json::json_pointer("/g|h").get(j_const) == j_const["g|h"]); + CHECK(json::json_pointer("/i\\j").get(j_const) == j_const["i\\j"]); + CHECK(json::json_pointer("/k\"l").get(j_const) == j_const["k\"l"]); + + // escaped access + CHECK(json::json_pointer("/a~1b").get(j_const) == j_const["a/b"]); + CHECK(json::json_pointer("/m~0n").get(j_const) == j_const["m~n"]); + + // unescaped access + CHECK_THROWS_AS(json::json_pointer("/a/b").get(j), std::out_of_range); + CHECK_THROWS_WITH(json::json_pointer("/a/b").get(j), "key 'a' not found"); + // "/a/b" works for JSON {"a": {"b": 42}} + CHECK(json::json_pointer("/a/b").get({{"a", {{"b", 42}}}}) == json(42)); } SECTION("user-defined string literal") From 007359675b0ee39f5a70ce1a7adfc9d268388050 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 16 Apr 2016 16:39:20 +0200 Subject: [PATCH 009/133] added a flatten function --- src/json.hpp | 111 +++++++++++++++++++++++++++++++++++----------- src/json.hpp.re2c | 111 +++++++++++++++++++++++++++++++++++----------- test/unit.cpp | 47 ++++++++++++++++++++ 3 files changed, 217 insertions(+), 52 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 2d3831362..6aca24ad6 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8907,32 +8907,6 @@ basic_json_parser_63: /// the reference tokens std::vector reference_tokens {}; - /*! - @brief replace all occurrences of a substring by another string - - @param[in,out] s the string to manipulate - @param[in] f the substring to replace with @a t - @param[out] t the string to replace @a f - - @return The string @a s where all occurrences of @a f are replaced - with @a t. - - @pre The search string @a f must not be empty. - */ - static void replace_substring(std::string& s, - const std::string& f, - const std::string& t) - { - assert(not f.empty()); - - for ( - size_t pos = s.find(f); // find first occurrence of f - pos != std::string::npos; // make sure f was found - s.replace(pos, f.size(), t), // replace with t - pos = s.find(f, pos + t.size()) // find next occurrence of f - ); - } - /// split the string input to reference tokens void split(std::string reference_string) { @@ -8993,7 +8967,92 @@ basic_json_parser_63: reference_tokens.push_back(reference_token); } } + + /*! + @brief replace all occurrences of a substring by another string + + @param[in,out] s the string to manipulate + @param[in] f the substring to replace with @a t + @param[out] t the string to replace @a f + + @return The string @a s where all occurrences of @a f are replaced + with @a t. + + @pre The search string @a f must not be empty. + + @since version 2.0.0 + */ + static void replace_substring(std::string& s, + const std::string& f, + const std::string& t) + { + assert(not f.empty()); + + for ( + size_t pos = s.find(f); // find first occurrence of f + pos != std::string::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t + pos = s.find(f, pos + t.size()) // find next occurrence of f + ); + } + + /*! + @param[in] reference_string the reference string to the current value + @param[in] value the value to consider + @param[in,out] result the result object to insert values to + */ + static void flatten(const std::string reference_string, + const basic_json& value, + basic_json& result) + { + switch (value.m_type) + { + case value_t::array: + { + // iterate array and use index as reference string + for (size_t i = 0; i < value.m_value.array->size(); ++i) + { + flatten(reference_string + "/" + std::to_string(i), + value.m_value.array->operator[](i), result); + } + break; + } + + case value_t::object: + { + // iterate object and use keys as reference string + for (const auto& element : *value.m_value.object) + { + // escape "~"" to "~0" and "/" to "~1" + std::string key(element.first); + replace_substring(key, "~", "~0"); + replace_substring(key, "/", "~1"); + + flatten(reference_string + "/" + key, + element.second, result); + } + break; + } + + default: + { + // add primitive value with its reference string + result[reference_string] = value; + break; + } + } + } }; + + /*! + @return an object that maps JSON pointers to primitve values + */ + basic_json flatten() const + { + basic_json result(value_t::object); + json_pointer::flatten("", *this, result); + return result; + } }; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index dd4eeb838..74827e2c6 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8217,32 +8217,6 @@ class basic_json /// the reference tokens std::vector reference_tokens {}; - /*! - @brief replace all occurrences of a substring by another string - - @param[in,out] s the string to manipulate - @param[in] f the substring to replace with @a t - @param[out] t the string to replace @a f - - @return The string @a s where all occurrences of @a f are replaced - with @a t. - - @pre The search string @a f must not be empty. - */ - static void replace_substring(std::string& s, - const std::string& f, - const std::string& t) - { - assert(not f.empty()); - - for ( - size_t pos = s.find(f); // find first occurrence of f - pos != std::string::npos; // make sure f was found - s.replace(pos, f.size(), t), // replace with t - pos = s.find(f, pos + t.size()) // find next occurrence of f - ); - } - /// split the string input to reference tokens void split(std::string reference_string) { @@ -8303,7 +8277,92 @@ class basic_json reference_tokens.push_back(reference_token); } } + + /*! + @brief replace all occurrences of a substring by another string + + @param[in,out] s the string to manipulate + @param[in] f the substring to replace with @a t + @param[out] t the string to replace @a f + + @return The string @a s where all occurrences of @a f are replaced + with @a t. + + @pre The search string @a f must not be empty. + + @since version 2.0.0 + */ + static void replace_substring(std::string& s, + const std::string& f, + const std::string& t) + { + assert(not f.empty()); + + for ( + size_t pos = s.find(f); // find first occurrence of f + pos != std::string::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t + pos = s.find(f, pos + t.size()) // find next occurrence of f + ); + } + + /*! + @param[in] reference_string the reference string to the current value + @param[in] value the value to consider + @param[in,out] result the result object to insert values to + */ + static void flatten(const std::string reference_string, + const basic_json& value, + basic_json& result) + { + switch (value.m_type) + { + case value_t::array: + { + // iterate array and use index as reference string + for (size_t i = 0; i < value.m_value.array->size(); ++i) + { + flatten(reference_string + "/" + std::to_string(i), + value.m_value.array->operator[](i), result); + } + break; + } + + case value_t::object: + { + // iterate object and use keys as reference string + for (const auto& element : *value.m_value.object) + { + // escape "~"" to "~0" and "/" to "~1" + std::string key(element.first); + replace_substring(key, "~", "~0"); + replace_substring(key, "/", "~1"); + + flatten(reference_string + "/" + key, + element.second, result); + } + break; + } + + default: + { + // add primitive value with its reference string + result[reference_string] = value; + break; + } + } + } }; + + /*! + @return an object that maps JSON pointers to primitve values + */ + basic_json flatten() const + { + basic_json result(value_t::object); + json_pointer::flatten("", *this, result); + return result; + } }; diff --git a/test/unit.cpp b/test/unit.cpp index 223de2c24..0d9aa0a72 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12168,6 +12168,53 @@ TEST_CASE("JSON pointers") CHECK_THROWS_WITH(json::json_pointer("/~"), "escape error: '~' must be followed with '0' or '1'"); } } + + SECTION("flatten") + { + json j = + { + {"pi", 3.141}, + {"happy", true}, + {"name", "Niels"}, + {"nothing", nullptr}, + { + "answer", { + {"everything", 42} + } + }, + {"list", {1, 0, 2}}, + { + "object", { + {"currency", "USD"}, + {"value", 42.99}, + {"", "empty string"}, + {"/", "slash"}, + {"~", "tilde"}, + {"~1", "tilde1"} + } + } + }; + + json j_flatten = + { + {"/pi", 3.141}, + {"/happy", true}, + {"/name", "Niels"}, + {"/nothing", nullptr}, + {"/answer/everything", 42}, + {"/list/0", 1}, + {"/list/1", 0}, + {"/list/2", 2}, + {"/object/currency", "USD"}, + {"/object/value", 42.99}, + {"/object/", "empty string"}, + {"/object/~1", "slash"}, + {"/object/~0", "tilde"}, + {"/object/~01", "tilde1"} + }; + + CHECK(j.flatten() == j_flatten); + } } TEST_CASE("regression tests") From f834965b44572b14a0865763aed3fde02facf0e4 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 16 Apr 2016 20:45:40 +0200 Subject: [PATCH 010/133] implemented deflatten function --- src/json.hpp | 81 ++++++++++++++++++++++++++++++++++++++++++++++- src/json.hpp.re2c | 81 ++++++++++++++++++++++++++++++++++++++++++++++- test/unit.cpp | 17 ++++++++++ 3 files changed, 177 insertions(+), 2 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 6aca24ad6..96bc1f325 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8855,7 +8855,6 @@ basic_json_parser_63: } private: - /// return referenced value reference get(reference j) const { pointer result = &j; @@ -8880,6 +8879,49 @@ basic_json_parser_63: return *result; } + reference get2(reference j) const + { + pointer result = &j; + + for (const auto& reference_token : reference_tokens) + { + switch (result->m_type) + { + case value_t::null: + { + if (reference_token == "0") + { + result = &result->operator[](0); + } + else + { + result = &result->operator[](reference_token); + } + continue; + } + + case value_t::object: + { + result = &result->operator[](reference_token); + continue; + } + + case value_t::array: + { + result = &result->operator[](static_cast(std::stoi(reference_token))); + continue; + } + + default: + { + throw std::domain_error("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *result; + } + const_reference get(const_reference j) const { const_pointer result = &j; @@ -9042,6 +9084,35 @@ basic_json_parser_63: } } } + + /*! + @param[in] value flattened JSON + + @return deflattened JSON + */ + static basic_json deflatten(const basic_json& value) + { + if (not value.is_object()) + { + throw std::domain_error("only objects can be deflattened"); + } + + basic_json result; + + // iterate the JSON object values + for (const auto& element : *value.m_value.object) + { + if (not element.second.is_primitive()) + { + throw std::domain_error("values in object must be primitive"); + } + + // assign value to reference pointed to by JSON pointer + json_pointer(element.first).get2(result) = element.second; + } + + return result; + } }; /*! @@ -9053,6 +9124,14 @@ basic_json_parser_63: json_pointer::flatten("", *this, result); return result; } + + /*! + @return the original JSON from a flattened version + */ + basic_json deflatten() const + { + return json_pointer::deflatten(*this); + } }; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 74827e2c6..1a049cd52 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8165,7 +8165,6 @@ class basic_json } private: - /// return referenced value reference get(reference j) const { pointer result = &j; @@ -8190,6 +8189,49 @@ class basic_json return *result; } + reference get2(reference j) const + { + pointer result = &j; + + for (const auto& reference_token : reference_tokens) + { + switch (result->m_type) + { + case value_t::null: + { + if (reference_token == "0") + { + result = &result->operator[](0); + } + else + { + result = &result->operator[](reference_token); + } + continue; + } + + case value_t::object: + { + result = &result->operator[](reference_token); + continue; + } + + case value_t::array: + { + result = &result->operator[](static_cast(std::stoi(reference_token))); + continue; + } + + default: + { + throw std::domain_error("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *result; + } + const_reference get(const_reference j) const { const_pointer result = &j; @@ -8352,6 +8394,35 @@ class basic_json } } } + + /*! + @param[in] value flattened JSON + + @return deflattened JSON + */ + static basic_json deflatten(const basic_json& value) + { + if (not value.is_object()) + { + throw std::domain_error("only objects can be deflattened"); + } + + basic_json result; + + // iterate the JSON object values + for (const auto& element : *value.m_value.object) + { + if (not element.second.is_primitive()) + { + throw std::domain_error("values in object must be primitive"); + } + + // assign value to reference pointed to by JSON pointer + json_pointer(element.first).get2(result) = element.second; + } + + return result; + } }; /*! @@ -8363,6 +8434,14 @@ class basic_json json_pointer::flatten("", *this, result); return result; } + + /*! + @return the original JSON from a flattened version + */ + basic_json deflatten() const + { + return json_pointer::deflatten(*this); + } }; diff --git a/test/unit.cpp b/test/unit.cpp index 0d9aa0a72..1ace40d08 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12213,7 +12213,24 @@ TEST_CASE("JSON pointers") {"/object/~01", "tilde1"} }; + // check if flattened result is as expected CHECK(j.flatten() == j_flatten); + + // check if deflattened result is as expected + CHECK(j_flatten.deflatten() == j); + + // explicit roundtrip check + CHECK(j.flatten().deflatten() == j); + + // roundtrip for primitive values + json j_null; + CHECK(j_null.flatten().deflatten() == j_null); + json j_number = 42; + CHECK(j_number.flatten().deflatten() == j_number); + json j_boolean = false; + CHECK(j_boolean.flatten().deflatten() == j_boolean); + json j_string = "foo"; + CHECK(j_string.flatten().deflatten() == j_string); } } From 40e899a819ac105a591ab1e8405b938728c94e2e Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 17:39:35 +0200 Subject: [PATCH 011/133] cleanup and documentation --- doc/examples/flatten.cpp | 34 ++ doc/examples/flatten.link | 1 + doc/examples/flatten.output | 16 + doc/examples/operatorjson_pointer.cpp | 47 +++ doc/examples/operatorjson_pointer.link | 1 + doc/examples/operatorjson_pointer.output | 8 + doc/examples/operatorjson_pointer_const.cpp | 23 ++ doc/examples/operatorjson_pointer_const.link | 1 + .../operatorjson_pointer_const.output | 4 + doc/examples/unflatten.cpp | 28 ++ doc/examples/unflatten.link | 1 + doc/examples/unflatten.output | 22 + src/json.hpp | 386 +++++++++++++++--- src/json.hpp.re2c | 386 +++++++++++++++--- test/unit.cpp | 222 ++++++---- 15 files changed, 978 insertions(+), 202 deletions(-) create mode 100644 doc/examples/flatten.cpp create mode 100644 doc/examples/flatten.link create mode 100644 doc/examples/flatten.output create mode 100644 doc/examples/operatorjson_pointer.cpp create mode 100644 doc/examples/operatorjson_pointer.link create mode 100644 doc/examples/operatorjson_pointer.output create mode 100644 doc/examples/operatorjson_pointer_const.cpp create mode 100644 doc/examples/operatorjson_pointer_const.link create mode 100644 doc/examples/operatorjson_pointer_const.output create mode 100644 doc/examples/unflatten.cpp create mode 100644 doc/examples/unflatten.link create mode 100644 doc/examples/unflatten.output diff --git a/doc/examples/flatten.cpp b/doc/examples/flatten.cpp new file mode 100644 index 000000000..5d7692028 --- /dev/null +++ b/doc/examples/flatten.cpp @@ -0,0 +1,34 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // create JSON value + json j = + { + {"pi", 3.141}, + {"happy", true}, + {"name", "Niels"}, + {"nothing", nullptr}, + { + "answer", { + {"everything", 42} + } + }, + {"list", {1, 0, 2}}, + { + "object", { + {"currency", "USD"}, + {"value", 42.99}, + {"", "empty string"}, + {"/", "slash"}, + {"~", "tilde"}, + {"~1", "tilde1"} + } + } + }; + + // call flatten() + std::cout << std::setw(4) << j.flatten() << '\n'; +} diff --git a/doc/examples/flatten.link b/doc/examples/flatten.link new file mode 100644 index 000000000..70ba78baa --- /dev/null +++ b/doc/examples/flatten.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/flatten.output b/doc/examples/flatten.output new file mode 100644 index 000000000..beb368faf --- /dev/null +++ b/doc/examples/flatten.output @@ -0,0 +1,16 @@ +{ + "/answer/everything": 42, + "/happy": true, + "/list/0": 1, + "/list/1": 0, + "/list/2": 2, + "/name": "Niels", + "/nothing": null, + "/object/": "empty string", + "/object/currency": "USD", + "/object/value": 42.99, + "/object/~0": "tilde", + "/object/~01": "tilde1", + "/object/~1": "slash", + "/pi": 3.141 +} diff --git a/doc/examples/operatorjson_pointer.cpp b/doc/examples/operatorjson_pointer.cpp new file mode 100644 index 000000000..18e41c1f5 --- /dev/null +++ b/doc/examples/operatorjson_pointer.cpp @@ -0,0 +1,47 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // create a JSON value + json j = + { + {"number", 1}, {"string", "foo"}, {"array", {1, 2}} + }; + + // read-only access + + // output element with JSON pointer "/number" + std::cout << j["/number"_json_pointer] << '\n'; + // output element with JSON pointer "/string" + std::cout << j["/string"_json_pointer] << '\n'; + // output element with JSON pointer "/array" + std::cout << j["/array"_json_pointer] << '\n'; + // output element with JSON pointer "/array/1" + std::cout << j["/array/1"_json_pointer] << '\n'; + + // writing access + + // change the string + j["/string"_json_pointer] = "bar"; + // output the changed string + std::cout << j["string"] << '\n'; + + // "change" a nonexisting object entry + j["/boolean"_json_pointer] = true; + // output the changed object + std::cout << j << '\n'; + + // change an array element + j["/array/1"_json_pointer] = 21; + // "change" an array element with nonexisting index + j["/array/4"_json_pointer] = 44; + // output the changed array + std::cout << j["array"] << '\n'; + + // "change" the arry element past the end + j["/array/-"_json_pointer] = 55; + // output the changed array + std::cout << j["array"] << '\n'; +} diff --git a/doc/examples/operatorjson_pointer.link b/doc/examples/operatorjson_pointer.link new file mode 100644 index 000000000..3cee69e78 --- /dev/null +++ b/doc/examples/operatorjson_pointer.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/operatorjson_pointer.output b/doc/examples/operatorjson_pointer.output new file mode 100644 index 000000000..1fd1b032d --- /dev/null +++ b/doc/examples/operatorjson_pointer.output @@ -0,0 +1,8 @@ +1 +"foo" +[1,2] +2 +"bar" +{"array":[1,2],"boolean":true,"number":1,"string":"bar"} +[1,21,null,null,44] +[1,21,null,null,44,55] diff --git a/doc/examples/operatorjson_pointer_const.cpp b/doc/examples/operatorjson_pointer_const.cpp new file mode 100644 index 000000000..20ac36cb2 --- /dev/null +++ b/doc/examples/operatorjson_pointer_const.cpp @@ -0,0 +1,23 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // create a JSON value + const json j = + { + {"number", 1}, {"string", "foo"}, {"array", {1, 2}} + }; + + // read-only access + + // output element with JSON pointer "/number" + std::cout << j["/number"_json_pointer] << '\n'; + // output element with JSON pointer "/string" + std::cout << j["/string"_json_pointer] << '\n'; + // output element with JSON pointer "/array" + std::cout << j["/array"_json_pointer] << '\n'; + // output element with JSON pointer "/array/1" + std::cout << j["/array/1"_json_pointer] << '\n'; +} diff --git a/doc/examples/operatorjson_pointer_const.link b/doc/examples/operatorjson_pointer_const.link new file mode 100644 index 000000000..b13a9b19c --- /dev/null +++ b/doc/examples/operatorjson_pointer_const.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/operatorjson_pointer_const.output b/doc/examples/operatorjson_pointer_const.output new file mode 100644 index 000000000..7b9306bbc --- /dev/null +++ b/doc/examples/operatorjson_pointer_const.output @@ -0,0 +1,4 @@ +1 +"foo" +[1,2] +2 diff --git a/doc/examples/unflatten.cpp b/doc/examples/unflatten.cpp new file mode 100644 index 000000000..39c674c94 --- /dev/null +++ b/doc/examples/unflatten.cpp @@ -0,0 +1,28 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // create JSON value + json j_flattened = + { + {"/answer/everything", 42}, + {"/happy", true}, + {"/list/0", 1}, + {"/list/1", 0}, + {"/list/2", 2}, + {"/name", "Niels"}, + {"/nothing", nullptr}, + {"/object/", "empty string"}, + {"/object/currency", "USD"}, + {"/object/value", 42.99}, + {"/object/~0", "tilde"}, + {"/object/~01", "tilde1"}, + {"/object/~1", "slash"}, + {"/pi", 3.141} + }; + + // call unflatten() + std::cout << std::setw(4) << j_flattened.unflatten() << '\n'; +} diff --git a/doc/examples/unflatten.link b/doc/examples/unflatten.link new file mode 100644 index 000000000..bc7594a0a --- /dev/null +++ b/doc/examples/unflatten.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/unflatten.output b/doc/examples/unflatten.output new file mode 100644 index 000000000..f57c9c9a1 --- /dev/null +++ b/doc/examples/unflatten.output @@ -0,0 +1,22 @@ +{ + "answer": { + "everything": 42 + }, + "happy": true, + "list": [ + 1, + 0, + 2 + ], + "name": "Niels", + "nothing": null, + "object": { + "": "empty string", + "/": "slash", + "currency": "USD", + "value": 42.99, + "~": "tilde", + "~1": "tilde1" + }, + "pi": 3.141 +} diff --git a/src/json.hpp b/src/json.hpp index 96bc1f325..6cf369bd9 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -3598,23 +3598,86 @@ class basic_json /*! @brief access specified element via JSON Pointer - Returns a reference to the element at with specified JSON pointer @a ptr. + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. Similar to + @ref operator[](const typename object_t::key_type&), `null` values + are created in arrays and objects if necessary. - @param p JSON pointer to the desired element + In particular: + - If the JSON pointer points to an object key that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. + - If the JSON pointer points to an array index that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. All indices between the current maximum and the given + index are also filled with `null`. + - The special value `-` is treated as a synonym for the index past the + end. + + @param[in] ptr a JSON pointer + + @return reference to the JSON value pointed to by @a ptr + + @complexity Linear in the length of the JSON pointer. + + @throw std::out_of_range if the JSON pointer can not be resolved + + @liveexample{The behavior is shown in the example.,operatorjson_pointer} @since version 2.0.0 */ reference operator[](const json_pointer& ptr) { - return ptr.get(*this); + return ptr.get_unchecked(this); } /*! - @copydoc basic_json::operator[](const json_pointer&) + @brief access specified element via JSON Pointer + + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. The function does not change the JSON + value; no `null` values are created. In particular, the the special value + `-` yields an exception. + + @param[in] ptr a JSON pointer + + @return reference to the JSON value pointed to by @a ptr + + @complexity Linear in the length of the JSON pointer. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::out_of_range if the special value `-` is used for an array + + @liveexample{The behavior is shown in the example., + operatorjson_pointer_const} + + @since version 2.0.0 */ const_reference operator[](const json_pointer& ptr) const { - return ptr.get(*this); + return ptr.get_unchecked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Returns a reference to the element at with specified JSON pointer @a ptr. + + @param ptr JSON pointer to the desired element + + @since version 2.0.0 + */ + reference at(const json_pointer& ptr) + { + return ptr.get_checked(this); + } + + /*! + @copydoc basic_json::at(const json_pointer&) + */ + const_reference at(const json_pointer& ptr) const + { + return ptr.get_checked(this); } /*! @@ -8841,45 +8904,28 @@ basic_json_parser_63: @brief JSON Pointer @sa [RFC 6901](https://tools.ietf.org/html/rfc6901) + + @since version 2.0.0 */ class json_pointer { + /// allow basic_json to access private members + friend class basic_json; + public: /// empty reference token json_pointer() = default; /// nonempty reference token explicit json_pointer(const std::string& s) - { - split(s); - } + : reference_tokens(split(s)) + {} private: - reference get(reference j) const - { - pointer result = &j; - - for (const auto& reference_token : reference_tokens) - { - switch (result->m_type) - { - case value_t::object: - result = &result->at(reference_token); - continue; - - case value_t::array: - result = &result->at(static_cast(std::stoi(reference_token))); - continue; - - default: - throw std::domain_error("unresolved reference token '" + reference_token + "'"); - } - } - - return *result; - } - - reference get2(reference j) const + /*! + @brief create and return a reference to the pointed to value + */ + reference get_and_create(reference j) const { pointer result = &j; @@ -8922,40 +8968,172 @@ basic_json_parser_63: return *result; } - const_reference get(const_reference j) const - { - const_pointer result = &j; + /*! + @brief return a reference to the pointed to value + @param[in] ptr a JSON value + + @return reference to the JSON value pointed to by the JSON pointer + + @complexity Linear in the length of the JSON pointer. + + @throw std::out_of_range if the JSON pointer can not be resolved + */ + reference get_unchecked(pointer ptr) const + { for (const auto& reference_token : reference_tokens) { - switch (result->m_type) + switch (ptr->m_type) { case value_t::object: - result = &result->at(reference_token); - continue; + { + ptr = &ptr->operator[](reference_token); + break; + } case value_t::array: - result = &result->at(static_cast(std::stoi(reference_token))); - continue; + { + if (reference_token == "-") + { + ptr = &ptr->operator[](ptr->m_value.array->size()); + } + else + { + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + } + break; + } default: - throw std::domain_error("unresolved reference token '" + reference_token + "'"); + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } } } - return *result; + return *ptr; } - /// the reference tokens - std::vector reference_tokens {}; + reference get_checked(pointer ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->m_type) + { + case value_t::object: + { + ptr = &ptr->at(reference_token); + break; + } + + case value_t::array: + { + if (reference_token == "-") + { + throw std::out_of_range("cannot resolve reference token '-'"); + } + else + { + ptr = &ptr->at(static_cast(std::stoi(reference_token))); + } + break; + } + + default: + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *ptr; + } + + /*! + @brief return a const reference to the pointed to value + + @param[in] ptr a JSON value + + @return const reference to the JSON value pointed to by the JSON + pointer + */ + const_reference get_unchecked(const_pointer ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->m_type) + { + case value_t::object: + { + ptr = &ptr->operator[](reference_token); + continue; + } + + case value_t::array: + { + if (reference_token == "-") + { + throw std::out_of_range("array index '-' (" + + std::to_string(ptr->m_value.array->size()) + + ") is out of range"); + } + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + continue; + } + + default: + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *ptr; + } + + const_reference get_checked(const_pointer ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->m_type) + { + case value_t::object: + { + ptr = &ptr->at(reference_token); + continue; + } + + case value_t::array: + { + if (reference_token == "-") + { + throw std::out_of_range("array index '-' (" + + std::to_string(ptr->m_value.array->size()) + + ") is out of range"); + } + ptr = &ptr->at(static_cast(std::stoi(reference_token))); + continue; + } + + default: + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *ptr; + } /// split the string input to reference tokens - void split(std::string reference_string) + std::vector split(std::string reference_string) { + std::vector result; + // special case: empty reference string -> no reference tokens if (reference_string.empty()) { - return; + return result; } // check if nonempty reference string begins with slash @@ -9006,10 +9184,13 @@ basic_json_parser_63: replace_substring(reference_token, "~0", "~"); // finally, store the reference token - reference_tokens.push_back(reference_token); + result.push_back(reference_token); } + + return result; } + private: /*! @brief replace all occurrences of a substring by another string @@ -9042,6 +9223,8 @@ basic_json_parser_63: @param[in] reference_string the reference string to the current value @param[in] value the value to consider @param[in,out] result the result object to insert values to + + @note Empty objects or arrays are flattened to `null`. */ static void flatten(const std::string reference_string, const basic_json& value, @@ -9051,27 +9234,43 @@ basic_json_parser_63: { case value_t::array: { - // iterate array and use index as reference string - for (size_t i = 0; i < value.m_value.array->size(); ++i) + if (value.m_value.array->empty()) { - flatten(reference_string + "/" + std::to_string(i), - value.m_value.array->operator[](i), result); + // flatten empty array as null + result[reference_string] = nullptr; + } + else + { + // iterate array and use index as reference string + for (size_t i = 0; i < value.m_value.array->size(); ++i) + { + flatten(reference_string + "/" + std::to_string(i), + value.m_value.array->operator[](i), result); + } } break; } case value_t::object: { - // iterate object and use keys as reference string - for (const auto& element : *value.m_value.object) + if (value.m_value.object->empty()) { - // escape "~"" to "~0" and "/" to "~1" - std::string key(element.first); - replace_substring(key, "~", "~0"); - replace_substring(key, "/", "~1"); + // flatten empty object as null + result[reference_string] = nullptr; + } + else + { + // iterate object and use keys as reference string + for (const auto& element : *value.m_value.object) + { + // escape "~"" to "~0" and "/" to "~1" + std::string key(element.first); + replace_substring(key, "~", "~0"); + replace_substring(key, "/", "~1"); - flatten(reference_string + "/" + key, - element.second, result); + flatten(reference_string + "/" + key, + element.second, result); + } } break; } @@ -9088,13 +9287,13 @@ basic_json_parser_63: /*! @param[in] value flattened JSON - @return deflattened JSON + @return unflattened JSON */ - static basic_json deflatten(const basic_json& value) + static basic_json unflatten(const basic_json& value) { if (not value.is_object()) { - throw std::domain_error("only objects can be deflattened"); + throw std::domain_error("only objects can be unflattened"); } basic_json result; @@ -9108,15 +9307,44 @@ basic_json_parser_63: } // assign value to reference pointed to by JSON pointer - json_pointer(element.first).get2(result) = element.second; + json_pointer(element.first).get_and_create(result) = element.second; } return result; } + + private: + /// the reference tokens + const std::vector reference_tokens {}; }; + //////////////////////////// + // JSON Pointer functions // + //////////////////////////// + + /// @name JSON Pointer functions + /// @{ + /*! + @brief return flattened JSON value + + The function creates a JSON object whose keys are JSON pointers (see + [RFC 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all + primitive. The original JSON value can be restored using the + @ref unflatten() function. + @return an object that maps JSON pointers to primitve values + + @note Empty objects and arrays are flattened to `null`. + + @complexity Linear in the size the JSON value. + + @liveexample{The following code shows how a JSON object is flattened to an + object whose keys consist of JSON pointers.,flatten} + + @sa @ref unflatten() for the reverse function + + @since version 2.0.0 */ basic_json flatten() const { @@ -9126,12 +9354,38 @@ basic_json_parser_63: } /*! + @brief unflatten a previously flattened JSON value + + The function restores the arbitrary nesting of a JSON value that has been + flattened before using the @ref flatten() function. The JSON value must + meet certain constraints: + 1. The value must be an object. + 2. The keys must be JSON pointers (see + [RFC 6901](https://tools.ietf.org/html/rfc6901)) + 3. The mapped values must be primitive JSON types. + @return the original JSON from a flattened version + + @note Empty objects and arrays are flattened by @ref flatten() to `null` + values and can not unflattened to their original type. Apart from + this example, for a JSON value `j`, the following is always true: + `j == j.flatten().unflatten()`. + + @complexity Linear in the size the JSON value. + + @liveexample{The following code shows how a flattened JSON object is + unflattened into the original nested JSON object.,unflatten} + + @sa @ref flatten() for the reverse function + + @since version 2.0.0 */ - basic_json deflatten() const + basic_json unflatten() const { - return json_pointer::deflatten(*this); + return json_pointer::unflatten(*this); } + + /// @} }; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 1a049cd52..7fe9673fe 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -3598,23 +3598,86 @@ class basic_json /*! @brief access specified element via JSON Pointer - Returns a reference to the element at with specified JSON pointer @a ptr. + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. Similar to + @ref operator[](const typename object_t::key_type&), `null` values + are created in arrays and objects if necessary. - @param p JSON pointer to the desired element + In particular: + - If the JSON pointer points to an object key that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. + - If the JSON pointer points to an array index that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. All indices between the current maximum and the given + index are also filled with `null`. + - The special value `-` is treated as a synonym for the index past the + end. + + @param[in] ptr a JSON pointer + + @return reference to the JSON value pointed to by @a ptr + + @complexity Linear in the length of the JSON pointer. + + @throw std::out_of_range if the JSON pointer can not be resolved + + @liveexample{The behavior is shown in the example.,operatorjson_pointer} @since version 2.0.0 */ reference operator[](const json_pointer& ptr) { - return ptr.get(*this); + return ptr.get_unchecked(this); } /*! - @copydoc basic_json::operator[](const json_pointer&) + @brief access specified element via JSON Pointer + + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. The function does not change the JSON + value; no `null` values are created. In particular, the the special value + `-` yields an exception. + + @param[in] ptr a JSON pointer + + @return reference to the JSON value pointed to by @a ptr + + @complexity Linear in the length of the JSON pointer. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::out_of_range if the special value `-` is used for an array + + @liveexample{The behavior is shown in the example., + operatorjson_pointer_const} + + @since version 2.0.0 */ const_reference operator[](const json_pointer& ptr) const { - return ptr.get(*this); + return ptr.get_unchecked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Returns a reference to the element at with specified JSON pointer @a ptr. + + @param ptr JSON pointer to the desired element + + @since version 2.0.0 + */ + reference at(const json_pointer& ptr) + { + return ptr.get_checked(this); + } + + /*! + @copydoc basic_json::at(const json_pointer&) + */ + const_reference at(const json_pointer& ptr) const + { + return ptr.get_checked(this); } /*! @@ -8151,45 +8214,28 @@ class basic_json @brief JSON Pointer @sa [RFC 6901](https://tools.ietf.org/html/rfc6901) + + @since version 2.0.0 */ class json_pointer { + /// allow basic_json to access private members + friend class basic_json; + public: /// empty reference token json_pointer() = default; /// nonempty reference token explicit json_pointer(const std::string& s) - { - split(s); - } + : reference_tokens(split(s)) + {} private: - reference get(reference j) const - { - pointer result = &j; - - for (const auto& reference_token : reference_tokens) - { - switch (result->m_type) - { - case value_t::object: - result = &result->at(reference_token); - continue; - - case value_t::array: - result = &result->at(static_cast(std::stoi(reference_token))); - continue; - - default: - throw std::domain_error("unresolved reference token '" + reference_token + "'"); - } - } - - return *result; - } - - reference get2(reference j) const + /*! + @brief create and return a reference to the pointed to value + */ + reference get_and_create(reference j) const { pointer result = &j; @@ -8232,40 +8278,172 @@ class basic_json return *result; } - const_reference get(const_reference j) const - { - const_pointer result = &j; + /*! + @brief return a reference to the pointed to value + @param[in] ptr a JSON value + + @return reference to the JSON value pointed to by the JSON pointer + + @complexity Linear in the length of the JSON pointer. + + @throw std::out_of_range if the JSON pointer can not be resolved + */ + reference get_unchecked(pointer ptr) const + { for (const auto& reference_token : reference_tokens) { - switch (result->m_type) + switch (ptr->m_type) { case value_t::object: - result = &result->at(reference_token); - continue; + { + ptr = &ptr->operator[](reference_token); + break; + } case value_t::array: - result = &result->at(static_cast(std::stoi(reference_token))); - continue; + { + if (reference_token == "-") + { + ptr = &ptr->operator[](ptr->m_value.array->size()); + } + else + { + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + } + break; + } default: - throw std::domain_error("unresolved reference token '" + reference_token + "'"); + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } } } - return *result; + return *ptr; } - /// the reference tokens - std::vector reference_tokens {}; + reference get_checked(pointer ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->m_type) + { + case value_t::object: + { + ptr = &ptr->at(reference_token); + break; + } + + case value_t::array: + { + if (reference_token == "-") + { + throw std::out_of_range("cannot resolve reference token '-'"); + } + else + { + ptr = &ptr->at(static_cast(std::stoi(reference_token))); + } + break; + } + + default: + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *ptr; + } + + /*! + @brief return a const reference to the pointed to value + + @param[in] ptr a JSON value + + @return const reference to the JSON value pointed to by the JSON + pointer + */ + const_reference get_unchecked(const_pointer ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->m_type) + { + case value_t::object: + { + ptr = &ptr->operator[](reference_token); + continue; + } + + case value_t::array: + { + if (reference_token == "-") + { + throw std::out_of_range("array index '-' (" + + std::to_string(ptr->m_value.array->size()) + + ") is out of range"); + } + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + continue; + } + + default: + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *ptr; + } + + const_reference get_checked(const_pointer ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->m_type) + { + case value_t::object: + { + ptr = &ptr->at(reference_token); + continue; + } + + case value_t::array: + { + if (reference_token == "-") + { + throw std::out_of_range("array index '-' (" + + std::to_string(ptr->m_value.array->size()) + + ") is out of range"); + } + ptr = &ptr->at(static_cast(std::stoi(reference_token))); + continue; + } + + default: + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *ptr; + } /// split the string input to reference tokens - void split(std::string reference_string) + std::vector split(std::string reference_string) { + std::vector result; + // special case: empty reference string -> no reference tokens if (reference_string.empty()) { - return; + return result; } // check if nonempty reference string begins with slash @@ -8316,10 +8494,13 @@ class basic_json replace_substring(reference_token, "~0", "~"); // finally, store the reference token - reference_tokens.push_back(reference_token); + result.push_back(reference_token); } + + return result; } + private: /*! @brief replace all occurrences of a substring by another string @@ -8352,6 +8533,8 @@ class basic_json @param[in] reference_string the reference string to the current value @param[in] value the value to consider @param[in,out] result the result object to insert values to + + @note Empty objects or arrays are flattened to `null`. */ static void flatten(const std::string reference_string, const basic_json& value, @@ -8361,27 +8544,43 @@ class basic_json { case value_t::array: { - // iterate array and use index as reference string - for (size_t i = 0; i < value.m_value.array->size(); ++i) + if (value.m_value.array->empty()) { - flatten(reference_string + "/" + std::to_string(i), - value.m_value.array->operator[](i), result); + // flatten empty array as null + result[reference_string] = nullptr; + } + else + { + // iterate array and use index as reference string + for (size_t i = 0; i < value.m_value.array->size(); ++i) + { + flatten(reference_string + "/" + std::to_string(i), + value.m_value.array->operator[](i), result); + } } break; } case value_t::object: { - // iterate object and use keys as reference string - for (const auto& element : *value.m_value.object) + if (value.m_value.object->empty()) { - // escape "~"" to "~0" and "/" to "~1" - std::string key(element.first); - replace_substring(key, "~", "~0"); - replace_substring(key, "/", "~1"); + // flatten empty object as null + result[reference_string] = nullptr; + } + else + { + // iterate object and use keys as reference string + for (const auto& element : *value.m_value.object) + { + // escape "~"" to "~0" and "/" to "~1" + std::string key(element.first); + replace_substring(key, "~", "~0"); + replace_substring(key, "/", "~1"); - flatten(reference_string + "/" + key, - element.second, result); + flatten(reference_string + "/" + key, + element.second, result); + } } break; } @@ -8398,13 +8597,13 @@ class basic_json /*! @param[in] value flattened JSON - @return deflattened JSON + @return unflattened JSON */ - static basic_json deflatten(const basic_json& value) + static basic_json unflatten(const basic_json& value) { if (not value.is_object()) { - throw std::domain_error("only objects can be deflattened"); + throw std::domain_error("only objects can be unflattened"); } basic_json result; @@ -8418,15 +8617,44 @@ class basic_json } // assign value to reference pointed to by JSON pointer - json_pointer(element.first).get2(result) = element.second; + json_pointer(element.first).get_and_create(result) = element.second; } return result; } + + private: + /// the reference tokens + const std::vector reference_tokens {}; }; + //////////////////////////// + // JSON Pointer functions // + //////////////////////////// + + /// @name JSON Pointer functions + /// @{ + /*! + @brief return flattened JSON value + + The function creates a JSON object whose keys are JSON pointers (see + [RFC 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all + primitive. The original JSON value can be restored using the + @ref unflatten() function. + @return an object that maps JSON pointers to primitve values + + @note Empty objects and arrays are flattened to `null`. + + @complexity Linear in the size the JSON value. + + @liveexample{The following code shows how a JSON object is flattened to an + object whose keys consist of JSON pointers.,flatten} + + @sa @ref unflatten() for the reverse function + + @since version 2.0.0 */ basic_json flatten() const { @@ -8436,12 +8664,38 @@ class basic_json } /*! + @brief unflatten a previously flattened JSON value + + The function restores the arbitrary nesting of a JSON value that has been + flattened before using the @ref flatten() function. The JSON value must + meet certain constraints: + 1. The value must be an object. + 2. The keys must be JSON pointers (see + [RFC 6901](https://tools.ietf.org/html/rfc6901)) + 3. The mapped values must be primitive JSON types. + @return the original JSON from a flattened version + + @note Empty objects and arrays are flattened by @ref flatten() to `null` + values and can not unflattened to their original type. Apart from + this example, for a JSON value `j`, the following is always true: + `j == j.flatten().unflatten()`. + + @complexity Linear in the size the JSON value. + + @liveexample{The following code shows how a flattened JSON object is + unflattened into the original nested JSON object.,unflatten} + + @sa @ref flatten() for the reverse function + + @since version 2.0.0 */ - basic_json deflatten() const + basic_json unflatten() const { - return json_pointer::deflatten(*this); + return json_pointer::unflatten(*this); } + + /// @} }; diff --git a/test/unit.cpp b/test/unit.cpp index 1ace40d08..a3b9035d2 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12054,119 +12054,195 @@ TEST_CASE("Unicode", "[hide]") TEST_CASE("JSON pointers") { + SECTION("errors") + { + CHECK_THROWS_AS(json::json_pointer("foo"), std::domain_error); + CHECK_THROWS_WITH(json::json_pointer("foo"), "JSON pointer must be empty or begin with '/'"); + + CHECK_THROWS_AS(json::json_pointer("/~~"), std::domain_error); + CHECK_THROWS_WITH(json::json_pointer("/~~"), "escape error: '~' must be followed with '0' or '1'"); + + CHECK_THROWS_AS(json::json_pointer("/~"), std::domain_error); + CHECK_THROWS_WITH(json::json_pointer("/~"), "escape error: '~' must be followed with '0' or '1'"); + } + SECTION("examples from RFC 6901") { - json j = R"( - { - "foo": ["bar", "baz"], - "": 0, - "a/b": 1, - "c%d": 2, - "e^f": 3, - "g|h": 4, - "i\\j": 5, - "k\"l": 6, - " ": 7, - "m~n": 8 - } - )"_json; - - const json j_const = j; - SECTION("nonconst access") { + json j = R"( + { + "foo": ["bar", "baz"], + "": 0, + "a/b": 1, + "c%d": 2, + "e^f": 3, + "g|h": 4, + "i\\j": 5, + "k\"l": 6, + " ": 7, + "m~n": 8 + } + )"_json; + // the whole document - CHECK(json::json_pointer().get(j) == j); - CHECK(json::json_pointer("").get(j) == j); CHECK(j[json::json_pointer()] == j); CHECK(j[json::json_pointer("")] == j); // array access - CHECK(json::json_pointer("/foo").get(j) == j["foo"]); - CHECK(json::json_pointer("/foo/0").get(j) == j["foo"][0]); - CHECK(json::json_pointer("/foo/1").get(j) == j["foo"][1]); CHECK(j[json::json_pointer("/foo")] == j["foo"]); CHECK(j[json::json_pointer("/foo/0")] == j["foo"][0]); CHECK(j[json::json_pointer("/foo/1")] == j["foo"][1]); CHECK(j["/foo/1"_json_pointer] == j["foo"][1]); // empty string access - CHECK(json::json_pointer("/").get(j) == j[""]); + CHECK(j[json::json_pointer("/")] == j[""]); // other cases - CHECK(json::json_pointer("/ ").get(j) == j[" "]); - CHECK(json::json_pointer("/c%d").get(j) == j["c%d"]); - CHECK(json::json_pointer("/e^f").get(j) == j["e^f"]); - CHECK(json::json_pointer("/g|h").get(j) == j["g|h"]); - CHECK(json::json_pointer("/i\\j").get(j) == j["i\\j"]); - CHECK(json::json_pointer("/k\"l").get(j) == j["k\"l"]); + CHECK(j[json::json_pointer("/ ")] == j[" "]); + CHECK(j[json::json_pointer("/c%d")] == j["c%d"]); + CHECK(j[json::json_pointer("/e^f")] == j["e^f"]); + CHECK(j[json::json_pointer("/g|h")] == j["g|h"]); + CHECK(j[json::json_pointer("/i\\j")] == j["i\\j"]); + CHECK(j[json::json_pointer("/k\"l")] == j["k\"l"]); // escaped access - CHECK(json::json_pointer("/a~1b").get(j) == j["a/b"]); - CHECK(json::json_pointer("/m~0n").get(j) == j["m~n"]); + CHECK(j[json::json_pointer("/a~1b")] == j["a/b"]); + CHECK(j[json::json_pointer("/m~0n")] == j["m~n"]); // unescaped access - CHECK_THROWS_AS(json::json_pointer("/a/b").get(j), std::out_of_range); - CHECK_THROWS_WITH(json::json_pointer("/a/b").get(j), "key 'a' not found"); + CHECK_THROWS_AS(j[json::json_pointer("/a/b")], std::out_of_range); + CHECK_THROWS_WITH(j[json::json_pointer("/a/b")], "unresolved reference token 'b'"); // "/a/b" works for JSON {"a": {"b": 42}} - CHECK(json::json_pointer("/a/b").get({{"a", {{"b", 42}}}}) == json(42)); + CHECK(json({{"a", {{"b", 42}}}})[json::json_pointer("/a/b")] == json(42)); } SECTION("const access") { + const json j = R"( + { + "foo": ["bar", "baz"], + "": 0, + "a/b": 1, + "c%d": 2, + "e^f": 3, + "g|h": 4, + "i\\j": 5, + "k\"l": 6, + " ": 7, + "m~n": 8 + } + )"_json; + // the whole document - CHECK(json::json_pointer().get(j_const) == j_const); - CHECK(json::json_pointer("").get(j_const) == j_const); + CHECK(j[json::json_pointer()] == j); + CHECK(j[json::json_pointer("")] == j); // array access - CHECK(json::json_pointer("/foo").get(j_const) == j_const["foo"]); - CHECK(json::json_pointer("/foo/0").get(j_const) == j_const["foo"][0]); - CHECK(json::json_pointer("/foo/1").get(j_const) == j_const["foo"][1]); + CHECK(j[json::json_pointer("/foo")] == j["foo"]); + CHECK(j[json::json_pointer("/foo/0")] == j["foo"][0]); + CHECK(j[json::json_pointer("/foo/1")] == j["foo"][1]); + CHECK(j["/foo/1"_json_pointer] == j["foo"][1]); // empty string access - CHECK(json::json_pointer("/").get(j_const) == j_const[""]); + CHECK(j[json::json_pointer("/")] == j[""]); // other cases - CHECK(json::json_pointer("/ ").get(j_const) == j_const[" "]); - CHECK(json::json_pointer("/c%d").get(j_const) == j_const["c%d"]); - CHECK(json::json_pointer("/e^f").get(j_const) == j_const["e^f"]); - CHECK(json::json_pointer("/g|h").get(j_const) == j_const["g|h"]); - CHECK(json::json_pointer("/i\\j").get(j_const) == j_const["i\\j"]); - CHECK(json::json_pointer("/k\"l").get(j_const) == j_const["k\"l"]); + CHECK(j[json::json_pointer("/ ")] == j[" "]); + CHECK(j[json::json_pointer("/c%d")] == j["c%d"]); + CHECK(j[json::json_pointer("/e^f")] == j["e^f"]); + CHECK(j[json::json_pointer("/g|h")] == j["g|h"]); + CHECK(j[json::json_pointer("/i\\j")] == j["i\\j"]); + CHECK(j[json::json_pointer("/k\"l")] == j["k\"l"]); // escaped access - CHECK(json::json_pointer("/a~1b").get(j_const) == j_const["a/b"]); - CHECK(json::json_pointer("/m~0n").get(j_const) == j_const["m~n"]); + CHECK(j[json::json_pointer("/a~1b")] == j["a/b"]); + CHECK(j[json::json_pointer("/m~0n")] == j["m~n"]); // unescaped access - CHECK_THROWS_AS(json::json_pointer("/a/b").get(j), std::out_of_range); - CHECK_THROWS_WITH(json::json_pointer("/a/b").get(j), "key 'a' not found"); - // "/a/b" works for JSON {"a": {"b": 42}} - CHECK(json::json_pointer("/a/b").get({{"a", {{"b", 42}}}}) == json(42)); + CHECK_THROWS_AS(j.at(json::json_pointer("/a/b")), std::out_of_range); + CHECK_THROWS_WITH(j.at(json::json_pointer("/a/b")), "key 'a' not found"); } SECTION("user-defined string literal") { + json j = R"( + { + "foo": ["bar", "baz"], + "": 0, + "a/b": 1, + "c%d": 2, + "e^f": 3, + "g|h": 4, + "i\\j": 5, + "k\"l": 6, + " ": 7, + "m~n": 8 + } + )"_json; + // the whole document - CHECK(""_json_pointer.get(j) == j); + CHECK(j[""_json_pointer] == j); // array access - CHECK("/foo"_json_pointer.get(j) == j["foo"]); - CHECK("/foo/0"_json_pointer.get(j) == j["foo"][0]); - CHECK("/foo/1"_json_pointer.get(j) == j["foo"][1]); + CHECK(j["/foo"_json_pointer] == j["foo"]); + CHECK(j["/foo/0"_json_pointer] == j["foo"][0]); + CHECK(j["/foo/1"_json_pointer] == j["foo"][1]); } + } - SECTION("errors") + SECTION("array access") + { + SECTION("nonconst access") { - CHECK_THROWS_AS(json::json_pointer("foo"), std::domain_error); - CHECK_THROWS_WITH(json::json_pointer("foo"), "JSON pointer must be empty or begin with '/'"); + json j = {1, 2, 3}; - CHECK_THROWS_AS(json::json_pointer("/~~"), std::domain_error); - CHECK_THROWS_WITH(json::json_pointer("/~~"), "escape error: '~' must be followed with '0' or '1'"); + // check reading access + CHECK(j["/0"_json_pointer] == j[0]); + CHECK(j["/1"_json_pointer] == j[1]); + CHECK(j["/2"_json_pointer] == j[2]); - CHECK_THROWS_AS(json::json_pointer("/~"), std::domain_error); - CHECK_THROWS_WITH(json::json_pointer("/~"), "escape error: '~' must be followed with '0' or '1'"); + // assign to existing index + j["/1"_json_pointer] = 13; + CHECK(j[1] == json(13)); + + // assign to nonexisting index + j["/3"_json_pointer] = 33; + CHECK(j[3] == json(33)); + + // assign to nonexisting index (with gap) + j["/5"_json_pointer] = 55; + CHECK(j == json({1, 13, 3, 33, nullptr, 55})); + + // assign to "-" + j["/-"_json_pointer] = 99; + CHECK(j == json({1, 13, 3, 33, nullptr, 55, 99})); } + + SECTION("const access") + { + const json j = {1, 2, 3}; + + // check reading access + CHECK(j["/0"_json_pointer] == j[0]); + CHECK(j["/1"_json_pointer] == j[1]); + CHECK(j["/2"_json_pointer] == j[2]); + + // assign to nonexisting index + CHECK_THROWS_AS(j.at("/3"_json_pointer), std::out_of_range); + CHECK_THROWS_WITH(j.at("/3"_json_pointer), "array index 3 is out of range"); + + // assign to nonexisting index (with gap) + CHECK_THROWS_AS(j.at("/5"_json_pointer), std::out_of_range); + CHECK_THROWS_WITH(j.at("/5"_json_pointer), "array index 5 is out of range"); + + // assign to "-" + CHECK_THROWS_AS(j["/-"_json_pointer], std::out_of_range); + CHECK_THROWS_WITH(j["/-"_json_pointer], "array index '-' (3) is out of range"); + CHECK_THROWS_AS(j.at("/-"_json_pointer), std::out_of_range); + CHECK_THROWS_WITH(j.at("/-"_json_pointer), "array index '-' (3) is out of range"); + } + } SECTION("flatten") @@ -12216,21 +12292,27 @@ TEST_CASE("JSON pointers") // check if flattened result is as expected CHECK(j.flatten() == j_flatten); - // check if deflattened result is as expected - CHECK(j_flatten.deflatten() == j); + // check if unflattened result is as expected + CHECK(j_flatten.unflatten() == j); // explicit roundtrip check - CHECK(j.flatten().deflatten() == j); + CHECK(j.flatten().unflatten() == j); // roundtrip for primitive values json j_null; - CHECK(j_null.flatten().deflatten() == j_null); + CHECK(j_null.flatten().unflatten() == j_null); json j_number = 42; - CHECK(j_number.flatten().deflatten() == j_number); + CHECK(j_number.flatten().unflatten() == j_number); json j_boolean = false; - CHECK(j_boolean.flatten().deflatten() == j_boolean); + CHECK(j_boolean.flatten().unflatten() == j_boolean); json j_string = "foo"; - CHECK(j_string.flatten().deflatten() == j_string); + CHECK(j_string.flatten().unflatten() == j_string); + + // roundtrip for empty structured values (will be unflattened to null) + json j_array(json::value_t::array); + CHECK(j_array.flatten().unflatten() == json()); + json j_object(json::value_t::object); + CHECK(j_object.flatten().unflatten() == json()); } } From f883a04c87dd3c3ccd3828172dfe9160376cda67 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 18:18:49 +0200 Subject: [PATCH 012/133] more documentation --- doc/examples/json_pointer.cpp | 46 ++++++++++++++++++++++++++++++++ doc/examples/json_pointer.link | 1 + doc/examples/json_pointer.output | 3 +++ src/json.hpp | 37 +++++++++++++++++-------- src/json.hpp.re2c | 37 +++++++++++++++++-------- 5 files changed, 102 insertions(+), 22 deletions(-) create mode 100644 doc/examples/json_pointer.cpp create mode 100644 doc/examples/json_pointer.link create mode 100644 doc/examples/json_pointer.output diff --git a/doc/examples/json_pointer.cpp b/doc/examples/json_pointer.cpp new file mode 100644 index 000000000..140eac3b6 --- /dev/null +++ b/doc/examples/json_pointer.cpp @@ -0,0 +1,46 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // correct JSON pointers + json::json_pointer p1; + json::json_pointer p2(""); + json::json_pointer p3("/"); + json::json_pointer p4("//"); + json::json_pointer p5("/foo/bar"); + json::json_pointer p6("/foo/bar/-"); + json::json_pointer p7("/foo/~0"); + json::json_pointer p8("/foo/~1"); + + // error: JSON pointer does not begin with a slash + try + { + json::json_pointer p9("foo"); + } + catch (std::domain_error& e) + { + std::cout << "domain_error: " << e.what() << '\n'; + } + + // error: JSON pointer uses escape symbol ~ not followed by 0 or 1 + try + { + json::json_pointer p10("/foo/~"); + } + catch (std::domain_error& e) + { + std::cout << "domain_error: " << e.what() << '\n'; + } + + // error: JSON pointer uses escape symbol ~ not followed by 0 or 1 + try + { + json::json_pointer p11("/foo/~3"); + } + catch (std::domain_error& e) + { + std::cout << "domain_error: " << e.what() << '\n'; + } +} diff --git a/doc/examples/json_pointer.link b/doc/examples/json_pointer.link new file mode 100644 index 000000000..c10c5fb9e --- /dev/null +++ b/doc/examples/json_pointer.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/json_pointer.output b/doc/examples/json_pointer.output new file mode 100644 index 000000000..b81c8a201 --- /dev/null +++ b/doc/examples/json_pointer.output @@ -0,0 +1,3 @@ +domain_error: JSON pointer must be empty or begin with '/' +domain_error: escape error: '~' must be followed with '0' or '1' +domain_error: escape error: '~' must be followed with '0' or '1' diff --git a/src/json.hpp b/src/json.hpp index 6cf369bd9..c40e004a9 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8913,11 +8913,26 @@ basic_json_parser_63: friend class basic_json; public: - /// empty reference token - json_pointer() = default; + /*! + @brief create JSON pointer - /// nonempty reference token - explicit json_pointer(const std::string& s) + Create a JSON pointer according to the syntax described in + [Section 3 of RFC6901](https://tools.ietf.org/html/rfc6901#section-3). + + @param[in] s string representing the JSON pointer; if omitted, the + empty string is assumed which references the whole JSON + value + + @throw std::domain_error if reference token is nonempty and does not + begin with a slash (`/`), or if a tilde (`~`) is not followed + by `0` (representing `~`) or `1` (representing `/`). + + @liveexample{The example shows the construction several valid JSON + pointers as well as the exceptional behavior.,json_pointer} + + @since version 2.0.0 + */ + explicit json_pointer(const std::string& s = "") : reference_tokens(split(s)) {} @@ -8943,19 +8958,19 @@ basic_json_parser_63: { result = &result->operator[](reference_token); } - continue; + break; } case value_t::object: { result = &result->operator[](reference_token); - continue; + break; } case value_t::array: { result = &result->operator[](static_cast(std::stoi(reference_token))); - continue; + break; } default: @@ -9066,7 +9081,7 @@ basic_json_parser_63: case value_t::object: { ptr = &ptr->operator[](reference_token); - continue; + break; } case value_t::array: @@ -9078,7 +9093,7 @@ basic_json_parser_63: ") is out of range"); } ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); - continue; + break; } default: @@ -9100,7 +9115,7 @@ basic_json_parser_63: case value_t::object: { ptr = &ptr->at(reference_token); - continue; + break; } case value_t::array: @@ -9112,7 +9127,7 @@ basic_json_parser_63: ") is out of range"); } ptr = &ptr->at(static_cast(std::stoi(reference_token))); - continue; + break; } default: diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 7fe9673fe..e2ea78b6a 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8223,11 +8223,26 @@ class basic_json friend class basic_json; public: - /// empty reference token - json_pointer() = default; + /*! + @brief create JSON pointer - /// nonempty reference token - explicit json_pointer(const std::string& s) + Create a JSON pointer according to the syntax described in + [Section 3 of RFC6901](https://tools.ietf.org/html/rfc6901#section-3). + + @param[in] s string representing the JSON pointer; if omitted, the + empty string is assumed which references the whole JSON + value + + @throw std::domain_error if reference token is nonempty and does not + begin with a slash (`/`), or if a tilde (`~`) is not followed + by `0` (representing `~`) or `1` (representing `/`). + + @liveexample{The example shows the construction several valid JSON + pointers as well as the exceptional behavior.,json_pointer} + + @since version 2.0.0 + */ + explicit json_pointer(const std::string& s = "") : reference_tokens(split(s)) {} @@ -8253,19 +8268,19 @@ class basic_json { result = &result->operator[](reference_token); } - continue; + break; } case value_t::object: { result = &result->operator[](reference_token); - continue; + break; } case value_t::array: { result = &result->operator[](static_cast(std::stoi(reference_token))); - continue; + break; } default: @@ -8376,7 +8391,7 @@ class basic_json case value_t::object: { ptr = &ptr->operator[](reference_token); - continue; + break; } case value_t::array: @@ -8388,7 +8403,7 @@ class basic_json ") is out of range"); } ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); - continue; + break; } default: @@ -8410,7 +8425,7 @@ class basic_json case value_t::object: { ptr = &ptr->at(reference_token); - continue; + break; } case value_t::array: @@ -8422,7 +8437,7 @@ class basic_json ") is out of range"); } ptr = &ptr->at(static_cast(std::stoi(reference_token))); - continue; + break; } default: From 0835eb293ffa80bab9591fe55656d57d76805f40 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 18:54:54 +0200 Subject: [PATCH 013/133] improved RFC compliance and code coverage --- src/json.hpp | 48 +++++++++++++++++++++++++++++++++++++++++++---- src/json.hpp.re2c | 48 +++++++++++++++++++++++++++++++++++++++++++---- test/unit.cpp | 24 ++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 8 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index c40e004a9..47046c03f 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8992,7 +8992,9 @@ basic_json_parser_63: @complexity Linear in the length of the JSON pointer. - @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number */ reference get_unchecked(pointer ptr) const { @@ -9002,18 +9004,27 @@ basic_json_parser_63: { case value_t::object: { + // use unchecked object access ptr = &ptr->operator[](reference_token); break; } case value_t::array: { + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } + if (reference_token == "-") { + // explicityly treat "-" as index beyond the end ptr = &ptr->operator[](ptr->m_value.array->size()); } else { + // convert array index to number; unchecked access ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); } break; @@ -9037,6 +9048,7 @@ basic_json_parser_63: { case value_t::object: { + // note: at performs range check ptr = &ptr->at(reference_token); break; } @@ -9045,12 +9057,20 @@ basic_json_parser_63: { if (reference_token == "-") { - throw std::out_of_range("cannot resolve reference token '-'"); + // "-" always fails the range check + throw std::out_of_range("array index '-' (" + + std::to_string(ptr->m_value.array->size()) + + ") is out of range"); } - else + + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') { - ptr = &ptr->at(static_cast(std::stoi(reference_token))); + throw std::domain_error("array index must not begin with '0'"); } + + // note: at performs range check + ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } @@ -9080,6 +9100,7 @@ basic_json_parser_63: { case value_t::object: { + // use unchecked object access ptr = &ptr->operator[](reference_token); break; } @@ -9088,10 +9109,19 @@ basic_json_parser_63: { if (reference_token == "-") { + // "-" cannot be used for const access throw std::out_of_range("array index '-' (" + std::to_string(ptr->m_value.array->size()) + ") is out of range"); } + + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } + + // use unchecked array access ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); break; } @@ -9114,6 +9144,7 @@ basic_json_parser_63: { case value_t::object: { + // note: at performs range check ptr = &ptr->at(reference_token); break; } @@ -9122,10 +9153,19 @@ basic_json_parser_63: { if (reference_token == "-") { + // "-" always fails the range check throw std::out_of_range("array index '-' (" + std::to_string(ptr->m_value.array->size()) + ") is out of range"); } + + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } + + // note: at performs range check ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index e2ea78b6a..ac11f08ab 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8302,7 +8302,9 @@ class basic_json @complexity Linear in the length of the JSON pointer. - @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number */ reference get_unchecked(pointer ptr) const { @@ -8312,18 +8314,27 @@ class basic_json { case value_t::object: { + // use unchecked object access ptr = &ptr->operator[](reference_token); break; } case value_t::array: { + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } + if (reference_token == "-") { + // explicityly treat "-" as index beyond the end ptr = &ptr->operator[](ptr->m_value.array->size()); } else { + // convert array index to number; unchecked access ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); } break; @@ -8347,6 +8358,7 @@ class basic_json { case value_t::object: { + // note: at performs range check ptr = &ptr->at(reference_token); break; } @@ -8355,12 +8367,20 @@ class basic_json { if (reference_token == "-") { - throw std::out_of_range("cannot resolve reference token '-'"); + // "-" always fails the range check + throw std::out_of_range("array index '-' (" + + std::to_string(ptr->m_value.array->size()) + + ") is out of range"); } - else + + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') { - ptr = &ptr->at(static_cast(std::stoi(reference_token))); + throw std::domain_error("array index must not begin with '0'"); } + + // note: at performs range check + ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } @@ -8390,6 +8410,7 @@ class basic_json { case value_t::object: { + // use unchecked object access ptr = &ptr->operator[](reference_token); break; } @@ -8398,10 +8419,19 @@ class basic_json { if (reference_token == "-") { + // "-" cannot be used for const access throw std::out_of_range("array index '-' (" + std::to_string(ptr->m_value.array->size()) + ") is out of range"); } + + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } + + // use unchecked array access ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); break; } @@ -8424,6 +8454,7 @@ class basic_json { case value_t::object: { + // note: at performs range check ptr = &ptr->at(reference_token); break; } @@ -8432,10 +8463,19 @@ class basic_json { if (reference_token == "-") { + // "-" always fails the range check throw std::out_of_range("array index '-' (" + std::to_string(ptr->m_value.array->size()) + ") is out of range"); } + + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } + + // note: at performs range check ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } diff --git a/test/unit.cpp b/test/unit.cpp index a3b9035d2..f4d162e1a 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12196,6 +12196,7 @@ TEST_CASE("JSON pointers") SECTION("nonconst access") { json j = {1, 2, 3}; + const json j_const = j; // check reading access CHECK(j["/0"_json_pointer] == j[0]); @@ -12214,9 +12215,32 @@ TEST_CASE("JSON pointers") j["/5"_json_pointer] = 55; CHECK(j == json({1, 13, 3, 33, nullptr, 55})); + // error with leading 0 + CHECK_THROWS_AS(j["/01"_json_pointer], std::domain_error); + CHECK_THROWS_WITH(j["/01"_json_pointer], "array index must not begin with '0'"); + CHECK_THROWS_AS(j_const["/01"_json_pointer], std::domain_error); + CHECK_THROWS_WITH(j_const["/01"_json_pointer], "array index must not begin with '0'"); + CHECK_THROWS_AS(j.at("/01"_json_pointer), std::domain_error); + CHECK_THROWS_WITH(j.at("/01"_json_pointer), "array index must not begin with '0'"); + CHECK_THROWS_AS(j_const.at("/01"_json_pointer), std::domain_error); + CHECK_THROWS_WITH(j_const.at("/01"_json_pointer), "array index must not begin with '0'"); + + // error with incorrect numbers + CHECK_THROWS_AS(j["/one"_json_pointer] = 1, std::invalid_argument); + // assign to "-" j["/-"_json_pointer] = 99; CHECK(j == json({1, 13, 3, 33, nullptr, 55, 99})); + + // error when using "-" in const object + CHECK_THROWS_AS(j_const["/-"_json_pointer], std::out_of_range); + CHECK_THROWS_WITH(j_const["/-"_json_pointer], "array index '-' (3) is out of range"); + + // error when using "-" with at + CHECK_THROWS_AS(j.at("/-"_json_pointer), std::out_of_range); + CHECK_THROWS_WITH(j.at("/-"_json_pointer), "array index '-' (7) is out of range"); + CHECK_THROWS_AS(j_const.at("/-"_json_pointer), std::out_of_range); + CHECK_THROWS_WITH(j_const.at("/-"_json_pointer), "array index '-' (3) is out of range"); } SECTION("const access") From 7034ae2486fa58a2cf31bfc86c42f4c07a6e7b23 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 19:12:12 +0200 Subject: [PATCH 014/133] improved test coverage --- test/unit.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/test/unit.cpp b/test/unit.cpp index f4d162e1a..f79a29fdc 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12095,6 +12095,10 @@ TEST_CASE("JSON pointers") CHECK(j[json::json_pointer("/foo/1")] == j["foo"][1]); CHECK(j["/foo/1"_json_pointer] == j["foo"][1]); + // checked array access + CHECK(j.at(json::json_pointer("/foo/0")) == j["foo"][0]); + CHECK(j.at(json::json_pointer("/foo/1")) == j["foo"][1]); + // empty string access CHECK(j[json::json_pointer("/")] == j[""]); @@ -12106,6 +12110,14 @@ TEST_CASE("JSON pointers") CHECK(j[json::json_pointer("/i\\j")] == j["i\\j"]); CHECK(j[json::json_pointer("/k\"l")] == j["k\"l"]); + // checked access + CHECK(j.at(json::json_pointer("/ ")) == j[" "]); + CHECK(j.at(json::json_pointer("/c%d")) == j["c%d"]); + CHECK(j.at(json::json_pointer("/e^f")) == j["e^f"]); + CHECK(j.at(json::json_pointer("/g|h")) == j["g|h"]); + CHECK(j.at(json::json_pointer("/i\\j")) == j["i\\j"]); + CHECK(j.at(json::json_pointer("/k\"l")) == j["k\"l"]); + // escaped access CHECK(j[json::json_pointer("/a~1b")] == j["a/b"]); CHECK(j[json::json_pointer("/m~0n")] == j["m~n"]); @@ -12115,6 +12127,13 @@ TEST_CASE("JSON pointers") CHECK_THROWS_WITH(j[json::json_pointer("/a/b")], "unresolved reference token 'b'"); // "/a/b" works for JSON {"a": {"b": 42}} CHECK(json({{"a", {{"b", 42}}}})[json::json_pointer("/a/b")] == json(42)); + + // unresolved access + json j_primitive = 1; + CHECK_THROWS_AS(j_primitive["/foo"_json_pointer], std::out_of_range); + CHECK_THROWS_WITH(j_primitive["/foo"_json_pointer], "unresolved reference token 'foo'"); + CHECK_THROWS_AS(j_primitive.at("/foo"_json_pointer), std::out_of_range); + CHECK_THROWS_WITH(j_primitive.at("/foo"_json_pointer), "unresolved reference token 'foo'"); } SECTION("const access") @@ -12144,6 +12163,10 @@ TEST_CASE("JSON pointers") CHECK(j[json::json_pointer("/foo/1")] == j["foo"][1]); CHECK(j["/foo/1"_json_pointer] == j["foo"][1]); + // checked array access + CHECK(j.at(json::json_pointer("/foo/0")) == j["foo"][0]); + CHECK(j.at(json::json_pointer("/foo/1")) == j["foo"][1]); + // empty string access CHECK(j[json::json_pointer("/")] == j[""]); @@ -12155,6 +12178,14 @@ TEST_CASE("JSON pointers") CHECK(j[json::json_pointer("/i\\j")] == j["i\\j"]); CHECK(j[json::json_pointer("/k\"l")] == j["k\"l"]); + // checked access + CHECK(j.at(json::json_pointer("/ ")) == j[" "]); + CHECK(j.at(json::json_pointer("/c%d")) == j["c%d"]); + CHECK(j.at(json::json_pointer("/e^f")) == j["e^f"]); + CHECK(j.at(json::json_pointer("/g|h")) == j["g|h"]); + CHECK(j.at(json::json_pointer("/i\\j")) == j["i\\j"]); + CHECK(j.at(json::json_pointer("/k\"l")) == j["k\"l"]); + // escaped access CHECK(j[json::json_pointer("/a~1b")] == j["a/b"]); CHECK(j[json::json_pointer("/m~0n")] == j["m~n"]); @@ -12162,6 +12193,13 @@ TEST_CASE("JSON pointers") // unescaped access CHECK_THROWS_AS(j.at(json::json_pointer("/a/b")), std::out_of_range); CHECK_THROWS_WITH(j.at(json::json_pointer("/a/b")), "key 'a' not found"); + + // unresolved access + const json j_primitive = 1; + CHECK_THROWS_AS(j_primitive["/foo"_json_pointer], std::out_of_range); + CHECK_THROWS_WITH(j_primitive["/foo"_json_pointer], "unresolved reference token 'foo'"); + CHECK_THROWS_AS(j_primitive.at("/foo"_json_pointer), std::out_of_range); + CHECK_THROWS_WITH(j_primitive.at("/foo"_json_pointer), "unresolved reference token 'foo'"); } SECTION("user-defined string literal") @@ -12319,6 +12357,14 @@ TEST_CASE("JSON pointers") // check if unflattened result is as expected CHECK(j_flatten.unflatten() == j); + // error for nonobjects + CHECK_THROWS_AS(json(1).unflatten(), std::domain_error); + CHECK_THROWS_WITH(json(1).unflatten(), "only objects can be unflattened"); + + // error for nonprimitve values + CHECK_THROWS_AS(json({{"/1", {1, 2, 3}}}).unflatten(), std::domain_error); + CHECK_THROWS_WITH(json({{"/1", {1, 2, 3}}}).unflatten(), "values in object must be primitive"); + // explicit roundtrip check CHECK(j.flatten().unflatten() == j); From 6268287940ce3a2523fda959ed1efe7d5f0051c4 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 22:08:21 +0200 Subject: [PATCH 015/133] improved documentation and test coverage --- README.md | 2 +- doc/examples/flatten.cpp | 3 ++ doc/examples/flatten.link | 2 +- doc/examples/flatten.output | 1 + src/json.hpp | 58 ++++++++++++++++++++++++++++++------- src/json.hpp.re2c | 58 ++++++++++++++++++++++++++++++------- test/unit.cpp | 5 ++++ 7 files changed, 105 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index d39663ee3..2dd60bf13 100644 --- a/README.md +++ b/README.md @@ -428,7 +428,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (3344299 assertions in 29 test cases) +All tests passed (3344416 assertions in 30 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/doc/examples/flatten.cpp b/doc/examples/flatten.cpp index 5d7692028..0601f8a3f 100644 --- a/doc/examples/flatten.cpp +++ b/doc/examples/flatten.cpp @@ -31,4 +31,7 @@ int main() // call flatten() std::cout << std::setw(4) << j.flatten() << '\n'; + + // flatten for a primitive value + std::cout << j["pi"].flatten() << '\n'; } diff --git a/doc/examples/flatten.link b/doc/examples/flatten.link index 70ba78baa..0fe78bbb1 100644 --- a/doc/examples/flatten.link +++ b/doc/examples/flatten.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/flatten.output b/doc/examples/flatten.output index beb368faf..fedfc8ef2 100644 --- a/doc/examples/flatten.output +++ b/doc/examples/flatten.output @@ -14,3 +14,4 @@ "/object/~1": "slash", "/pi": 3.141 } +{"":3.141} diff --git a/src/json.hpp b/src/json.hpp index 47046c03f..030c8f2cc 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -3273,8 +3273,8 @@ class basic_json @return reference to the element at index @a idx - @throw std::domain_error if JSON is not an array or null; example: `"cannot - use operator[] with string"` + @throw std::domain_error if JSON is not an array or null; example: + `"cannot use operator[] with string"` @complexity Constant if @a idx is in the range of the array. Otherwise linear in `idx - size()`. @@ -3620,7 +3620,9 @@ class basic_json @complexity Linear in the length of the JSON pointer. - @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number @liveexample{The behavior is shown in the example.,operatorjson_pointer} @@ -3645,8 +3647,9 @@ class basic_json @complexity Linear in the length of the JSON pointer. - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::out_of_range if the special value `-` is used for an array + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number @liveexample{The behavior is shown in the example., operatorjson_pointer_const} @@ -8923,9 +8926,12 @@ basic_json_parser_63: empty string is assumed which references the whole JSON value - @throw std::domain_error if reference token is nonempty and does not - begin with a slash (`/`), or if a tilde (`~`) is not followed - by `0` (representing `~`) or `1` (representing `/`). + @throw std::domain_error if reference token is nonempty and does not + begin with a slash (`/`); example: `"JSON pointer must be empty or + begin with /"` + @throw std::domain_error if a tilde (`~`) is not followed by `0` + (representing `~`) or `1` (representing `/`); example: `"escape error: + ~ must be followed with 0 or 1"` @liveexample{The example shows the construction several valid JSON pointers as well as the exceptional behavior.,json_pointer} @@ -8944,6 +8950,8 @@ basic_json_parser_63: { pointer result = &j; + // in case no reference tokens exist, return a reference to the + // JSON value j which will be overwritten by a primitive value for (const auto& reference_token : reference_tokens) { switch (result->m_type) @@ -8952,10 +8960,12 @@ basic_json_parser_63: { if (reference_token == "0") { + // start a new array if reference token is 0 result = &result->operator[](0); } else { + // start a new object otherwise result = &result->operator[](reference_token); } break; @@ -8963,19 +8973,38 @@ basic_json_parser_63: case value_t::object: { + // create an entry in the object result = &result->operator[](reference_token); break; } case value_t::array: { + // create an entry in the array result = &result->operator[](static_cast(std::stoi(reference_token))); break; } + /* + This function is only to be called from the unflatten() + function. There, j is initially of type null. + + - In case the reference tokens are empty, a reference to + j is returned and overwritten by the desired value by + the unflatten() function. + - If there are reference tokens, the null value of j will + be changed to an object or array after reading the first + reference token. + - All subsequent tokens work on arrays or objects and will + not change the type of j. + + Consequently, the type of @a j will always be null, + object, or array. Hence, the following line is + unreachable. + */ default: { - throw std::domain_error("unresolved reference token '" + reference_token + "'"); + break; // LCOV_EXCL_LINE } } } @@ -9361,7 +9390,11 @@ basic_json_parser_63: throw std::domain_error("values in object must be primitive"); } - // assign value to reference pointed to by JSON pointer + // assign value to reference pointed to by JSON pointer; + // Note that if the JSON pointer is "" (i.e., points to the + // whole value), function get_and_create returns a reference + // to result itself. An assignment will then create a + // primitive value. json_pointer(element.first).get_and_create(result) = element.second; } @@ -9390,7 +9423,8 @@ basic_json_parser_63: @return an object that maps JSON pointers to primitve values - @note Empty objects and arrays are flattened to `null`. + @note Empty objects and arrays are flattened to `null` and will not be + reconstructed correctly by the @ref unflatten() function. @complexity Linear in the size the JSON value. @@ -9428,6 +9462,8 @@ basic_json_parser_63: @complexity Linear in the size the JSON value. + @throws std::domain_error + @liveexample{The following code shows how a flattened JSON object is unflattened into the original nested JSON object.,unflatten} diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index ac11f08ab..f5fbe65bf 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -3273,8 +3273,8 @@ class basic_json @return reference to the element at index @a idx - @throw std::domain_error if JSON is not an array or null; example: `"cannot - use operator[] with string"` + @throw std::domain_error if JSON is not an array or null; example: + `"cannot use operator[] with string"` @complexity Constant if @a idx is in the range of the array. Otherwise linear in `idx - size()`. @@ -3620,7 +3620,9 @@ class basic_json @complexity Linear in the length of the JSON pointer. - @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number @liveexample{The behavior is shown in the example.,operatorjson_pointer} @@ -3645,8 +3647,9 @@ class basic_json @complexity Linear in the length of the JSON pointer. - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::out_of_range if the special value `-` is used for an array + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number @liveexample{The behavior is shown in the example., operatorjson_pointer_const} @@ -8233,9 +8236,12 @@ class basic_json empty string is assumed which references the whole JSON value - @throw std::domain_error if reference token is nonempty and does not - begin with a slash (`/`), or if a tilde (`~`) is not followed - by `0` (representing `~`) or `1` (representing `/`). + @throw std::domain_error if reference token is nonempty and does not + begin with a slash (`/`); example: `"JSON pointer must be empty or + begin with /"` + @throw std::domain_error if a tilde (`~`) is not followed by `0` + (representing `~`) or `1` (representing `/`); example: `"escape error: + ~ must be followed with 0 or 1"` @liveexample{The example shows the construction several valid JSON pointers as well as the exceptional behavior.,json_pointer} @@ -8254,6 +8260,8 @@ class basic_json { pointer result = &j; + // in case no reference tokens exist, return a reference to the + // JSON value j which will be overwritten by a primitive value for (const auto& reference_token : reference_tokens) { switch (result->m_type) @@ -8262,10 +8270,12 @@ class basic_json { if (reference_token == "0") { + // start a new array if reference token is 0 result = &result->operator[](0); } else { + // start a new object otherwise result = &result->operator[](reference_token); } break; @@ -8273,19 +8283,38 @@ class basic_json case value_t::object: { + // create an entry in the object result = &result->operator[](reference_token); break; } case value_t::array: { + // create an entry in the array result = &result->operator[](static_cast(std::stoi(reference_token))); break; } + /* + This function is only to be called from the unflatten() + function. There, j is initially of type null. + + - In case the reference tokens are empty, a reference to + j is returned and overwritten by the desired value by + the unflatten() function. + - If there are reference tokens, the null value of j will + be changed to an object or array after reading the first + reference token. + - All subsequent tokens work on arrays or objects and will + not change the type of j. + + Consequently, the type of @a j will always be null, + object, or array. Hence, the following line is + unreachable. + */ default: { - throw std::domain_error("unresolved reference token '" + reference_token + "'"); + break; // LCOV_EXCL_LINE } } } @@ -8671,7 +8700,11 @@ class basic_json throw std::domain_error("values in object must be primitive"); } - // assign value to reference pointed to by JSON pointer + // assign value to reference pointed to by JSON pointer; + // Note that if the JSON pointer is "" (i.e., points to the + // whole value), function get_and_create returns a reference + // to result itself. An assignment will then create a + // primitive value. json_pointer(element.first).get_and_create(result) = element.second; } @@ -8700,7 +8733,8 @@ class basic_json @return an object that maps JSON pointers to primitve values - @note Empty objects and arrays are flattened to `null`. + @note Empty objects and arrays are flattened to `null` and will not be + reconstructed correctly by the @ref unflatten() function. @complexity Linear in the size the JSON value. @@ -8738,6 +8772,8 @@ class basic_json @complexity Linear in the size the JSON value. + @throws std::domain_error + @liveexample{The following code shows how a flattened JSON object is unflattened into the original nested JSON object.,unflatten} diff --git a/test/unit.cpp b/test/unit.cpp index f79a29fdc..f5a6fc094 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12365,6 +12365,11 @@ TEST_CASE("JSON pointers") CHECK_THROWS_AS(json({{"/1", {1, 2, 3}}}).unflatten(), std::domain_error); CHECK_THROWS_WITH(json({{"/1", {1, 2, 3}}}).unflatten(), "values in object must be primitive"); + // error for conflicting values + json j_error = {{"", 42}, {"/foo", 17}}; + CHECK_THROWS_AS(j_error.unflatten(), std::domain_error); + CHECK_THROWS_WITH(j_error.unflatten(), "unresolved reference token 'foo'"); + // explicit roundtrip check CHECK(j.flatten().unflatten() == j); From 1dee40a9697dd4bc22ed6dd13ad5c928d44ff0f6 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 22:34:39 +0200 Subject: [PATCH 016/133] fixed test case --- src/json.hpp | 24 ++++++------------------ src/json.hpp.re2c | 24 ++++++------------------ test/unit.cpp | 2 +- 3 files changed, 13 insertions(+), 37 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 030c8f2cc..5fdba1404 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8986,25 +8986,15 @@ basic_json_parser_63: } /* - This function is only to be called from the unflatten() - function. There, j is initially of type null. - - - In case the reference tokens are empty, a reference to - j is returned and overwritten by the desired value by - the unflatten() function. - - If there are reference tokens, the null value of j will - be changed to an object or array after reading the first - reference token. - - All subsequent tokens work on arrays or objects and will - not change the type of j. - - Consequently, the type of @a j will always be null, - object, or array. Hence, the following line is - unreachable. + The following code is only reached if there exists a + reference token _and_ the current value is primitive. In + this case, we have an error situation, because primitive + values may only occur as single value; that is, with an + empty list of reference tokens. */ default: { - break; // LCOV_EXCL_LINE + throw std::domain_error("invalid value to unflatten"); } } } @@ -9462,8 +9452,6 @@ basic_json_parser_63: @complexity Linear in the size the JSON value. - @throws std::domain_error - @liveexample{The following code shows how a flattened JSON object is unflattened into the original nested JSON object.,unflatten} diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index f5fbe65bf..95a484f86 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8296,25 +8296,15 @@ class basic_json } /* - This function is only to be called from the unflatten() - function. There, j is initially of type null. - - - In case the reference tokens are empty, a reference to - j is returned and overwritten by the desired value by - the unflatten() function. - - If there are reference tokens, the null value of j will - be changed to an object or array after reading the first - reference token. - - All subsequent tokens work on arrays or objects and will - not change the type of j. - - Consequently, the type of @a j will always be null, - object, or array. Hence, the following line is - unreachable. + The following code is only reached if there exists a + reference token _and_ the current value is primitive. In + this case, we have an error situation, because primitive + values may only occur as single value; that is, with an + empty list of reference tokens. */ default: { - break; // LCOV_EXCL_LINE + throw std::domain_error("invalid value to unflatten"); } } } @@ -8772,8 +8762,6 @@ class basic_json @complexity Linear in the size the JSON value. - @throws std::domain_error - @liveexample{The following code shows how a flattened JSON object is unflattened into the original nested JSON object.,unflatten} diff --git a/test/unit.cpp b/test/unit.cpp index f5a6fc094..2666e1111 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12368,7 +12368,7 @@ TEST_CASE("JSON pointers") // error for conflicting values json j_error = {{"", 42}, {"/foo", 17}}; CHECK_THROWS_AS(j_error.unflatten(), std::domain_error); - CHECK_THROWS_WITH(j_error.unflatten(), "unresolved reference token 'foo'"); + CHECK_THROWS_WITH(j_error.unflatten(), "invalid value to unflatten"); // explicit roundtrip check CHECK(j.flatten().unflatten() == j); From 08c97df4207282c280b252609d8d64f0dda80ed9 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 23:18:07 +0200 Subject: [PATCH 017/133] added examples --- doc/examples/at_json_pointer.cpp | 35 +++++++++++++++++ doc/examples/at_json_pointer.link | 1 + doc/examples/at_json_pointer.output | 6 +++ doc/examples/at_json_pointer_const.cpp | 23 +++++++++++ doc/examples/at_json_pointer_const.link | 1 + doc/examples/at_json_pointer_const.output | 4 ++ src/json.hpp | 47 ++++++++++++++++++----- src/json.hpp.re2c | 47 ++++++++++++++++++----- 8 files changed, 144 insertions(+), 20 deletions(-) create mode 100644 doc/examples/at_json_pointer.cpp create mode 100644 doc/examples/at_json_pointer.link create mode 100644 doc/examples/at_json_pointer.output create mode 100644 doc/examples/at_json_pointer_const.cpp create mode 100644 doc/examples/at_json_pointer_const.link create mode 100644 doc/examples/at_json_pointer_const.output diff --git a/doc/examples/at_json_pointer.cpp b/doc/examples/at_json_pointer.cpp new file mode 100644 index 000000000..0665e608c --- /dev/null +++ b/doc/examples/at_json_pointer.cpp @@ -0,0 +1,35 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // create a JSON value + json j = + { + {"number", 1}, {"string", "foo"}, {"array", {1, 2}} + }; + + // read-only access + + // output element with JSON pointer "/number" + std::cout << j.at("/number"_json_pointer) << '\n'; + // output element with JSON pointer "/string" + std::cout << j.at("/string"_json_pointer) << '\n'; + // output element with JSON pointer "/array" + std::cout << j.at("/array"_json_pointer) << '\n'; + // output element with JSON pointer "/array/1" + std::cout << j.at("/array/1"_json_pointer) << '\n'; + + // writing access + + // change the string + j.at("/string"_json_pointer) = "bar"; + // output the changed string + std::cout << j["string"] << '\n'; + + // change an array element + j.at("/array/1"_json_pointer) = 21; + // output the changed array + std::cout << j["array"] << '\n'; +} diff --git a/doc/examples/at_json_pointer.link b/doc/examples/at_json_pointer.link new file mode 100644 index 000000000..5356294e2 --- /dev/null +++ b/doc/examples/at_json_pointer.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/at_json_pointer.output b/doc/examples/at_json_pointer.output new file mode 100644 index 000000000..11913c723 --- /dev/null +++ b/doc/examples/at_json_pointer.output @@ -0,0 +1,6 @@ +1 +"foo" +[1,2] +2 +"bar" +[1,21] diff --git a/doc/examples/at_json_pointer_const.cpp b/doc/examples/at_json_pointer_const.cpp new file mode 100644 index 000000000..e3cfc5154 --- /dev/null +++ b/doc/examples/at_json_pointer_const.cpp @@ -0,0 +1,23 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // create a JSON value + json j = + { + {"number", 1}, {"string", "foo"}, {"array", {1, 2}} + }; + + // read-only access + + // output element with JSON pointer "/number" + std::cout << j.at("/number"_json_pointer) << '\n'; + // output element with JSON pointer "/string" + std::cout << j.at("/string"_json_pointer) << '\n'; + // output element with JSON pointer "/array" + std::cout << j.at("/array"_json_pointer) << '\n'; + // output element with JSON pointer "/array/1" + std::cout << j.at("/array/1"_json_pointer) << '\n'; +} diff --git a/doc/examples/at_json_pointer_const.link b/doc/examples/at_json_pointer_const.link new file mode 100644 index 000000000..905e60d34 --- /dev/null +++ b/doc/examples/at_json_pointer_const.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/at_json_pointer_const.output b/doc/examples/at_json_pointer_const.output new file mode 100644 index 000000000..7b9306bbc --- /dev/null +++ b/doc/examples/at_json_pointer_const.output @@ -0,0 +1,4 @@ +1 +"foo" +[1,2] +2 diff --git a/src/json.hpp b/src/json.hpp index 5fdba1404..ffa460673 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -3616,9 +3616,9 @@ class basic_json @param[in] ptr a JSON pointer - @return reference to the JSON value pointed to by @a ptr + @return reference to the element pointed to by @a ptr - @complexity Linear in the length of the JSON pointer. + @complexity Constant. @throw std::out_of_range if the JSON pointer can not be resolved @throw std::domain_error if an array index begins with '0' @@ -3641,18 +3641,17 @@ class basic_json value; no `null` values are created. In particular, the the special value `-` yields an exception. - @param[in] ptr a JSON pointer + @param[in] ptr JSON pointer to the desired element - @return reference to the JSON value pointed to by @a ptr + @return const reference to the element pointed to by @a ptr - @complexity Linear in the length of the JSON pointer. + @complexity Constant. @throw std::out_of_range if the JSON pointer can not be resolved @throw std::domain_error if an array index begins with '0' @throw std::invalid_argument if an array index was not a number - @liveexample{The behavior is shown in the example., - operatorjson_pointer_const} + @liveexample{The behavior is shown in the example.,operatorjson_pointer_const} @since version 2.0.0 */ @@ -3664,9 +3663,20 @@ class basic_json /*! @brief access specified element via JSON Pointer - Returns a reference to the element at with specified JSON pointer @a ptr. + Returns a reference to the element at with specified JSON pointer @a ptr, + with bounds checking. - @param ptr JSON pointer to the desired element + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer} @since version 2.0.0 */ @@ -3676,7 +3686,24 @@ class basic_json } /*! - @copydoc basic_json::at(const json_pointer&) + @brief access specified element via JSON Pointer + + Returns a const reference to the element at with specified JSON pointer + @a ptr, with bounds checking. + + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer_const} + + @since version 2.0.0 */ const_reference at(const json_pointer& ptr) const { diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 95a484f86..ced7ffba2 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -3616,9 +3616,9 @@ class basic_json @param[in] ptr a JSON pointer - @return reference to the JSON value pointed to by @a ptr + @return reference to the element pointed to by @a ptr - @complexity Linear in the length of the JSON pointer. + @complexity Constant. @throw std::out_of_range if the JSON pointer can not be resolved @throw std::domain_error if an array index begins with '0' @@ -3641,18 +3641,17 @@ class basic_json value; no `null` values are created. In particular, the the special value `-` yields an exception. - @param[in] ptr a JSON pointer + @param[in] ptr JSON pointer to the desired element - @return reference to the JSON value pointed to by @a ptr + @return const reference to the element pointed to by @a ptr - @complexity Linear in the length of the JSON pointer. + @complexity Constant. @throw std::out_of_range if the JSON pointer can not be resolved @throw std::domain_error if an array index begins with '0' @throw std::invalid_argument if an array index was not a number - @liveexample{The behavior is shown in the example., - operatorjson_pointer_const} + @liveexample{The behavior is shown in the example.,operatorjson_pointer_const} @since version 2.0.0 */ @@ -3664,9 +3663,20 @@ class basic_json /*! @brief access specified element via JSON Pointer - Returns a reference to the element at with specified JSON pointer @a ptr. + Returns a reference to the element at with specified JSON pointer @a ptr, + with bounds checking. - @param ptr JSON pointer to the desired element + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer} @since version 2.0.0 */ @@ -3676,7 +3686,24 @@ class basic_json } /*! - @copydoc basic_json::at(const json_pointer&) + @brief access specified element via JSON Pointer + + Returns a const reference to the element at with specified JSON pointer + @a ptr, with bounds checking. + + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer_const} + + @since version 2.0.0 */ const_reference at(const json_pointer& ptr) const { From f4107d0d9c2ca274eaa484de821ca26b5d35dceb Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 23:36:37 +0200 Subject: [PATCH 018/133] updated documentation --- doc/examples/operator__equal.output | 2 +- doc/examples/operator__equal.test | 4 ++++ doc/examples/operator__notequal.output | 2 +- doc/examples/operator__notequal.test | 4 ++++ 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 doc/examples/operator__equal.test create mode 100644 doc/examples/operator__notequal.test diff --git a/doc/examples/operator__equal.output b/doc/examples/operator__equal.output index 780673556..e9dfd7551 100644 --- a/doc/examples/operator__equal.output +++ b/doc/examples/operator__equal.output @@ -1,4 +1,4 @@ [1,2,3] == [1,2,4] false {"A":"a","B":"b"} == {"A":"a","B":"b"} true -17 == 17.0 true +17 == 17 true "foo" == "bar" false diff --git a/doc/examples/operator__equal.test b/doc/examples/operator__equal.test new file mode 100644 index 000000000..e9dfd7551 --- /dev/null +++ b/doc/examples/operator__equal.test @@ -0,0 +1,4 @@ +[1,2,3] == [1,2,4] false +{"A":"a","B":"b"} == {"A":"a","B":"b"} true +17 == 17 true +"foo" == "bar" false diff --git a/doc/examples/operator__notequal.output b/doc/examples/operator__notequal.output index 9eba626e3..ddd838b4a 100644 --- a/doc/examples/operator__notequal.output +++ b/doc/examples/operator__notequal.output @@ -1,4 +1,4 @@ [1,2,3] == [1,2,4] true {"A":"a","B":"b"} == {"A":"a","B":"b"} false -17 == 17.0 false +17 == 17 false "foo" == "bar" true diff --git a/doc/examples/operator__notequal.test b/doc/examples/operator__notequal.test new file mode 100644 index 000000000..ddd838b4a --- /dev/null +++ b/doc/examples/operator__notequal.test @@ -0,0 +1,4 @@ +[1,2,3] == [1,2,4] true +{"A":"a","B":"b"} == {"A":"a","B":"b"} false +17 == 17 false +"foo" == "bar" true From 3ca1bfdd9d4d622132340363862296996fa03d6d Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 23:41:52 +0200 Subject: [PATCH 019/133] made a function static --- src/json.hpp | 2 +- src/json.hpp.re2c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index ffa460673..57a8f4c72 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9227,7 +9227,7 @@ basic_json_parser_63: } /// split the string input to reference tokens - std::vector split(std::string reference_string) + static std::vector split(std::string reference_string) { std::vector result; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index ced7ffba2..cdd96ee91 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8537,7 +8537,7 @@ class basic_json } /// split the string input to reference tokens - std::vector split(std::string reference_string) + static std::vector split(std::string reference_string) { std::vector result; From 70fc5835cb4758b73fdab800380a7e3246ff79f7 Mon Sep 17 00:00:00 2001 From: Niels Date: Mon, 18 Apr 2016 22:41:36 +0200 Subject: [PATCH 020/133] started implementing JSON Patch (RFC 6902) --- src/json.hpp | 95 +++++++++++++++++++ src/json.hpp.re2c | 95 +++++++++++++++++++ test/unit.cpp | 226 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 416 insertions(+) diff --git a/src/json.hpp b/src/json.hpp index 57a8f4c72..421b99953 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9492,6 +9492,101 @@ basic_json_parser_63: } /// @} + + /*! + @brief applies a JSON patch + + @param[in] patch JSON patch document + @return patched document + + @note The original JSON value is not changed; that is, the patch is + applied to a copy of the value. + + @sa [RFC 6902](https://tools.ietf.org/html/rfc6902) + */ + basic_json apply_patch(const basic_json& patch) const + { + basic_json result = *this; + + if (not patch.is_array()) + { + // a JSON patch must be an array of objects + throw std::domain_error("JSON patch must be an array of objects"); + } + + for (const auto& val : patch) + { + if (not val.is_object()) + { + throw std::domain_error("JSON patch must be an array of objects"); + } + + // collect members + const auto it_op = val.m_value.object->find("op"); + const auto it_path = val.m_value.object->find("path"); + const auto it_value = val.m_value.object->find("value"); + + if (it_op == val.m_value.object->end() or not it_op->second.is_string()) + { + throw std::domain_error("operation must have a string 'op' member"); + } + + if (it_path == val.m_value.object->end() or not it_op->second.is_string()) + { + throw std::domain_error("operation must have a string 'path' member"); + } + + const std::string op = it_op->second; + const std::string path = it_path->second; + const json_pointer ptr(path); + + if (op == "add") + { + if (it_value == val.m_value.object->end()) + { + throw std::domain_error("'add' operation must have member 'value'"); + } + + result[ptr] = it_value->second; + } + else if (op == "remove") + { + } + else if (op == "replace") + { + if (it_value == val.m_value.object->end()) + { + throw std::domain_error("'replace' operation must have member 'value'"); + } + } + else if (op == "move") + { + } + else if (op == "copy") + { + } + else if (op == "test") + { + if (it_value == val.m_value.object->end()) + { + throw std::domain_error("'test' operation must have member 'value'"); + } + + if (result.at(ptr) != it_value->second) + { + throw std::domain_error("unsuccessful: " + val.dump()); + } + } + else + { + // op must be "add", "remove", "replace", "move", + // "copy", or "test" + throw std::domain_error("operation value '" + op + "' is invalid"); + } + } + + return result; + } }; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index cdd96ee91..3f839737f 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8802,6 +8802,101 @@ class basic_json } /// @} + + /*! + @brief applies a JSON patch + + @param[in] patch JSON patch document + @return patched document + + @note The original JSON value is not changed; that is, the patch is + applied to a copy of the value. + + @sa [RFC 6902](https://tools.ietf.org/html/rfc6902) + */ + basic_json apply_patch(const basic_json& patch) const + { + basic_json result = *this; + + if (not patch.is_array()) + { + // a JSON patch must be an array of objects + throw std::domain_error("JSON patch must be an array of objects"); + } + + for (const auto& val : patch) + { + if (not val.is_object()) + { + throw std::domain_error("JSON patch must be an array of objects"); + } + + // collect members + const auto it_op = val.m_value.object->find("op"); + const auto it_path = val.m_value.object->find("path"); + const auto it_value = val.m_value.object->find("value"); + + if (it_op == val.m_value.object->end() or not it_op->second.is_string()) + { + throw std::domain_error("operation must have a string 'op' member"); + } + + if (it_path == val.m_value.object->end() or not it_op->second.is_string()) + { + throw std::domain_error("operation must have a string 'path' member"); + } + + const std::string op = it_op->second; + const std::string path = it_path->second; + const json_pointer ptr(path); + + if (op == "add") + { + if (it_value == val.m_value.object->end()) + { + throw std::domain_error("'add' operation must have member 'value'"); + } + + result[ptr] = it_value->second; + } + else if (op == "remove") + { + } + else if (op == "replace") + { + if (it_value == val.m_value.object->end()) + { + throw std::domain_error("'replace' operation must have member 'value'"); + } + } + else if (op == "move") + { + } + else if (op == "copy") + { + } + else if (op == "test") + { + if (it_value == val.m_value.object->end()) + { + throw std::domain_error("'test' operation must have member 'value'"); + } + + if (result.at(ptr) != it_value->second) + { + throw std::domain_error("unsuccessful: " + val.dump()); + } + } + else + { + // op must be "add", "remove", "replace", "move", + // "copy", or "test" + throw std::domain_error("operation value '" + op + "' is invalid"); + } + } + + return result; + } }; diff --git a/test/unit.cpp b/test/unit.cpp index 2666e1111..7a91efd70 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12391,6 +12391,232 @@ TEST_CASE("JSON pointers") } } +TEST_CASE("JSON patch") +{ + SECTION("examples from RFC 6902") + { + SECTION("example A.1 - Adding an Object Member") + { + // An example target JSON document: + json doc = R"( + { "foo": "bar"} + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/baz", "value": "qux" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + + SECTION("example A.8 - Testing a Value: Success") + { + // An example target JSON document: + json doc = R"( + { + "baz": "qux", + "foo": [ "a", 2, "c" ] + } + )"_json; + + // A JSON Patch document that will result in successful evaluation: + json patch = R"( + [ + { "op": "test", "path": "/baz", "value": "qux" }, + { "op": "test", "path": "/foo/1", "value": 2 } + ] + )"_json; + + // check if evaluation does not throw + CHECK_NOTHROW(doc.apply_patch(patch)); + // check if patched document is unchanged + CHECK(doc.apply_patch(patch) == doc); + } + + SECTION("example A.9 - Testing a Value: Error") + { + // An example target JSON document: + json doc = R"( + { "baz": "qux" } + )"_json; + + // A JSON Patch document that will result in an error condition: + json patch = R"( + [ + { "op": "test", "path": "/baz", "value": "bar" } + ] + )"_json; + + // check that evaluation throws + CHECK_THROWS_AS(doc.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(doc.apply_patch(patch), "unsuccessful: " + patch[0].dump()); + } + + SECTION("example A.10 - Adding a Nested Member Object") + { + // An example target JSON document: + json doc = R"( + { "foo": "bar" } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/child", "value": { "grandchild": { } } } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { + "foo": "bar", + "child": { + "grandchild": { + } + } + } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + + SECTION("example A.11 - Ignoring Unrecognized Elements") + { + // An example target JSON document: + json doc = R"( + { "foo": "bar" } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/baz", "value": "qux", "xyz": 123 } + ] + )"_json; + + json expected = R"( + { + "foo": "bar", + "baz": "qux" + } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + + SECTION("example A.12 - Adding to a Nonexistent Target") + { + // An example target JSON document: + json doc = R"( + { "foo": "bar" } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/baz/bat", "value": "qux" } + ] + )"_json; + + // This JSON Patch document, applied to the target JSON document + // above, would result in an error (therefore, it would not be + // applied), because the "add" operation's target location that + // references neither the root of the document, nor a member of + // an existing object, nor a member of an existing array. + + CHECK_THROWS_AS(doc.apply_patch(patch), std::out_of_range); + CHECK_THROWS_WITH(doc.apply_patch(patch), "unresolved reference token 'bat'"); + } + + SECTION("example A.14 - Escape Ordering") + { + // An example target JSON document: + json doc = R"( + { + "/": 9, + "~1": 10 + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + {"op": "test", "path": "/~01", "value": 10} + ] + )"_json; + + json expected = R"( + { + "/": 9, + "~1": 10 + } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + + SECTION("example A.15 - Comparing Strings and Numbers") + { + // An example target JSON document: + json doc = R"( + { + "/": 9, + "~1": 10 + } + )"_json; + + // A JSON Patch document that will result in an error condition: + json patch = R"( + [ + {"op": "test", "path": "/~01", "value": "10"} + ] + )"_json; + + // check that evaluation throws + CHECK_THROWS_AS(doc.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(doc.apply_patch(patch), "unsuccessful: " + patch[0].dump()); + } + + SECTION("example A.16 - Adding an Array Value") + { + // An example target JSON document: + json doc = R"( + { "foo": ["bar"] } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/foo/-", "value": ["abc", "def"] } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": ["bar", ["abc", "def"]] } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + } +} + TEST_CASE("regression tests") { SECTION("issue #60 - Double quotation mark is not parsed correctly") From fa03cf0c63544a358c8b92db8fe85317a826174a Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 20 Apr 2016 15:41:33 +0200 Subject: [PATCH 021/133] replace and copy --- src/json.hpp | 19 +++++++++++++ src/json.hpp.re2c | 19 +++++++++++++ test/unit.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+) diff --git a/src/json.hpp b/src/json.hpp index 421b99953..acde03bf3 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9525,6 +9525,7 @@ basic_json_parser_63: const auto it_op = val.m_value.object->find("op"); const auto it_path = val.m_value.object->find("path"); const auto it_value = val.m_value.object->find("value"); + const auto it_from = val.m_value.object->find("from"); if (it_op == val.m_value.object->end() or not it_op->second.is_string()) { @@ -9558,12 +9559,30 @@ basic_json_parser_63: { throw std::domain_error("'replace' operation must have member 'value'"); } + + result.at(ptr) = it_value->second; } else if (op == "move") { + if (it_from == val.m_value.object->end()) + { + throw std::domain_error("'move' operation must have member 'from'"); + } + + const std::string from_path = it_from->second; + const json_pointer from_ptr(from_path); } else if (op == "copy") { + if (it_from == val.m_value.object->end()) + { + throw std::domain_error("'copy' operation must have member 'from'"); + } + + const std::string from_path = it_from->second; + const json_pointer from_ptr(from_path); + + result[ptr] = result.at(from_ptr); } else if (op == "test") { diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 3f839737f..d161f38d1 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8835,6 +8835,7 @@ class basic_json const auto it_op = val.m_value.object->find("op"); const auto it_path = val.m_value.object->find("path"); const auto it_value = val.m_value.object->find("value"); + const auto it_from = val.m_value.object->find("from"); if (it_op == val.m_value.object->end() or not it_op->second.is_string()) { @@ -8868,12 +8869,30 @@ class basic_json { throw std::domain_error("'replace' operation must have member 'value'"); } + + result.at(ptr) = it_value->second; } else if (op == "move") { + if (it_from == val.m_value.object->end()) + { + throw std::domain_error("'move' operation must have member 'from'"); + } + + const std::string from_path = it_from->second; + const json_pointer from_ptr(from_path); } else if (op == "copy") { + if (it_from == val.m_value.object->end()) + { + throw std::domain_error("'copy' operation must have member 'from'"); + } + + const std::string from_path = it_from->second; + const json_pointer from_ptr(from_path); + + result[ptr] = result.at(from_ptr); } else if (op == "test") { diff --git a/test/unit.cpp b/test/unit.cpp index 7a91efd70..7b6754625 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12421,6 +12421,34 @@ TEST_CASE("JSON patch") CHECK(doc.apply_patch(patch) == expected); } + SECTION("example A.5 - Replacing a Value") + { + // An example target JSON document: + json doc = R"( + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "replace", "path": "/baz", "value": "boo" } + ] + )"_json; + + json expected = R"( + { + "baz": "boo", + "foo": "bar" + } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + SECTION("example A.8 - Testing a Value: Success") { // An example target JSON document: @@ -12615,6 +12643,48 @@ TEST_CASE("JSON patch") CHECK(doc.apply_patch(patch) == expected); } } + + SECTION("own examples") + { + SECTION("copy") + { + // An example target JSON document: + json doc = R"( + { + "foo": { + "bar": "baz", + "waldo": "fred" + }, + "qux": { + "corge": "grault" + } + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "copy", "from": "/foo/waldo", "path": "/qux/thud" } + ] + )"_json; + + json expected = R"( + { + "foo": { + "bar": "baz", + "waldo": "fred" + }, + "qux": { + "corge": "grault", + "thud": "fred" + } + } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + } } TEST_CASE("regression tests") From 397ada22d35cf2ebc168a48f264218c069f13d74 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 20 Apr 2016 16:52:00 +0200 Subject: [PATCH 022/133] implemented remove --- src/json.hpp | 26 +++++++++++++++++++++++-- src/json.hpp.re2c | 26 +++++++++++++++++++++++-- test/unit.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 4 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index acde03bf3..de6c6ec1a 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8969,6 +8969,18 @@ basic_json_parser_63: : reference_tokens(split(s)) {} + std::string pop_back() + { + if (reference_tokens.empty()) + { + throw std::domain_error("JSON pointer has no parent"); + } + + auto last = reference_tokens.back(); + reference_tokens.pop_back(); + return last; + } + private: /*! @brief create and return a reference to the pointed to value @@ -9420,7 +9432,7 @@ basic_json_parser_63: private: /// the reference tokens - const std::vector reference_tokens {}; + std::vector reference_tokens {}; }; //////////////////////////// @@ -9539,7 +9551,7 @@ basic_json_parser_63: const std::string op = it_op->second; const std::string path = it_path->second; - const json_pointer ptr(path); + json_pointer ptr(path); if (op == "add") { @@ -9552,6 +9564,16 @@ basic_json_parser_63: } else if (op == "remove") { + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + if (parent.is_object()) + { + parent.erase(parent.find(last_path)); + } + else if (parent.is_array()) + { + parent.erase(parent.begin() + std::stoi(last_path)); + } } else if (op == "replace") { diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index d161f38d1..073baf364 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8279,6 +8279,18 @@ class basic_json : reference_tokens(split(s)) {} + std::string pop_back() + { + if (reference_tokens.empty()) + { + throw std::domain_error("JSON pointer has no parent"); + } + + auto last = reference_tokens.back(); + reference_tokens.pop_back(); + return last; + } + private: /*! @brief create and return a reference to the pointed to value @@ -8730,7 +8742,7 @@ class basic_json private: /// the reference tokens - const std::vector reference_tokens {}; + std::vector reference_tokens {}; }; //////////////////////////// @@ -8849,7 +8861,7 @@ class basic_json const std::string op = it_op->second; const std::string path = it_path->second; - const json_pointer ptr(path); + json_pointer ptr(path); if (op == "add") { @@ -8862,6 +8874,16 @@ class basic_json } else if (op == "remove") { + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + if (parent.is_object()) + { + parent.erase(parent.find(last_path)); + } + else if (parent.is_array()) + { + parent.erase(parent.begin() + std::stoi(last_path)); + } } else if (op == "replace") { diff --git a/test/unit.cpp b/test/unit.cpp index 7b6754625..6f9ad8f5c 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12421,6 +12421,55 @@ TEST_CASE("JSON patch") CHECK(doc.apply_patch(patch) == expected); } + SECTION("example A.3 - Removing an Object Member") + { + // An example target JSON document: + json doc = R"( + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "remove", "path": "/baz" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": "bar" } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + + SECTION("example A.4 - Removing an Array Element") + { + // An example target JSON document: + json doc = R"( + { "foo": [ "bar", "qux", "baz" ] } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "remove", "path": "/foo/1" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": [ "bar", "baz" ] } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + SECTION("example A.5 - Replacing a Value") { // An example target JSON document: From 855cf2307bb7c4ac874cb5eaac74f1c4abf01428 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 24 Apr 2016 16:51:06 +0200 Subject: [PATCH 023/133] extended "add" to cope with arrays --- src/json.hpp | 20 +++++++++++++++++++- src/json.hpp.re2c | 20 +++++++++++++++++++- test/unit.cpp | 28 +++++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index de6c6ec1a..c1bf6648b 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9560,7 +9560,25 @@ basic_json_parser_63: throw std::domain_error("'add' operation must have member 'value'"); } - result[ptr] = it_value->second; + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + + if (parent.is_object()) + { + parent[last_path] = it_value->second; + } + else if (parent.is_array()) + { + if (last_path == "-") + { + parent.push_back(it_value->second); + } + else + { + parent.insert(parent.begin() + std::stoi(last_path), + it_value->second); + } + } } else if (op == "remove") { diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 073baf364..aa02bbea3 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8870,7 +8870,25 @@ class basic_json throw std::domain_error("'add' operation must have member 'value'"); } - result[ptr] = it_value->second; + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + + if (parent.is_object()) + { + parent[last_path] = it_value->second; + } + else if (parent.is_array()) + { + if (last_path == "-") + { + parent.push_back(it_value->second); + } + else + { + parent.insert(parent.begin() + std::stoi(last_path), + it_value->second); + } + } } else if (op == "remove") { diff --git a/test/unit.cpp b/test/unit.cpp index 6f9ad8f5c..277daed1f 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12421,6 +12421,29 @@ TEST_CASE("JSON patch") CHECK(doc.apply_patch(patch) == expected); } + SECTION("example A.2 - Adding an Array Element") + { + // An example target JSON document: + json doc = R"( + { "foo": [ "bar", "baz" ] } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/foo/1", "value": "qux" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": [ "bar", "qux", "baz" ] } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + SECTION("example A.3 - Removing an Object Member") { // An example target JSON document: @@ -12616,9 +12639,12 @@ TEST_CASE("JSON patch") // an existing object, nor a member of an existing array. CHECK_THROWS_AS(doc.apply_patch(patch), std::out_of_range); - CHECK_THROWS_WITH(doc.apply_patch(patch), "unresolved reference token 'bat'"); + CHECK_THROWS_WITH(doc.apply_patch(patch), "key 'baz' not found"); } + // A.13. Invalid JSON Patch Document + // not applicable + SECTION("example A.14 - Escape Ordering") { // An example target JSON document: From 09e9f6dcd4b61005e0b37f364cdadeda4d6ea9a1 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 24 Apr 2016 17:43:27 +0200 Subject: [PATCH 024/133] implemented "move" --- src/json.hpp | 75 ++++++++++++++++++++++++++++------------------- src/json.hpp.re2c | 75 ++++++++++++++++++++++++++++------------------- test/unit.cpp | 62 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 152 insertions(+), 60 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index c1bf6648b..8d5291ce8 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9526,6 +9526,44 @@ basic_json_parser_63: throw std::domain_error("JSON patch must be an array of objects"); } + const auto operation_add = [&result](json_pointer & ptr, + basic_json & value) + { + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + + if (parent.is_object()) + { + parent[last_path] = value; + } + else if (parent.is_array()) + { + if (last_path == "-") + { + parent.push_back(value); + } + else + { + parent.insert(parent.begin() + std::stoi(last_path), + value); + } + } + }; + + const auto operation_remove = [&result](json_pointer & ptr) + { + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + if (parent.is_object()) + { + parent.erase(parent.find(last_path)); + } + else if (parent.is_array()) + { + parent.erase(parent.begin() + std::stoi(last_path)); + } + }; + for (const auto& val : patch) { if (not val.is_object()) @@ -9560,38 +9598,11 @@ basic_json_parser_63: throw std::domain_error("'add' operation must have member 'value'"); } - const auto last_path = ptr.pop_back(); - basic_json& parent = result.at(ptr); - - if (parent.is_object()) - { - parent[last_path] = it_value->second; - } - else if (parent.is_array()) - { - if (last_path == "-") - { - parent.push_back(it_value->second); - } - else - { - parent.insert(parent.begin() + std::stoi(last_path), - it_value->second); - } - } + operation_add(ptr, it_value->second); } else if (op == "remove") { - const auto last_path = ptr.pop_back(); - basic_json& parent = result.at(ptr); - if (parent.is_object()) - { - parent.erase(parent.find(last_path)); - } - else if (parent.is_array()) - { - parent.erase(parent.begin() + std::stoi(last_path)); - } + operation_remove(ptr); } else if (op == "replace") { @@ -9610,7 +9621,11 @@ basic_json_parser_63: } const std::string from_path = it_from->second; - const json_pointer from_ptr(from_path); + json_pointer from_ptr(from_path); + basic_json v = result[from_ptr]; + + operation_remove(from_ptr); + operation_add(ptr, v); } else if (op == "copy") { diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index aa02bbea3..37feeec6d 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8836,6 +8836,44 @@ class basic_json throw std::domain_error("JSON patch must be an array of objects"); } + const auto operation_add = [&result](json_pointer & ptr, + basic_json & value) + { + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + + if (parent.is_object()) + { + parent[last_path] = value; + } + else if (parent.is_array()) + { + if (last_path == "-") + { + parent.push_back(value); + } + else + { + parent.insert(parent.begin() + std::stoi(last_path), + value); + } + } + }; + + const auto operation_remove = [&result](json_pointer & ptr) + { + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + if (parent.is_object()) + { + parent.erase(parent.find(last_path)); + } + else if (parent.is_array()) + { + parent.erase(parent.begin() + std::stoi(last_path)); + } + }; + for (const auto& val : patch) { if (not val.is_object()) @@ -8870,38 +8908,11 @@ class basic_json throw std::domain_error("'add' operation must have member 'value'"); } - const auto last_path = ptr.pop_back(); - basic_json& parent = result.at(ptr); - - if (parent.is_object()) - { - parent[last_path] = it_value->second; - } - else if (parent.is_array()) - { - if (last_path == "-") - { - parent.push_back(it_value->second); - } - else - { - parent.insert(parent.begin() + std::stoi(last_path), - it_value->second); - } - } + operation_add(ptr, it_value->second); } else if (op == "remove") { - const auto last_path = ptr.pop_back(); - basic_json& parent = result.at(ptr); - if (parent.is_object()) - { - parent.erase(parent.find(last_path)); - } - else if (parent.is_array()) - { - parent.erase(parent.begin() + std::stoi(last_path)); - } + operation_remove(ptr); } else if (op == "replace") { @@ -8920,7 +8931,11 @@ class basic_json } const std::string from_path = it_from->second; - const json_pointer from_ptr(from_path); + json_pointer from_ptr(from_path); + basic_json v = result[from_ptr]; + + operation_remove(from_ptr); + operation_add(ptr, v); } else if (op == "copy") { diff --git a/test/unit.cpp b/test/unit.cpp index 277daed1f..907e68bfc 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12521,6 +12521,68 @@ TEST_CASE("JSON patch") CHECK(doc.apply_patch(patch) == expected); } + SECTION("example A.6 - Moving a Value") + { + // An example target JSON document: + json doc = R"( + { + "foo": { + "bar": "baz", + "waldo": "fred" + }, + "qux": { + "corge": "grault" + } + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "move", "from": "/foo/waldo", "path": "/qux/thud" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { + "foo": { + "bar": "baz" + }, + "qux": { + "corge": "grault", + "thud": "fred" + } + } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + + SECTION("example A.7 - Moving a Value") + { + // An example target JSON document: + json doc = R"( + { "foo": [ "all", "grass", "cows", "eat" ] } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "move", "from": "/foo/1", "path": "/foo/3" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": [ "all", "cows", "eat", "grass" ] } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + SECTION("example A.8 - Testing a Value: Success") { // An example target JSON document: From fb54e212b666ecc37272740278384a8bc9fc2f5f Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 24 Apr 2016 19:03:33 +0200 Subject: [PATCH 025/133] clean up and added tests --- src/json.hpp | 120 ++++++++++++++--------------- src/json.hpp.re2c | 120 ++++++++++++++--------------- test/unit.cpp | 192 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 310 insertions(+), 122 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 8d5291ce8..b7a6f64a8 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9518,42 +9518,44 @@ basic_json_parser_63: */ basic_json apply_patch(const basic_json& patch) const { + // make a working copy to apply the patch to basic_json result = *this; - if (not patch.is_array()) - { - // a JSON patch must be an array of objects - throw std::domain_error("JSON patch must be an array of objects"); - } - - const auto operation_add = [&result](json_pointer & ptr, - basic_json & value) + // wrapper for "add" operation; add value at ptr + const auto operation_add = [&result](json_pointer & ptr, basic_json value) { + // get reference to parent of JSON pointer ptr const auto last_path = ptr.pop_back(); basic_json& parent = result.at(ptr); if (parent.is_object()) { + // use operator[] to add value parent[last_path] = value; } else if (parent.is_array()) { if (last_path == "-") { + // special case: append to back parent.push_back(value); } else { - parent.insert(parent.begin() + std::stoi(last_path), - value); + // default case: insert add offset + parent.insert(parent.begin() + std::stoi(last_path), value); } } }; + // wrapper for "remove" operation; remove value at ptr const auto operation_remove = [&result](json_pointer & ptr) { + // get reference to parent of JSON pointer ptr const auto last_path = ptr.pop_back(); basic_json& parent = result.at(ptr); + + // remove child if (parent.is_object()) { parent.erase(parent.find(last_path)); @@ -9564,41 +9566,57 @@ basic_json_parser_63: } }; + // type check + if (not patch.is_array()) + { + // a JSON patch must be an array of objects + throw std::domain_error("JSON patch must be an array of objects"); + } + + // iterate and apply th eoperations for (const auto& val : patch) { + // wrapper to get a value for an operation + const auto get_value = [&val](const std::string & op, + const std::string & member, + bool string_type = false) -> basic_json& + { + // find value + auto it = val.m_value.object->find(member); + + // context-sensitive error message + const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'"; + + // check if desired value is present + if (it == val.m_value.object->end()) + { + throw std::domain_error(error_msg + " must have member '" + member + "'"); + } + + // check if result is of type string + if (string_type and not it->second.is_string()) + { + throw std::domain_error(error_msg + " must have string member '" + member + "'"); + } + + // no error: return value + return it->second; + }; + + // type check if (not val.is_object()) { throw std::domain_error("JSON patch must be an array of objects"); } - // collect members - const auto it_op = val.m_value.object->find("op"); - const auto it_path = val.m_value.object->find("path"); - const auto it_value = val.m_value.object->find("value"); - const auto it_from = val.m_value.object->find("from"); - - if (it_op == val.m_value.object->end() or not it_op->second.is_string()) - { - throw std::domain_error("operation must have a string 'op' member"); - } - - if (it_path == val.m_value.object->end() or not it_op->second.is_string()) - { - throw std::domain_error("operation must have a string 'path' member"); - } - - const std::string op = it_op->second; - const std::string path = it_path->second; - json_pointer ptr(path); + // collect mandatory members + const std::string op = get_value("op", "op", true); + const std::string path = get_value(op, "path", true); + json_pointer ptr(get_value(op, "path", true)); if (op == "add") { - if (it_value == val.m_value.object->end()) - { - throw std::domain_error("'add' operation must have member 'value'"); - } - - operation_add(ptr, it_value->second); + operation_add(ptr, get_value("add", "value")); } else if (op == "remove") { @@ -9606,21 +9624,11 @@ basic_json_parser_63: } else if (op == "replace") { - if (it_value == val.m_value.object->end()) - { - throw std::domain_error("'replace' operation must have member 'value'"); - } - - result.at(ptr) = it_value->second; + result.at(ptr) = get_value("replace", "value"); } else if (op == "move") { - if (it_from == val.m_value.object->end()) - { - throw std::domain_error("'move' operation must have member 'from'"); - } - - const std::string from_path = it_from->second; + const std::string from_path = get_value("move", "from", true); json_pointer from_ptr(from_path); basic_json v = result[from_ptr]; @@ -9629,32 +9637,22 @@ basic_json_parser_63: } else if (op == "copy") { - if (it_from == val.m_value.object->end()) - { - throw std::domain_error("'copy' operation must have member 'from'"); - } - - const std::string from_path = it_from->second; + const std::string from_path = get_value("copy", "from", true);; const json_pointer from_ptr(from_path); result[ptr] = result.at(from_ptr); } else if (op == "test") { - if (it_value == val.m_value.object->end()) - { - throw std::domain_error("'test' operation must have member 'value'"); - } - - if (result.at(ptr) != it_value->second) + if (result.at(ptr) != get_value("test", "value")) { throw std::domain_error("unsuccessful: " + val.dump()); } } else { - // op must be "add", "remove", "replace", "move", - // "copy", or "test" + // op must be "add", "remove", "replace", "move", "copy", or + // "test" throw std::domain_error("operation value '" + op + "' is invalid"); } } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 37feeec6d..c4c87f5de 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8828,42 +8828,44 @@ class basic_json */ basic_json apply_patch(const basic_json& patch) const { + // make a working copy to apply the patch to basic_json result = *this; - if (not patch.is_array()) - { - // a JSON patch must be an array of objects - throw std::domain_error("JSON patch must be an array of objects"); - } - - const auto operation_add = [&result](json_pointer & ptr, - basic_json & value) + // wrapper for "add" operation; add value at ptr + const auto operation_add = [&result](json_pointer & ptr, basic_json value) { + // get reference to parent of JSON pointer ptr const auto last_path = ptr.pop_back(); basic_json& parent = result.at(ptr); if (parent.is_object()) { + // use operator[] to add value parent[last_path] = value; } else if (parent.is_array()) { if (last_path == "-") { + // special case: append to back parent.push_back(value); } else { - parent.insert(parent.begin() + std::stoi(last_path), - value); + // default case: insert add offset + parent.insert(parent.begin() + std::stoi(last_path), value); } } }; + // wrapper for "remove" operation; remove value at ptr const auto operation_remove = [&result](json_pointer & ptr) { + // get reference to parent of JSON pointer ptr const auto last_path = ptr.pop_back(); basic_json& parent = result.at(ptr); + + // remove child if (parent.is_object()) { parent.erase(parent.find(last_path)); @@ -8874,41 +8876,57 @@ class basic_json } }; + // type check + if (not patch.is_array()) + { + // a JSON patch must be an array of objects + throw std::domain_error("JSON patch must be an array of objects"); + } + + // iterate and apply th eoperations for (const auto& val : patch) { + // wrapper to get a value for an operation + const auto get_value = [&val](const std::string & op, + const std::string & member, + bool string_type = false) -> basic_json& + { + // find value + auto it = val.m_value.object->find(member); + + // context-sensitive error message + const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'"; + + // check if desired value is present + if (it == val.m_value.object->end()) + { + throw std::domain_error(error_msg + " must have member '" + member + "'"); + } + + // check if result is of type string + if (string_type and not it->second.is_string()) + { + throw std::domain_error(error_msg + " must have string member '" + member + "'"); + } + + // no error: return value + return it->second; + }; + + // type check if (not val.is_object()) { throw std::domain_error("JSON patch must be an array of objects"); } - // collect members - const auto it_op = val.m_value.object->find("op"); - const auto it_path = val.m_value.object->find("path"); - const auto it_value = val.m_value.object->find("value"); - const auto it_from = val.m_value.object->find("from"); - - if (it_op == val.m_value.object->end() or not it_op->second.is_string()) - { - throw std::domain_error("operation must have a string 'op' member"); - } - - if (it_path == val.m_value.object->end() or not it_op->second.is_string()) - { - throw std::domain_error("operation must have a string 'path' member"); - } - - const std::string op = it_op->second; - const std::string path = it_path->second; - json_pointer ptr(path); + // collect mandatory members + const std::string op = get_value("op", "op", true); + const std::string path = get_value(op, "path", true); + json_pointer ptr(get_value(op, "path", true)); if (op == "add") { - if (it_value == val.m_value.object->end()) - { - throw std::domain_error("'add' operation must have member 'value'"); - } - - operation_add(ptr, it_value->second); + operation_add(ptr, get_value("add", "value")); } else if (op == "remove") { @@ -8916,21 +8934,11 @@ class basic_json } else if (op == "replace") { - if (it_value == val.m_value.object->end()) - { - throw std::domain_error("'replace' operation must have member 'value'"); - } - - result.at(ptr) = it_value->second; + result.at(ptr) = get_value("replace", "value"); } else if (op == "move") { - if (it_from == val.m_value.object->end()) - { - throw std::domain_error("'move' operation must have member 'from'"); - } - - const std::string from_path = it_from->second; + const std::string from_path = get_value("move", "from", true); json_pointer from_ptr(from_path); basic_json v = result[from_ptr]; @@ -8939,32 +8947,22 @@ class basic_json } else if (op == "copy") { - if (it_from == val.m_value.object->end()) - { - throw std::domain_error("'copy' operation must have member 'from'"); - } - - const std::string from_path = it_from->second; + const std::string from_path = get_value("copy", "from", true);; const json_pointer from_ptr(from_path); result[ptr] = result.at(from_ptr); } else if (op == "test") { - if (it_value == val.m_value.object->end()) - { - throw std::domain_error("'test' operation must have member 'value'"); - } - - if (result.at(ptr) != it_value->second) + if (result.at(ptr) != get_value("test", "value")) { throw std::domain_error("unsuccessful: " + val.dump()); } } else { - // op must be "add", "remove", "replace", "move", - // "copy", or "test" + // op must be "add", "remove", "replace", "move", "copy", or + // "test" throw std::domain_error("operation value '" + op + "' is invalid"); } } diff --git a/test/unit.cpp b/test/unit.cpp index 907e68bfc..664648cb6 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12822,6 +12822,198 @@ TEST_CASE("JSON patch") CHECK(doc.apply_patch(patch) == expected); } } + + SECTION("errors") + { + SECTION("unknown operation") + { + SECTION("missing 'op'") + { + json j; + json patch = {{{"foo", "bar"}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation must have member 'op'"); + } + + SECTION("non-string 'op'") + { + json j; + json patch = {{{"op", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation must have string member 'op'"); + } + } + + SECTION("add") + { + SECTION("missing 'path'") + { + json j; + json patch = {{{"op", "add"}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'add' must have member 'path'"); + } + + SECTION("non-string 'path'") + { + json j; + json patch = {{{"op", "add"}, {"path", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'add' must have string member 'path'"); + } + + SECTION("missing 'value'") + { + json j; + json patch = {{{"op", "add"}, {"path", ""}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'add' must have member 'value'"); + } + } + + SECTION("remove") + { + SECTION("missing 'path'") + { + json j; + json patch = {{{"op", "remove"}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'remove' must have member 'path'"); + } + + SECTION("non-string 'path'") + { + json j; + json patch = {{{"op", "remove"}, {"path", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'remove' must have string member 'path'"); + } + } + + SECTION("replace") + { + SECTION("missing 'path'") + { + json j; + json patch = {{{"op", "replace"}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'replace' must have member 'path'"); + } + + SECTION("non-string 'path'") + { + json j; + json patch = {{{"op", "replace"}, {"path", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'replace' must have string member 'path'"); + } + + SECTION("missing 'value'") + { + json j; + json patch = {{{"op", "replace"}, {"path", ""}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'replace' must have member 'value'"); + } + } + + SECTION("move") + { + SECTION("missing 'path'") + { + json j; + json patch = {{{"op", "move"}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have member 'path'"); + } + + SECTION("non-string 'path'") + { + json j; + json patch = {{{"op", "move"}, {"path", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have string member 'path'"); + } + + SECTION("missing 'from'") + { + json j; + json patch = {{{"op", "move"}, {"path", ""}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have member 'from'"); + } + + SECTION("non-string 'from'") + { + json j; + json patch = {{{"op", "move"}, {"path", ""}, {"from", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have string member 'from'"); + } + } + + SECTION("copy") + { + SECTION("missing 'path'") + { + json j; + json patch = {{{"op", "copy"}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have member 'path'"); + } + + SECTION("non-string 'path'") + { + json j; + json patch = {{{"op", "copy"}, {"path", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have string member 'path'"); + } + + SECTION("missing 'from'") + { + json j; + json patch = {{{"op", "copy"}, {"path", ""}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have member 'from'"); + } + + SECTION("non-string 'from'") + { + json j; + json patch = {{{"op", "copy"}, {"path", ""}, {"from", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have string member 'from'"); + } + } + + SECTION("test") + { + SECTION("missing 'path'") + { + json j; + json patch = {{{"op", "test"}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'test' must have member 'path'"); + } + + SECTION("non-string 'path'") + { + json j; + json patch = {{{"op", "test"}, {"path", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'test' must have string member 'path'"); + } + + SECTION("missing 'value'") + { + json j; + json patch = {{{"op", "test"}, {"path", ""}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'test' must have member 'value'"); + } + } + } } TEST_CASE("regression tests") From 8d4cf5ef8d0f3ad5bd7efb32dc7d3b44acc386e9 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 24 Apr 2016 19:04:10 +0200 Subject: [PATCH 026/133] oops --- src/json.hpp | 2 +- src/json.hpp.re2c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index b7a6f64a8..0a1db1c32 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9612,7 +9612,7 @@ basic_json_parser_63: // collect mandatory members const std::string op = get_value("op", "op", true); const std::string path = get_value(op, "path", true); - json_pointer ptr(get_value(op, "path", true)); + json_pointer ptr(path); if (op == "add") { diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index c4c87f5de..52d76148c 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8922,7 +8922,7 @@ class basic_json // collect mandatory members const std::string op = get_value("op", "op", true); const std::string path = get_value(op, "path", true); - json_pointer ptr(get_value(op, "path", true)); + json_pointer ptr(path); if (op == "add") { From 96cfe7463fa4faf32a2e618065955fc4ef43ff57 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 24 Apr 2016 19:09:12 +0200 Subject: [PATCH 027/133] fixed some warnings --- src/json.hpp | 16 ++++++++-------- src/json.hpp.re2c | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 0a1db1c32..bfe45ada2 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9522,7 +9522,7 @@ basic_json_parser_63: basic_json result = *this; // wrapper for "add" operation; add value at ptr - const auto operation_add = [&result](json_pointer & ptr, basic_json value) + const auto operation_add = [&result](json_pointer & ptr, basic_json val) { // get reference to parent of JSON pointer ptr const auto last_path = ptr.pop_back(); @@ -9531,19 +9531,19 @@ basic_json_parser_63: if (parent.is_object()) { // use operator[] to add value - parent[last_path] = value; + parent[last_path] = val; } else if (parent.is_array()) { if (last_path == "-") { // special case: append to back - parent.push_back(value); + parent.push_back(val); } else { // default case: insert add offset - parent.insert(parent.begin() + std::stoi(last_path), value); + parent.insert(parent.begin() + std::stoi(last_path), val); } } }; @@ -9579,7 +9579,7 @@ basic_json_parser_63: // wrapper to get a value for an operation const auto get_value = [&val](const std::string & op, const std::string & member, - bool string_type = false) -> basic_json& + bool string_type) -> basic_json& { // find value auto it = val.m_value.object->find(member); @@ -9616,7 +9616,7 @@ basic_json_parser_63: if (op == "add") { - operation_add(ptr, get_value("add", "value")); + operation_add(ptr, get_value("add", "value", false)); } else if (op == "remove") { @@ -9624,7 +9624,7 @@ basic_json_parser_63: } else if (op == "replace") { - result.at(ptr) = get_value("replace", "value"); + result.at(ptr) = get_value("replace", "value", false); } else if (op == "move") { @@ -9644,7 +9644,7 @@ basic_json_parser_63: } else if (op == "test") { - if (result.at(ptr) != get_value("test", "value")) + if (result.at(ptr) != get_value("test", "value", false)) { throw std::domain_error("unsuccessful: " + val.dump()); } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 52d76148c..af6df6edd 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8832,7 +8832,7 @@ class basic_json basic_json result = *this; // wrapper for "add" operation; add value at ptr - const auto operation_add = [&result](json_pointer & ptr, basic_json value) + const auto operation_add = [&result](json_pointer & ptr, basic_json val) { // get reference to parent of JSON pointer ptr const auto last_path = ptr.pop_back(); @@ -8841,19 +8841,19 @@ class basic_json if (parent.is_object()) { // use operator[] to add value - parent[last_path] = value; + parent[last_path] = val; } else if (parent.is_array()) { if (last_path == "-") { // special case: append to back - parent.push_back(value); + parent.push_back(val); } else { // default case: insert add offset - parent.insert(parent.begin() + std::stoi(last_path), value); + parent.insert(parent.begin() + std::stoi(last_path), val); } } }; @@ -8889,7 +8889,7 @@ class basic_json // wrapper to get a value for an operation const auto get_value = [&val](const std::string & op, const std::string & member, - bool string_type = false) -> basic_json& + bool string_type) -> basic_json& { // find value auto it = val.m_value.object->find(member); @@ -8926,7 +8926,7 @@ class basic_json if (op == "add") { - operation_add(ptr, get_value("add", "value")); + operation_add(ptr, get_value("add", "value", false)); } else if (op == "remove") { @@ -8934,7 +8934,7 @@ class basic_json } else if (op == "replace") { - result.at(ptr) = get_value("replace", "value"); + result.at(ptr) = get_value("replace", "value", false); } else if (op == "move") { @@ -8954,7 +8954,7 @@ class basic_json } else if (op == "test") { - if (result.at(ptr) != get_value("test", "value")) + if (result.at(ptr) != get_value("test", "value", false)) { throw std::domain_error("unsuccessful: " + val.dump()); } From 28f73ed406ec8b4a5d79ea486f92160f844dfb9b Mon Sep 17 00:00:00 2001 From: Robert Marki Date: Sun, 24 Apr 2016 16:55:32 +0200 Subject: [PATCH 028/133] Refactor CMake listfile to define an interface imported library Define the library as an interface imported library so other targets can use the library as a dependency and use the interface properties of the library. --- CMakeLists.txt | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 16e9f960e..3985171b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,24 +2,17 @@ cmake_minimum_required(VERSION 2.8) project(json CXX) -add_executable(json_unit - src/json.hpp test/catch.hpp test/unit.cpp -) +add_library(${PROJECT_NAME} INTERFACE IMPORTED GLOBAL) +set_target_properties(${PROJECT_NAME} PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/src") -if(MSVC) - set(CMAKE_CXX_FLAGS - "/EHsc" - ) - - STRING(REPLACE "/O2" "/Od" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) - - add_definitions(-D_SCL_SECURE_NO_WARNINGS) -else(MSVC) - set(CMAKE_CXX_FLAGS - "-std=c++11" - ) -endif(MSVC) - -include_directories( - src test -) +set(UNIT_TEST_NAME "json_unit") +add_executable(${UNIT_TEST_NAME} + "test/catch.hpp" "test/unit.cpp") +set_target_properties(${UNIT_TEST_NAME} PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON + COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" + COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>") +target_include_directories(${UNIT_TEST_NAME} PRIVATE "test") +target_link_libraries(${UNIT_TEST_NAME} ${PROJECT_NAME}) From 30e396043aef78aae28a6785ab0253bc1df401d5 Mon Sep 17 00:00:00 2001 From: Robert Marki Date: Mon, 25 Apr 2016 09:36:05 +0200 Subject: [PATCH 029/133] Export library target and store build directory in package registry --- CMakeLists.txt | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3985171b8..6cb02c095 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,18 +1,26 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.0) project(json CXX) -add_library(${PROJECT_NAME} INTERFACE IMPORTED GLOBAL) -set_target_properties(${PROJECT_NAME} PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/src") +set(JSON_TARGET_NAME ${PROJECT_NAME}) +set(JSON_UNITTEST_TARGET_NAME "json_unit") +set(JSON_PACKAGE_NAME ${JSON_TARGET_NAME}) +set(JSON_TARGETS_FILENAME "${JSON_PACKAGE_NAME}Targets.cmake") -set(UNIT_TEST_NAME "json_unit") -add_executable(${UNIT_TEST_NAME} +add_library(${JSON_TARGET_NAME} INTERFACE) +target_include_directories(${JSON_TARGET_NAME} INTERFACE + $) + +add_executable(${JSON_UNITTEST_TARGET_NAME} "test/catch.hpp" "test/unit.cpp") -set_target_properties(${UNIT_TEST_NAME} PROPERTIES +set_target_properties(${JSON_UNITTEST_TARGET_NAME} PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>") -target_include_directories(${UNIT_TEST_NAME} PRIVATE "test") -target_link_libraries(${UNIT_TEST_NAME} ${PROJECT_NAME}) +target_include_directories(${JSON_UNITTEST_TARGET_NAME} PRIVATE "test") +target_link_libraries(${JSON_UNITTEST_TARGET_NAME} ${JSON_TARGET_NAME}) + +export(TARGETS ${JSON_TARGET_NAME} + FILE "${CMAKE_BINARY_DIR}/${JSON_TARGETS_FILENAME}") +export(PACKAGE ${JSON_PACKAGE_NAME}) From b1a2e9a7150fd7003c433c4e2693b8cebed2d8d9 Mon Sep 17 00:00:00 2001 From: Robert Marki Date: Mon, 25 Apr 2016 10:23:14 +0200 Subject: [PATCH 030/133] Create an install target for the project - define the project's version in the cmake listfile - create a config and config version file for the cmake package - install the json.hpp file and the package's targets, config and config version files --- CMakeLists.txt | 35 +++++++++++++++++++++++++++++++++-- cmake/config.cmake.in | 6 ++++++ 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 cmake/config.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 6cb02c095..75caa9a2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,16 +1,25 @@ cmake_minimum_required(VERSION 3.0) -project(json CXX) +# define the project +project(json VERSION 2.0.0 LANGUAGES CXX) +# define project variables set(JSON_TARGET_NAME ${PROJECT_NAME}) set(JSON_UNITTEST_TARGET_NAME "json_unit") set(JSON_PACKAGE_NAME ${JSON_TARGET_NAME}) set(JSON_TARGETS_FILENAME "${JSON_PACKAGE_NAME}Targets.cmake") +set(JSON_CONFIG_FILENAME "${JSON_PACKAGE_NAME}Config.cmake") +set(JSON_CONFIGVERSION_FILENAME "${JSON_PACKAGE_NAME}ConfigVersion.cmake") +set(JSON_CONFIG_DESTINATION "cmake") +set(JSON_INCLUDE_DESTINATION "include/nlohmann") +# create and configure the library target add_library(${JSON_TARGET_NAME} INTERFACE) target_include_directories(${JSON_TARGET_NAME} INTERFACE - $) + $ + $) +# create and configure the unit test target add_executable(${JSON_UNITTEST_TARGET_NAME} "test/catch.hpp" "test/unit.cpp") set_target_properties(${JSON_UNITTEST_TARGET_NAME} PROPERTIES @@ -21,6 +30,28 @@ set_target_properties(${JSON_UNITTEST_TARGET_NAME} PROPERTIES target_include_directories(${JSON_UNITTEST_TARGET_NAME} PRIVATE "test") target_link_libraries(${JSON_UNITTEST_TARGET_NAME} ${JSON_TARGET_NAME}) +# generate a config and config version file for the package +include(CMakePackageConfigHelpers) +configure_package_config_file("cmake/config.cmake.in" + "${CMAKE_BINARY_DIR}/${JSON_CONFIG_FILENAME}" + INSTALL_DESTINATION ${JSON_CONFIG_DESTINATION}) +write_basic_package_version_file("${CMAKE_BINARY_DIR}/${JSON_CONFIGVERSION_FILENAME}" + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion) + +# export the library target and store build directory in package registry export(TARGETS ${JSON_TARGET_NAME} FILE "${CMAKE_BINARY_DIR}/${JSON_TARGETS_FILENAME}") export(PACKAGE ${JSON_PACKAGE_NAME}) + +# install library target and config files +install(TARGETS ${JSON_TARGET_NAME} + EXPORT ${JSON_PACKAGE_NAME}) +install(FILES "src/json.hpp" + DESTINATION ${JSON_INCLUDE_DESTINATION}) +install(EXPORT ${JSON_PACKAGE_NAME} + FILE ${JSON_TARGETS_FILENAME} + DESTINATION ${JSON_CONFIG_DESTINATION}) +install(FILES "${CMAKE_BINARY_DIR}/${JSON_CONFIG_FILENAME}" + "${CMAKE_BINARY_DIR}/${JSON_CONFIGVERSION_FILENAME}" + DESTINATION ${JSON_CONFIG_DESTINATION}) diff --git a/cmake/config.cmake.in b/cmake/config.cmake.in new file mode 100644 index 000000000..3ff97adda --- /dev/null +++ b/cmake/config.cmake.in @@ -0,0 +1,6 @@ +@PACKAGE_INIT@ + +cmake_policy(PUSH) +cmake_policy(SET CMP0024 OLD) +include(${CMAKE_CURRENT_LIST_DIR}/@JSON_TARGETS_FILENAME@) +cmake_policy(POP) \ No newline at end of file From 192a6920342257d2feca3e35c9c4a8b44a792b32 Mon Sep 17 00:00:00 2001 From: Robert Marki Date: Mon, 25 Apr 2016 11:55:03 +0200 Subject: [PATCH 031/133] Generate package config files in cmake's current binary directory Generate the config files of the package in CMAKE_CURRENT_BINARY_DIR instead of CMAKE_BINARY_DIR because the later will refer to the main project's binary directory if the library is included in the project using the add_subdirectory command. --- CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 75caa9a2d..4ae1d8bb5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,15 +33,15 @@ target_link_libraries(${JSON_UNITTEST_TARGET_NAME} ${JSON_TARGET_NAME}) # generate a config and config version file for the package include(CMakePackageConfigHelpers) configure_package_config_file("cmake/config.cmake.in" - "${CMAKE_BINARY_DIR}/${JSON_CONFIG_FILENAME}" + "${CMAKE_CURRENT_BINARY_DIR}/${JSON_CONFIG_FILENAME}" INSTALL_DESTINATION ${JSON_CONFIG_DESTINATION}) -write_basic_package_version_file("${CMAKE_BINARY_DIR}/${JSON_CONFIGVERSION_FILENAME}" +write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/${JSON_CONFIGVERSION_FILENAME}" VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion) # export the library target and store build directory in package registry export(TARGETS ${JSON_TARGET_NAME} - FILE "${CMAKE_BINARY_DIR}/${JSON_TARGETS_FILENAME}") + FILE "${CMAKE_CURRENT_BINARY_DIR}/${JSON_TARGETS_FILENAME}") export(PACKAGE ${JSON_PACKAGE_NAME}) # install library target and config files @@ -52,6 +52,6 @@ install(FILES "src/json.hpp" install(EXPORT ${JSON_PACKAGE_NAME} FILE ${JSON_TARGETS_FILENAME} DESTINATION ${JSON_CONFIG_DESTINATION}) -install(FILES "${CMAKE_BINARY_DIR}/${JSON_CONFIG_FILENAME}" - "${CMAKE_BINARY_DIR}/${JSON_CONFIGVERSION_FILENAME}" +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${JSON_CONFIG_FILENAME}" + "${CMAKE_CURRENT_BINARY_DIR}/${JSON_CONFIGVERSION_FILENAME}" DESTINATION ${JSON_CONFIG_DESTINATION}) From 5e0bf75d6056eee48976f9c4e86ed52461d289aa Mon Sep 17 00:00:00 2001 From: Niels Date: Mon, 25 Apr 2016 23:17:04 +0200 Subject: [PATCH 032/133] cleanup, test, and diff --- README.md | 2 +- doc/examples/diff.cpp | 34 ++ doc/examples/diff.link | 1 + doc/examples/diff.output | 25 + doc/examples/patch.cpp | 30 + doc/examples/patch.link | 1 + doc/examples/patch.output | 11 + src/json.hpp | 753 +++++++++++++++++------- src/json.hpp.re2c | 753 +++++++++++++++++------- test/unit.cpp | 1174 +++++++++++++++++++++++++++---------- 10 files changed, 2068 insertions(+), 716 deletions(-) create mode 100644 doc/examples/diff.cpp create mode 100644 doc/examples/diff.link create mode 100644 doc/examples/diff.output create mode 100644 doc/examples/patch.cpp create mode 100644 doc/examples/patch.link create mode 100644 doc/examples/patch.output diff --git a/README.md b/README.md index 2dd60bf13..8f4779f95 100644 --- a/README.md +++ b/README.md @@ -428,7 +428,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (3344416 assertions in 30 test cases) +All tests passed (3344554 assertions in 31 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/doc/examples/diff.cpp b/doc/examples/diff.cpp new file mode 100644 index 000000000..d81a58dbd --- /dev/null +++ b/doc/examples/diff.cpp @@ -0,0 +1,34 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // the source document + json source = R"( + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // the target document + json target = R"( + { + "baz": "boo", + "hello": [ + "world" + ] + } + )"_json; + + // create the patch + json patch = json::diff(source, target); + + // roundtrip + json patched_source = source.patch(patch); + + // output patch and roundtrip result + std::cout << std::setw(4) << patch << "\n\n" + << std::setw(4) << patched_source << std::endl; +} diff --git a/doc/examples/diff.link b/doc/examples/diff.link new file mode 100644 index 000000000..c3e3fa4d7 --- /dev/null +++ b/doc/examples/diff.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/diff.output b/doc/examples/diff.output new file mode 100644 index 000000000..7dc79791f --- /dev/null +++ b/doc/examples/diff.output @@ -0,0 +1,25 @@ +[ + { + "op": "replace", + "path": "/baz", + "value": "boo" + }, + { + "op": "remove", + "path": "/foo" + }, + { + "op": "add", + "path": "/hello", + "value": [ + "world" + ] + } +] + +{ + "baz": "boo", + "hello": [ + "world" + ] +} diff --git a/doc/examples/patch.cpp b/doc/examples/patch.cpp new file mode 100644 index 000000000..24a52d596 --- /dev/null +++ b/doc/examples/patch.cpp @@ -0,0 +1,30 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // the original document + json doc = R"( + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // the patch + json patch = R"( + [ + { "op": "replace", "path": "/baz", "value": "boo" }, + { "op": "add", "path": "/hello", "value": ["world"] }, + { "op": "remove", "path": "/foo"} + ] + )"_json; + + // apply the patch + json patched_doc = doc.patch(patch); + + // output original and patched document + std::cout << std::setw(4) << doc << "\n\n" + << std::setw(4) << patched_doc << std::endl; +} diff --git a/doc/examples/patch.link b/doc/examples/patch.link new file mode 100644 index 000000000..5d5032b7b --- /dev/null +++ b/doc/examples/patch.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/patch.output b/doc/examples/patch.output new file mode 100644 index 000000000..eb558fe25 --- /dev/null +++ b/doc/examples/patch.output @@ -0,0 +1,11 @@ +{ + "baz": "qux", + "foo": "bar" +} + +{ + "baz": "boo", + "hello": [ + "world" + ] +} diff --git a/src/json.hpp b/src/json.hpp index bfe45ada2..1785f182f 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -3595,121 +3595,6 @@ class basic_json } } - /*! - @brief access specified element via JSON Pointer - - Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. Similar to - @ref operator[](const typename object_t::key_type&), `null` values - are created in arrays and objects if necessary. - - In particular: - - If the JSON pointer points to an object key that does not exist, it - is created an filled with a `null` value before a reference to it - is returned. - - If the JSON pointer points to an array index that does not exist, it - is created an filled with a `null` value before a reference to it - is returned. All indices between the current maximum and the given - index are also filled with `null`. - - The special value `-` is treated as a synonym for the index past the - end. - - @param[in] ptr a JSON pointer - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,operatorjson_pointer} - - @since version 2.0.0 - */ - reference operator[](const json_pointer& ptr) - { - return ptr.get_unchecked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. The function does not change the JSON - value; no `null` values are created. In particular, the the special value - `-` yields an exception. - - @param[in] ptr JSON pointer to the desired element - - @return const reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,operatorjson_pointer_const} - - @since version 2.0.0 - */ - const_reference operator[](const json_pointer& ptr) const - { - return ptr.get_unchecked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Returns a reference to the element at with specified JSON pointer @a ptr, - with bounds checking. - - @param[in] ptr JSON pointer to the desired element - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,at_json_pointer} - - @since version 2.0.0 - */ - reference at(const json_pointer& ptr) - { - return ptr.get_checked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Returns a const reference to the element at with specified JSON pointer - @a ptr, with bounds checking. - - @param[in] ptr JSON pointer to the desired element - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,at_json_pointer_const} - - @since version 2.0.0 - */ - const_reference at(const json_pointer& ptr) const - { - return ptr.get_checked(this); - } - /*! @brief access specified object element with default value @@ -4145,8 +4030,8 @@ class basic_json @throw std::domain_error when called on a type other than JSON array; example: `"cannot use erase() with null"` - @throw std::out_of_range when `idx >= size()`; example: `"index out of - range"` + @throw std::out_of_range when `idx >= size()`; example: `"array index 17 + is out of range"` @complexity Linear in distance between @a idx and the end of the container. @@ -4167,7 +4052,7 @@ class basic_json { if (idx >= size()) { - throw std::out_of_range("index out of range"); + throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); } assert(m_value.array != nullptr); @@ -8969,9 +8854,17 @@ basic_json_parser_63: : reference_tokens(split(s)) {} + /// test for inequality + bool operator!=(const json_pointer& rhs) const + { + return reference_tokens != rhs.reference_tokens; + } + + private: + /// remove and return last reference pointer std::string pop_back() { - if (reference_tokens.empty()) + if (is_root()) { throw std::domain_error("JSON pointer has no parent"); } @@ -8981,7 +8874,24 @@ basic_json_parser_63: return last; } - private: + /// return whether pointer points to the root document + bool is_root() const + { + return reference_tokens.empty(); + } + + json_pointer top() const + { + if (is_root()) + { + throw std::domain_error("JSON pointer has no parent"); + } + + json_pointer result = *this; + result.reference_tokens = {reference_tokens[0]}; + return result; + } + /*! @brief create and return a reference to the pointed to value */ @@ -9020,7 +8930,7 @@ basic_json_parser_63: case value_t::array: { // create an entry in the array - result = &result->operator[](static_cast(std::stoi(reference_token))); + result = &result->operator[](static_cast(std::stoi(reference_token))); break; } @@ -9083,7 +8993,7 @@ basic_json_parser_63: else { // convert array index to number; unchecked access - ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); } break; } @@ -9128,7 +9038,7 @@ basic_json_parser_63: } // note: at performs range check - ptr = &ptr->at(static_cast(std::stoi(reference_token))); + ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } @@ -9180,7 +9090,7 @@ basic_json_parser_63: } // use unchecked array access - ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); break; } @@ -9224,7 +9134,7 @@ basic_json_parser_63: } // note: at performs range check - ptr = &ptr->at(static_cast(std::stoi(reference_token))); + ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } @@ -9291,12 +9201,8 @@ basic_json_parser_63: } } - // first transform any occurrence of the sequence '~1' to '/' - replace_substring(reference_token, "~1", "/"); - // then transform any occurrence of the sequence '~0' to '~' - replace_substring(reference_token, "~0", "~"); - // finally, store the reference token + unescape(reference_token); result.push_back(reference_token); } @@ -9332,6 +9238,24 @@ basic_json_parser_63: ); } + /// escape tilde and slash + static std::string escape(std::string s) + { + // escape "~"" to "~0" and "/" to "~1" + replace_substring(s, "~", "~0"); + replace_substring(s, "/", "~1"); + return s; + } + + /// unescape tilde and slash + static void unescape(std::string& s) + { + // first transform any occurrence of the sequence '~1' to '/' + replace_substring(s, "~1", "/"); + // then transform any occurrence of the sequence '~0' to '~' + replace_substring(s, "~0", "~"); + } + /*! @param[in] reference_string the reference string to the current value @param[in] value the value to consider @@ -9339,7 +9263,7 @@ basic_json_parser_63: @note Empty objects or arrays are flattened to `null`. */ - static void flatten(const std::string reference_string, + static void flatten(const std::string& reference_string, const basic_json& value, basic_json& result) { @@ -9376,12 +9300,7 @@ basic_json_parser_63: // iterate object and use keys as reference string for (const auto& element : *value.m_value.object) { - // escape "~"" to "~0" and "/" to "~1" - std::string key(element.first); - replace_substring(key, "~", "~0"); - replace_substring(key, "/", "~1"); - - flatten(reference_string + "/" + key, + flatten(reference_string + "/" + escape(element.first), element.second, result); } } @@ -9435,13 +9354,128 @@ basic_json_parser_63: std::vector reference_tokens {}; }; - //////////////////////////// - // JSON Pointer functions // - //////////////////////////// + ////////////////////////// + // JSON Pointer support // + ////////////////////////// /// @name JSON Pointer functions /// @{ + /*! + @brief access specified element via JSON Pointer + + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. Similar to + @ref operator[](const typename object_t::key_type&), `null` values + are created in arrays and objects if necessary. + + In particular: + - If the JSON pointer points to an object key that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. + - If the JSON pointer points to an array index that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. All indices between the current maximum and the given + index are also filled with `null`. + - The special value `-` is treated as a synonym for the index past the + end. + + @param[in] ptr a JSON pointer + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,operatorjson_pointer} + + @since version 2.0.0 + */ + reference operator[](const json_pointer& ptr) + { + return ptr.get_unchecked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. The function does not change the JSON + value; no `null` values are created. In particular, the the special value + `-` yields an exception. + + @param[in] ptr JSON pointer to the desired element + + @return const reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,operatorjson_pointer_const} + + @since version 2.0.0 + */ + const_reference operator[](const json_pointer& ptr) const + { + return ptr.get_unchecked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Returns a reference to the element at with specified JSON pointer @a ptr, + with bounds checking. + + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer} + + @since version 2.0.0 + */ + reference at(const json_pointer& ptr) + { + return ptr.get_checked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Returns a const reference to the element at with specified JSON pointer + @a ptr, with bounds checking. + + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer_const} + + @since version 2.0.0 + */ + const_reference at(const json_pointer& ptr) const + { + return ptr.get_checked(this); + } + /*! @brief return flattened JSON value @@ -9505,45 +9539,146 @@ basic_json_parser_63: /// @} + ////////////////////////// + // JSON Patch functions // + ////////////////////////// + + /// @name JSON Patch functions + /// @{ + /*! @brief applies a JSON patch + [JSON Patch](http://jsonpatch.com) defines a JSON document structure for + expressing a sequence of operations to apply to a JSON) document. With + this funcion, a JSON Patch is applied to the current JSON value by + executing all operations from the patch. + @param[in] patch JSON patch document @return patched document - @note The original JSON value is not changed; that is, the patch is - applied to a copy of the value. + @note The application of a patch is atomic: Either all operations succeed + and the patched document is returned or an exception is thrown. In + any case, the original value is not changed: the patch is applied + to a copy of the value. - @sa [RFC 6902](https://tools.ietf.org/html/rfc6902) + @throw std::out_of_range if a JSON pointer inside the patch could not + be resolved successfully in the current JSON value; example: `"key baz + not found"` + @throw invalid_argument if the JSON patch is malformed (e.g., mandatory + attributes are missing); example: `"operation add must have member path"` + + @complexity Linear in the size of the JSON value and the length of the + JSON patch. As usually only a fraction of the JSON value is affected by + the patch, the complexity can usually be neglected. + + @liveexample{The following code shows how a JSON patch is applied to a + value.,patch} + + @sa @ref diff -- create a JSON patch by comparing two JSON values + + @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902) + @sa [RFC 6901 (JSON Pointer)](https://tools.ietf.org/html/rfc6901) + + @since version 2.0.0 */ - basic_json apply_patch(const basic_json& patch) const + basic_json patch(const basic_json& patch) const { // make a working copy to apply the patch to basic_json result = *this; + // the valid JSON Patch operations + enum class patch_operations {add, remove, replace, move, copy, test, invalid}; + + const auto get_op = [](const std::string op) + { + if (op == "add") + { + return patch_operations::add; + } + if (op == "remove") + { + return patch_operations::remove; + } + if (op == "replace") + { + return patch_operations::replace; + } + if (op == "move") + { + return patch_operations::move; + } + if (op == "copy") + { + return patch_operations::copy; + } + if (op == "test") + { + return patch_operations::test; + } + + return patch_operations::invalid; + }; + // wrapper for "add" operation; add value at ptr const auto operation_add = [&result](json_pointer & ptr, basic_json val) { - // get reference to parent of JSON pointer ptr - const auto last_path = ptr.pop_back(); - basic_json& parent = result.at(ptr); - - if (parent.is_object()) + // adding to the root of the target document means replacing it + if (ptr.is_root()) { - // use operator[] to add value - parent[last_path] = val; + result = val; } - else if (parent.is_array()) + else { - if (last_path == "-") + // make sure the top element of the pointer exists + json_pointer top_pointer = ptr.top(); + if (top_pointer != ptr) { - // special case: append to back - parent.push_back(val); + basic_json& x = result.at(top_pointer); } - else + + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.pop_back(); + basic_json& parent = result[ptr]; + + switch (parent.m_type) { - // default case: insert add offset - parent.insert(parent.begin() + std::stoi(last_path), val); + case value_t::null: + case value_t::object: + { + // use operator[] to add value + parent[last_path] = val; + break; + } + + case value_t::array: + { + if (last_path == "-") + { + // special case: append to back + parent.push_back(val); + } + else + { + const auto idx = std::stoi(last_path); + if (static_cast(idx) > parent.size()) + { + // avoid undefined behavior + throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); + } + else + { + // default case: insert add offset + parent.insert(parent.begin() + static_cast(idx), val); + } + } + break; + } + + default: + { + throw std::domain_error("unexpected parent type " + parent.type_name()); + } } } }; @@ -9558,11 +9693,21 @@ basic_json_parser_63: // remove child if (parent.is_object()) { - parent.erase(parent.find(last_path)); + // perform range check + auto it = parent.find(last_path); + if (it != parent.end()) + { + parent.erase(it); + } + else + { + throw std::out_of_range("key '" + last_path + "' not found"); + } } else if (parent.is_array()) { - parent.erase(parent.begin() + std::stoi(last_path)); + // note erase performs range check + parent.erase(static_cast(std::stoi(last_path))); } }; @@ -9570,7 +9715,7 @@ basic_json_parser_63: if (not patch.is_array()) { // a JSON patch must be an array of objects - throw std::domain_error("JSON patch must be an array of objects"); + throw std::invalid_argument("JSON patch must be an array of objects"); } // iterate and apply th eoperations @@ -9590,13 +9735,13 @@ basic_json_parser_63: // check if desired value is present if (it == val.m_value.object->end()) { - throw std::domain_error(error_msg + " must have member '" + member + "'"); + throw std::invalid_argument(error_msg + " must have member '" + member + "'"); } // check if result is of type string if (string_type and not it->second.is_string()) { - throw std::domain_error(error_msg + " must have string member '" + member + "'"); + throw std::invalid_argument(error_msg + " must have string member '" + member + "'"); } // no error: return value @@ -9606,7 +9751,7 @@ basic_json_parser_63: // type check if (not val.is_object()) { - throw std::domain_error("JSON patch must be an array of objects"); + throw std::invalid_argument("JSON patch must be an array of objects"); } // collect mandatory members @@ -9614,51 +9759,251 @@ basic_json_parser_63: const std::string path = get_value(op, "path", true); json_pointer ptr(path); - if (op == "add") + switch (get_op(op)) { - operation_add(ptr, get_value("add", "value", false)); - } - else if (op == "remove") - { - operation_remove(ptr); - } - else if (op == "replace") - { - result.at(ptr) = get_value("replace", "value", false); - } - else if (op == "move") - { - const std::string from_path = get_value("move", "from", true); - json_pointer from_ptr(from_path); - basic_json v = result[from_ptr]; - - operation_remove(from_ptr); - operation_add(ptr, v); - } - else if (op == "copy") - { - const std::string from_path = get_value("copy", "from", true);; - const json_pointer from_ptr(from_path); - - result[ptr] = result.at(from_ptr); - } - else if (op == "test") - { - if (result.at(ptr) != get_value("test", "value", false)) + case patch_operations::add: { - throw std::domain_error("unsuccessful: " + val.dump()); + operation_add(ptr, get_value("add", "value", false)); + break; + } + + case patch_operations::remove: + { + operation_remove(ptr); + break; + } + + case patch_operations::replace: + { + // the "path" location must exist - use at() + result.at(ptr) = get_value("replace", "value", false); + break; + } + + case patch_operations::move: + { + const std::string from_path = get_value("move", "from", true); + json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + basic_json v = result.at(from_ptr); + + // The move operation is functionally identical to a + // "remove" operation on the "from" location, followed + // immediately by an "add" operation at the target + // location with the value that was just removed. + operation_remove(from_ptr); + operation_add(ptr, v); + break; + } + + case patch_operations::copy: + { + const std::string from_path = get_value("copy", "from", true);; + const json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + result[ptr] = result.at(from_ptr); + break; + } + + case patch_operations::test: + { + bool success = false; + try + { + // check if "value" matches the one at "path" + // the "path" location must exist - use at() + success = (result.at(ptr) == get_value("test", "value", false)); + } + catch (std::out_of_range&) + { + // ignore out of range errors: success remains false + } + + // throw an exception if test fails + if (not success) + { + throw std::domain_error("unsuccessful: " + val.dump()); + } + + break; + } + + case patch_operations::invalid: + { + // op must be "add", "remove", "replace", "move", "copy", or + // "test" + throw std::invalid_argument("operation value '" + op + "' is invalid"); } - } - else - { - // op must be "add", "remove", "replace", "move", "copy", or - // "test" - throw std::domain_error("operation value '" + op + "' is invalid"); } } return result; } + + /*! + @brief creates a diff as a JSON patch + + Creates a [JSON Patch](http://jsonpatch.com) so that value @a source can + be changed into the value @a target by calling @ref patch function. + + @invariant For two JSON values @a source and @a target, the following code + yields always `true`: + @code {.cpp} + source.patch(diff(source, target)) == target; + @endcode + + @note Currently, only `remove`, `add`, and `replace` operations are + generated. + + @param[in] source JSON value to copare from + @param[in] target JSON value to copare against + @param[in] path helper value to create JSON pointers + + @return a JSON patch to convert the @a source to @a target + + @complexity Linear in the lengths of @a source and @a target. + + @liveexample{The following code shows how a JSON patch is created as a + diff for two JSON values.,diff} + + @sa @ref patch -- apply a JSON patch + + @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902) + + @since version 2.0.0 + */ + static basic_json diff(const basic_json& source, + const basic_json& target, + std::string path = "") noexcept + { + // the patch + basic_json result(value_t::array); + + // if the values are the same, return empty patch + if (source == target) + { + return result; + } + + if (source.type() != target.type()) + { + // different types: replace value + result.push_back( + { + {"op", "replace"}, + {"path", path}, + {"value", target} + }); + } + else + { + switch (source.type()) + { + case value_t::array: + { + // first pass: traverse common elements + size_t i = 0; + while (i < source.size() and i < target.size()) + { + // recursive call to compare array values at index i + auto temp_diff = diff(source[i], target[i], path + "/" + std::to_string(i)); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + ++i; + } + + // i now reached the end of at least one array + // in a second pass, traverse the remaining elements + + // remove my remaining elements + while (i < source.size()) + { + result.push_back(object( + { + {"op", "remove"}, + {"path", path + "/" + std::to_string(i)} + })); + ++i; + } + + // add other remaining elements + while (i < target.size()) + { + result.push_back( + { + {"op", "add"}, + {"path", path + "/" + std::to_string(i)}, + {"value", target[i]} + }); + ++i; + } + + break; + } + + case value_t::object: + { + // first pass: traverse this object's elements + for (auto it = source.begin(); it != source.end(); ++it) + { + // escape the key name to be used in a JSON patch + const auto key = json_pointer::escape(it.key()); + + if (target.find(it.key()) != target.end()) + { + // recursive call to compare object values at key it + auto temp_diff = diff(it.value(), target[it.key()], path + "/" + key); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + } + else + { + // found a key that is not in o -> remove it + result.push_back(object( + { + {"op", "remove"}, + {"path", path + "/" + key} + })); + } + } + + // second pass: traverse other object's elements + for (auto it = target.begin(); it != target.end(); ++it) + { + if (source.find(it.key()) == source.end()) + { + // found a key that is not in this -> add it + const auto key = json_pointer::escape(it.key()); + result.push_back( + { + {"op", "add"}, + {"path", path + "/" + key}, + {"value", it.value()} + }); + } + } + + break; + } + + default: + { + // both primitive type: replace value + result.push_back( + { + {"op", "replace"}, + {"path", path}, + {"value", target} + }); + break; + } + } + } + + return result; + } + + /// @} }; @@ -9678,9 +10023,9 @@ using json = basic_json<>; } -///////////////////////// -// nonmember functions // -///////////////////////// +/////////////////////// +// nonmember support // +/////////////////////// // specialization of std::swap, and std::hash namespace std diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index af6df6edd..51b721670 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -3595,121 +3595,6 @@ class basic_json } } - /*! - @brief access specified element via JSON Pointer - - Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. Similar to - @ref operator[](const typename object_t::key_type&), `null` values - are created in arrays and objects if necessary. - - In particular: - - If the JSON pointer points to an object key that does not exist, it - is created an filled with a `null` value before a reference to it - is returned. - - If the JSON pointer points to an array index that does not exist, it - is created an filled with a `null` value before a reference to it - is returned. All indices between the current maximum and the given - index are also filled with `null`. - - The special value `-` is treated as a synonym for the index past the - end. - - @param[in] ptr a JSON pointer - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,operatorjson_pointer} - - @since version 2.0.0 - */ - reference operator[](const json_pointer& ptr) - { - return ptr.get_unchecked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. The function does not change the JSON - value; no `null` values are created. In particular, the the special value - `-` yields an exception. - - @param[in] ptr JSON pointer to the desired element - - @return const reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,operatorjson_pointer_const} - - @since version 2.0.0 - */ - const_reference operator[](const json_pointer& ptr) const - { - return ptr.get_unchecked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Returns a reference to the element at with specified JSON pointer @a ptr, - with bounds checking. - - @param[in] ptr JSON pointer to the desired element - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,at_json_pointer} - - @since version 2.0.0 - */ - reference at(const json_pointer& ptr) - { - return ptr.get_checked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Returns a const reference to the element at with specified JSON pointer - @a ptr, with bounds checking. - - @param[in] ptr JSON pointer to the desired element - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,at_json_pointer_const} - - @since version 2.0.0 - */ - const_reference at(const json_pointer& ptr) const - { - return ptr.get_checked(this); - } - /*! @brief access specified object element with default value @@ -4145,8 +4030,8 @@ class basic_json @throw std::domain_error when called on a type other than JSON array; example: `"cannot use erase() with null"` - @throw std::out_of_range when `idx >= size()`; example: `"index out of - range"` + @throw std::out_of_range when `idx >= size()`; example: `"array index 17 + is out of range"` @complexity Linear in distance between @a idx and the end of the container. @@ -4167,7 +4052,7 @@ class basic_json { if (idx >= size()) { - throw std::out_of_range("index out of range"); + throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); } assert(m_value.array != nullptr); @@ -8279,9 +8164,17 @@ class basic_json : reference_tokens(split(s)) {} + /// test for inequality + bool operator!=(const json_pointer& rhs) const + { + return reference_tokens != rhs.reference_tokens; + } + + private: + /// remove and return last reference pointer std::string pop_back() { - if (reference_tokens.empty()) + if (is_root()) { throw std::domain_error("JSON pointer has no parent"); } @@ -8291,7 +8184,24 @@ class basic_json return last; } - private: + /// return whether pointer points to the root document + bool is_root() const + { + return reference_tokens.empty(); + } + + json_pointer top() const + { + if (is_root()) + { + throw std::domain_error("JSON pointer has no parent"); + } + + json_pointer result = *this; + result.reference_tokens = {reference_tokens[0]}; + return result; + } + /*! @brief create and return a reference to the pointed to value */ @@ -8330,7 +8240,7 @@ class basic_json case value_t::array: { // create an entry in the array - result = &result->operator[](static_cast(std::stoi(reference_token))); + result = &result->operator[](static_cast(std::stoi(reference_token))); break; } @@ -8393,7 +8303,7 @@ class basic_json else { // convert array index to number; unchecked access - ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); } break; } @@ -8438,7 +8348,7 @@ class basic_json } // note: at performs range check - ptr = &ptr->at(static_cast(std::stoi(reference_token))); + ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } @@ -8490,7 +8400,7 @@ class basic_json } // use unchecked array access - ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); break; } @@ -8534,7 +8444,7 @@ class basic_json } // note: at performs range check - ptr = &ptr->at(static_cast(std::stoi(reference_token))); + ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } @@ -8601,12 +8511,8 @@ class basic_json } } - // first transform any occurrence of the sequence '~1' to '/' - replace_substring(reference_token, "~1", "/"); - // then transform any occurrence of the sequence '~0' to '~' - replace_substring(reference_token, "~0", "~"); - // finally, store the reference token + unescape(reference_token); result.push_back(reference_token); } @@ -8642,6 +8548,24 @@ class basic_json ); } + /// escape tilde and slash + static std::string escape(std::string s) + { + // escape "~"" to "~0" and "/" to "~1" + replace_substring(s, "~", "~0"); + replace_substring(s, "/", "~1"); + return s; + } + + /// unescape tilde and slash + static void unescape(std::string& s) + { + // first transform any occurrence of the sequence '~1' to '/' + replace_substring(s, "~1", "/"); + // then transform any occurrence of the sequence '~0' to '~' + replace_substring(s, "~0", "~"); + } + /*! @param[in] reference_string the reference string to the current value @param[in] value the value to consider @@ -8649,7 +8573,7 @@ class basic_json @note Empty objects or arrays are flattened to `null`. */ - static void flatten(const std::string reference_string, + static void flatten(const std::string& reference_string, const basic_json& value, basic_json& result) { @@ -8686,12 +8610,7 @@ class basic_json // iterate object and use keys as reference string for (const auto& element : *value.m_value.object) { - // escape "~"" to "~0" and "/" to "~1" - std::string key(element.first); - replace_substring(key, "~", "~0"); - replace_substring(key, "/", "~1"); - - flatten(reference_string + "/" + key, + flatten(reference_string + "/" + escape(element.first), element.second, result); } } @@ -8745,13 +8664,128 @@ class basic_json std::vector reference_tokens {}; }; - //////////////////////////// - // JSON Pointer functions // - //////////////////////////// + ////////////////////////// + // JSON Pointer support // + ////////////////////////// /// @name JSON Pointer functions /// @{ + /*! + @brief access specified element via JSON Pointer + + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. Similar to + @ref operator[](const typename object_t::key_type&), `null` values + are created in arrays and objects if necessary. + + In particular: + - If the JSON pointer points to an object key that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. + - If the JSON pointer points to an array index that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. All indices between the current maximum and the given + index are also filled with `null`. + - The special value `-` is treated as a synonym for the index past the + end. + + @param[in] ptr a JSON pointer + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,operatorjson_pointer} + + @since version 2.0.0 + */ + reference operator[](const json_pointer& ptr) + { + return ptr.get_unchecked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. The function does not change the JSON + value; no `null` values are created. In particular, the the special value + `-` yields an exception. + + @param[in] ptr JSON pointer to the desired element + + @return const reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,operatorjson_pointer_const} + + @since version 2.0.0 + */ + const_reference operator[](const json_pointer& ptr) const + { + return ptr.get_unchecked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Returns a reference to the element at with specified JSON pointer @a ptr, + with bounds checking. + + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer} + + @since version 2.0.0 + */ + reference at(const json_pointer& ptr) + { + return ptr.get_checked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Returns a const reference to the element at with specified JSON pointer + @a ptr, with bounds checking. + + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer_const} + + @since version 2.0.0 + */ + const_reference at(const json_pointer& ptr) const + { + return ptr.get_checked(this); + } + /*! @brief return flattened JSON value @@ -8815,45 +8849,146 @@ class basic_json /// @} + ////////////////////////// + // JSON Patch functions // + ////////////////////////// + + /// @name JSON Patch functions + /// @{ + /*! @brief applies a JSON patch + [JSON Patch](http://jsonpatch.com) defines a JSON document structure for + expressing a sequence of operations to apply to a JSON) document. With + this funcion, a JSON Patch is applied to the current JSON value by + executing all operations from the patch. + @param[in] patch JSON patch document @return patched document - @note The original JSON value is not changed; that is, the patch is - applied to a copy of the value. + @note The application of a patch is atomic: Either all operations succeed + and the patched document is returned or an exception is thrown. In + any case, the original value is not changed: the patch is applied + to a copy of the value. - @sa [RFC 6902](https://tools.ietf.org/html/rfc6902) + @throw std::out_of_range if a JSON pointer inside the patch could not + be resolved successfully in the current JSON value; example: `"key baz + not found"` + @throw invalid_argument if the JSON patch is malformed (e.g., mandatory + attributes are missing); example: `"operation add must have member path"` + + @complexity Linear in the size of the JSON value and the length of the + JSON patch. As usually only a fraction of the JSON value is affected by + the patch, the complexity can usually be neglected. + + @liveexample{The following code shows how a JSON patch is applied to a + value.,patch} + + @sa @ref diff -- create a JSON patch by comparing two JSON values + + @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902) + @sa [RFC 6901 (JSON Pointer)](https://tools.ietf.org/html/rfc6901) + + @since version 2.0.0 */ - basic_json apply_patch(const basic_json& patch) const + basic_json patch(const basic_json& patch) const { // make a working copy to apply the patch to basic_json result = *this; + // the valid JSON Patch operations + enum class patch_operations {add, remove, replace, move, copy, test, invalid}; + + const auto get_op = [](const std::string op) + { + if (op == "add") + { + return patch_operations::add; + } + if (op == "remove") + { + return patch_operations::remove; + } + if (op == "replace") + { + return patch_operations::replace; + } + if (op == "move") + { + return patch_operations::move; + } + if (op == "copy") + { + return patch_operations::copy; + } + if (op == "test") + { + return patch_operations::test; + } + + return patch_operations::invalid; + }; + // wrapper for "add" operation; add value at ptr const auto operation_add = [&result](json_pointer & ptr, basic_json val) { - // get reference to parent of JSON pointer ptr - const auto last_path = ptr.pop_back(); - basic_json& parent = result.at(ptr); - - if (parent.is_object()) + // adding to the root of the target document means replacing it + if (ptr.is_root()) { - // use operator[] to add value - parent[last_path] = val; + result = val; } - else if (parent.is_array()) + else { - if (last_path == "-") + // make sure the top element of the pointer exists + json_pointer top_pointer = ptr.top(); + if (top_pointer != ptr) { - // special case: append to back - parent.push_back(val); + basic_json& x = result.at(top_pointer); } - else + + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.pop_back(); + basic_json& parent = result[ptr]; + + switch (parent.m_type) { - // default case: insert add offset - parent.insert(parent.begin() + std::stoi(last_path), val); + case value_t::null: + case value_t::object: + { + // use operator[] to add value + parent[last_path] = val; + break; + } + + case value_t::array: + { + if (last_path == "-") + { + // special case: append to back + parent.push_back(val); + } + else + { + const auto idx = std::stoi(last_path); + if (static_cast(idx) > parent.size()) + { + // avoid undefined behavior + throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); + } + else + { + // default case: insert add offset + parent.insert(parent.begin() + static_cast(idx), val); + } + } + break; + } + + default: + { + throw std::domain_error("unexpected parent type " + parent.type_name()); + } } } }; @@ -8868,11 +9003,21 @@ class basic_json // remove child if (parent.is_object()) { - parent.erase(parent.find(last_path)); + // perform range check + auto it = parent.find(last_path); + if (it != parent.end()) + { + parent.erase(it); + } + else + { + throw std::out_of_range("key '" + last_path + "' not found"); + } } else if (parent.is_array()) { - parent.erase(parent.begin() + std::stoi(last_path)); + // note erase performs range check + parent.erase(static_cast(std::stoi(last_path))); } }; @@ -8880,7 +9025,7 @@ class basic_json if (not patch.is_array()) { // a JSON patch must be an array of objects - throw std::domain_error("JSON patch must be an array of objects"); + throw std::invalid_argument("JSON patch must be an array of objects"); } // iterate and apply th eoperations @@ -8900,13 +9045,13 @@ class basic_json // check if desired value is present if (it == val.m_value.object->end()) { - throw std::domain_error(error_msg + " must have member '" + member + "'"); + throw std::invalid_argument(error_msg + " must have member '" + member + "'"); } // check if result is of type string if (string_type and not it->second.is_string()) { - throw std::domain_error(error_msg + " must have string member '" + member + "'"); + throw std::invalid_argument(error_msg + " must have string member '" + member + "'"); } // no error: return value @@ -8916,7 +9061,7 @@ class basic_json // type check if (not val.is_object()) { - throw std::domain_error("JSON patch must be an array of objects"); + throw std::invalid_argument("JSON patch must be an array of objects"); } // collect mandatory members @@ -8924,51 +9069,251 @@ class basic_json const std::string path = get_value(op, "path", true); json_pointer ptr(path); - if (op == "add") + switch (get_op(op)) { - operation_add(ptr, get_value("add", "value", false)); - } - else if (op == "remove") - { - operation_remove(ptr); - } - else if (op == "replace") - { - result.at(ptr) = get_value("replace", "value", false); - } - else if (op == "move") - { - const std::string from_path = get_value("move", "from", true); - json_pointer from_ptr(from_path); - basic_json v = result[from_ptr]; - - operation_remove(from_ptr); - operation_add(ptr, v); - } - else if (op == "copy") - { - const std::string from_path = get_value("copy", "from", true);; - const json_pointer from_ptr(from_path); - - result[ptr] = result.at(from_ptr); - } - else if (op == "test") - { - if (result.at(ptr) != get_value("test", "value", false)) + case patch_operations::add: { - throw std::domain_error("unsuccessful: " + val.dump()); + operation_add(ptr, get_value("add", "value", false)); + break; + } + + case patch_operations::remove: + { + operation_remove(ptr); + break; + } + + case patch_operations::replace: + { + // the "path" location must exist - use at() + result.at(ptr) = get_value("replace", "value", false); + break; + } + + case patch_operations::move: + { + const std::string from_path = get_value("move", "from", true); + json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + basic_json v = result.at(from_ptr); + + // The move operation is functionally identical to a + // "remove" operation on the "from" location, followed + // immediately by an "add" operation at the target + // location with the value that was just removed. + operation_remove(from_ptr); + operation_add(ptr, v); + break; + } + + case patch_operations::copy: + { + const std::string from_path = get_value("copy", "from", true);; + const json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + result[ptr] = result.at(from_ptr); + break; + } + + case patch_operations::test: + { + bool success = false; + try + { + // check if "value" matches the one at "path" + // the "path" location must exist - use at() + success = (result.at(ptr) == get_value("test", "value", false)); + } + catch (std::out_of_range&) + { + // ignore out of range errors: success remains false + } + + // throw an exception if test fails + if (not success) + { + throw std::domain_error("unsuccessful: " + val.dump()); + } + + break; + } + + case patch_operations::invalid: + { + // op must be "add", "remove", "replace", "move", "copy", or + // "test" + throw std::invalid_argument("operation value '" + op + "' is invalid"); } - } - else - { - // op must be "add", "remove", "replace", "move", "copy", or - // "test" - throw std::domain_error("operation value '" + op + "' is invalid"); } } return result; } + + /*! + @brief creates a diff as a JSON patch + + Creates a [JSON Patch](http://jsonpatch.com) so that value @a source can + be changed into the value @a target by calling @ref patch function. + + @invariant For two JSON values @a source and @a target, the following code + yields always `true`: + @code {.cpp} + source.patch(diff(source, target)) == target; + @endcode + + @note Currently, only `remove`, `add`, and `replace` operations are + generated. + + @param[in] source JSON value to copare from + @param[in] target JSON value to copare against + @param[in] path helper value to create JSON pointers + + @return a JSON patch to convert the @a source to @a target + + @complexity Linear in the lengths of @a source and @a target. + + @liveexample{The following code shows how a JSON patch is created as a + diff for two JSON values.,diff} + + @sa @ref patch -- apply a JSON patch + + @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902) + + @since version 2.0.0 + */ + static basic_json diff(const basic_json& source, + const basic_json& target, + std::string path = "") noexcept + { + // the patch + basic_json result(value_t::array); + + // if the values are the same, return empty patch + if (source == target) + { + return result; + } + + if (source.type() != target.type()) + { + // different types: replace value + result.push_back( + { + {"op", "replace"}, + {"path", path}, + {"value", target} + }); + } + else + { + switch (source.type()) + { + case value_t::array: + { + // first pass: traverse common elements + size_t i = 0; + while (i < source.size() and i < target.size()) + { + // recursive call to compare array values at index i + auto temp_diff = diff(source[i], target[i], path + "/" + std::to_string(i)); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + ++i; + } + + // i now reached the end of at least one array + // in a second pass, traverse the remaining elements + + // remove my remaining elements + while (i < source.size()) + { + result.push_back(object( + { + {"op", "remove"}, + {"path", path + "/" + std::to_string(i)} + })); + ++i; + } + + // add other remaining elements + while (i < target.size()) + { + result.push_back( + { + {"op", "add"}, + {"path", path + "/" + std::to_string(i)}, + {"value", target[i]} + }); + ++i; + } + + break; + } + + case value_t::object: + { + // first pass: traverse this object's elements + for (auto it = source.begin(); it != source.end(); ++it) + { + // escape the key name to be used in a JSON patch + const auto key = json_pointer::escape(it.key()); + + if (target.find(it.key()) != target.end()) + { + // recursive call to compare object values at key it + auto temp_diff = diff(it.value(), target[it.key()], path + "/" + key); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + } + else + { + // found a key that is not in o -> remove it + result.push_back(object( + { + {"op", "remove"}, + {"path", path + "/" + key} + })); + } + } + + // second pass: traverse other object's elements + for (auto it = target.begin(); it != target.end(); ++it) + { + if (source.find(it.key()) == source.end()) + { + // found a key that is not in this -> add it + const auto key = json_pointer::escape(it.key()); + result.push_back( + { + {"op", "add"}, + {"path", path + "/" + key}, + {"value", it.value()} + }); + } + } + + break; + } + + default: + { + // both primitive type: replace value + result.push_back( + { + {"op", "replace"}, + {"path", path}, + {"value", target} + }); + break; + } + } + } + + return result; + } + + /// @} }; @@ -8988,9 +9333,9 @@ using json = basic_json<>; } -///////////////////////// -// nonmember functions // -///////////////////////// +/////////////////////// +// nonmember support // +/////////////////////// // specialization of std::swap, and std::hash namespace std diff --git a/test/unit.cpp b/test/unit.cpp index 664648cb6..f6c49883b 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -3455,7 +3455,7 @@ TEST_CASE("element access") { json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; CHECK_THROWS_AS(jarray.erase(8), std::out_of_range); - CHECK_THROWS_WITH(jarray.erase(8), "index out of range"); + CHECK_THROWS_WITH(jarray.erase(8), "array index 8 is out of range"); } } @@ -12395,304 +12395,384 @@ TEST_CASE("JSON patch") { SECTION("examples from RFC 6902") { - SECTION("example A.1 - Adding an Object Member") + SECTION("4. Operations") { - // An example target JSON document: - json doc = R"( - { "foo": "bar"} - )"_json; + // the ordering of members in JSON objects is not significant: + json op1 = R"({ "op": "add", "path": "/a/b/c", "value": "foo" })"_json; + json op2 = R"({ "path": "/a/b/c", "op": "add", "value": "foo" })"_json; + json op3 = R"({ "value": "foo", "path": "/a/b/c", "op": "add" })"_json; - // A JSON Patch document: - json patch = R"( - [ - { "op": "add", "path": "/baz", "value": "qux" } - ] - )"_json; - - // The resulting JSON document: - json expected = R"( - { - "baz": "qux", - "foo": "bar" - } - )"_json; - - // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); + // check if the operation objects are equivalent + CHECK(op1 == op2); + CHECK(op1 == op3); } - SECTION("example A.2 - Adding an Array Element") + SECTION("4.1 add") { - // An example target JSON document: - json doc = R"( - { "foo": [ "bar", "baz" ] } - )"_json; + json patch = R"([{ "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] }])"_json; - // A JSON Patch document: - json patch = R"( - [ - { "op": "add", "path": "/foo/1", "value": "qux" } - ] - )"_json; + // However, the object itself or an array containing it does need + // to exist, and it remains an error for that not to be the case. + // For example, an "add" with a target location of "/a/b" starting + // with this document + json doc1 = R"({ "a": { "foo": 1 } })"_json; - // The resulting JSON document: - json expected = R"( - { "foo": [ "bar", "qux", "baz" ] } - )"_json; - - // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); - } - - SECTION("example A.3 - Removing an Object Member") - { - // An example target JSON document: - json doc = R"( + // is not an error, because "a" exists, and "b" will be added to + // its value. + CHECK_NOTHROW(doc1.patch(patch)); + CHECK(doc1.patch(patch) == R"( { - "baz": "qux", - "foo": "bar" - } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "remove", "path": "/baz" } - ] - )"_json; - - // The resulting JSON document: - json expected = R"( - { "foo": "bar" } - )"_json; - - // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); - } - - SECTION("example A.4 - Removing an Array Element") - { - // An example target JSON document: - json doc = R"( - { "foo": [ "bar", "qux", "baz" ] } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "remove", "path": "/foo/1" } - ] - )"_json; - - // The resulting JSON document: - json expected = R"( - { "foo": [ "bar", "baz" ] } - )"_json; - - // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); - } - - SECTION("example A.5 - Replacing a Value") - { - // An example target JSON document: - json doc = R"( - { - "baz": "qux", - "foo": "bar" - } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "replace", "path": "/baz", "value": "boo" } - ] - )"_json; - - json expected = R"( - { - "baz": "boo", - "foo": "bar" - } - )"_json; - - // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); - } - - SECTION("example A.6 - Moving a Value") - { - // An example target JSON document: - json doc = R"( - { - "foo": { - "bar": "baz", - "waldo": "fred" - }, - "qux": { - "corge": "grault" + "a": { + "foo": 1, + "b": { + "c": [ "foo", "bar" ] + } } } - )"_json; + )"_json); + + // It is an error in this document: + json doc2 = R"({ "q": { "bar": 2 } })"_json; + + // because "a" does not exist. + CHECK_THROWS_AS(doc2.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(doc2.patch(patch), "key 'a' not found"); + } + + SECTION("4.2 remove") + { + // If removing an element from an array, any elements above the + // specified index are shifted one position to the left. + json doc = {1, 2, 3, 4}; + json patch = {{{"op", "remove"}, {"path", "/1"}}}; + CHECK(doc.patch(patch) == json({1, 3, 4})); + } + + SECTION("A.1. Adding an Object Member") + { + // An example target JSON document: + json doc = R"( + { "foo": "bar"} + )"_json; // A JSON Patch document: json patch = R"( - [ - { "op": "move", "from": "/foo/waldo", "path": "/qux/thud" } - ] - )"_json; + [ + { "op": "add", "path": "/baz", "value": "qux" } + ] + )"_json; // The resulting JSON document: json expected = R"( - { - "foo": { - "bar": "baz" - }, - "qux": { - "corge": "grault", - "thud": "fred" + { + "baz": "qux", + "foo": "bar" } - } - )"_json; + )"_json; // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); } - SECTION("example A.7 - Moving a Value") + SECTION("A.2. Adding an Array Element") { // An example target JSON document: json doc = R"( - { "foo": [ "all", "grass", "cows", "eat" ] } - )"_json; + { "foo": [ "bar", "baz" ] } + )"_json; // A JSON Patch document: json patch = R"( - [ - { "op": "move", "from": "/foo/1", "path": "/foo/3" } - ] - )"_json; + [ + { "op": "add", "path": "/foo/1", "value": "qux" } + ] + )"_json; // The resulting JSON document: json expected = R"( - { "foo": [ "all", "cows", "eat", "grass" ] } - )"_json; + { "foo": [ "bar", "qux", "baz" ] } + )"_json; // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); } - SECTION("example A.8 - Testing a Value: Success") + SECTION("A.3. Removing an Object Member") { // An example target JSON document: json doc = R"( - { - "baz": "qux", - "foo": [ "a", 2, "c" ] - } - )"_json; + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "remove", "path": "/baz" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": "bar" } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("A.4. Removing an Array Element") + { + // An example target JSON document: + json doc = R"( + { "foo": [ "bar", "qux", "baz" ] } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "remove", "path": "/foo/1" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": [ "bar", "baz" ] } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("A.5. Replacing a Value") + { + // An example target JSON document: + json doc = R"( + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "replace", "path": "/baz", "value": "boo" } + ] + )"_json; + + json expected = R"( + { + "baz": "boo", + "foo": "bar" + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("A.6. Moving a Value") + { + // An example target JSON document: + json doc = R"( + { + "foo": { + "bar": "baz", + "waldo": "fred" + }, + "qux": { + "corge": "grault" + } + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "move", "from": "/foo/waldo", "path": "/qux/thud" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { + "foo": { + "bar": "baz" + }, + "qux": { + "corge": "grault", + "thud": "fred" + } + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("A.7. Moving a Value") + { + // An example target JSON document: + json doc = R"( + { "foo": [ "all", "grass", "cows", "eat" ] } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "move", "from": "/foo/1", "path": "/foo/3" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": [ "all", "cows", "eat", "grass" ] } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("A.8. Testing a Value: Success") + { + // An example target JSON document: + json doc = R"( + { + "baz": "qux", + "foo": [ "a", 2, "c" ] + } + )"_json; // A JSON Patch document that will result in successful evaluation: json patch = R"( - [ - { "op": "test", "path": "/baz", "value": "qux" }, - { "op": "test", "path": "/foo/1", "value": 2 } - ] - )"_json; + [ + { "op": "test", "path": "/baz", "value": "qux" }, + { "op": "test", "path": "/foo/1", "value": 2 } + ] + )"_json; // check if evaluation does not throw - CHECK_NOTHROW(doc.apply_patch(patch)); + CHECK_NOTHROW(doc.patch(patch)); // check if patched document is unchanged - CHECK(doc.apply_patch(patch) == doc); + CHECK(doc.patch(patch) == doc); } - SECTION("example A.9 - Testing a Value: Error") + SECTION("A.9. Testing a Value: Error") { // An example target JSON document: json doc = R"( - { "baz": "qux" } - )"_json; + { "baz": "qux" } + )"_json; // A JSON Patch document that will result in an error condition: json patch = R"( - [ - { "op": "test", "path": "/baz", "value": "bar" } - ] - )"_json; + [ + { "op": "test", "path": "/baz", "value": "bar" } + ] + )"_json; // check that evaluation throws - CHECK_THROWS_AS(doc.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(doc.apply_patch(patch), "unsuccessful: " + patch[0].dump()); + CHECK_THROWS_AS(doc.patch(patch), std::domain_error); + CHECK_THROWS_WITH(doc.patch(patch), "unsuccessful: " + patch[0].dump()); } - SECTION("example A.10 - Adding a Nested Member Object") + SECTION("A.10. Adding a Nested Member Object") { // An example target JSON document: json doc = R"( - { "foo": "bar" } - )"_json; + { "foo": "bar" } + )"_json; // A JSON Patch document: json patch = R"( - [ - { "op": "add", "path": "/child", "value": { "grandchild": { } } } - ] - )"_json; + [ + { "op": "add", "path": "/child", "value": { "grandchild": { } } } + ] + )"_json; // The resulting JSON document: - json expected = R"( - { - "foo": "bar", - "child": { - "grandchild": { - } - } - } - )"_json; - - // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); - } - - SECTION("example A.11 - Ignoring Unrecognized Elements") - { - // An example target JSON document: - json doc = R"( - { "foo": "bar" } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "add", "path": "/baz", "value": "qux", "xyz": 123 } - ] - )"_json; - json expected = R"( { "foo": "bar", - "baz": "qux" - } - )"_json; + "child": { + "grandchild": { + } + } + } + )"_json; // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); } - SECTION("example A.12 - Adding to a Nonexistent Target") + SECTION("A.11. Ignoring Unrecognized Elements") { // An example target JSON document: json doc = R"( - { "foo": "bar" } - )"_json; + { "foo": "bar" } + )"_json; // A JSON Patch document: json patch = R"( - [ - { "op": "add", "path": "/baz/bat", "value": "qux" } - ] - )"_json; + [ + { "op": "add", "path": "/baz", "value": "qux", "xyz": 123 } + ] + )"_json; + + json expected = R"( + { + "foo": "bar", + "baz": "qux" + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("A.12. Adding to a Nonexistent Target") + { + // An example target JSON document: + json doc = R"( + { "foo": "bar" } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/baz/bat", "value": "qux" } + ] + )"_json; // This JSON Patch document, applied to the target JSON document // above, would result in an error (therefore, it would not be @@ -12700,89 +12780,150 @@ TEST_CASE("JSON patch") // references neither the root of the document, nor a member of // an existing object, nor a member of an existing array. - CHECK_THROWS_AS(doc.apply_patch(patch), std::out_of_range); - CHECK_THROWS_WITH(doc.apply_patch(patch), "key 'baz' not found"); + CHECK_THROWS_AS(doc.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(doc.patch(patch), "key 'baz' not found"); } - // A.13. Invalid JSON Patch Document + // A.13. Invalid JSON Patch Document // not applicable - SECTION("example A.14 - Escape Ordering") + SECTION("A.14. Escape Ordering") { // An example target JSON document: json doc = R"( - { - "/": 9, - "~1": 10 - } - )"_json; + { + "/": 9, + "~1": 10 + } + )"_json; // A JSON Patch document: json patch = R"( - [ - {"op": "test", "path": "/~01", "value": 10} - ] - )"_json; + [ + {"op": "test", "path": "/~01", "value": 10} + ] + )"_json; json expected = R"( - { - "/": 9, - "~1": 10 - } - )"_json; + { + "/": 9, + "~1": 10 + } + )"_json; // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); } - SECTION("example A.15 - Comparing Strings and Numbers") + SECTION("A.15. Comparing Strings and Numbers") { // An example target JSON document: json doc = R"( - { - "/": 9, - "~1": 10 - } - )"_json; + { + "/": 9, + "~1": 10 + } + )"_json; // A JSON Patch document that will result in an error condition: json patch = R"( - [ - {"op": "test", "path": "/~01", "value": "10"} - ] - )"_json; + [ + {"op": "test", "path": "/~01", "value": "10"} + ] + )"_json; // check that evaluation throws - CHECK_THROWS_AS(doc.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(doc.apply_patch(patch), "unsuccessful: " + patch[0].dump()); + CHECK_THROWS_AS(doc.patch(patch), std::domain_error); + CHECK_THROWS_WITH(doc.patch(patch), "unsuccessful: " + patch[0].dump()); } - SECTION("example A.16 - Adding an Array Value") + SECTION("A.16. Adding an Array Value") { // An example target JSON document: json doc = R"( - { "foo": ["bar"] } - )"_json; + { "foo": ["bar"] } + )"_json; // A JSON Patch document: json patch = R"( - [ - { "op": "add", "path": "/foo/-", "value": ["abc", "def"] } - ] - )"_json; + [ + { "op": "add", "path": "/foo/-", "value": ["abc", "def"] } + ] + )"_json; // The resulting JSON document: json expected = R"( - { "foo": ["bar", ["abc", "def"]] } - )"_json; + { "foo": ["bar", ["abc", "def"]] } + )"_json; // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); } } SECTION("own examples") { + SECTION("add") + { + SECTION("add to the root element") + { + // If the path is the root of the target document - the + // specified value becomes the entire content of the target + // document. + + // An example target JSON document: + json doc = 17; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "", "value": [1,2,3] } + ] + )"_json; + + // The resulting JSON document: + json expected = {1, 2, 3}; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("add to end of the array") + { + // The specified index MUST NOT be greater than the number of + // elements in the array. The example below uses and index of + // exactly the number of elements in the array which is legal. + + // An example target JSON document: + json doc = {0, 1, 2}; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/3", "value": 3 } + ] + )"_json; + + // The resulting JSON document: + json expected = {0, 1, 2, 3}; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + } + SECTION("copy") { // An example target JSON document: @@ -12805,6 +12946,7 @@ TEST_CASE("JSON patch") ] )"_json; + // The resulting JSON document: json expected = R"( { "foo": { @@ -12819,7 +12961,60 @@ TEST_CASE("JSON patch") )"_json; // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("replace") + { + json j = "string"; + json patch = {{{"op", "replace"}, {"path", ""}, {"value", 1}}}; + CHECK(j.patch(patch) == json(1)); + } + + SECTION("documentation GIF") + { + { + // a JSON patch + json p1 = R"( + [{"op": "add", "path": "/GB", "value": "London"}] + )"_json; + + // a JSON value + json source = R"( + {"D": "Berlin", "F": "Paris"} + )"_json; + + // apply the patch + json target = source.patch(p1); + // target = { "D": "Berlin", "F": "Paris", "GB": "London" } + CHECK(target == R"({ "D": "Berlin", "F": "Paris", "GB": "London" })"_json); + + // create a diff from two JSONs + json p2 = json::diff(target, source); + // p2 = [{"op": "delete", "path": "/GB"}] + CHECK(p2 == R"([{"op":"remove","path":"/GB"}])"_json); + } + { + // a JSON value + json j = {"good", "bad", "ugly"}; + + // a JSON pointer + auto ptr = json::json_pointer("/2"); + + // use to access elements + j[ptr] = {{"it", "cattivo"}}; + CHECK(j == R"(["good","bad",{"it":"cattivo"}])"_json); + + // use user-defined string literal + j["/2/en"_json_pointer] = "ugly"; + CHECK(j == R"(["good","bad",{"en":"ugly","it":"cattivo"}])"_json); + + json flat = j.flatten(); + CHECK(flat == R"({"/0":"good","/1":"bad","/2/en":"ugly","/2/it":"cattivo"})"_json); + } } } @@ -12827,20 +13022,44 @@ TEST_CASE("JSON patch") { SECTION("unknown operation") { + SECTION("not an array") + { + json j; + json patch = {{"op", "add"}, {"path", ""}, {"value", 1}}; + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "JSON patch must be an array of objects"); + } + + SECTION("not an array of objects") + { + json j; + json patch = {"op", "add", "path", "", "value", 1}; + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "JSON patch must be an array of objects"); + } + SECTION("missing 'op'") { json j; json patch = {{{"foo", "bar"}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation must have member 'op'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation must have member 'op'"); } SECTION("non-string 'op'") { json j; json patch = {{{"op", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation must have string member 'op'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation must have string member 'op'"); + } + + SECTION("invalid operation") + { + json j; + json patch = {{{"op", "foo"}, {"path", ""}}}; + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation value 'foo' is invalid"); } } @@ -12850,24 +13069,32 @@ TEST_CASE("JSON patch") { json j; json patch = {{{"op", "add"}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'add' must have member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'add' must have member 'path'"); } SECTION("non-string 'path'") { json j; json patch = {{{"op", "add"}, {"path", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'add' must have string member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'add' must have string member 'path'"); } SECTION("missing 'value'") { json j; json patch = {{{"op", "add"}, {"path", ""}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'add' must have member 'value'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'add' must have member 'value'"); + } + + SECTION("invalid array index") + { + json j = {1, 2}; + json patch = {{{"op", "add"}, {"path", "/4"}, {"value", 4}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "array index 4 is out of range"); } } @@ -12877,16 +13104,40 @@ TEST_CASE("JSON patch") { json j; json patch = {{{"op", "remove"}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'remove' must have member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'remove' must have member 'path'"); } SECTION("non-string 'path'") { json j; json patch = {{{"op", "remove"}, {"path", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'remove' must have string member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'remove' must have string member 'path'"); + } + + SECTION("nonexisting target location (array)") + { + json j = {1, 2, 3}; + json patch = {{{"op", "remove"}, {"path", "/17"}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "array index 17 is out of range"); + } + + SECTION("nonexisting target location (object)") + { + json j = {{"foo", 1}, {"bar", 2}}; + json patch = {{{"op", "remove"}, {"path", "/baz"}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "key 'baz' not found"); + } + + SECTION("root element as target location") + { + json j = "string"; + json patch = {{{"op", "remove"}, {"path", ""}}}; + CHECK_THROWS_AS(j.patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.patch(patch), "JSON pointer has no parent"); } } @@ -12896,24 +13147,40 @@ TEST_CASE("JSON patch") { json j; json patch = {{{"op", "replace"}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'replace' must have member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'replace' must have member 'path'"); } SECTION("non-string 'path'") { json j; json patch = {{{"op", "replace"}, {"path", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'replace' must have string member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'replace' must have string member 'path'"); } SECTION("missing 'value'") { json j; json patch = {{{"op", "replace"}, {"path", ""}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'replace' must have member 'value'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'replace' must have member 'value'"); + } + + SECTION("nonexisting target location (array)") + { + json j = {1, 2, 3}; + json patch = {{{"op", "replace"}, {"path", "/17"}, {"value", 19}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "array index 17 is out of range"); + } + + SECTION("nonexisting target location (object)") + { + json j = {{"foo", 1}, {"bar", 2}}; + json patch = {{{"op", "replace"}, {"path", "/baz"}, {"value", 3}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "key 'baz' not found"); } } @@ -12923,32 +13190,48 @@ TEST_CASE("JSON patch") { json j; json patch = {{{"op", "move"}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'move' must have member 'path'"); } SECTION("non-string 'path'") { json j; json patch = {{{"op", "move"}, {"path", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have string member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'move' must have string member 'path'"); } SECTION("missing 'from'") { json j; json patch = {{{"op", "move"}, {"path", ""}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have member 'from'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'move' must have member 'from'"); } SECTION("non-string 'from'") { json j; json patch = {{{"op", "move"}, {"path", ""}, {"from", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have string member 'from'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'move' must have string member 'from'"); + } + + SECTION("nonexisting from location (array)") + { + json j = {1, 2, 3}; + json patch = {{{"op", "move"}, {"path", "/0"}, {"from", "/5"}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "array index 5 is out of range"); + } + + SECTION("nonexisting from location (object)") + { + json j = {{"foo", 1}, {"bar", 2}}; + json patch = {{{"op", "move"}, {"path", "/baz"}, {"from", "/baz"}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "key 'baz' not found"); } } @@ -12958,32 +13241,48 @@ TEST_CASE("JSON patch") { json j; json patch = {{{"op", "copy"}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'copy' must have member 'path'"); } SECTION("non-string 'path'") { json j; json patch = {{{"op", "copy"}, {"path", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have string member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'copy' must have string member 'path'"); } SECTION("missing 'from'") { json j; json patch = {{{"op", "copy"}, {"path", ""}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have member 'from'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'copy' must have member 'from'"); } SECTION("non-string 'from'") { json j; json patch = {{{"op", "copy"}, {"path", ""}, {"from", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have string member 'from'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'copy' must have string member 'from'"); + } + + SECTION("nonexisting from location (array)") + { + json j = {1, 2, 3}; + json patch = {{{"op", "copy"}, {"path", "/0"}, {"from", "/5"}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "array index 5 is out of range"); + } + + SECTION("nonexisting from location (object)") + { + json j = {{"foo", 1}, {"bar", 2}}; + json patch = {{{"op", "copy"}, {"path", "/fob"}, {"from", "/baz"}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "key 'baz' not found"); } } @@ -12993,27 +13292,288 @@ TEST_CASE("JSON patch") { json j; json patch = {{{"op", "test"}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'test' must have member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'test' must have member 'path'"); } SECTION("non-string 'path'") { json j; json patch = {{{"op", "test"}, {"path", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'test' must have string member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'test' must have string member 'path'"); } SECTION("missing 'value'") { json j; json patch = {{{"op", "test"}, {"path", ""}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'test' must have member 'value'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'test' must have member 'value'"); } } } + + SECTION("Examples from jsonpatch.com") + { + SECTION("Simple Example") + { + // The original document + json doc = R"( + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // The patch + json patch = R"( + [ + { "op": "replace", "path": "/baz", "value": "boo" }, + { "op": "add", "path": "/hello", "value": ["world"] }, + { "op": "remove", "path": "/foo"} + ] + )"_json; + + // The result + json result = R"( + { + "baz": "boo", + "hello": ["world"] + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == result); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, result)) == result); + } + + SECTION("Operations") + { + // The original document + json doc = R"( + { + "biscuits": [ + {"name":"Digestive"}, + {"name": "Choco Liebniz"} + ] + } + )"_json; + + SECTION("add") + { + // The patch + json patch = R"( + [ + {"op": "add", "path": "/biscuits/1", "value": {"name": "Ginger Nut"}} + ] + )"_json; + + // The result + json result = R"( + { + "biscuits": [ + {"name": "Digestive"}, + {"name": "Ginger Nut"}, + {"name": "Choco Liebniz"} + ] + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == result); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, result)) == result); + } + + SECTION("remove") + { + // The patch + json patch = R"( + [ + {"op": "remove", "path": "/biscuits"} + ] + )"_json; + + // The result + json result = R"( + {} + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == result); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, result)) == result); + } + + SECTION("replace") + { + // The patch + json patch = R"( + [ + {"op": "replace", "path": "/biscuits/0/name", "value": "Chocolate Digestive"} + ] + )"_json; + + // The result + json result = R"( + { + "biscuits": [ + {"name": "Chocolate Digestive"}, + {"name": "Choco Liebniz"} + ] + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == result); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, result)) == result); + } + + SECTION("copy") + { + // The patch + json patch = R"( + [ + {"op": "copy", "from": "/biscuits/0", "path": "/best_biscuit"} + ] + )"_json; + + // The result + json result = R"( + { + "biscuits": [ + {"name": "Digestive"}, + {"name": "Choco Liebniz"} + ], + "best_biscuit": { + "name": "Digestive" + } + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == result); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, result)) == result); + } + + SECTION("move") + { + // The patch + json patch = R"( + [ + {"op": "move", "from": "/biscuits", "path": "/cookies"} + ] + )"_json; + + // The result + json result = R"( + { + "cookies": [ + {"name": "Digestive"}, + {"name": "Choco Liebniz"} + ] + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == result); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, result)) == result); + } + + SECTION("test") + { + // The patch + json patch = R"( + [ + {"op": "test", "path": "/best_biscuit/name", "value": "Choco Liebniz"} + ] + )"_json; + + // the test will fail + CHECK_THROWS_AS(doc.patch(patch), std::domain_error); + CHECK_THROWS_WITH(doc.patch(patch), "unsuccessful: " + patch[0].dump()); + } + } + } + + SECTION("Examples from bruth.github.io/jsonpatch-js") + { + SECTION("add") + { + CHECK(R"( {} )"_json.patch( + R"( [{"op": "add", "path": "/foo", "value": "bar"}] )"_json + ) == R"( {"foo": "bar"} )"_json); + + CHECK(R"( {"foo": [1, 3]} )"_json.patch( + R"( [{"op": "add", "path": "/foo", "value": "bar"}] )"_json + ) == R"( {"foo": "bar"} )"_json); + + CHECK(R"( {"foo": [{}]} )"_json.patch( + R"( [{"op": "add", "path": "/foo/0/bar", "value": "baz"}] )"_json + ) == R"( {"foo": [{"bar": "baz"}]} )"_json); + } + + SECTION("remove") + { + CHECK(R"( {"foo": "bar"} )"_json.patch( + R"( [{"op": "remove", "path": "/foo"}] )"_json + ) == R"( {} )"_json); + + CHECK(R"( {"foo": [1, 2, 3]} )"_json.patch( + R"( [{"op": "remove", "path": "/foo/1"}] )"_json + ) == R"( {"foo": [1, 3]} )"_json); + + CHECK(R"( {"foo": [{"bar": "baz"}]} )"_json.patch( + R"( [{"op": "remove", "path": "/foo/0/bar"}] )"_json + ) == R"( {"foo": [{}]} )"_json); + } + + SECTION("replace") + { + CHECK(R"( {"foo": "bar"} )"_json.patch( + R"( [{"op": "replace", "path": "/foo", "value": 1}] )"_json + ) == R"( {"foo": 1} )"_json); + + CHECK(R"( {"foo": [1, 2, 3]} )"_json.patch( + R"( [{"op": "replace", "path": "/foo/1", "value": 4}] )"_json + ) == R"( {"foo": [1, 4, 3]} )"_json); + + CHECK(R"( {"foo": [{"bar": "baz"}]} )"_json.patch( + R"( [{"op": "replace", "path": "/foo/0/bar", "value": 1}] )"_json + ) == R"( {"foo": [{"bar": 1}]} )"_json); + } + + SECTION("move") + { + CHECK(R"( {"foo": [1, 2, 3]} )"_json.patch( + R"( [{"op": "move", "from": "/foo", "path": "/bar"}] )"_json + ) == R"( {"bar": [1, 2, 3]} )"_json); + } + + SECTION("copy") + { + CHECK(R"( {"foo": [1, 2, 3]} )"_json.patch( + R"( [{"op": "copy", "from": "/foo/1", "path": "/bar"}] )"_json + ) == R"( {"foo": [1, 2, 3], "bar": 2} )"_json); + } + + SECTION("copy") + { + CHECK_NOTHROW(R"( {"foo": "bar"} )"_json.patch( + R"( [{"op": "test", "path": "/foo", "value": "bar"}] )"_json)); + } + } } TEST_CASE("regression tests") From 9af8f7d09421d2023c32013a3c2504f5130dcc1d Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 26 Apr 2016 20:38:01 +0200 Subject: [PATCH 033/133] update after #238 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2dd60bf13..d4b2fbea2 100644 --- a/README.md +++ b/README.md @@ -410,7 +410,7 @@ I deeply appreciate the help of the following people. - [Lv Zheng](https://github.com/lv-zheng) fixed a namespace issue with `int64_t` and `uint64_t`. - [abc100m](https://github.com/abc100m) analyzed the issues with GCC 4.8 and proposed a [partial solution](https://github.com/nlohmann/json/pull/212). - [zewt](https://github.com/zewt) added useful notes to the README file about Android. -- [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators. +- [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators and improved the integration via CMake . Thanks a lot for helping out! From e35805cf3a30ff4052e879746bbfc4544813706c Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 19:29:02 +0200 Subject: [PATCH 034/133] added GCC 6 and Clang 3.8 to Travis --- .travis.yml | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 629bec876..fd405df84 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,6 +30,14 @@ matrix: packages: ['g++-5', 'valgrind'] env: COMPILER=g++-5 + - os: linux + compiler: gcc + addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: ['g++-6', 'valgrind'] + env: COMPILER=g++-6 + - os: linux compiler: clang addons: @@ -45,6 +53,14 @@ matrix: sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7'] packages: ['clang-3.7', 'valgrind'] env: COMPILER=clang++-3.7 + + - os: linux + compiler: clang + addons: + apt: + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.8'] + packages: ['clang-3.8', 'valgrind'] + env: COMPILER=clang++-3.8 # - os: osx # compiler: clang @@ -57,11 +73,3 @@ script: - make CXX=$COMPILER CXXFLAGS="-lstdc++" - ./json_unit "*" - valgrind --error-exitcode=1 --leak-check=full ./json_unit - -notifications: - webhooks: - urls: - - https://webhooks.gitter.im/e/f1196addb0e97a5ff396 - on_success: change - on_failure: always - on_start: never From 86d7e3090f0e5d47626436a019149584e2d18f86 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 19:33:43 +0200 Subject: [PATCH 035/133] removed GCC 6, added Clang 3.5 --- .travis.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index fd405df84..495882353 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,13 +30,21 @@ matrix: packages: ['g++-5', 'valgrind'] env: COMPILER=g++-5 +# - os: linux +# compiler: gcc +# addons: +# apt: +# sources: ['ubuntu-toolchain-r-test'] +# packages: ['g++-6', 'valgrind'] +# env: COMPILER=g++-6 + - os: linux - compiler: gcc + compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-6', 'valgrind'] - env: COMPILER=g++-6 + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.5'] + packages: ['clang-3.5', 'valgrind'] + env: COMPILER=clang++-3.5 - os: linux compiler: clang From ca604c5a2ebb751aed3156011c220bbf3f9596de Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 19:37:52 +0200 Subject: [PATCH 036/133] trying Clang 3.9 --- .travis.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 495882353..4b3b700b7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,13 +38,8 @@ matrix: # packages: ['g++-6', 'valgrind'] # env: COMPILER=g++-6 - - os: linux - compiler: clang - addons: - apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.5'] - packages: ['clang-3.5', 'valgrind'] - env: COMPILER=clang++-3.5 + # Clang 3.5 is not able to compile the code, + # see https://travis-ci.org/nlohmann/json/jobs/126720186 - os: linux compiler: clang @@ -69,6 +64,14 @@ matrix: sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.8'] packages: ['clang-3.8', 'valgrind'] env: COMPILER=clang++-3.8 + + - os: linux + compiler: clang + addons: + apt: + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.9'] + packages: ['clang-3.9', 'valgrind'] + env: COMPILER=clang++-3.9 # - os: osx # compiler: clang From 68c50073a425af9fa2381d041c8e5dad240162f6 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 19:46:37 +0200 Subject: [PATCH 037/133] added OSX --- .travis.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4b3b700b7..cd8957592 100644 --- a/.travis.yml +++ b/.travis.yml @@ -69,16 +69,17 @@ matrix: compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.9'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] packages: ['clang-3.9', 'valgrind'] env: COMPILER=clang++-3.9 - # - os: osx - # compiler: clang - # env: COMPILER=clang - # before_install: - # - brew update - # - brew install valgrind + - os: osx + osx_image: xcode7.3 + compiler: clang + env: COMPILER=clang + before_install: + - brew update + - brew install valgrind script: - make CXX=$COMPILER CXXFLAGS="-lstdc++" From 40abeb28d584dc8b7f1c3aaff1ac9c1312568051 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 20:00:33 +0200 Subject: [PATCH 038/133] Valgrind only for Linux --- .travis.yml | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index cd8957592..f7c915119 100644 --- a/.travis.yml +++ b/.travis.yml @@ -45,7 +45,7 @@ matrix: compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.6'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] packages: ['clang-3.6', 'valgrind'] env: COMPILER=clang++-3.6 @@ -53,7 +53,7 @@ matrix: compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] packages: ['clang-3.7', 'valgrind'] env: COMPILER=clang++-3.7 @@ -61,7 +61,7 @@ matrix: compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.8'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] packages: ['clang-3.8', 'valgrind'] env: COMPILER=clang++-3.8 @@ -72,7 +72,23 @@ matrix: sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] packages: ['clang-3.9', 'valgrind'] env: COMPILER=clang++-3.9 + + - os: osx + osx_image: xcode7.1 + compiler: clang + env: COMPILER=clang + before_install: + - brew update + - brew install valgrind + - os: osx + osx_image: xcode7.2 + compiler: clang + env: COMPILER=clang + before_install: + - brew update + - brew install valgrind + - os: osx osx_image: xcode7.3 compiler: clang @@ -84,4 +100,6 @@ matrix: script: - make CXX=$COMPILER CXXFLAGS="-lstdc++" - ./json_unit "*" - - valgrind --error-exitcode=1 --leak-check=full ./json_unit + - if [ "${os}" = "linux" ]; then + valgrind --error-exitcode=1 --leak-check=full ./json_unit ; + fi From a07cdb14ecfbf84c38643c23b3490a684991eb4c Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 20:01:11 +0200 Subject: [PATCH 039/133] don't install valgrind for OSX --- .travis.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index f7c915119..79fad4708 100644 --- a/.travis.yml +++ b/.travis.yml @@ -77,25 +77,16 @@ matrix: osx_image: xcode7.1 compiler: clang env: COMPILER=clang - before_install: - - brew update - - brew install valgrind - os: osx osx_image: xcode7.2 compiler: clang env: COMPILER=clang - before_install: - - brew update - - brew install valgrind - os: osx osx_image: xcode7.3 compiler: clang env: COMPILER=clang - before_install: - - brew update - - brew install valgrind script: - make CXX=$COMPILER CXXFLAGS="-lstdc++" From ddc5442c91b54837060404f91e46f27d968f60d2 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 20:09:41 +0200 Subject: [PATCH 040/133] cleanup --- .travis.yml | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 79fad4708..2133d17ac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -45,7 +45,7 @@ matrix: compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.6'] packages: ['clang-3.6', 'valgrind'] env: COMPILER=clang++-3.6 @@ -53,7 +53,7 @@ matrix: compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7'] packages: ['clang-3.7', 'valgrind'] env: COMPILER=clang++-3.7 @@ -61,7 +61,7 @@ matrix: compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.8'] packages: ['clang-3.8', 'valgrind'] env: COMPILER=clang++-3.8 @@ -73,6 +73,26 @@ matrix: packages: ['clang-3.9', 'valgrind'] env: COMPILER=clang++-3.9 + - os: osx + osx_image: beta-xcode6.1 + compiler: clang + env: COMPILER=clang + + - os: osx + osx_image: beta-xcode6.2 + compiler: clang + env: COMPILER=clang + + - os: osx + osx_image: beta-xcode6.3 + compiler: clang + env: COMPILER=clang + + - os: osx + osx_image: xcode6.4 + compiler: clang + env: COMPILER=clang + - os: osx osx_image: xcode7.1 compiler: clang @@ -91,6 +111,6 @@ matrix: script: - make CXX=$COMPILER CXXFLAGS="-lstdc++" - ./json_unit "*" - - if [ "${os}" = "linux" ]; then + - if [ "${TRAVIS_OS_NAME}" = "linux" ]; then valgrind --error-exitcode=1 --leak-check=full ./json_unit ; fi From b685737d53c4adbd5869b238c46a8782ffd3f237 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 20:18:20 +0200 Subject: [PATCH 041/133] added MinGW --- .travis.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2133d17ac..3341f8236 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,6 +30,14 @@ matrix: packages: ['g++-5', 'valgrind'] env: COMPILER=g++-5 + - os: linux + compiler: gcc + addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: ['g++-mingw-w64'] + env: COMPILER=g++-mingw-w64 + # - os: linux # compiler: gcc # addons: @@ -111,6 +119,6 @@ matrix: script: - make CXX=$COMPILER CXXFLAGS="-lstdc++" - ./json_unit "*" - - if [ "${TRAVIS_OS_NAME}" = "linux" ]; then + - if [ `which valgrind` ]; then valgrind --error-exitcode=1 --leak-check=full ./json_unit ; fi From c019088d3b750841c8565a30c564d23d438b5b0e Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 20:35:40 +0200 Subject: [PATCH 042/133] wrong MinGW binary --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3341f8236..c038866e4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,7 +36,7 @@ matrix: apt: sources: ['ubuntu-toolchain-r-test'] packages: ['g++-mingw-w64'] - env: COMPILER=g++-mingw-w64 + env: COMPILER=i686-w64-mingw32-g++ # - os: linux # compiler: gcc From 74544b42af024c1d4f1942be534859aa22947276 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 20:48:47 +0200 Subject: [PATCH 043/133] removed MinGW compiler (too old) --- .travis.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index c038866e4..882f98d2f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,14 +30,6 @@ matrix: packages: ['g++-5', 'valgrind'] env: COMPILER=g++-5 - - os: linux - compiler: gcc - addons: - apt: - sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-mingw-w64'] - env: COMPILER=i686-w64-mingw32-g++ - # - os: linux # compiler: gcc # addons: From 62f81a60d7a9d62ee2fcf2569b8f4a7aceea5551 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 21:23:13 +0200 Subject: [PATCH 044/133] hopefully fixed a warning --- src/json.hpp | 6 ++++-- src/json.hpp.re2c | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 57a8f4c72..65ced7305 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -6078,9 +6078,11 @@ class basic_json { // convert a number 0..15 to its hex representation // (0..f) - auto hexify = [](const char v) -> char + const auto hexify = [](const int v) -> char { - return (v < 10) ? ('0' + v) : ('a' + v - 10); + return (v < 10) + ? ('0' + static_cast(v)) + : ('a' + static_cast(v - 10)); }; // print character c as \uxxxx diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index cdd96ee91..0aa8321e5 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -6078,9 +6078,11 @@ class basic_json { // convert a number 0..15 to its hex representation // (0..f) - auto hexify = [](const char v) -> char + const auto hexify = [](const int v) -> char { - return (v < 10) ? ('0' + v) : ('a' + v - 10); + return (v < 10) + ? ('0' + static_cast(v)) + : ('a' + static_cast(v - 10)); }; // print character c as \uxxxx From 1d3b4dd1583d1eeacf7df3c0f9ad2f356b378712 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 00:03:47 +0200 Subject: [PATCH 045/133] added test cases --- ChangeLog.md | 5 ++- doc/examples/json_pointer__to_string.cpp | 34 +++++++++++++++++ doc/examples/json_pointer__to_string.link | 1 + doc/examples/json_pointer__to_string.output | 12 ++++++ src/json.hpp | 37 +++++++++++++++++-- src/json.hpp.re2c | 37 +++++++++++++++++-- test/unit.cpp | 41 +++++++++++++++++++++ 7 files changed, 160 insertions(+), 7 deletions(-) create mode 100644 doc/examples/json_pointer__to_string.cpp create mode 100644 doc/examples/json_pointer__to_string.link create mode 100644 doc/examples/json_pointer__to_string.output diff --git a/ChangeLog.md b/ChangeLog.md index 0acd10f5a..75827603f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -5,10 +5,12 @@ All notable changes to this project will be documented in this file. This projec [Full Changelog](https://github.com/nlohmann/json/compare/v1.1.0...HEAD) +- Additional integration options [\#237](https://github.com/nlohmann/json/issues/237) +- Can't use basic\_json::iterator as a base iterator for std::move\_iterator [\#233](https://github.com/nlohmann/json/issues/233) - Provide a FAQ [\#163](https://github.com/nlohmann/json/issues/163) - Create PULL\_REQUEST\_TEMPLATE.md [\#213](https://github.com/nlohmann/json/pull/213) ([whackashoe](https://github.com/whackashoe)) - 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) ([msm-](https://github.com/msm-)) +- Add support for afl-fuzz testing [\#207](https://github.com/nlohmann/json/pull/207) ([mykter](https://github.com/mykter)) - 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)) - double values are serialized with commas as decimal points [\#228](https://github.com/nlohmann/json/issues/228) @@ -26,6 +28,7 @@ All notable changes to this project will be documented in this file. This projec - Conflicting typedef of ssize\_t on Windows 32 bit when using Boost.Python [\#204](https://github.com/nlohmann/json/issues/204) - Integer conversion to unsigned [\#178](https://github.com/nlohmann/json/issues/178) +- Implement additional integration options [\#238](https://github.com/nlohmann/json/pull/238) ([robertmrk](https://github.com/robertmrk)) - make serialization locale-independent [\#232](https://github.com/nlohmann/json/pull/232) ([nlohmann](https://github.com/nlohmann)) - fixes \#223 by updating README.md [\#227](https://github.com/nlohmann/json/pull/227) ([kevin--](https://github.com/kevin--)) - Use namespace std for int64\_t and uint64\_t [\#226](https://github.com/nlohmann/json/pull/226) ([lv-zheng](https://github.com/lv-zheng)) diff --git a/doc/examples/json_pointer__to_string.cpp b/doc/examples/json_pointer__to_string.cpp new file mode 100644 index 000000000..4cb053c53 --- /dev/null +++ b/doc/examples/json_pointer__to_string.cpp @@ -0,0 +1,34 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // different JSON Pointers + json::json_pointer ptr1(""); + json::json_pointer ptr2("/foo"); + json::json_pointer ptr3("/foo/0"); + json::json_pointer ptr4("/"); + json::json_pointer ptr5("/a~1b"); + json::json_pointer ptr6("/c%d"); + json::json_pointer ptr7("/e^f"); + json::json_pointer ptr8("/g|h"); + json::json_pointer ptr9("/i\\j"); + json::json_pointer ptr10("/k\"l"); + json::json_pointer ptr11("/ "); + json::json_pointer ptr12("/m~0n"); + + + std::cout << ptr1.to_string() << '\n' + << ptr2.to_string() << '\n' + << ptr3.to_string() << '\n' + << ptr4.to_string() << '\n' + << ptr5.to_string() << '\n' + << ptr6.to_string() << '\n' + << ptr7.to_string() << '\n' + << ptr8.to_string() << '\n' + << ptr9.to_string() << '\n' + << ptr10.to_string() << '\n' + << ptr11.to_string() << '\n' + << ptr12.to_string() << std::endl; +} diff --git a/doc/examples/json_pointer__to_string.link b/doc/examples/json_pointer__to_string.link new file mode 100644 index 000000000..407609b20 --- /dev/null +++ b/doc/examples/json_pointer__to_string.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/json_pointer__to_string.output b/doc/examples/json_pointer__to_string.output new file mode 100644 index 000000000..c4b5ea8fa --- /dev/null +++ b/doc/examples/json_pointer__to_string.output @@ -0,0 +1,12 @@ + +/foo +/foo/0 +/ +/a~1b +/c%d +/e^f +/g|h +/i\j +/k"l +/ +/m~0n diff --git a/src/json.hpp b/src/json.hpp index 1785f182f..6b22e89d4 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8818,6 +8818,10 @@ basic_json_parser_63: /*! @brief JSON Pointer + A JSON pointer defines a string syntax for identifying a specific value + within a JSON document. It can be used with functions `at` and + `operator[]`. Furthermore, JSON pointers are the base for JSON patches. + @sa [RFC 6901](https://tools.ietf.org/html/rfc6901) @since version 2.0.0 @@ -8854,10 +8858,37 @@ basic_json_parser_63: : reference_tokens(split(s)) {} - /// test for inequality - bool operator!=(const json_pointer& rhs) const + /*! + @brief return a string representation of the JSON pointer + + @invariant For each JSON pointer `ptr`, it holds: + @code {.cpp} + ptr == json_pointer(ptr.to_string()); + @endcode + + @return a string representation of the JSON pointer + + @liveexample{The example shows the result of `to_string`., + json_pointer__to_string} + + @since version 2.0.0 + */ + std::string to_string() const noexcept { - return reference_tokens != rhs.reference_tokens; + std::string result; + + for (const auto& reference_token : reference_tokens) + { + result += "/" + escape(reference_token); + } + + return result; + } + + /// @copydoc to_string() + operator std::string() const + { + return to_string(); } private: diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 51b721670..3dab33bbe 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8128,6 +8128,10 @@ class basic_json /*! @brief JSON Pointer + A JSON pointer defines a string syntax for identifying a specific value + within a JSON document. It can be used with functions `at` and + `operator[]`. Furthermore, JSON pointers are the base for JSON patches. + @sa [RFC 6901](https://tools.ietf.org/html/rfc6901) @since version 2.0.0 @@ -8164,10 +8168,37 @@ class basic_json : reference_tokens(split(s)) {} - /// test for inequality - bool operator!=(const json_pointer& rhs) const + /*! + @brief return a string representation of the JSON pointer + + @invariant For each JSON pointer `ptr`, it holds: + @code {.cpp} + ptr == json_pointer(ptr.to_string()); + @endcode + + @return a string representation of the JSON pointer + + @liveexample{The example shows the result of `to_string`., + json_pointer__to_string} + + @since version 2.0.0 + */ + std::string to_string() const noexcept { - return reference_tokens != rhs.reference_tokens; + std::string result; + + for (const auto& reference_token : reference_tokens) + { + result += "/" + escape(reference_token); + } + + return result; + } + + /// @copydoc to_string() + operator std::string() const + { + return to_string(); } private: diff --git a/test/unit.cpp b/test/unit.cpp index f6c49883b..d038b8679 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12035,6 +12035,36 @@ TEST_CASE("Unicode", "[hide]") // the array has 1112064 + 1 elemnts (a terminating "null" value) CHECK(j.size() == 1112065); + + SECTION("check JSON Pointers") + { + for (auto s : j) + { + // skip non-string JSON values + if (not s.is_string()) + { + continue; + } + + std::string ptr = s; + + // tilde must be followed by 0 or 1 + if (ptr == "~") + { + ptr += "0"; + } + + // JSON Pointers must begin with "/" + ptr = "/" + ptr; + + CHECK_NOTHROW(json::json_pointer("/" + ptr)); + + // check escape/unescape roundtrip + auto escaped = json::json_pointer::escape(ptr); + json::json_pointer::unescape(escaped); + CHECK(escaped == ptr); + } + } } SECTION("ignore byte-order-mark") @@ -12389,6 +12419,17 @@ TEST_CASE("JSON pointers") json j_object(json::value_t::object); CHECK(j_object.flatten().unflatten() == json()); } + + SECTION("string representation") + { + for (auto ptr : + {"", "/foo", "/foo/0", "/", "/a~1b", "/c%d", "/e^f", "/g|h", "/i\\j", "/k\"l", "/ ", "/m~0n" + }) + { + CHECK(json::json_pointer(ptr).to_string() == ptr); + CHECK(json::json_pointer(ptr) == ptr); + } + } } TEST_CASE("JSON patch") From f4ecceab19442e46813de74c3f1571e16ceffa42 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 00:12:19 +0200 Subject: [PATCH 046/133] cleanup --- test/unit.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/unit.cpp b/test/unit.cpp index d038b8679..2ad28a746 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12427,7 +12427,6 @@ TEST_CASE("JSON pointers") }) { CHECK(json::json_pointer(ptr).to_string() == ptr); - CHECK(json::json_pointer(ptr) == ptr); } } } From be16d005e4e7167c23344e78b72b5229706d347d Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 00:25:11 +0200 Subject: [PATCH 047/133] get compiler versions --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 882f98d2f..979c5aabf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -109,6 +109,7 @@ matrix: env: COMPILER=clang script: + - $COMPILER --version - make CXX=$COMPILER CXXFLAGS="-lstdc++" - ./json_unit "*" - if [ `which valgrind` ]; then From 7c04bc3db659cfd02bbe1903bea4447a672aed83 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 00:43:33 +0200 Subject: [PATCH 048/133] added name call --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 979c5aabf..d1748dff5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -109,6 +109,7 @@ matrix: env: COMPILER=clang script: + - uname -a - $COMPILER --version - make CXX=$COMPILER CXXFLAGS="-lstdc++" - ./json_unit "*" From 9170740f45b033c9fbd06f084890e18bffec091e Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 01:01:41 +0200 Subject: [PATCH 049/133] added documentation on Travis compilers --- README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/README.md b/README.md index 90be576cf..1f1e09274 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,8 @@ Though it's 2016 already, the support for C++11 is still a bit sparse. Currently - Clang 3.4 - 3.9 (and possibly later) - Microsoft Visual C++ 14.0 RC (and possibly later) +The code is currently checked with Travis for GCC 4.9, GCC + I would be happy to learn about other compilers/versions. Please note: @@ -63,6 +65,24 @@ Please note: - For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. +The following compilers are currently used in [continuous integration](https://travis-ci.org/nlohmann/json): + +| Compiler | Operating System | Version String | +|-----------------|------------------------------|----------------| +| GCC 4.9.3 | Ubuntu 14.04.3 LTS | g++-4.9 (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3 | +| GCC 5.3.0 | Ubuntu 14.04.3 LTS | g++-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204 | +| Clang 3.6.2 | Ubuntu 14.04.3 LTS | Ubuntu clang version 3.6.2-svn240577-1~exp1 (branches/release_36) (based on LLVM 3.6.2) | +| Clang 3.7.1 | Ubuntu 14.04.3 LTS | Ubuntu clang version 3.7.1-svn253571-1~exp1 (branches/release_37) (based on LLVM 3.7.1) | +| Clang 3.8.1 | Ubuntu 14.04.3 LTS | clang version 3.8.1-svn265380-1~exp1 (branches/release_38) | +| Clang 3.9.0 | Ubuntu 14.04.3 LTS | clang version 3.9.0-svn267478-1~exp1 (trunk) | +| Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | +| Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | +| Clang Xcode 6.3 | Darwin Kernel Version 14.3.0 | Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) | +| Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | +| Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 | Apple LLVM version 7.0.0 (clang-700.1.76) | +| Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 | Apple LLVM version 7.0.2 (clang-700.1.81) | +| Clang Xcode 7.3 | Darwin Kernel Version 14.5.0 | Apple LLVM version 7.3.0 (clang-703.0.29) | + ## Examples Here are some examples to give you an idea how to use the class. From a21f8b0c77646f3eb225bc98ed3f9ca586101068 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 01:21:35 +0200 Subject: [PATCH 050/133] added AppVeyor information --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1f1e09274..28794d9ce 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ The following compilers are currently used in [continuous integration](https://t | Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 | Apple LLVM version 7.0.0 (clang-700.1.76) | | Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 | Apple LLVM version 7.0.2 (clang-700.1.81) | | Clang Xcode 7.3 | Darwin Kernel Version 14.5.0 | Apple LLVM version 7.3.0 (clang-703.0.29) | +| Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25123.0 | ## Examples From ea84a85b132b2e9bdf1e61aa55b657eba5e254f1 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 10:39:03 +0200 Subject: [PATCH 051/133] simplified flatten/unflatten examples --- README.md | 2 +- doc/examples/flatten.cpp | 9 +-------- doc/examples/flatten.link | 2 +- doc/examples/flatten.output | 5 ----- doc/examples/unflatten.cpp | 4 ---- doc/examples/unflatten.link | 2 +- doc/examples/unflatten.output | 6 +----- 7 files changed, 5 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 28794d9ce..1f501b73c 100644 --- a/README.md +++ b/README.md @@ -449,7 +449,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (3344554 assertions in 31 test cases) +All tests passed (5568699 assertions in 31 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/doc/examples/flatten.cpp b/doc/examples/flatten.cpp index 0601f8a3f..ace53a21b 100644 --- a/doc/examples/flatten.cpp +++ b/doc/examples/flatten.cpp @@ -20,18 +20,11 @@ int main() { "object", { {"currency", "USD"}, - {"value", 42.99}, - {"", "empty string"}, - {"/", "slash"}, - {"~", "tilde"}, - {"~1", "tilde1"} + {"value", 42.99} } } }; // call flatten() std::cout << std::setw(4) << j.flatten() << '\n'; - - // flatten for a primitive value - std::cout << j["pi"].flatten() << '\n'; } diff --git a/doc/examples/flatten.link b/doc/examples/flatten.link index 0fe78bbb1..817d06277 100644 --- a/doc/examples/flatten.link +++ b/doc/examples/flatten.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/flatten.output b/doc/examples/flatten.output index fedfc8ef2..33bd4c4b9 100644 --- a/doc/examples/flatten.output +++ b/doc/examples/flatten.output @@ -6,12 +6,7 @@ "/list/2": 2, "/name": "Niels", "/nothing": null, - "/object/": "empty string", "/object/currency": "USD", "/object/value": 42.99, - "/object/~0": "tilde", - "/object/~01": "tilde1", - "/object/~1": "slash", "/pi": 3.141 } -{"":3.141} diff --git a/doc/examples/unflatten.cpp b/doc/examples/unflatten.cpp index 39c674c94..e2b9b6b86 100644 --- a/doc/examples/unflatten.cpp +++ b/doc/examples/unflatten.cpp @@ -14,12 +14,8 @@ int main() {"/list/2", 2}, {"/name", "Niels"}, {"/nothing", nullptr}, - {"/object/", "empty string"}, {"/object/currency", "USD"}, {"/object/value", 42.99}, - {"/object/~0", "tilde"}, - {"/object/~01", "tilde1"}, - {"/object/~1", "slash"}, {"/pi", 3.141} }; diff --git a/doc/examples/unflatten.link b/doc/examples/unflatten.link index bc7594a0a..d564ab012 100644 --- a/doc/examples/unflatten.link +++ b/doc/examples/unflatten.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/unflatten.output b/doc/examples/unflatten.output index f57c9c9a1..ed48385ae 100644 --- a/doc/examples/unflatten.output +++ b/doc/examples/unflatten.output @@ -11,12 +11,8 @@ "name": "Niels", "nothing": null, "object": { - "": "empty string", - "/": "slash", "currency": "USD", - "value": 42.99, - "~": "tilde", - "~1": "tilde1" + "value": 42.99 }, "pi": 3.141 } From 9073b2ca392893b84bbee789ccb171dda7bef022 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 16:22:27 +0200 Subject: [PATCH 052/133] hopefully removed some warnings --- src/json.hpp | 6 +++--- src/json.hpp.re2c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 65ced7305..80b67710a 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -757,7 +757,7 @@ class basic_json /// assignment type_data_t& operator=(value_t rhs) { - bits.type = static_cast(rhs); + bits.type = static_cast(rhs) & 15; // avoid overflow return *this; } @@ -765,7 +765,7 @@ class basic_json type_data_t(value_t t) noexcept { *reinterpret_cast(this) = 0; - bits.type = static_cast(t); + bits.type = static_cast(t) & 15; // avoid overflow } /// default constructor @@ -6082,7 +6082,7 @@ class basic_json { return (v < 10) ? ('0' + static_cast(v)) - : ('a' + static_cast(v - 10)); + : ('a' + static_cast((v - 10) & 0xff)); }; // print character c as \uxxxx diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 0aa8321e5..1c80915b0 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -757,7 +757,7 @@ class basic_json /// assignment type_data_t& operator=(value_t rhs) { - bits.type = static_cast(rhs); + bits.type = static_cast(rhs) & 15; // avoid overflow return *this; } @@ -765,7 +765,7 @@ class basic_json type_data_t(value_t t) noexcept { *reinterpret_cast(this) = 0; - bits.type = static_cast(t); + bits.type = static_cast(t) & 15; // avoid overflow } /// default constructor @@ -6082,7 +6082,7 @@ class basic_json { return (v < 10) ? ('0' + static_cast(v)) - : ('a' + static_cast(v - 10)); + : ('a' + static_cast((v - 10) & 0xff)); }; // print character c as \uxxxx From c04275966f8e1d2aba154074ef823b5973e1cb68 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 7 May 2016 18:33:43 +0200 Subject: [PATCH 053/133] improved test coverage --- README.md | 2 +- src/json.hpp | 3 ++- src/json.hpp.re2c | 3 ++- test/unit.cpp | 6 ++++++ 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1f501b73c..f8cb20d6e 100644 --- a/README.md +++ b/README.md @@ -449,7 +449,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (5568699 assertions in 31 test cases) +All tests passed (5568703 assertions in 31 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/src/json.hpp b/src/json.hpp index 6b22e89d4..932ab9e54 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9708,7 +9708,8 @@ basic_json_parser_63: default: { - throw std::domain_error("unexpected parent type " + parent.type_name()); + // if there exists a parent it cannot be primitive + assert(false); // LCOV_EXCL_LINE } } } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 3dab33bbe..77a1eea9a 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -9018,7 +9018,8 @@ class basic_json default: { - throw std::domain_error("unexpected parent type " + parent.type_name()); + // if there exists a parent it cannot be primitive + assert(false); // LCOV_EXCL_LINE } } } diff --git a/test/unit.cpp b/test/unit.cpp index 2ad28a746..de00166f7 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12094,6 +12094,12 @@ TEST_CASE("JSON pointers") CHECK_THROWS_AS(json::json_pointer("/~"), std::domain_error); CHECK_THROWS_WITH(json::json_pointer("/~"), "escape error: '~' must be followed with '0' or '1'"); + + json::json_pointer p; + CHECK_THROWS_AS(p.top(), std::domain_error); + CHECK_THROWS_WITH(p.top(), "JSON pointer has no parent"); + CHECK_THROWS_AS(p.pop_back(), std::domain_error); + CHECK_THROWS_WITH(p.pop_back(), "JSON pointer has no parent"); } SECTION("examples from RFC 6901") From 85a30813c8d9b0eccefcdc59e9e4e602a7fffae7 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 7 May 2016 20:22:58 +0200 Subject: [PATCH 054/133] removed unnecessary code (numbers must not begin with "+") --- README.md | 2 +- src/json.hpp | 4 ---- src/json.hpp.re2c | 4 ---- test/unit.cpp | 4 ++++ 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index f8cb20d6e..c9f3a713a 100644 --- a/README.md +++ b/README.md @@ -449,7 +449,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (5568703 assertions in 31 test cases) +All tests passed (5568705 assertions in 31 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/src/json.hpp b/src/json.hpp index 932ab9e54..515365501 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8448,10 +8448,6 @@ basic_json_parser_63: { type = value_t::number_unsigned; max = static_cast(std::numeric_limits::max()); - if (*curptr == '+') - { - curptr++; - } } // count the significant figures diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 77a1eea9a..c8b66e920 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -7758,10 +7758,6 @@ class basic_json { type = value_t::number_unsigned; max = static_cast(std::numeric_limits::max()); - if (*curptr == '+') - { - curptr++; - } } // count the significant figures diff --git a/test/unit.cpp b/test/unit.cpp index de00166f7..9b735108d 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -9776,6 +9776,10 @@ TEST_CASE("parser class") CHECK_THROWS_AS(json::parser("-0e-:").parse(), std::invalid_argument); CHECK_THROWS_AS(json::parser("-0f").parse(), std::invalid_argument); + // numbers must not begin with "+" + CHECK_THROWS_AS(json::parser("+1").parse(), std::invalid_argument); + CHECK_THROWS_AS(json::parser("+0").parse(), std::invalid_argument); + CHECK_THROWS_WITH(json::parser("01").parse(), "parse error - unexpected number literal; expected end of input"); CHECK_THROWS_WITH(json::parser("--1").parse(), "parse error - unexpected '-'"); From fadf286653c41823804bd224d88db39d7835c9da Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 8 May 2016 14:35:32 +0200 Subject: [PATCH 055/133] added test case for std::bad_alloc --- test/unit.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/test/unit.cpp b/test/unit.cpp index 9b735108d..af52e1751 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -13993,3 +13993,34 @@ TEST_CASE("regression tests") CHECK(dest == expected); } } + +// special test case to check if memory is leaked if constructor throws + +template +struct my_allocator : std::allocator +{ + template + void construct(T*, Args&& ...) + { + throw std::bad_alloc(); + } +}; + +TEST_CASE("bad_alloc") +{ + SECTION("bad_alloc") + { + // create JSON type using the throwing allocator + using my_json = nlohmann::basic_json; + + // creating an object should throw + CHECK_THROWS_AS(my_json j(my_json::value_t::object), std::bad_alloc); + } +} From 6d8e00ade80b72ffbb849c363cb4bd0f37d0804d Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 8 May 2016 17:17:17 +0200 Subject: [PATCH 056/133] another try to remove a warning --- src/json.hpp | 2 +- src/json.hpp.re2c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 459f7f3df..bc6fd7098 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -5967,7 +5967,7 @@ class basic_json { return (v < 10) ? ('0' + static_cast(v)) - : ('a' + static_cast((v - 10) & 0xff)); + : ('a' + static_cast((v - 10) & 0x1f)); }; // print character c as \uxxxx diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 685024a5f..793cc7380 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -5967,7 +5967,7 @@ class basic_json { return (v < 10) ? ('0' + static_cast(v)) - : ('a' + static_cast((v - 10) & 0xff)); + : ('a' + static_cast((v - 10) & 0x1f)); }; // print character c as \uxxxx From 9ecf83f630fc950f0e0b67bd99ecf68f2b8afa68 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 8 May 2016 20:28:20 +0200 Subject: [PATCH 057/133] working on #235 --- doc/examples/push_back__initializer_list.cpp | 26 ++++++ doc/examples/push_back__initializer_list.link | 1 + .../push_back__initializer_list.output | 4 + src/json.hpp | 50 +++++++++++- src/json.hpp.re2c | 50 +++++++++++- test/unit.cpp | 81 +++++++++++++++++++ 6 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 doc/examples/push_back__initializer_list.cpp create mode 100644 doc/examples/push_back__initializer_list.link create mode 100644 doc/examples/push_back__initializer_list.output diff --git a/doc/examples/push_back__initializer_list.cpp b/doc/examples/push_back__initializer_list.cpp new file mode 100644 index 000000000..9fe01ad79 --- /dev/null +++ b/doc/examples/push_back__initializer_list.cpp @@ -0,0 +1,26 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // create JSON values + json object = {{"one", 1}, {"two", 2}}; + json null; + + // print values + std::cout << object << '\n'; + std::cout << null << '\n'; + + // add values: + object.push_back({"three", 3}); // object is extended + object += {"four", 4}; // object is extended + null.push_back({"five", 5}); // null is converted to array + + // print values + std::cout << object << '\n'; + std::cout << null << '\n'; + + // would throw: + //object.push_back({1, 2, 3}); +} diff --git a/doc/examples/push_back__initializer_list.link b/doc/examples/push_back__initializer_list.link new file mode 100644 index 000000000..2b5abaeda --- /dev/null +++ b/doc/examples/push_back__initializer_list.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/push_back__initializer_list.output b/doc/examples/push_back__initializer_list.output new file mode 100644 index 000000000..668eb25d7 --- /dev/null +++ b/doc/examples/push_back__initializer_list.output @@ -0,0 +1,4 @@ +{"one":1,"two":2} +null +{"four":4,"one":1,"three":3,"two":2} +[["five",5]] diff --git a/src/json.hpp b/src/json.hpp index 515365501..37080ebb7 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -4878,7 +4878,55 @@ class basic_json reference operator+=(const typename object_t::value_type& val) { push_back(val); - return operator[](val.first); + return *this; + } + + /*! + @brief add an object to an object + + This function allows to use `push_back` with an initializer list. In case + + 1. the current value is an object, + 2. the initializer list @a init contains only two elements, and + 3. the first element of @a init is a string, + + @a init is converted into an object element and added using + @ref push_back(const typename object_t::value_type&). Otherwise, @a init + is converted to a JSON value and added using @ref push_back(basic_json&&). + + @param init an initializer list + + @complexity Linear in the size of the initializer list @a init. + + @note This function is required to resolve an ambiguous overload error, + because pairs like `{"key", "value"}` can be both interpreted as + `object_t::value_type` or `std::initializer_list`, see + https://github.com/nlohmann/json/issues/235 for more information. + + @liveexample{The example shows how initializer lists are treated as + objects when possible.,push_back__initializer_list} + */ + void push_back(std::initializer_list init) + { + if (is_object() and init.size() == 2 and init.begin()->is_string()) + { + const string_t key = *init.begin(); + push_back(typename object_t::value_type(key, *(init.begin() + 1))); + } + else + { + push_back(basic_json(init)); + } + } + + /*! + @brief add an object to an object + @copydoc push_back(std::initializer_list) + */ + reference operator+=(std::initializer_list init) + { + push_back(init); + return *this; } /*! diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index c8b66e920..4321f0aa3 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -4878,7 +4878,55 @@ class basic_json reference operator+=(const typename object_t::value_type& val) { push_back(val); - return operator[](val.first); + return *this; + } + + /*! + @brief add an object to an object + + This function allows to use `push_back` with an initializer list. In case + + 1. the current value is an object, + 2. the initializer list @a init contains only two elements, and + 3. the first element of @a init is a string, + + @a init is converted into an object element and added using + @ref push_back(const typename object_t::value_type&). Otherwise, @a init + is converted to a JSON value and added using @ref push_back(basic_json&&). + + @param init an initializer list + + @complexity Linear in the size of the initializer list @a init. + + @note This function is required to resolve an ambiguous overload error, + because pairs like `{"key", "value"}` can be both interpreted as + `object_t::value_type` or `std::initializer_list`, see + https://github.com/nlohmann/json/issues/235 for more information. + + @liveexample{The example shows how initializer lists are treated as + objects when possible.,push_back__initializer_list} + */ + void push_back(std::initializer_list init) + { + if (is_object() and init.size() == 2 and init.begin()->is_string()) + { + const string_t key = *init.begin(); + push_back(typename object_t::value_type(key, *(init.begin() + 1))); + } + else + { + push_back(basic_json(init)); + } + } + + /*! + @brief add an object to an object + @copydoc push_back(std::initializer_list) + */ + reference operator+=(std::initializer_list init) + { + push_back(init); + return *this; } /*! diff --git a/test/unit.cpp b/test/unit.cpp index af52e1751..e42430c35 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -7920,6 +7920,42 @@ TEST_CASE("modifiers") "cannot use push_back() with number"); } } + + SECTION("with initializer_list") + { + SECTION("null") + { + json j; + j.push_back({"foo", "bar"}); + CHECK(j == json::array({{"foo", "bar"}})); + + json k; + k.push_back({1, 2, 3}); + CHECK(k == json::array({{1, 2, 3}})); + } + + SECTION("array") + { + json j = {1, 2, 3}; + j.push_back({"foo", "bar"}); + CHECK(j == json({1, 2, 3, {"foo", "bar"}})); + + json k = {1, 2, 3}; + k.push_back({1, 2, 3}); + CHECK(k == json({1, 2, 3, {1, 2, 3}})); + } + + SECTION("object") + { + json j = {{"key1", 1}}; + j.push_back({"key2", "bar"}); + CHECK(j == json({{"key1", 1}, {"key2", "bar"}})); + + json k = {{"key1", 1}}; + CHECK_THROWS_AS(k.push_back({1, 2, 3, 4}), std::domain_error); + CHECK_THROWS_WITH(k.push_back({1, 2, 3, 4}), "cannot use push_back() with object"); + } + } } SECTION("operator+=") @@ -8016,6 +8052,42 @@ TEST_CASE("modifiers") "cannot use push_back() with number"); } } + + SECTION("with initializer_list") + { + SECTION("null") + { + json j; + j += {"foo", "bar"}; + CHECK(j == json::array({{"foo", "bar"}})); + + json k; + k += {1, 2, 3}; + CHECK(k == json::array({{1, 2, 3}})); + } + + SECTION("array") + { + json j = {1, 2, 3}; + j += {"foo", "bar"}; + CHECK(j == json({1, 2, 3, {"foo", "bar"}})); + + json k = {1, 2, 3}; + k += {1, 2, 3}; + CHECK(k == json({1, 2, 3, {1, 2, 3}})); + } + + SECTION("object") + { + json j = {{"key1", 1}}; + j += {"key2", "bar"}; + CHECK(j == json({{"key1", 1}, {"key2", "bar"}})); + + json k = {{"key1", 1}}; + CHECK_THROWS_AS((k += {1, 2, 3, 4}), std::domain_error); + CHECK_THROWS_WITH((k += {1, 2, 3, 4}), "cannot use push_back() with object"); + } + } } SECTION("insert") @@ -13992,6 +14064,15 @@ TEST_CASE("regression tests") CHECK(dest == expected); } + + SECTION("issue ##235 - ambiguous overload for 'push_back' and 'operator+='") + { + json data = {{"key", "value"}}; + data.push_back({"key2", "value2"}); + data += {"key3", "value3"}; + + CHECK(data == json({{"key", "value"}, {"key2", "value2"}, {"key3", "value3"}})); + } } // special test case to check if memory is leaked if constructor throws From 6a98a6c964068f407e98970f886fe310eb89e8f2 Mon Sep 17 00:00:00 2001 From: Chris Kitching Date: Sun, 8 May 2016 16:30:24 +0100 Subject: [PATCH 058/133] Add CMake option to disable building the tests (Default builds) --- CMakeLists.txt | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ae1d8bb5..05eda6472 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,8 @@ cmake_minimum_required(VERSION 3.0) # define the project project(json VERSION 2.0.0 LANGUAGES CXX) +option(BuildTests "Build the unit tests" ON) + # define project variables set(JSON_TARGET_NAME ${PROJECT_NAME}) set(JSON_UNITTEST_TARGET_NAME "json_unit") @@ -20,15 +22,19 @@ target_include_directories(${JSON_TARGET_NAME} INTERFACE $) # create and configure the unit test target -add_executable(${JSON_UNITTEST_TARGET_NAME} - "test/catch.hpp" "test/unit.cpp") -set_target_properties(${JSON_UNITTEST_TARGET_NAME} PROPERTIES - CXX_STANDARD 11 - CXX_STANDARD_REQUIRED ON - COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" - COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>") -target_include_directories(${JSON_UNITTEST_TARGET_NAME} PRIVATE "test") -target_link_libraries(${JSON_UNITTEST_TARGET_NAME} ${JSON_TARGET_NAME}) +if (BuildTests) + add_executable(${JSON_UNITTEST_TARGET_NAME} + "test/catch.hpp" + "test/unit.cpp" + ) + set_target_properties(${JSON_UNITTEST_TARGET_NAME} PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON + COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" + COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>") + target_include_directories(${JSON_UNITTEST_TARGET_NAME} PRIVATE "test") + target_link_libraries(${JSON_UNITTEST_TARGET_NAME} ${JSON_TARGET_NAME}) +endif() # generate a config and config version file for the package include(CMakePackageConfigHelpers) From bf7b6d15c771cd9dedc1ddce2dbc9676d14d85e8 Mon Sep 17 00:00:00 2001 From: Chris Kitching Date: Wed, 11 May 2016 01:10:29 +0100 Subject: [PATCH 059/133] Unset execute bit on sample.json --- test/json_testsuite/sample.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 test/json_testsuite/sample.json diff --git a/test/json_testsuite/sample.json b/test/json_testsuite/sample.json old mode 100755 new mode 100644 From b6becce8fb29f9f3d21dd2edc6c0f21474b619bd Mon Sep 17 00:00:00 2001 From: Chris Kitching Date: Wed, 11 May 2016 01:12:56 +0100 Subject: [PATCH 060/133] Don't use variable for the test target name I'm not sure that using a variable for target names really helps with clarity. Unlike paths, target names aren't really something you change. In a sense, targets are themselves a sort of variable, so having a variable to name a variable seems just a bit gnarly. --- CMakeLists.txt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 05eda6472..b51f83ab7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,6 @@ option(BuildTests "Build the unit tests" ON) # define project variables set(JSON_TARGET_NAME ${PROJECT_NAME}) -set(JSON_UNITTEST_TARGET_NAME "json_unit") set(JSON_PACKAGE_NAME ${JSON_TARGET_NAME}) set(JSON_TARGETS_FILENAME "${JSON_PACKAGE_NAME}Targets.cmake") set(JSON_CONFIG_FILENAME "${JSON_PACKAGE_NAME}Config.cmake") @@ -23,17 +22,17 @@ target_include_directories(${JSON_TARGET_NAME} INTERFACE # create and configure the unit test target if (BuildTests) - add_executable(${JSON_UNITTEST_TARGET_NAME} + add_executable(json_unit "test/catch.hpp" "test/unit.cpp" ) - set_target_properties(${JSON_UNITTEST_TARGET_NAME} PROPERTIES + set_target_properties(json_unit PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>") - target_include_directories(${JSON_UNITTEST_TARGET_NAME} PRIVATE "test") - target_link_libraries(${JSON_UNITTEST_TARGET_NAME} ${JSON_TARGET_NAME}) + target_include_directories(json_unit PRIVATE "test") + target_link_libraries(json_unit ${JSON_TARGET_NAME}) endif() # generate a config and config version file for the package From 4e6aacda3625a0212edef4b8eb7e3bbdb8989775 Mon Sep 17 00:00:00 2001 From: Chris Kitching Date: Wed, 11 May 2016 01:14:56 +0100 Subject: [PATCH 061/133] Use definitely-unique target/project name There exist lots of json libraries, and project/target names must be globally unique. If someone integrated with this library in a particularly stupid way, using a generic name like "json" might cause a problem. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b51f83ab7..caa4a0ee4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.0) # define the project -project(json VERSION 2.0.0 LANGUAGES CXX) +project(nlohmann_json VERSION 2.0.0 LANGUAGES CXX) option(BuildTests "Build the unit tests" ON) From af76508fe773dba22047d4bc6a31464a00afbb58 Mon Sep 17 00:00:00 2001 From: Chris Kitching Date: Wed, 11 May 2016 01:25:54 +0100 Subject: [PATCH 062/133] Introduce structure to the test/ directory This introduces a clear separation between test data and test binaries. Test data is moved into test/data, and the test binaries move into test/src. A new CMake script specific to building the tests is introduced in /test to slightly clean up the toplevel one. As well as tidying things up, this makes the next step trivial... --- .github/CONTRIBUTING.md | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .travis.yml | 2 +- CMakeLists.txt | 12 +- Makefile | 10 +- README.md | 2 +- test/CMakeLists.txt | 15 ++ test/{ => data}/json.org/1.json | 0 test/{ => data}/json.org/2.json | 0 test/{ => data}/json.org/3.json | 0 test/{ => data}/json.org/4.json | 0 test/{ => data}/json.org/5.json | 0 .../json_nlohmann_tests/all_unicode.json | 0 test/{ => data}/json_nlohmann_tests/bom.json | 0 .../json_roundtrip/roundtrip01.json | 0 .../json_roundtrip/roundtrip02.json | 0 .../json_roundtrip/roundtrip03.json | 0 .../json_roundtrip/roundtrip04.json | 0 .../json_roundtrip/roundtrip05.json | 0 .../json_roundtrip/roundtrip06.json | 0 .../json_roundtrip/roundtrip07.json | 0 .../json_roundtrip/roundtrip08.json | 0 .../json_roundtrip/roundtrip09.json | 0 .../json_roundtrip/roundtrip10.json | 0 .../json_roundtrip/roundtrip11.json | 0 .../json_roundtrip/roundtrip12.json | 0 .../json_roundtrip/roundtrip13.json | 0 .../json_roundtrip/roundtrip14.json | 0 .../json_roundtrip/roundtrip15.json | 0 .../json_roundtrip/roundtrip16.json | 0 .../json_roundtrip/roundtrip17.json | 0 .../json_roundtrip/roundtrip18.json | 0 .../json_roundtrip/roundtrip19.json | 0 .../json_roundtrip/roundtrip20.json | 0 .../json_roundtrip/roundtrip21.json | 0 .../json_roundtrip/roundtrip22.json | 0 .../json_roundtrip/roundtrip23.json | 0 .../json_roundtrip/roundtrip24.json | 0 .../json_roundtrip/roundtrip25.json | 0 .../json_roundtrip/roundtrip26.json | 0 .../json_roundtrip/roundtrip27.json | 0 .../json_roundtrip/roundtrip28.json | 0 .../json_roundtrip/roundtrip29.json | 0 .../json_roundtrip/roundtrip30.json | 0 .../json_roundtrip/roundtrip31.json | 0 .../json_roundtrip/roundtrip32.json | 0 test/{ => data}/json_tests/fail1.json | 0 test/{ => data}/json_tests/fail10.json | 0 test/{ => data}/json_tests/fail11.json | 0 test/{ => data}/json_tests/fail12.json | 0 test/{ => data}/json_tests/fail13.json | 0 test/{ => data}/json_tests/fail14.json | 0 test/{ => data}/json_tests/fail15.json | 0 test/{ => data}/json_tests/fail16.json | 0 test/{ => data}/json_tests/fail17.json | 0 test/{ => data}/json_tests/fail18.json | 0 test/{ => data}/json_tests/fail19.json | 0 test/{ => data}/json_tests/fail2.json | 0 test/{ => data}/json_tests/fail20.json | 0 test/{ => data}/json_tests/fail21.json | 0 test/{ => data}/json_tests/fail22.json | 0 test/{ => data}/json_tests/fail23.json | 0 test/{ => data}/json_tests/fail24.json | 0 test/{ => data}/json_tests/fail25.json | 0 test/{ => data}/json_tests/fail26.json | 0 test/{ => data}/json_tests/fail27.json | 0 test/{ => data}/json_tests/fail28.json | 0 test/{ => data}/json_tests/fail29.json | 0 test/{ => data}/json_tests/fail3.json | 0 test/{ => data}/json_tests/fail30.json | 0 test/{ => data}/json_tests/fail31.json | 0 test/{ => data}/json_tests/fail32.json | 0 test/{ => data}/json_tests/fail33.json | 0 test/{ => data}/json_tests/fail4.json | 0 test/{ => data}/json_tests/fail5.json | 0 test/{ => data}/json_tests/fail6.json | 0 test/{ => data}/json_tests/fail7.json | 0 test/{ => data}/json_tests/fail8.json | 0 test/{ => data}/json_tests/fail9.json | 0 test/{ => data}/json_tests/pass1.json | 0 test/{ => data}/json_tests/pass2.json | 0 test/{ => data}/json_tests/pass3.json | 0 test/{ => data}/json_testsuite/README.md | 0 test/{ => data}/json_testsuite/sample.json | 0 test/{ => src}/catch.hpp | 0 test/{ => src}/fuzz.cpp | 0 test/{ => src}/unit.cpp | 156 +++++++++--------- 87 files changed, 103 insertions(+), 98 deletions(-) create mode 100644 test/CMakeLists.txt rename test/{ => data}/json.org/1.json (100%) rename test/{ => data}/json.org/2.json (100%) rename test/{ => data}/json.org/3.json (100%) rename test/{ => data}/json.org/4.json (100%) rename test/{ => data}/json.org/5.json (100%) rename test/{ => data}/json_nlohmann_tests/all_unicode.json (100%) rename test/{ => data}/json_nlohmann_tests/bom.json (100%) rename test/{ => data}/json_roundtrip/roundtrip01.json (100%) rename test/{ => data}/json_roundtrip/roundtrip02.json (100%) rename test/{ => data}/json_roundtrip/roundtrip03.json (100%) rename test/{ => data}/json_roundtrip/roundtrip04.json (100%) rename test/{ => data}/json_roundtrip/roundtrip05.json (100%) rename test/{ => data}/json_roundtrip/roundtrip06.json (100%) rename test/{ => data}/json_roundtrip/roundtrip07.json (100%) rename test/{ => data}/json_roundtrip/roundtrip08.json (100%) rename test/{ => data}/json_roundtrip/roundtrip09.json (100%) rename test/{ => data}/json_roundtrip/roundtrip10.json (100%) rename test/{ => data}/json_roundtrip/roundtrip11.json (100%) rename test/{ => data}/json_roundtrip/roundtrip12.json (100%) rename test/{ => data}/json_roundtrip/roundtrip13.json (100%) rename test/{ => data}/json_roundtrip/roundtrip14.json (100%) rename test/{ => data}/json_roundtrip/roundtrip15.json (100%) rename test/{ => data}/json_roundtrip/roundtrip16.json (100%) rename test/{ => data}/json_roundtrip/roundtrip17.json (100%) rename test/{ => data}/json_roundtrip/roundtrip18.json (100%) rename test/{ => data}/json_roundtrip/roundtrip19.json (100%) rename test/{ => data}/json_roundtrip/roundtrip20.json (100%) rename test/{ => data}/json_roundtrip/roundtrip21.json (100%) rename test/{ => data}/json_roundtrip/roundtrip22.json (100%) rename test/{ => data}/json_roundtrip/roundtrip23.json (100%) rename test/{ => data}/json_roundtrip/roundtrip24.json (100%) rename test/{ => data}/json_roundtrip/roundtrip25.json (100%) rename test/{ => data}/json_roundtrip/roundtrip26.json (100%) rename test/{ => data}/json_roundtrip/roundtrip27.json (100%) rename test/{ => data}/json_roundtrip/roundtrip28.json (100%) rename test/{ => data}/json_roundtrip/roundtrip29.json (100%) rename test/{ => data}/json_roundtrip/roundtrip30.json (100%) rename test/{ => data}/json_roundtrip/roundtrip31.json (100%) rename test/{ => data}/json_roundtrip/roundtrip32.json (100%) rename test/{ => data}/json_tests/fail1.json (100%) rename test/{ => data}/json_tests/fail10.json (100%) rename test/{ => data}/json_tests/fail11.json (100%) rename test/{ => data}/json_tests/fail12.json (100%) rename test/{ => data}/json_tests/fail13.json (100%) rename test/{ => data}/json_tests/fail14.json (100%) rename test/{ => data}/json_tests/fail15.json (100%) rename test/{ => data}/json_tests/fail16.json (100%) rename test/{ => data}/json_tests/fail17.json (100%) rename test/{ => data}/json_tests/fail18.json (100%) rename test/{ => data}/json_tests/fail19.json (100%) rename test/{ => data}/json_tests/fail2.json (100%) rename test/{ => data}/json_tests/fail20.json (100%) rename test/{ => data}/json_tests/fail21.json (100%) rename test/{ => data}/json_tests/fail22.json (100%) rename test/{ => data}/json_tests/fail23.json (100%) rename test/{ => data}/json_tests/fail24.json (100%) rename test/{ => data}/json_tests/fail25.json (100%) rename test/{ => data}/json_tests/fail26.json (100%) rename test/{ => data}/json_tests/fail27.json (100%) rename test/{ => data}/json_tests/fail28.json (100%) rename test/{ => data}/json_tests/fail29.json (100%) rename test/{ => data}/json_tests/fail3.json (100%) rename test/{ => data}/json_tests/fail30.json (100%) rename test/{ => data}/json_tests/fail31.json (100%) rename test/{ => data}/json_tests/fail32.json (100%) rename test/{ => data}/json_tests/fail33.json (100%) rename test/{ => data}/json_tests/fail4.json (100%) rename test/{ => data}/json_tests/fail5.json (100%) rename test/{ => data}/json_tests/fail6.json (100%) rename test/{ => data}/json_tests/fail7.json (100%) rename test/{ => data}/json_tests/fail8.json (100%) rename test/{ => data}/json_tests/fail9.json (100%) rename test/{ => data}/json_tests/pass1.json (100%) rename test/{ => data}/json_tests/pass2.json (100%) rename test/{ => data}/json_tests/pass3.json (100%) rename test/{ => data}/json_testsuite/README.md (100%) rename test/{ => data}/json_testsuite/sample.json (100%) rename test/{ => src}/catch.hpp (100%) rename test/{ => src}/fuzz.cpp (100%) rename test/{ => src}/unit.cpp (99%) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index ea57e6505..eba242872 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -35,7 +35,7 @@ There are currently two files which need to be edited: To run [`re2c`](http://re2c.org) and generate/overwrite file `src/json.hpp` with your changes in file `src/json.hpp.re2c`. -2. [`test/unit.cpp`](https://github.com/nlohmann/json/blob/master/test/unit.cpp) - This contains the [Catch](https://github.com/philsquared/Catch) unit tests which currently cover [100 %](https://coveralls.io/github/nlohmann/json) of the library's code. +2. [`test/src/unit.cpp`](https://github.com/nlohmann/json/blob/master/test/unit.cpp) - This contains the [Catch](https://github.com/philsquared/Catch) unit tests which currently cover [100 %](https://coveralls.io/github/nlohmann/json) of the library's code. If you add or change a feature, please also add a unit test to this file. The unit tests can be compiled with diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 27920581c..49d166595 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -14,7 +14,7 @@ There are currently two files which need to be edited: To run [`re2c`](http://re2c.org) and generate/overwrite file `src/json.hpp` with your changes in file `src/json.hpp.re2c`. -2. [`test/unit.cpp`](https://github.com/nlohmann/json/blob/master/test/unit.cpp) - This contains the [Catch](https://github.com/philsquared/Catch) unit tests which currently cover [100 %](https://coveralls.io/github/nlohmann/json) of the library's code. +2. [`test/src/unit.cpp`](https://github.com/nlohmann/json/blob/master/test/unit.cpp) - This contains the [Catch](https://github.com/philsquared/Catch) unit tests which currently cover [100 %](https://coveralls.io/github/nlohmann/json) of the library's code. If you add or change a feature, please also add a unit test to this file. The unit tests can be compiled with diff --git a/.travis.yml b/.travis.yml index d1748dff5..1ada0084c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ matrix: - touch src/json.hpp - make json_unit CXXFLAGS="-fprofile-arcs -ftest-coverage -std=c++11 -lstdc++" CXX=$COMPILER - ./json_unit "*" - - coveralls --exclude test/catch.hpp --exclude test/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9' + - coveralls --exclude test/src/catch.hpp --exclude test/src/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9' env: COMPILER=g++-4.9 - os: linux diff --git a/CMakeLists.txt b/CMakeLists.txt index caa4a0ee4..18e9c651f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,17 +22,7 @@ target_include_directories(${JSON_TARGET_NAME} INTERFACE # create and configure the unit test target if (BuildTests) - add_executable(json_unit - "test/catch.hpp" - "test/unit.cpp" - ) - set_target_properties(json_unit PROPERTIES - CXX_STANDARD 11 - CXX_STANDARD_REQUIRED ON - COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" - COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>") - target_include_directories(json_unit PRIVATE "test") - target_link_libraries(json_unit ${JSON_TARGET_NAME}) + add_subdirectory(test) endif() # generate a config and config version file for the package diff --git a/Makefile b/Makefile index d0a80379c..6fdc06b9d 100644 --- a/Makefile +++ b/Makefile @@ -19,8 +19,8 @@ clean: # additional flags FLAGS = -Wall -Wextra -pedantic -Weffc++ -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wmissing-declarations -Wmissing-include-dirs -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-overflow=5 -Wswitch -Wundef -Wno-unused -Wnon-virtual-dtor -Wreorder -Wdeprecated -Wfloat-equal -# build unit tests -json_unit: test/unit.cpp src/json.hpp test/catch.hpp +# build unit tests (TODO: Does this want its own makefile?) +json_unit: test/src/unit.cpp src/json.hpp test/src/catch.hpp $(CXX) -std=c++11 $(CXXFLAGS) $(FLAGS) $(CPPFLAGS) -I src -I test $< $(LDFLAGS) -o $@ @@ -43,11 +43,11 @@ fuzz_testing: mkdir -p fuzz-testing fuzz-testing/testcases fuzz-testing/out $(MAKE) fuzz CXX=afl-clang++ mv fuzz fuzz-testing - find test/json_tests -size -5k -name *json | xargs -I{} cp "{}" fuzz-testing/testcases + find test/data/json_tests -size -5k -name *json | xargs -I{} cp "{}" fuzz-testing/testcases @echo "Execute: afl-fuzz -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzz" # the fuzzer binary -fuzz: test/fuzz.cpp src/json.hpp +fuzz: test/src/fuzz.cpp src/json.hpp $(CXX) -std=c++11 $(CXXFLAGS) $(FLAGS) $(CPPFLAGS) -I src $< $(LDFLAGS) -o $@ @@ -75,7 +75,7 @@ pretty: --indent-col1-comments --pad-oper --pad-header --align-pointer=type \ --align-reference=type --add-brackets --convert-tabs --close-templates \ --lineend=linux --preserve-date --suffix=none --formatted \ - src/json.hpp src/json.hpp.re2c test/unit.cpp test/fuzz.cpp benchmarks/benchmarks.cpp doc/examples/*.cpp + src/json.hpp src/json.hpp.re2c test/src/unit.cpp test/src/fuzz.cpp benchmarks/benchmarks.cpp doc/examples/*.cpp ########################################################################## diff --git a/README.md b/README.md index c9f3a713a..46ede2495 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ There are myriads of [JSON](http://json.org) libraries out there, and each may e - **Trivial integration**. Our whole code consists of a single header file `json.hpp`. That's it. No library, no subproject, no dependencies, no complex build system. The class is written in vanilla C++11. All in all, everything should require no adjustment of your compiler flags or project settings. -- **Serious testing**. Our class is heavily [unit-tested](https://github.com/nlohmann/json/blob/master/test/unit.cpp) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](http://valgrind.org) that there are no memory leaks. +- **Serious testing**. Our class is heavily [unit-tested](https://github.com/nlohmann/json/blob/master/test/src/unit.cpp) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](http://valgrind.org) that there are no memory leaks. Other aspects were not so important to us: diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 000000000..0039fd84c --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,15 @@ +# The unit test executable. +add_executable(json_unit + "src/catch.hpp" + "src/unit.cpp" +) + +set_target_properties(json_unit PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON + COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" + COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>" +) + +target_include_directories(json_unit PRIVATE "src") +target_link_libraries(json_unit ${JSON_TARGET_NAME}) diff --git a/test/json.org/1.json b/test/data/json.org/1.json similarity index 100% rename from test/json.org/1.json rename to test/data/json.org/1.json diff --git a/test/json.org/2.json b/test/data/json.org/2.json similarity index 100% rename from test/json.org/2.json rename to test/data/json.org/2.json diff --git a/test/json.org/3.json b/test/data/json.org/3.json similarity index 100% rename from test/json.org/3.json rename to test/data/json.org/3.json diff --git a/test/json.org/4.json b/test/data/json.org/4.json similarity index 100% rename from test/json.org/4.json rename to test/data/json.org/4.json diff --git a/test/json.org/5.json b/test/data/json.org/5.json similarity index 100% rename from test/json.org/5.json rename to test/data/json.org/5.json diff --git a/test/json_nlohmann_tests/all_unicode.json b/test/data/json_nlohmann_tests/all_unicode.json similarity index 100% rename from test/json_nlohmann_tests/all_unicode.json rename to test/data/json_nlohmann_tests/all_unicode.json diff --git a/test/json_nlohmann_tests/bom.json b/test/data/json_nlohmann_tests/bom.json similarity index 100% rename from test/json_nlohmann_tests/bom.json rename to test/data/json_nlohmann_tests/bom.json diff --git a/test/json_roundtrip/roundtrip01.json b/test/data/json_roundtrip/roundtrip01.json similarity index 100% rename from test/json_roundtrip/roundtrip01.json rename to test/data/json_roundtrip/roundtrip01.json diff --git a/test/json_roundtrip/roundtrip02.json b/test/data/json_roundtrip/roundtrip02.json similarity index 100% rename from test/json_roundtrip/roundtrip02.json rename to test/data/json_roundtrip/roundtrip02.json diff --git a/test/json_roundtrip/roundtrip03.json b/test/data/json_roundtrip/roundtrip03.json similarity index 100% rename from test/json_roundtrip/roundtrip03.json rename to test/data/json_roundtrip/roundtrip03.json diff --git a/test/json_roundtrip/roundtrip04.json b/test/data/json_roundtrip/roundtrip04.json similarity index 100% rename from test/json_roundtrip/roundtrip04.json rename to test/data/json_roundtrip/roundtrip04.json diff --git a/test/json_roundtrip/roundtrip05.json b/test/data/json_roundtrip/roundtrip05.json similarity index 100% rename from test/json_roundtrip/roundtrip05.json rename to test/data/json_roundtrip/roundtrip05.json diff --git a/test/json_roundtrip/roundtrip06.json b/test/data/json_roundtrip/roundtrip06.json similarity index 100% rename from test/json_roundtrip/roundtrip06.json rename to test/data/json_roundtrip/roundtrip06.json diff --git a/test/json_roundtrip/roundtrip07.json b/test/data/json_roundtrip/roundtrip07.json similarity index 100% rename from test/json_roundtrip/roundtrip07.json rename to test/data/json_roundtrip/roundtrip07.json diff --git a/test/json_roundtrip/roundtrip08.json b/test/data/json_roundtrip/roundtrip08.json similarity index 100% rename from test/json_roundtrip/roundtrip08.json rename to test/data/json_roundtrip/roundtrip08.json diff --git a/test/json_roundtrip/roundtrip09.json b/test/data/json_roundtrip/roundtrip09.json similarity index 100% rename from test/json_roundtrip/roundtrip09.json rename to test/data/json_roundtrip/roundtrip09.json diff --git a/test/json_roundtrip/roundtrip10.json b/test/data/json_roundtrip/roundtrip10.json similarity index 100% rename from test/json_roundtrip/roundtrip10.json rename to test/data/json_roundtrip/roundtrip10.json diff --git a/test/json_roundtrip/roundtrip11.json b/test/data/json_roundtrip/roundtrip11.json similarity index 100% rename from test/json_roundtrip/roundtrip11.json rename to test/data/json_roundtrip/roundtrip11.json diff --git a/test/json_roundtrip/roundtrip12.json b/test/data/json_roundtrip/roundtrip12.json similarity index 100% rename from test/json_roundtrip/roundtrip12.json rename to test/data/json_roundtrip/roundtrip12.json diff --git a/test/json_roundtrip/roundtrip13.json b/test/data/json_roundtrip/roundtrip13.json similarity index 100% rename from test/json_roundtrip/roundtrip13.json rename to test/data/json_roundtrip/roundtrip13.json diff --git a/test/json_roundtrip/roundtrip14.json b/test/data/json_roundtrip/roundtrip14.json similarity index 100% rename from test/json_roundtrip/roundtrip14.json rename to test/data/json_roundtrip/roundtrip14.json diff --git a/test/json_roundtrip/roundtrip15.json b/test/data/json_roundtrip/roundtrip15.json similarity index 100% rename from test/json_roundtrip/roundtrip15.json rename to test/data/json_roundtrip/roundtrip15.json diff --git a/test/json_roundtrip/roundtrip16.json b/test/data/json_roundtrip/roundtrip16.json similarity index 100% rename from test/json_roundtrip/roundtrip16.json rename to test/data/json_roundtrip/roundtrip16.json diff --git a/test/json_roundtrip/roundtrip17.json b/test/data/json_roundtrip/roundtrip17.json similarity index 100% rename from test/json_roundtrip/roundtrip17.json rename to test/data/json_roundtrip/roundtrip17.json diff --git a/test/json_roundtrip/roundtrip18.json b/test/data/json_roundtrip/roundtrip18.json similarity index 100% rename from test/json_roundtrip/roundtrip18.json rename to test/data/json_roundtrip/roundtrip18.json diff --git a/test/json_roundtrip/roundtrip19.json b/test/data/json_roundtrip/roundtrip19.json similarity index 100% rename from test/json_roundtrip/roundtrip19.json rename to test/data/json_roundtrip/roundtrip19.json diff --git a/test/json_roundtrip/roundtrip20.json b/test/data/json_roundtrip/roundtrip20.json similarity index 100% rename from test/json_roundtrip/roundtrip20.json rename to test/data/json_roundtrip/roundtrip20.json diff --git a/test/json_roundtrip/roundtrip21.json b/test/data/json_roundtrip/roundtrip21.json similarity index 100% rename from test/json_roundtrip/roundtrip21.json rename to test/data/json_roundtrip/roundtrip21.json diff --git a/test/json_roundtrip/roundtrip22.json b/test/data/json_roundtrip/roundtrip22.json similarity index 100% rename from test/json_roundtrip/roundtrip22.json rename to test/data/json_roundtrip/roundtrip22.json diff --git a/test/json_roundtrip/roundtrip23.json b/test/data/json_roundtrip/roundtrip23.json similarity index 100% rename from test/json_roundtrip/roundtrip23.json rename to test/data/json_roundtrip/roundtrip23.json diff --git a/test/json_roundtrip/roundtrip24.json b/test/data/json_roundtrip/roundtrip24.json similarity index 100% rename from test/json_roundtrip/roundtrip24.json rename to test/data/json_roundtrip/roundtrip24.json diff --git a/test/json_roundtrip/roundtrip25.json b/test/data/json_roundtrip/roundtrip25.json similarity index 100% rename from test/json_roundtrip/roundtrip25.json rename to test/data/json_roundtrip/roundtrip25.json diff --git a/test/json_roundtrip/roundtrip26.json b/test/data/json_roundtrip/roundtrip26.json similarity index 100% rename from test/json_roundtrip/roundtrip26.json rename to test/data/json_roundtrip/roundtrip26.json diff --git a/test/json_roundtrip/roundtrip27.json b/test/data/json_roundtrip/roundtrip27.json similarity index 100% rename from test/json_roundtrip/roundtrip27.json rename to test/data/json_roundtrip/roundtrip27.json diff --git a/test/json_roundtrip/roundtrip28.json b/test/data/json_roundtrip/roundtrip28.json similarity index 100% rename from test/json_roundtrip/roundtrip28.json rename to test/data/json_roundtrip/roundtrip28.json diff --git a/test/json_roundtrip/roundtrip29.json b/test/data/json_roundtrip/roundtrip29.json similarity index 100% rename from test/json_roundtrip/roundtrip29.json rename to test/data/json_roundtrip/roundtrip29.json diff --git a/test/json_roundtrip/roundtrip30.json b/test/data/json_roundtrip/roundtrip30.json similarity index 100% rename from test/json_roundtrip/roundtrip30.json rename to test/data/json_roundtrip/roundtrip30.json diff --git a/test/json_roundtrip/roundtrip31.json b/test/data/json_roundtrip/roundtrip31.json similarity index 100% rename from test/json_roundtrip/roundtrip31.json rename to test/data/json_roundtrip/roundtrip31.json diff --git a/test/json_roundtrip/roundtrip32.json b/test/data/json_roundtrip/roundtrip32.json similarity index 100% rename from test/json_roundtrip/roundtrip32.json rename to test/data/json_roundtrip/roundtrip32.json diff --git a/test/json_tests/fail1.json b/test/data/json_tests/fail1.json similarity index 100% rename from test/json_tests/fail1.json rename to test/data/json_tests/fail1.json diff --git a/test/json_tests/fail10.json b/test/data/json_tests/fail10.json similarity index 100% rename from test/json_tests/fail10.json rename to test/data/json_tests/fail10.json diff --git a/test/json_tests/fail11.json b/test/data/json_tests/fail11.json similarity index 100% rename from test/json_tests/fail11.json rename to test/data/json_tests/fail11.json diff --git a/test/json_tests/fail12.json b/test/data/json_tests/fail12.json similarity index 100% rename from test/json_tests/fail12.json rename to test/data/json_tests/fail12.json diff --git a/test/json_tests/fail13.json b/test/data/json_tests/fail13.json similarity index 100% rename from test/json_tests/fail13.json rename to test/data/json_tests/fail13.json diff --git a/test/json_tests/fail14.json b/test/data/json_tests/fail14.json similarity index 100% rename from test/json_tests/fail14.json rename to test/data/json_tests/fail14.json diff --git a/test/json_tests/fail15.json b/test/data/json_tests/fail15.json similarity index 100% rename from test/json_tests/fail15.json rename to test/data/json_tests/fail15.json diff --git a/test/json_tests/fail16.json b/test/data/json_tests/fail16.json similarity index 100% rename from test/json_tests/fail16.json rename to test/data/json_tests/fail16.json diff --git a/test/json_tests/fail17.json b/test/data/json_tests/fail17.json similarity index 100% rename from test/json_tests/fail17.json rename to test/data/json_tests/fail17.json diff --git a/test/json_tests/fail18.json b/test/data/json_tests/fail18.json similarity index 100% rename from test/json_tests/fail18.json rename to test/data/json_tests/fail18.json diff --git a/test/json_tests/fail19.json b/test/data/json_tests/fail19.json similarity index 100% rename from test/json_tests/fail19.json rename to test/data/json_tests/fail19.json diff --git a/test/json_tests/fail2.json b/test/data/json_tests/fail2.json similarity index 100% rename from test/json_tests/fail2.json rename to test/data/json_tests/fail2.json diff --git a/test/json_tests/fail20.json b/test/data/json_tests/fail20.json similarity index 100% rename from test/json_tests/fail20.json rename to test/data/json_tests/fail20.json diff --git a/test/json_tests/fail21.json b/test/data/json_tests/fail21.json similarity index 100% rename from test/json_tests/fail21.json rename to test/data/json_tests/fail21.json diff --git a/test/json_tests/fail22.json b/test/data/json_tests/fail22.json similarity index 100% rename from test/json_tests/fail22.json rename to test/data/json_tests/fail22.json diff --git a/test/json_tests/fail23.json b/test/data/json_tests/fail23.json similarity index 100% rename from test/json_tests/fail23.json rename to test/data/json_tests/fail23.json diff --git a/test/json_tests/fail24.json b/test/data/json_tests/fail24.json similarity index 100% rename from test/json_tests/fail24.json rename to test/data/json_tests/fail24.json diff --git a/test/json_tests/fail25.json b/test/data/json_tests/fail25.json similarity index 100% rename from test/json_tests/fail25.json rename to test/data/json_tests/fail25.json diff --git a/test/json_tests/fail26.json b/test/data/json_tests/fail26.json similarity index 100% rename from test/json_tests/fail26.json rename to test/data/json_tests/fail26.json diff --git a/test/json_tests/fail27.json b/test/data/json_tests/fail27.json similarity index 100% rename from test/json_tests/fail27.json rename to test/data/json_tests/fail27.json diff --git a/test/json_tests/fail28.json b/test/data/json_tests/fail28.json similarity index 100% rename from test/json_tests/fail28.json rename to test/data/json_tests/fail28.json diff --git a/test/json_tests/fail29.json b/test/data/json_tests/fail29.json similarity index 100% rename from test/json_tests/fail29.json rename to test/data/json_tests/fail29.json diff --git a/test/json_tests/fail3.json b/test/data/json_tests/fail3.json similarity index 100% rename from test/json_tests/fail3.json rename to test/data/json_tests/fail3.json diff --git a/test/json_tests/fail30.json b/test/data/json_tests/fail30.json similarity index 100% rename from test/json_tests/fail30.json rename to test/data/json_tests/fail30.json diff --git a/test/json_tests/fail31.json b/test/data/json_tests/fail31.json similarity index 100% rename from test/json_tests/fail31.json rename to test/data/json_tests/fail31.json diff --git a/test/json_tests/fail32.json b/test/data/json_tests/fail32.json similarity index 100% rename from test/json_tests/fail32.json rename to test/data/json_tests/fail32.json diff --git a/test/json_tests/fail33.json b/test/data/json_tests/fail33.json similarity index 100% rename from test/json_tests/fail33.json rename to test/data/json_tests/fail33.json diff --git a/test/json_tests/fail4.json b/test/data/json_tests/fail4.json similarity index 100% rename from test/json_tests/fail4.json rename to test/data/json_tests/fail4.json diff --git a/test/json_tests/fail5.json b/test/data/json_tests/fail5.json similarity index 100% rename from test/json_tests/fail5.json rename to test/data/json_tests/fail5.json diff --git a/test/json_tests/fail6.json b/test/data/json_tests/fail6.json similarity index 100% rename from test/json_tests/fail6.json rename to test/data/json_tests/fail6.json diff --git a/test/json_tests/fail7.json b/test/data/json_tests/fail7.json similarity index 100% rename from test/json_tests/fail7.json rename to test/data/json_tests/fail7.json diff --git a/test/json_tests/fail8.json b/test/data/json_tests/fail8.json similarity index 100% rename from test/json_tests/fail8.json rename to test/data/json_tests/fail8.json diff --git a/test/json_tests/fail9.json b/test/data/json_tests/fail9.json similarity index 100% rename from test/json_tests/fail9.json rename to test/data/json_tests/fail9.json diff --git a/test/json_tests/pass1.json b/test/data/json_tests/pass1.json similarity index 100% rename from test/json_tests/pass1.json rename to test/data/json_tests/pass1.json diff --git a/test/json_tests/pass2.json b/test/data/json_tests/pass2.json similarity index 100% rename from test/json_tests/pass2.json rename to test/data/json_tests/pass2.json diff --git a/test/json_tests/pass3.json b/test/data/json_tests/pass3.json similarity index 100% rename from test/json_tests/pass3.json rename to test/data/json_tests/pass3.json diff --git a/test/json_testsuite/README.md b/test/data/json_testsuite/README.md similarity index 100% rename from test/json_testsuite/README.md rename to test/data/json_testsuite/README.md diff --git a/test/json_testsuite/sample.json b/test/data/json_testsuite/sample.json similarity index 100% rename from test/json_testsuite/sample.json rename to test/data/json_testsuite/sample.json diff --git a/test/catch.hpp b/test/src/catch.hpp similarity index 100% rename from test/catch.hpp rename to test/src/catch.hpp diff --git a/test/fuzz.cpp b/test/src/fuzz.cpp similarity index 100% rename from test/fuzz.cpp rename to test/src/fuzz.cpp diff --git a/test/unit.cpp b/test/src/unit.cpp similarity index 99% rename from test/unit.cpp rename to test/src/unit.cpp index e42430c35..0a2bdd104 100644 --- a/test/unit.cpp +++ b/test/src/unit.cpp @@ -1314,7 +1314,7 @@ TEST_CASE("constructors") SECTION("std::ifstream") { - std::ifstream f("test/json_tests/pass1.json"); + std::ifstream f("test/data/json_tests/pass1.json"); json j(f); } } @@ -11652,39 +11652,39 @@ TEST_CASE("compliance tests from json.org") { for (auto filename : { - //"test/json_tests/fail1.json", - "test/json_tests/fail2.json", - "test/json_tests/fail3.json", - "test/json_tests/fail4.json", - "test/json_tests/fail5.json", - "test/json_tests/fail6.json", - "test/json_tests/fail7.json", - "test/json_tests/fail8.json", - "test/json_tests/fail9.json", - "test/json_tests/fail10.json", - "test/json_tests/fail11.json", - "test/json_tests/fail12.json", - "test/json_tests/fail13.json", - "test/json_tests/fail14.json", - "test/json_tests/fail15.json", - "test/json_tests/fail16.json", - "test/json_tests/fail17.json", - //"test/json_tests/fail18.json", - "test/json_tests/fail19.json", - "test/json_tests/fail20.json", - "test/json_tests/fail21.json", - "test/json_tests/fail22.json", - "test/json_tests/fail23.json", - "test/json_tests/fail24.json", - "test/json_tests/fail25.json", - "test/json_tests/fail26.json", - "test/json_tests/fail27.json", - "test/json_tests/fail28.json", - "test/json_tests/fail29.json", - "test/json_tests/fail30.json", - "test/json_tests/fail31.json", - "test/json_tests/fail32.json", - "test/json_tests/fail33.json" + //"test/data/json_tests/fail1.json", + "test/data/json_tests/fail2.json", + "test/data/json_tests/fail3.json", + "test/data/json_tests/fail4.json", + "test/data/json_tests/fail5.json", + "test/data/json_tests/fail6.json", + "test/data/json_tests/fail7.json", + "test/data/json_tests/fail8.json", + "test/data/json_tests/fail9.json", + "test/data/json_tests/fail10.json", + "test/data/json_tests/fail11.json", + "test/data/json_tests/fail12.json", + "test/data/json_tests/fail13.json", + "test/data/json_tests/fail14.json", + "test/data/json_tests/fail15.json", + "test/data/json_tests/fail16.json", + "test/data/json_tests/fail17.json", + //"test/data/json_tests/fail18.json", + "test/data/json_tests/fail19.json", + "test/data/json_tests/fail20.json", + "test/data/json_tests/fail21.json", + "test/data/json_tests/fail22.json", + "test/data/json_tests/fail23.json", + "test/data/json_tests/fail24.json", + "test/data/json_tests/fail25.json", + "test/data/json_tests/fail26.json", + "test/data/json_tests/fail27.json", + "test/data/json_tests/fail28.json", + "test/data/json_tests/fail29.json", + "test/data/json_tests/fail30.json", + "test/data/json_tests/fail31.json", + "test/data/json_tests/fail32.json", + "test/data/json_tests/fail33.json" }) { CAPTURE(filename); @@ -11698,9 +11698,9 @@ TEST_CASE("compliance tests from json.org") { for (auto filename : { - "test/json_tests/pass1.json", - "test/json_tests/pass2.json", - "test/json_tests/pass3.json" + "test/data/json_tests/pass1.json", + "test/data/json_tests/pass2.json", + "test/data/json_tests/pass3.json" }) { CAPTURE(filename); @@ -11873,42 +11873,42 @@ TEST_CASE("compliance tests from nativejson-benchmark") SECTION("roundtrip") { - // test cases are from https://github.com/miloyip/nativejson-benchmark/tree/master/data/roundtrip + // test cases are from https://github.com/miloyip/nativejson-benchmark/tree/master/test/data/roundtrip for (auto filename : { - "test/json_roundtrip/roundtrip01.json", - "test/json_roundtrip/roundtrip02.json", - "test/json_roundtrip/roundtrip03.json", - "test/json_roundtrip/roundtrip04.json", - "test/json_roundtrip/roundtrip05.json", - "test/json_roundtrip/roundtrip06.json", - "test/json_roundtrip/roundtrip07.json", - "test/json_roundtrip/roundtrip08.json", - "test/json_roundtrip/roundtrip09.json", - "test/json_roundtrip/roundtrip10.json", - "test/json_roundtrip/roundtrip11.json", - "test/json_roundtrip/roundtrip12.json", - "test/json_roundtrip/roundtrip13.json", - "test/json_roundtrip/roundtrip14.json", - "test/json_roundtrip/roundtrip15.json", - "test/json_roundtrip/roundtrip16.json", - "test/json_roundtrip/roundtrip17.json", - "test/json_roundtrip/roundtrip18.json", - "test/json_roundtrip/roundtrip19.json", - "test/json_roundtrip/roundtrip20.json", - "test/json_roundtrip/roundtrip21.json", - "test/json_roundtrip/roundtrip22.json", - "test/json_roundtrip/roundtrip23.json", - "test/json_roundtrip/roundtrip24.json", - "test/json_roundtrip/roundtrip25.json", - "test/json_roundtrip/roundtrip26.json", - "test/json_roundtrip/roundtrip27.json", - "test/json_roundtrip/roundtrip28.json", - "test/json_roundtrip/roundtrip29.json", - "test/json_roundtrip/roundtrip30.json", - "test/json_roundtrip/roundtrip31.json", - "test/json_roundtrip/roundtrip32.json" + "test/data/json_roundtrip/roundtrip01.json", + "test/data/json_roundtrip/roundtrip02.json", + "test/data/json_roundtrip/roundtrip03.json", + "test/data/json_roundtrip/roundtrip04.json", + "test/data/json_roundtrip/roundtrip05.json", + "test/data/json_roundtrip/roundtrip06.json", + "test/data/json_roundtrip/roundtrip07.json", + "test/data/json_roundtrip/roundtrip08.json", + "test/data/json_roundtrip/roundtrip09.json", + "test/data/json_roundtrip/roundtrip10.json", + "test/data/json_roundtrip/roundtrip11.json", + "test/data/json_roundtrip/roundtrip12.json", + "test/data/json_roundtrip/roundtrip13.json", + "test/data/json_roundtrip/roundtrip14.json", + "test/data/json_roundtrip/roundtrip15.json", + "test/data/json_roundtrip/roundtrip16.json", + "test/data/json_roundtrip/roundtrip17.json", + "test/data/json_roundtrip/roundtrip18.json", + "test/data/json_roundtrip/roundtrip19.json", + "test/data/json_roundtrip/roundtrip20.json", + "test/data/json_roundtrip/roundtrip21.json", + "test/data/json_roundtrip/roundtrip22.json", + "test/data/json_roundtrip/roundtrip23.json", + "test/data/json_roundtrip/roundtrip24.json", + "test/data/json_roundtrip/roundtrip25.json", + "test/data/json_roundtrip/roundtrip26.json", + "test/data/json_roundtrip/roundtrip27.json", + "test/data/json_roundtrip/roundtrip28.json", + "test/data/json_roundtrip/roundtrip29.json", + "test/data/json_roundtrip/roundtrip30.json", + "test/data/json_roundtrip/roundtrip31.json", + "test/data/json_roundtrip/roundtrip32.json" }) { CAPTURE(filename); @@ -11928,7 +11928,7 @@ TEST_CASE("test suite from json-test-suite") { // read a file with all unicode characters stored as single-character // strings in a JSON array - std::ifstream f("test/json_testsuite/sample.json"); + std::ifstream f("test/data/json_testsuite/sample.json"); json j; CHECK_NOTHROW(j << f); @@ -11943,35 +11943,35 @@ TEST_CASE("json.org examples") SECTION("1.json") { - std::ifstream f("test/json.org/1.json"); + std::ifstream f("test/data/json.org/1.json"); json j; CHECK_NOTHROW(j << f); } SECTION("2.json") { - std::ifstream f("test/json.org/2.json"); + std::ifstream f("test/data/json.org/2.json"); json j; CHECK_NOTHROW(j << f); } SECTION("3.json") { - std::ifstream f("test/json.org/3.json"); + std::ifstream f("test/data/json.org/3.json"); json j; CHECK_NOTHROW(j << f); } SECTION("4.json") { - std::ifstream f("test/json.org/4.json"); + std::ifstream f("test/data/json.org/4.json"); json j; CHECK_NOTHROW(j << f); } SECTION("5.json") { - std::ifstream f("test/json.org/5.json"); + std::ifstream f("test/data/json.org/5.json"); json j; CHECK_NOTHROW(j << f); } @@ -12105,7 +12105,7 @@ TEST_CASE("Unicode", "[hide]") { // read a file with all unicode characters stored as single-character // strings in a JSON array - std::ifstream f("test/json_nlohmann_tests/all_unicode.json"); + std::ifstream f("test/data/json_nlohmann_tests/all_unicode.json"); json j; CHECK_NOTHROW(j << f); @@ -12146,7 +12146,7 @@ TEST_CASE("Unicode", "[hide]") SECTION("ignore byte-order-mark") { // read a file with a UTF-8 BOM - std::ifstream f("test/json_nlohmann_tests/bom.json"); + std::ifstream f("test/data/json_nlohmann_tests/bom.json"); json j; CHECK_NOTHROW(j << f); } From 527a69bb64d2d03e385b02cfec72130e70f9b37f Mon Sep 17 00:00:00 2001 From: Chris Kitching Date: Wed, 11 May 2016 01:38:52 +0100 Subject: [PATCH 063/133] Install the test binary and test data. Fixes #241 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The resulting install tree, when tests are enabled, looks like this: ``` . ├── cmake │   ├── nlohmann_jsonConfig.cmake │   ├── nlohmann_jsonConfigVersion.cmake │   └── nlohmann_jsonTargets.cmake ├── include │   └── nlohmann │   └── json.hpp └── test ├── bin │   └── json_unit └── data ├── json_nlohmann_tests │   ├── all_unicode.json │   └── bom.json ├── json.org │   ├── 1.json │   ├── ... ├── json_roundtrip │   ├── roundtrip01.json │   ├── roundtrip02.json │   └── ... ├── json_tests │   ├── fail10.json │   └── ... └── json_testsuite └── sample.json ``` It has the property that you can invoke the test binary from the root of the install tree and the tests work correctly (you no longer depend on the test binary being run inside the source tree). If tests are disabled, the entire `test/` subtree is omitted. Notice how that yields exactly what you want for using this library in other projects. I do not believe I need to update travis due to this change, as the evil Makefile continues to do in-tree builds. I expect I'll find out soon enough. --- test/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 0039fd84c..b63e5a394 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -11,5 +11,11 @@ set_target_properties(json_unit PROPERTIES COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>" ) +# Install the test binary. +install(TARGETS json_unit RUNTIME DESTINATION test/bin) + +# Copy the test data to the install tree. +install(DIRECTORY data/ DESTINATION test/data) + target_include_directories(json_unit PRIVATE "src") target_link_libraries(json_unit ${JSON_TARGET_NAME}) From 0e2f0c4edce364ced6cd32d8fe72d5b4d9f0ef45 Mon Sep 17 00:00:00 2001 From: Chris Kitching Date: Wed, 11 May 2016 02:06:33 +0100 Subject: [PATCH 064/133] Repair appveyor... Horrifyingly It's sort of gnarly that it's still doing in-tree builds, but I really, _really_ don't want to get any more friendly with CMake's Visual Studio generator to work out how to make it stop doing it. In-tree builds still work, after all, and the goal of this work is to make out-of-tree builds work as well. Notional horrors like this will have to wait ;) --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index aaf9c5f1a..63902ced4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,5 +7,5 @@ build_script: - cmake . -G "Visual Studio 14 2015" - cmake --build . --config Release test_script: -- Release\json_unit.exe -- Release\json_unit.exe "*" +- test\Release\json_unit.exe +- test\Release\json_unit.exe "*" From f1e61896fb33391140fd7d5862fa08e2db852162 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 11 May 2016 18:43:12 +0200 Subject: [PATCH 065/133] fixed a shadow error --- src/json.hpp | 6 +++--- src/json.hpp.re2c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index f62f3e783..4c47abc46 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9659,7 +9659,7 @@ basic_json_parser_63: @since version 2.0.0 */ - basic_json patch(const basic_json& patch) const + basic_json patch(const basic_json& json_patch) const { // make a working copy to apply the patch to basic_json result = *this; @@ -9790,14 +9790,14 @@ basic_json_parser_63: }; // type check - if (not patch.is_array()) + if (not json_patch.is_array()) { // a JSON patch must be an array of objects throw std::invalid_argument("JSON patch must be an array of objects"); } // iterate and apply th eoperations - for (const auto& val : patch) + for (const auto& val : json_patch) { // wrapper to get a value for an operation const auto get_value = [&val](const std::string & op, diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index f3d3508cf..9703b4136 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8969,7 +8969,7 @@ class basic_json @since version 2.0.0 */ - basic_json patch(const basic_json& patch) const + basic_json patch(const basic_json& json_patch) const { // make a working copy to apply the patch to basic_json result = *this; @@ -9100,14 +9100,14 @@ class basic_json }; // type check - if (not patch.is_array()) + if (not json_patch.is_array()) { // a JSON patch must be an array of objects throw std::invalid_argument("JSON patch must be an array of objects"); } // iterate and apply th eoperations - for (const auto& val : patch) + for (const auto& val : json_patch) { // wrapper to get a value for an operation const auto get_value = [&val](const std::string & op, From fb06356856daca9a912b17fd0aa0bf7bc736aaef Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 11 May 2016 20:58:11 +0200 Subject: [PATCH 066/133] thanks --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 46ede2495..0d2cbf45c 100644 --- a/README.md +++ b/README.md @@ -431,7 +431,8 @@ I deeply appreciate the help of the following people. - [Lv Zheng](https://github.com/lv-zheng) fixed a namespace issue with `int64_t` and `uint64_t`. - [abc100m](https://github.com/abc100m) analyzed the issues with GCC 4.8 and proposed a [partial solution](https://github.com/nlohmann/json/pull/212). - [zewt](https://github.com/zewt) added useful notes to the README file about Android. -- [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators and improved the integration via CMake . +- [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators and improved the integration via CMake. +- [Chris Kitching](https://github.com/ChrisKitching) cleaned up the CMake files. Thanks a lot for helping out! From 0e0ecb2c14ce6a997aed0c59f2967d161193296a Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 12 May 2016 00:32:18 +0200 Subject: [PATCH 067/133] fixed a warning and update ChangeLog --- ChangeLog.md | 4 ++++ src/json.hpp | 2 +- src/json.hpp.re2c | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 75827603f..f0654ea28 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. This projec [Full Changelog](https://github.com/nlohmann/json/compare/v1.1.0...HEAD) +- Unit test fails when doing a CMake out-of-tree build [\#241](https://github.com/nlohmann/json/issues/241) - Additional integration options [\#237](https://github.com/nlohmann/json/issues/237) - Can't use basic\_json::iterator as a base iterator for std::move\_iterator [\#233](https://github.com/nlohmann/json/issues/233) - Provide a FAQ [\#163](https://github.com/nlohmann/json/issues/163) @@ -13,6 +14,8 @@ All notable changes to this project will be documented in this file. This projec - Add support for afl-fuzz testing [\#207](https://github.com/nlohmann/json/pull/207) ([mykter](https://github.com/mykter)) - 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)) +- -Wconversion warnings [\#239](https://github.com/nlohmann/json/issues/239) +- ambiguous overload for 'push\_back' and 'operator+=' [\#235](https://github.com/nlohmann/json/issues/235) - double values are serialized with commas as decimal points [\#228](https://github.com/nlohmann/json/issues/228) - Move semantics with std::initializer\_list [\#225](https://github.com/nlohmann/json/issues/225) - abort during getline in yyfill [\#223](https://github.com/nlohmann/json/issues/223) @@ -28,6 +31,7 @@ All notable changes to this project will be documented in this file. This projec - Conflicting typedef of ssize\_t on Windows 32 bit when using Boost.Python [\#204](https://github.com/nlohmann/json/issues/204) - Integer conversion to unsigned [\#178](https://github.com/nlohmann/json/issues/178) +- Out of tree builds and a few other miscellaneous CMake cleanups. [\#242](https://github.com/nlohmann/json/pull/242) ([ChrisKitching](https://github.com/ChrisKitching)) - Implement additional integration options [\#238](https://github.com/nlohmann/json/pull/238) ([robertmrk](https://github.com/robertmrk)) - make serialization locale-independent [\#232](https://github.com/nlohmann/json/pull/232) ([nlohmann](https://github.com/nlohmann)) - fixes \#223 by updating README.md [\#227](https://github.com/nlohmann/json/pull/227) ([kevin--](https://github.com/kevin--)) diff --git a/src/json.hpp b/src/json.hpp index 4c47abc46..d06849ffc 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9954,7 +9954,7 @@ basic_json_parser_63: */ static basic_json diff(const basic_json& source, const basic_json& target, - std::string path = "") noexcept + std::string path = "") { // the patch basic_json result(value_t::array); diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 9703b4136..151e95aea 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -9264,7 +9264,7 @@ class basic_json */ static basic_json diff(const basic_json& source, const basic_json& target, - std::string path = "") noexcept + std::string path = "") { // the patch basic_json result(value_t::array); From 0a393b8374fa92ce17476d0bee2056fc6515805f Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 12 May 2016 07:34:36 +0200 Subject: [PATCH 068/133] indentation cleanup --- doc/examples/at_json_pointer.link | 2 +- doc/examples/at_json_pointer_const.link | 2 +- doc/examples/basic_json__istream.link | 2 +- doc/examples/flatten.link | 2 +- doc/examples/json_pointer.link | 2 +- doc/examples/operatorjson_pointer.link | 2 +- doc/examples/operatorjson_pointer_const.link | 2 +- doc/examples/unflatten.link | 2 +- src/json.hpp | 450 ++++++++++--------- src/json.hpp.re2c | 450 ++++++++++--------- 10 files changed, 464 insertions(+), 452 deletions(-) diff --git a/doc/examples/at_json_pointer.link b/doc/examples/at_json_pointer.link index 5356294e2..7a7efa268 100644 --- a/doc/examples/at_json_pointer.link +++ b/doc/examples/at_json_pointer.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/at_json_pointer_const.link b/doc/examples/at_json_pointer_const.link index 905e60d34..9057e0b27 100644 --- a/doc/examples/at_json_pointer_const.link +++ b/doc/examples/at_json_pointer_const.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__istream.link b/doc/examples/basic_json__istream.link index e5475436d..20d1033c3 100644 --- a/doc/examples/basic_json__istream.link +++ b/doc/examples/basic_json__istream.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/flatten.link b/doc/examples/flatten.link index 817d06277..50d3841f3 100644 --- a/doc/examples/flatten.link +++ b/doc/examples/flatten.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/json_pointer.link b/doc/examples/json_pointer.link index c10c5fb9e..6602f0cf4 100644 --- a/doc/examples/json_pointer.link +++ b/doc/examples/json_pointer.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operatorjson_pointer.link b/doc/examples/operatorjson_pointer.link index 3cee69e78..3a60e8a65 100644 --- a/doc/examples/operatorjson_pointer.link +++ b/doc/examples/operatorjson_pointer.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operatorjson_pointer_const.link b/doc/examples/operatorjson_pointer_const.link index b13a9b19c..1bc14234d 100644 --- a/doc/examples/operatorjson_pointer_const.link +++ b/doc/examples/operatorjson_pointer_const.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/unflatten.link b/doc/examples/unflatten.link index d564ab012..386f5e11f 100644 --- a/doc/examples/unflatten.link +++ b/doc/examples/unflatten.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/src/json.hpp b/src/json.hpp index d06849ffc..436467632 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -271,8 +271,8 @@ class basic_json @tparam ObjectType the container to store objects (e.g., `std::map` or `std::unordered_map`) - @tparam StringType the type of the keys or names (e.g., `std::string`). The - comparison function `std::less` is used to order elements + @tparam StringType the type of the keys or names (e.g., `std::string`). + The comparison function `std::less` is used to order elements inside the container. @tparam AllocatorType the allocator to use for objects (e.g., `std::allocator`) @@ -280,8 +280,8 @@ class basic_json #### Default type With the default values for @a ObjectType (`std::map`), @a StringType - (`std::string`), and @a AllocatorType (`std::allocator`), the default value - for @a object_t is: + (`std::string`), and @a AllocatorType (`std::allocator`), the default + value for @a object_t is: @code {.cpp} std::map< @@ -298,16 +298,16 @@ class basic_json the default type, objects have the following behavior: - When all names are unique, objects will be interoperable in the sense - that all software implementations receiving that object will agree on the - name-value mappings. + that all software implementations receiving that object will agree on + the name-value mappings. - When the names within an object are not unique, later stored name/value pairs overwrite previously stored name/value pairs, leaving the used names unique. For instance, `{"key": 1}` and `{"key": 2, "key": 1}` will be treated as equal and both stored as `{"key": 1}`. - Internally, name/value pairs are stored in lexicographical order of the - names. Objects will also be serialized (see @ref dump) in this order. For - instance, `{"b": 1, "a": 2}` and `{"a": 2, "b": 1}` will be stored and - serialized as `{"a": 2, "b": 1}`. + names. Objects will also be serialized (see @ref dump) in this order. + For instance, `{"b": 1, "a": 2}` and `{"a": 2, "b": 1}` will be stored + and serialized as `{"a": 2, "b": 1}`. - When comparing objects, the order of the name/value pairs is irrelevant. This makes objects interoperable in the sense that they will not be affected by these differences. For instance, `{"b": 1, "a": 2}` and @@ -320,23 +320,24 @@ class basic_json In this class, the object's limit of nesting is not constraint explicitly. However, a maximum depth of nesting may be introduced by the compiler or - runtime environment. A theoretical limit can be queried by calling the @ref - max_size function of a JSON object. + runtime environment. A theoretical limit can be queried by calling the + @ref max_size function of a JSON object. #### Storage Objects are stored as pointers in a @ref basic_json type. That is, for any - access to object values, a pointer of type `object_t*` must be dereferenced. + access to object values, a pointer of type `object_t*` must be + dereferenced. @sa @ref array_t -- type for an array value @since version 1.0.0 - @note The order name/value pairs are added to the object is *not* preserved - by the library. Therefore, iterating an object may return name/value pairs - in a different order than they were originally stored. In fact, keys will - be traversed in alphabetical order as `std::map` with `std::less` is used - by default. Please note this behavior conforms to [RFC + @note The order name/value pairs are added to the object is *not* + preserved by the library. Therefore, iterating an object may return + name/value pairs in a different order than they were originally stored. In + fact, keys will be traversed in alphabetical order as `std::map` with + `std::less` is used by default. Please note this behavior conforms to [RFC 7159](http://rfc7159.net/rfc7159), because any order implements the specified "unordered" nature of JSON objects. */ @@ -378,8 +379,8 @@ class basic_json In this class, the array's limit of nesting is not constraint explicitly. However, a maximum depth of nesting may be introduced by the compiler or - runtime environment. A theoretical limit can be queried by calling the @ref - max_size function of a JSON array. + runtime environment. A theoretical limit can be queried by calling the + @ref max_size function of a JSON array. #### Storage @@ -399,8 +400,8 @@ class basic_json > A string is a sequence of zero or more Unicode characters. To store objects in C++, a type is defined by the template parameter - described below. Unicode values are split by the JSON class into byte-sized - characters during deserialization. + described below. Unicode values are split by the JSON class into + byte-sized characters during deserialization. @tparam StringType the container to store strings (e.g., `std::string`). Note this container is used for keys/names in objects, see @ref object_t. @@ -469,19 +470,19 @@ class basic_json @brief a type for a number (integer) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most programming - > languages. A number is represented in base 10 using decimal digits. It - > contains an integer component that may be prefixed with an optional minus - > sign, which may be followed by a fraction part and/or an exponent part. - > Leading zeros are not allowed. (...) Numeric values that cannot be - > represented in the grammar below (such as Infinity and NaN) are not - > permitted. + > The representation of numbers is similar to that used in most + > programming languages. A number is represented in base 10 using decimal + > digits. It contains an integer component that may be prefixed with an + > optional minus sign, which may be followed by a fraction part and/or an + > exponent part. Leading zeros are not allowed. (...) Numeric values that + > cannot be represented in the grammar below (such as Infinity and NaN) + > are not permitted. - This description includes both integer and floating-point numbers. However, - C++ allows more precise storage if it is known whether the number is a - signed integer, an unsigned integer or a floating-point number. Therefore, - three different types, @ref number_integer_t, @ref number_unsigned_t and - @ref number_float_t are used. + This description includes both integer and floating-point numbers. + However, C++ allows more precise storage if it is known whether the number + is a signed integer, an unsigned integer or a floating-point number. + Therefore, three different types, @ref number_integer_t, @ref + number_unsigned_t and @ref number_float_t are used. To store integer numbers in C++, a type is defined by the template parameter @a NumberIntegerType which chooses the type to use. @@ -500,8 +501,8 @@ class basic_json - The restrictions about leading zeros is not enforced in C++. Instead, leading zeros in integer literals lead to an interpretation as octal number. Internally, the value will be stored as decimal number. For - instance, the C++ integer literal `010` will be serialized to `8`. During - deserialization, leading zeros yield an error. + instance, the C++ integer literal `010` will be serialized to `8`. + During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to `null`. #### Limits @@ -512,9 +513,10 @@ class basic_json When the default type is used, the maximal integer number that can be stored is `9223372036854775807` (INT64_MAX) and the minimal integer number that can be stored is `-9223372036854775808` (INT64_MIN). Integer numbers - that are out of range will yield over/underflow when used in a constructor. - During deserialization, too large or small integer numbers will be - automatically be stored as @ref number_unsigned_t or @ref number_float_t. + that are out of range will yield over/underflow when used in a + constructor. During deserialization, too large or small integer numbers + will be automatically be stored as @ref number_unsigned_t or @ref + number_float_t. [RFC 7159](http://rfc7159.net/rfc7159) further states: > Note that when such software is used, numbers that are integers and are @@ -540,27 +542,27 @@ class basic_json @brief a type for a number (unsigned) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most programming - > languages. A number is represented in base 10 using decimal digits. It - > contains an integer component that may be prefixed with an optional minus - > sign, which may be followed by a fraction part and/or an exponent part. - > Leading zeros are not allowed. (...) Numeric values that cannot be - > represented in the grammar below (such as Infinity and NaN) are not - > permitted. + > The representation of numbers is similar to that used in most + > programming languages. A number is represented in base 10 using decimal + > digits. It contains an integer component that may be prefixed with an + > optional minus sign, which may be followed by a fraction part and/or an + > exponent part. Leading zeros are not allowed. (...) Numeric values that + > cannot be represented in the grammar below (such as Infinity and NaN) + > are not permitted. - This description includes both integer and floating-point numbers. However, - C++ allows more precise storage if it is known whether the number is a - signed integer, an unsigned integer or a floating-point number. Therefore, - three different types, @ref number_integer_t, @ref number_unsigned_t and - @ref number_float_t are used. + This description includes both integer and floating-point numbers. + However, C++ allows more precise storage if it is known whether the number + is a signed integer, an unsigned integer or a floating-point number. + Therefore, three different types, @ref number_integer_t, @ref + number_unsigned_t and @ref number_float_t are used. - To store unsigned integer numbers in C++, a type is defined by the template - parameter @a NumberUnsignedType which chooses the type to use. + To store unsigned integer numbers in C++, a type is defined by the + template parameter @a NumberUnsignedType which chooses the type to use. #### Default type - With the default values for @a NumberUnsignedType (`uint64_t`), the default - value for @a number_unsigned_t is: + With the default values for @a NumberUnsignedType (`uint64_t`), the + default value for @a number_unsigned_t is: @code {.cpp} uint64_t @@ -571,8 +573,8 @@ class basic_json - The restrictions about leading zeros is not enforced in C++. Instead, leading zeros in integer literals lead to an interpretation as octal number. Internally, the value will be stored as decimal number. For - instance, the C++ integer literal `010` will be serialized to `8`. During - deserialization, leading zeros yield an error. + instance, the C++ integer literal `010` will be serialized to `8`. + During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to `null`. #### Limits @@ -612,19 +614,19 @@ class basic_json @brief a type for a number (floating-point) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most programming - > languages. A number is represented in base 10 using decimal digits. It - > contains an integer component that may be prefixed with an optional minus - > sign, which may be followed by a fraction part and/or an exponent part. - > Leading zeros are not allowed. (...) Numeric values that cannot be - > represented in the grammar below (such as Infinity and NaN) are not - > permitted. + > The representation of numbers is similar to that used in most + > programming languages. A number is represented in base 10 using decimal + > digits. It contains an integer component that may be prefixed with an + > optional minus sign, which may be followed by a fraction part and/or an + > exponent part. Leading zeros are not allowed. (...) Numeric values that + > cannot be represented in the grammar below (such as Infinity and NaN) + > are not permitted. - This description includes both integer and floating-point numbers. However, - C++ allows more precise storage if it is known whether the number is a - signed integer, an unsigned integer or a floating-point number. Therefore, - three different types, @ref number_integer_t, @ref number_unsigned_t and - @ref number_float_t are used. + This description includes both integer and floating-point numbers. + However, C++ allows more precise storage if it is known whether the number + is a signed integer, an unsigned integer or a floating-point number. + Therefore, three different types, @ref number_integer_t, @ref + number_unsigned_t and @ref number_float_t are used. To store floating-point numbers in C++, a type is defined by the template parameter @a NumberFloatType which chooses the type to use. @@ -641,8 +643,8 @@ class basic_json #### Default behavior - The restrictions about leading zeros is not enforced in C++. Instead, - leading zeros in floating-point literals will be ignored. Internally, the - value will be stored as decimal number. For instance, the C++ + leading zeros in floating-point literals will be ignored. Internally, + the value will be stored as decimal number. For instance, the C++ floating-point literal `01.2` will be serialized to `1.2`. During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to `null`. @@ -653,9 +655,9 @@ class basic_json > This specification allows implementations to set limits on the range and > precision of numbers accepted. Since software that implements IEEE > 754-2008 binary64 (double precision) numbers is generally available and - > widely used, good interoperability can be achieved by implementations that - > expect no more precision or range than these provide, in the sense that - > implementations will approximate JSON numbers within the expected + > widely used, good interoperability can be achieved by implementations + > that expect no more precision or range than these provide, in the sense + > that implementations will approximate JSON numbers within the expected > precision. This implementation does exactly follow this approach, as it uses double @@ -938,9 +940,9 @@ class basic_json influenced. When passed to @ref parse(std::istream&, parser_callback_t) or @ref parse(const string_t&, parser_callback_t), it is called on certain events (passed as @ref parse_event_t via parameter @a event) with a set - recursion depth @a depth and context JSON value @a parsed. The return value - of the callback function is a boolean indicating whether the element that - emitted the callback shall be kept or not. + recursion depth @a depth and context JSON value @a parsed. The return + value of the callback function is a boolean indicating whether the element + that emitted the callback shall be kept or not. We distinguish six scenarios (determined by the event type) in which the callback function can be called. The following table describes the values @@ -960,8 +962,8 @@ class basic_json - Discarded values in structured types are skipped. That is, the parser will behave as if the discarded value was never read. - - In case a value outside a structured type is skipped, it is replaced with - `null`. This case happens if the top-level element is skipped. + - In case a value outside a structured type is skipped, it is replaced + with `null`. This case happens if the top-level element is skipped. @param[in] depth the depth of the recursion during parsing @@ -1065,8 +1067,8 @@ class basic_json Create a `null` JSON value. This is the explicitly version of the `null` value constructor as it takes a null pointer as parameter. It allows to create `null` values by explicitly assigning a `nullptr` to a JSON value. - The passed null pointer itself is not read -- it is only used to choose the - right constructor. + The passed null pointer itself is not read -- it is only used to choose + the right constructor. @complexity Constant. @@ -1096,8 +1098,8 @@ class basic_json @throw std::bad_alloc if allocation for object value fails - @liveexample{The following code shows the constructor with an @ref object_t - parameter.,basic_json__object_t} + @liveexample{The following code shows the constructor with an @ref + object_t parameter.,basic_json__object_t} @sa @ref basic_json(const CompatibleObjectType&) -- create an object value from a compatible STL container @@ -1177,11 +1179,11 @@ class basic_json any type @a CompatibleArrayType that can be used to construct values of type @ref array_t. - @tparam CompatibleArrayType An object type whose `value_type` is compatible - to @ref array_t. Examples include `std::vector`, `std::deque`, `std::list`, - `std::forward_list`, `std::array`, `std::set`, `std::unordered_set`, - `std::multiset`, and `unordered_multiset` with a `value_type` from which a - @ref basic_json value can be constructed. + @tparam CompatibleArrayType An object type whose `value_type` is + compatible to @ref array_t. Examples include `std::vector`, `std::deque`, + `std::list`, `std::forward_list`, `std::array`, `std::set`, + `std::unordered_set`, `std::multiset`, and `unordered_multiset` with a + `value_type` from which a @ref basic_json value can be constructed. @param[in] val a value for the array @@ -1225,8 +1227,8 @@ class basic_json @throw std::bad_alloc if allocation for string value fails - @liveexample{The following code shows the constructor with an @ref string_t - parameter.,basic_json__string_t} + @liveexample{The following code shows the constructor with an @ref + string_t parameter.,basic_json__string_t} @sa @ref basic_json(const typename string_t::value_type*) -- create a string value from a character pointer @@ -1318,9 +1320,9 @@ class basic_json Create an integer number JSON value with a given content. @tparam T A helper type to remove this function via SFINAE in case @ref - number_integer_t is the same as `int`. In this case, this constructor would - have the same signature as @ref basic_json(const int value). Note the - helper type @a T is not visible in this constructor's interface. + number_integer_t is the same as `int`. In this case, this constructor + would have the same signature as @ref basic_json(const int value). Note + the helper type @a T is not visible in this constructor's interface. @param[in] val an integer to create a JSON number from @@ -1355,8 +1357,8 @@ class basic_json @note This constructor allows to pass enums directly to a constructor. As C++ has no way of specifying the type of an anonymous enum explicitly, we can only rely on the fact that such values implicitly convert to int. As - int may already be the same type of number_integer_t, we may need to switch - off the constructor @ref basic_json(const number_integer_t). + int may already be the same type of number_integer_t, we may need to + switch off the constructor @ref basic_json(const number_integer_t). @complexity Constant. @@ -1383,8 +1385,8 @@ class basic_json construct values of type @ref number_integer_t. @tparam CompatibleNumberIntegerType An integer type which is compatible to - @ref number_integer_t. Examples include the types `int`, `int32_t`, `long`, - and `short`. + @ref number_integer_t. Examples include the types `int`, `int32_t`, + `long`, and `short`. @param[in] val an integer to create a JSON number from @@ -1442,12 +1444,12 @@ class basic_json /*! @brief create an unsigned number (implicit) - Create an unsigned number JSON value with a given content. This constructor - allows any type @a CompatibleNumberUnsignedType that can be used to - construct values of type @ref number_unsigned_t. + Create an unsigned number JSON value with a given content. This + constructor allows any type @a CompatibleNumberUnsignedType that can be + used to construct values of type @ref number_unsigned_t. - @tparam CompatibleNumberUnsignedType An integer type which is compatible to - @ref number_unsigned_t. Examples may include the types `unsigned int`, + @tparam CompatibleNumberUnsignedType An integer type which is compatible + to @ref number_unsigned_t. Examples may include the types `unsigned int`, `uint32_t`, or `unsigned short`. @param[in] val an unsigned integer to create a JSON number from @@ -1480,8 +1482,8 @@ class basic_json @note [RFC 7159](http://www.rfc-editor.org/rfc/rfc7159.txt), section 6 disallows NaN values: - > Numeric values that cannot be represented in the grammar below (such - > as Infinity and NaN) are not permitted. + > Numeric values that cannot be represented in the grammar below (such as + > Infinity and NaN) are not permitted. In case the parameter @a val is not a number, a JSON null value is created instead. @@ -1513,15 +1515,16 @@ class basic_json constructor allows any type @a CompatibleNumberFloatType that can be used to construct values of type @ref number_float_t. - @tparam CompatibleNumberFloatType A floating-point type which is compatible - to @ref number_float_t. Examples may include the types `float` or `double`. + @tparam CompatibleNumberFloatType A floating-point type which is + compatible to @ref number_float_t. Examples may include the types `float` + or `double`. @param[in] val a floating-point to create a JSON number from @note [RFC 7159](http://www.rfc-editor.org/rfc/rfc7159.txt), section 6 disallows NaN values: - > Numeric values that cannot be represented in the grammar below (such - > as Infinity and NaN) are not permitted. + > Numeric values that cannot be represented in the grammar below (such as + > Infinity and NaN) are not permitted. In case the parameter @a val is not a number, a JSON null value is created instead. @@ -1592,13 +1595,13 @@ class basic_json used by the functions @ref array(std::initializer_list) and @ref object(std::initializer_list). - @param[in] manual_type internal parameter; when @a type_deduction is set to - `false`, the created JSON value will use the provided type (only @ref + @param[in] manual_type internal parameter; when @a type_deduction is set + to `false`, the created JSON value will use the provided type (only @ref value_t::array and @ref value_t::object are valid); when @a type_deduction is set to `true`, this parameter has no effect - @throw std::domain_error if @a type_deduction is `false`, @a manual_type is - `value_t::object`, but @a init contains an element which is not a pair + @throw std::domain_error if @a type_deduction is `false`, @a manual_type + is `value_t::object`, but @a init contains an element which is not a pair whose first element is a string; example: `"cannot create object from initializer list"` @@ -1679,8 +1682,8 @@ class basic_json list of values `a, b, c`, creates the JSON value `[a, b, c]`. If the initializer list is empty, the empty array `[]` is created. - @note This function is only needed to express two edge cases that cannot be - realized with the initializer list constructor (@ref + @note This function is only needed to express two edge cases that cannot + be realized with the initializer list constructor (@ref basic_json(std::initializer_list, bool, value_t)). These cases are: 1. creating an array whose elements are all pairs whose first element is a @@ -1723,8 +1726,8 @@ class basic_json related function @ref array(std::initializer_list), there are no cases which can only be expressed by this function. That is, any initializer list @a init can also be passed to the initializer list - constructor - @ref basic_json(std::initializer_list, bool, value_t). + constructor @ref basic_json(std::initializer_list, bool, + value_t). @param[in] init initializer list to create an object from (optional) @@ -1755,8 +1758,8 @@ class basic_json /*! @brief construct an array with count copies of given value - Constructs a JSON array value by creating @a cnt copies of a passed - value. In case @a cnt is `0`, an empty array is created. As postcondition, + Constructs a JSON array value by creating @a cnt copies of a passed value. + In case @a cnt is `0`, an empty array is created. As postcondition, `std::distance(begin(),end()) == cnt` holds. @param[in] cnt the number of JSON copies of @a val to create @@ -1784,8 +1787,8 @@ class basic_json - In case of primitive types (number, boolean, or string), @a first must be `begin()` and @a last must be `end()`. In this case, the value is copied. Otherwise, std::out_of_range is thrown. - - In case of structured types (array, object), the constructor behaves - as similar versions for `std::vector`. + - In case of structured types (array, object), the constructor behaves as + similar versions for `std::vector`. - In case of a null type, std::domain_error is thrown. @tparam InputIT an input iterator type (@ref iterator or @ref @@ -1800,8 +1803,8 @@ class basic_json boolean, or string) where an out of range error can be detected easily; example: `"iterators out of range"` @throw std::bad_alloc if allocation for object, array, or string fails - @throw std::domain_error if called with a null value; example: `"cannot use - construct with iterators from null"` + @throw std::domain_error if called with a null value; example: `"cannot + use construct with iterators from null"` @complexity Linear in distance between @a first and @a last. @@ -2042,8 +2045,8 @@ class basic_json @brief copy assignment Copy assignment operator. Copies a JSON value via the "copy and swap" - strategy: It is expressed in terms of the copy constructor, destructor, and - the swap() member function. + strategy: It is expressed in terms of the copy constructor, destructor, + and the swap() member function. @param[in] other value to copy from @@ -2143,8 +2146,8 @@ class basic_json parameter. @param[in] indent if indent is nonnegative, then array elements and object - members will be pretty-printed with that indent level. An indent level of 0 - will only insert newlines. -1 (the default) selects the most compact + members will be pretty-printed with that indent level. An indent level of + 0 will only insert newlines. -1 (the default) selects the most compact representation @return string containing the serialization of the JSON value @@ -2976,8 +2979,8 @@ class basic_json /*! @brief get a reference value (implicit) - Implict reference access to the internally stored JSON value. No copies are - made. + Implict reference access to the internally stored JSON value. No copies + are made. @warning Writing data to the referee of the result yields an undefined state. @@ -3027,14 +3030,14 @@ class basic_json /*! @brief get a value (implicit) - Implicit type conversion between the JSON value and a compatible value. The - call is realized by calling @ref get() const. + Implicit type conversion between the JSON value and a compatible value. + The call is realized by calling @ref get() const. @tparam ValueType non-pointer type compatible to the JSON value, for instance `int` for JSON integer numbers, `bool` for JSON booleans, or - `std::vector` types for JSON arrays. The character type of @ref string_t as - well as an initializer list of this type is excluded to avoid ambiguities - as these types implicitly convert to `std::string`. + `std::vector` types for JSON arrays. The character type of @ref string_t + as well as an initializer list of this type is excluded to avoid + ambiguities as these types implicitly convert to `std::string`. @return copy of the JSON value, converted to type @a ValueType @@ -3123,8 +3126,8 @@ class basic_json /*! @brief access specified array element with bounds checking - Returns a const reference to the element at specified location @a idx, with - bounds checking. + Returns a const reference to the element at specified location @a idx, + with bounds checking. @param[in] idx index of the element to access @@ -3215,8 +3218,8 @@ class basic_json /*! @brief access specified object element with bounds checking - Returns a const reference to the element at with specified key @a key, with - bounds checking. + Returns a const reference to the element at with specified key @a key, + with bounds checking. @param[in] key key of the element to access @@ -3690,8 +3693,8 @@ class basic_json @complexity Constant. - @pre The JSON value must not be `null` (would throw `std::out_of_range`) or - an empty array or object (undefined behavior, guarded by assertions). + @pre The JSON value must not be `null` (would throw `std::out_of_range`) + or an empty array or object (undefined behavior, guarded by assertions). @post The JSON value remains unchanged. @throw std::out_of_range when called on `null` value @@ -3732,8 +3735,8 @@ class basic_json @complexity Constant. - @pre The JSON value must not be `null` (would throw `std::out_of_range`) or - an empty array or object (undefined behavior, guarded by assertions). + @pre The JSON value must not be `null` (would throw `std::out_of_range`) + or an empty array or object (undefined behavior, guarded by assertions). @post The JSON value remains unchanged. @throw std::out_of_range when called on `null` value. @@ -3772,16 +3775,16 @@ class basic_json will be `null`. @param[in] pos iterator to the element to remove - @return Iterator following the last removed element. If the iterator @a pos - refers to the last element, the `end()` iterator is returned. + @return Iterator following the last removed element. If the iterator @a + pos refers to the last element, the `end()` iterator is returned. @tparam InteratorType an @ref iterator or @ref const_iterator @post Invalidates iterators and references at or after the point of the erase, including the `end()` iterator. - @throw std::domain_error if called on a `null` value; example: `"cannot use - erase() with null"` + @throw std::domain_error if called on a `null` value; example: `"cannot + use erase() with null"` @throw std::domain_error if called on an iterator which does not belong to the current JSON value; example: `"iterator does not fit current value"` @throw std::out_of_range if called on a primitive type with invalid @@ -3797,12 +3800,12 @@ class basic_json @liveexample{The example shows the result of `erase()` for different JSON types.,erase__IteratorType} - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in the - given range + @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + the given range @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key - @sa @ref erase(const size_type) -- removes the element from an array at the - given index + @sa @ref erase(const size_type) -- removes the element from an array at + the given index @since version 1.0.0 */ @@ -3871,9 +3874,9 @@ class basic_json /*! @brief remove elements given an iterator range - Removes the element specified by the range `[first; last)`. The iterator @a - first does not need to be dereferenceable if `first == last`: erasing an - empty range is a no-op. + Removes the element specified by the range `[first; last)`. The iterator + @a first does not need to be dereferenceable if `first == last`: erasing + an empty range is a no-op. If called on a primitive type other than `null`, the resulting JSON value will be `null`. @@ -3888,8 +3891,8 @@ class basic_json @post Invalidates iterators and references at or after the point of the erase, including the `end()` iterator. - @throw std::domain_error if called on a `null` value; example: `"cannot use - erase() with null"` + @throw std::domain_error if called on a `null` value; example: `"cannot + use erase() with null"` @throw std::domain_error if called on iterators which does not belong to the current JSON value; example: `"iterators do not fit current value"` @throw std::out_of_range if called on a primitive type with invalid @@ -3909,8 +3912,8 @@ class basic_json @sa @ref erase(InteratorType) -- removes the element at a given position @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key - @sa @ref erase(const size_type) -- removes the element from an array at the - given index + @sa @ref erase(const size_type) -- removes the element from an array at + the given index @since version 1.0.0 */ @@ -3986,8 +3989,8 @@ class basic_json @param[in] key value of the elements to remove @return Number of elements removed. If @a ObjectType is the default - `std::map` type, the return value will always be `0` (@a key was not found) - or `1` (@a key was found). + `std::map` type, the return value will always be `0` (@a key was not + found) or `1` (@a key was found). @post References and iterators to the erased elements are invalidated. Other references and iterators are not affected. @@ -4000,10 +4003,10 @@ class basic_json @liveexample{The example shows the effect of `erase()`.,erase__key_type} @sa @ref erase(InteratorType) -- removes the element at a given position - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in the - given range - @sa @ref erase(const size_type) -- removes the element from an array at the - given index + @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + the given range + @sa @ref erase(const size_type) -- removes the element from an array at + the given index @since version 1.0.0 */ @@ -4038,8 +4041,8 @@ class basic_json @liveexample{The example shows the effect of `erase()`.,erase__size_type} @sa @ref erase(InteratorType) -- removes the element at a given position - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in the - given range + @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + the given range @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key @@ -4078,7 +4081,8 @@ class basic_json @brief find an element in a JSON object Finds an element in a JSON object with key equivalent to @a key. If the - element is not found or the JSON value is not an object, end() is returned. + element is not found or the JSON value is not an object, end() is + returned. @param[in] key key value of the element to search for @@ -4438,9 +4442,9 @@ class basic_json @brief wrapper to access iterator member functions in range-based for This function allows to access @ref iterator::key() and @ref - iterator::value() during range-based for loops. In these loops, a reference - to the JSON values is returned, so there is no access to the underlying - iterator. + iterator::value() during range-based for loops. In these loops, a + reference to the JSON values is returned, so there is no access to the + underlying iterator. @note The name of this function is not yet final and may change in the future. @@ -4484,8 +4488,8 @@ class basic_json object | result of function `object_t::empty()` array | result of function `array_t::empty()` - @complexity Constant, as long as @ref array_t and @ref object_t satisfy the - Container concept; that is, their `empty()` functions have constant + @complexity Constant, as long as @ref array_t and @ref object_t satisfy + the Container concept; that is, their `empty()` functions have constant complexity. @requirement This function helps `basic_json` satisfying the @@ -4547,8 +4551,9 @@ class basic_json object | result of function object_t::size() array | result of function array_t::size() - @complexity Constant, as long as @ref array_t and @ref object_t satisfy the - Container concept; that is, their size() functions have constant complexity. + @complexity Constant, as long as @ref array_t and @ref object_t satisfy + the Container concept; that is, their size() functions have constant + complexity. @requirement This function helps `basic_json` satisfying the [Container](http://en.cppreference.com/w/cpp/concept/Container) @@ -4612,8 +4617,8 @@ class basic_json object | result of function `object_t::max_size()` array | result of function `array_t::max_size()` - @complexity Constant, as long as @ref array_t and @ref object_t satisfy the - Container concept; that is, their `max_size()` functions have constant + @complexity Constant, as long as @ref array_t and @ref object_t satisfy + the Container concept; that is, their `max_size()` functions have constant complexity. @requirement This function helps `basic_json` satisfying the @@ -4835,8 +4840,8 @@ class basic_json @brief add an object to an object Inserts the given element @a val to the JSON object. If the function is - called on a JSON null value, an empty object is created before inserting @a - val. + called on a JSON null value, an empty object is created before inserting + @a val. @param[in] val the value to add to the JSON object @@ -5111,8 +5116,8 @@ class basic_json @return iterator pointing to the first element inserted, or @a pos if `ilist` is empty - @complexity Linear in `ilist.size()` plus linear in the distance between @a - pos and end of the container. + @complexity Linear in `ilist.size()` plus linear in the distance between + @a pos and end of the container. @liveexample{The example shows how `insert()` is used.,insert__ilist} @@ -5757,8 +5762,8 @@ class basic_json @note A UTF-8 byte order mark is silently ignored. - @liveexample{The example below demonstrates the `parse()` function with and - without callback function.,parse__string__parser_callback_t} + @liveexample{The example below demonstrates the `parse()` function with + and without callback function.,parse__string__parser_callback_t} @sa @ref parse(std::istream&, parser_callback_t) for a version that reads from an input stream @@ -5786,11 +5791,11 @@ class basic_json @note A UTF-8 byte order mark is silently ignored. - @liveexample{The example below demonstrates the `parse()` function with and - without callback function.,parse__istream__parser_callback_t} + @liveexample{The example below demonstrates the `parse()` function with + and without callback function.,parse__istream__parser_callback_t} - @sa @ref parse(const string_t&, parser_callback_t) for a version that reads - from a string + @sa @ref parse(const string_t&, parser_callback_t) for a version that + reads from a string @since version 1.0.0 */ @@ -5923,8 +5928,8 @@ class basic_json /*! @brief escape a string - Escape a string by replacing certain special characters by a sequence of an - escape character (backslash) and another character and other control + Escape a string by replacing certain special characters by a sequence of + an escape character (backslash) and another character and other control characters by a sequence of "\u" followed by a four-digit hex representation. @@ -6046,8 +6051,8 @@ class basic_json This function is called by the public member function dump and organizes the serialization internally. The indentation level is propagated as - additional parameter. In case of arrays and objects, the function is called - recursively. Note that + additional parameter. In case of arrays and objects, the function is + called recursively. Note that - strings and object keys are escaped using `escape_string()` - integer numbers are converted implicitly via `operator<<` @@ -6241,8 +6246,8 @@ class basic_json { // Otherwise 6, 15 or 16 digits of precision allows // round-trip IEEE 754 string->float->string, - // string->double->string or string->long double->string; - // to be safe, we read this value from + // string->double->string or string->long + // double->string; to be safe, we read this value from // std::numeric_limits::digits10 std::stringstream ss; ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems @@ -7262,8 +7267,8 @@ class basic_json @brief lexical analysis This class organizes the lexical analysis during JSON deserialization. The - core of it is a scanner generated by [re2c](http://re2c.org) that processes - a buffer and recognizes tokens according to RFC 7159. + core of it is a scanner generated by [re2c](http://re2c.org) that + processes a buffer and recognizes tokens according to RFC 7159. */ class lexer { @@ -8259,13 +8264,14 @@ basic_json_parser_63: 1. Escaped characters. In this case, a new character is constructed according to the nature of the escape. Some escapes create new - characters (e.g., `"\\n"` is replaced by `"\n"`), some are copied as - is (e.g., `"\\\\"`). Furthermore, Unicode escapes of the shape + characters (e.g., `"\\n"` is replaced by `"\n"`), some are copied + as is (e.g., `"\\\\"`). Furthermore, Unicode escapes of the shape `"\\uxxxx"` need special care. In this case, to_unicode takes care of the construction of the values. 2. Unescaped characters are copied as is. - @return string value of current token without opening and closing quotes + @return string value of current token without opening and closing + quotes @throw std::out_of_range if to_unicode fails */ string_t get_string() const @@ -8376,8 +8382,8 @@ basic_json_parser_63: This function (and its overloads) serves to select the most approprate standard floating point number parsing function based on the type - supplied via the first parameter. Set this to - @a static_cast(nullptr). + supplied via the first parameter. Set this to @a + static_cast(nullptr). @param[in] type the @ref number_float_t in use @@ -8401,8 +8407,8 @@ basic_json_parser_63: This function (and its overloads) serves to select the most approprate standard floating point number parsing function based on the type - supplied via the first parameter. Set this to - @a static_cast(nullptr). + supplied via the first parameter. Set this to @a + static_cast(nullptr). @param[in] type the @ref number_float_t in use @@ -8421,8 +8427,8 @@ basic_json_parser_63: This function (and its overloads) serves to select the most approprate standard floating point number parsing function based on the type - supplied via the first parameter. Set this to - @a static_cast(nullptr). + supplied via the first parameter. Set this to @a + static_cast(nullptr). @param[in] type the @ref number_float_t in use @@ -8446,13 +8452,13 @@ basic_json_parser_63: This function parses the integer component up to the radix point or exponent while collecting information about the 'floating point representation', which it stores in the result parameter. If there is - no radix point or exponent, and the number can fit into a - @ref number_integer_t or @ref number_unsigned_t then it sets the - result parameter accordingly. + no radix point or exponent, and the number can fit into a @ref + number_integer_t or @ref number_unsigned_t then it sets the result + parameter accordingly. The 'floating point representation' includes the number of significant - figures after the radix point, whether the number is in exponential - or decimal form, the capitalization of the exponent marker, and if the + figures after the radix point, whether the number is in exponential or + decimal form, the capitalization of the exponent marker, and if the optional '+' is present in the exponent. This information is necessary to perform accurate round trips of floating point numbers. @@ -9415,11 +9421,11 @@ basic_json_parser_63: throw std::domain_error("values in object must be primitive"); } - // assign value to reference pointed to by JSON pointer; - // Note that if the JSON pointer is "" (i.e., points to the - // whole value), function get_and_create returns a reference - // to result itself. An assignment will then create a - // primitive value. + // assign value to reference pointed to by JSON pointer; Note + // that if the JSON pointer is "" (i.e., points to the whole + // value), function get_and_create returns a reference to + // result itself. An assignment will then create a primitive + // value. json_pointer(element.first).get_and_create(result) = element.second; } @@ -9442,9 +9448,9 @@ basic_json_parser_63: @brief access specified element via JSON Pointer Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. Similar to - @ref operator[](const typename object_t::key_type&), `null` values - are created in arrays and objects if necessary. + No bound checking is performed. Similar to @ref operator[](const typename + object_t::key_type&), `null` values are created in arrays and objects if + necessary. In particular: - If the JSON pointer points to an object key that does not exist, it @@ -9531,8 +9537,8 @@ basic_json_parser_63: /*! @brief access specified element via JSON Pointer - Returns a const reference to the element at with specified JSON pointer - @a ptr, with bounds checking. + Returns a const reference to the element at with specified JSON pointer @a + ptr, with bounds checking. @param[in] ptr JSON pointer to the desired element @@ -9556,10 +9562,10 @@ basic_json_parser_63: /*! @brief return flattened JSON value - The function creates a JSON object whose keys are JSON pointers (see - [RFC 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all - primitive. The original JSON value can be restored using the - @ref unflatten() function. + The function creates a JSON object whose keys are JSON pointers (see [RFC + 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all + primitive. The original JSON value can be restored using the @ref + unflatten() function. @return an object that maps JSON pointers to primitve values @@ -9631,7 +9637,7 @@ basic_json_parser_63: this funcion, a JSON Patch is applied to the current JSON value by executing all operations from the patch. - @param[in] patch JSON patch document + @param[in] json_patch JSON patch document @return patched document @note The application of a patch is atomic: Either all operations succeed @@ -10092,8 +10098,8 @@ basic_json_parser_63: /*! @brief default JSON class -This type is the default specialization of the @ref basic_json class which uses -the standard template types. +This type is the default specialization of the @ref basic_json class which +uses the standard template types. @since version 1.0.0 */ diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 151e95aea..ba4fc007b 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -271,8 +271,8 @@ class basic_json @tparam ObjectType the container to store objects (e.g., `std::map` or `std::unordered_map`) - @tparam StringType the type of the keys or names (e.g., `std::string`). The - comparison function `std::less` is used to order elements + @tparam StringType the type of the keys or names (e.g., `std::string`). + The comparison function `std::less` is used to order elements inside the container. @tparam AllocatorType the allocator to use for objects (e.g., `std::allocator`) @@ -280,8 +280,8 @@ class basic_json #### Default type With the default values for @a ObjectType (`std::map`), @a StringType - (`std::string`), and @a AllocatorType (`std::allocator`), the default value - for @a object_t is: + (`std::string`), and @a AllocatorType (`std::allocator`), the default + value for @a object_t is: @code {.cpp} std::map< @@ -298,16 +298,16 @@ class basic_json the default type, objects have the following behavior: - When all names are unique, objects will be interoperable in the sense - that all software implementations receiving that object will agree on the - name-value mappings. + that all software implementations receiving that object will agree on + the name-value mappings. - When the names within an object are not unique, later stored name/value pairs overwrite previously stored name/value pairs, leaving the used names unique. For instance, `{"key": 1}` and `{"key": 2, "key": 1}` will be treated as equal and both stored as `{"key": 1}`. - Internally, name/value pairs are stored in lexicographical order of the - names. Objects will also be serialized (see @ref dump) in this order. For - instance, `{"b": 1, "a": 2}` and `{"a": 2, "b": 1}` will be stored and - serialized as `{"a": 2, "b": 1}`. + names. Objects will also be serialized (see @ref dump) in this order. + For instance, `{"b": 1, "a": 2}` and `{"a": 2, "b": 1}` will be stored + and serialized as `{"a": 2, "b": 1}`. - When comparing objects, the order of the name/value pairs is irrelevant. This makes objects interoperable in the sense that they will not be affected by these differences. For instance, `{"b": 1, "a": 2}` and @@ -320,23 +320,24 @@ class basic_json In this class, the object's limit of nesting is not constraint explicitly. However, a maximum depth of nesting may be introduced by the compiler or - runtime environment. A theoretical limit can be queried by calling the @ref - max_size function of a JSON object. + runtime environment. A theoretical limit can be queried by calling the + @ref max_size function of a JSON object. #### Storage Objects are stored as pointers in a @ref basic_json type. That is, for any - access to object values, a pointer of type `object_t*` must be dereferenced. + access to object values, a pointer of type `object_t*` must be + dereferenced. @sa @ref array_t -- type for an array value @since version 1.0.0 - @note The order name/value pairs are added to the object is *not* preserved - by the library. Therefore, iterating an object may return name/value pairs - in a different order than they were originally stored. In fact, keys will - be traversed in alphabetical order as `std::map` with `std::less` is used - by default. Please note this behavior conforms to [RFC + @note The order name/value pairs are added to the object is *not* + preserved by the library. Therefore, iterating an object may return + name/value pairs in a different order than they were originally stored. In + fact, keys will be traversed in alphabetical order as `std::map` with + `std::less` is used by default. Please note this behavior conforms to [RFC 7159](http://rfc7159.net/rfc7159), because any order implements the specified "unordered" nature of JSON objects. */ @@ -378,8 +379,8 @@ class basic_json In this class, the array's limit of nesting is not constraint explicitly. However, a maximum depth of nesting may be introduced by the compiler or - runtime environment. A theoretical limit can be queried by calling the @ref - max_size function of a JSON array. + runtime environment. A theoretical limit can be queried by calling the + @ref max_size function of a JSON array. #### Storage @@ -399,8 +400,8 @@ class basic_json > A string is a sequence of zero or more Unicode characters. To store objects in C++, a type is defined by the template parameter - described below. Unicode values are split by the JSON class into byte-sized - characters during deserialization. + described below. Unicode values are split by the JSON class into + byte-sized characters during deserialization. @tparam StringType the container to store strings (e.g., `std::string`). Note this container is used for keys/names in objects, see @ref object_t. @@ -469,19 +470,19 @@ class basic_json @brief a type for a number (integer) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most programming - > languages. A number is represented in base 10 using decimal digits. It - > contains an integer component that may be prefixed with an optional minus - > sign, which may be followed by a fraction part and/or an exponent part. - > Leading zeros are not allowed. (...) Numeric values that cannot be - > represented in the grammar below (such as Infinity and NaN) are not - > permitted. + > The representation of numbers is similar to that used in most + > programming languages. A number is represented in base 10 using decimal + > digits. It contains an integer component that may be prefixed with an + > optional minus sign, which may be followed by a fraction part and/or an + > exponent part. Leading zeros are not allowed. (...) Numeric values that + > cannot be represented in the grammar below (such as Infinity and NaN) + > are not permitted. - This description includes both integer and floating-point numbers. However, - C++ allows more precise storage if it is known whether the number is a - signed integer, an unsigned integer or a floating-point number. Therefore, - three different types, @ref number_integer_t, @ref number_unsigned_t and - @ref number_float_t are used. + This description includes both integer and floating-point numbers. + However, C++ allows more precise storage if it is known whether the number + is a signed integer, an unsigned integer or a floating-point number. + Therefore, three different types, @ref number_integer_t, @ref + number_unsigned_t and @ref number_float_t are used. To store integer numbers in C++, a type is defined by the template parameter @a NumberIntegerType which chooses the type to use. @@ -500,8 +501,8 @@ class basic_json - The restrictions about leading zeros is not enforced in C++. Instead, leading zeros in integer literals lead to an interpretation as octal number. Internally, the value will be stored as decimal number. For - instance, the C++ integer literal `010` will be serialized to `8`. During - deserialization, leading zeros yield an error. + instance, the C++ integer literal `010` will be serialized to `8`. + During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to `null`. #### Limits @@ -512,9 +513,10 @@ class basic_json When the default type is used, the maximal integer number that can be stored is `9223372036854775807` (INT64_MAX) and the minimal integer number that can be stored is `-9223372036854775808` (INT64_MIN). Integer numbers - that are out of range will yield over/underflow when used in a constructor. - During deserialization, too large or small integer numbers will be - automatically be stored as @ref number_unsigned_t or @ref number_float_t. + that are out of range will yield over/underflow when used in a + constructor. During deserialization, too large or small integer numbers + will be automatically be stored as @ref number_unsigned_t or @ref + number_float_t. [RFC 7159](http://rfc7159.net/rfc7159) further states: > Note that when such software is used, numbers that are integers and are @@ -540,27 +542,27 @@ class basic_json @brief a type for a number (unsigned) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most programming - > languages. A number is represented in base 10 using decimal digits. It - > contains an integer component that may be prefixed with an optional minus - > sign, which may be followed by a fraction part and/or an exponent part. - > Leading zeros are not allowed. (...) Numeric values that cannot be - > represented in the grammar below (such as Infinity and NaN) are not - > permitted. + > The representation of numbers is similar to that used in most + > programming languages. A number is represented in base 10 using decimal + > digits. It contains an integer component that may be prefixed with an + > optional minus sign, which may be followed by a fraction part and/or an + > exponent part. Leading zeros are not allowed. (...) Numeric values that + > cannot be represented in the grammar below (such as Infinity and NaN) + > are not permitted. - This description includes both integer and floating-point numbers. However, - C++ allows more precise storage if it is known whether the number is a - signed integer, an unsigned integer or a floating-point number. Therefore, - three different types, @ref number_integer_t, @ref number_unsigned_t and - @ref number_float_t are used. + This description includes both integer and floating-point numbers. + However, C++ allows more precise storage if it is known whether the number + is a signed integer, an unsigned integer or a floating-point number. + Therefore, three different types, @ref number_integer_t, @ref + number_unsigned_t and @ref number_float_t are used. - To store unsigned integer numbers in C++, a type is defined by the template - parameter @a NumberUnsignedType which chooses the type to use. + To store unsigned integer numbers in C++, a type is defined by the + template parameter @a NumberUnsignedType which chooses the type to use. #### Default type - With the default values for @a NumberUnsignedType (`uint64_t`), the default - value for @a number_unsigned_t is: + With the default values for @a NumberUnsignedType (`uint64_t`), the + default value for @a number_unsigned_t is: @code {.cpp} uint64_t @@ -571,8 +573,8 @@ class basic_json - The restrictions about leading zeros is not enforced in C++. Instead, leading zeros in integer literals lead to an interpretation as octal number. Internally, the value will be stored as decimal number. For - instance, the C++ integer literal `010` will be serialized to `8`. During - deserialization, leading zeros yield an error. + instance, the C++ integer literal `010` will be serialized to `8`. + During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to `null`. #### Limits @@ -612,19 +614,19 @@ class basic_json @brief a type for a number (floating-point) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most programming - > languages. A number is represented in base 10 using decimal digits. It - > contains an integer component that may be prefixed with an optional minus - > sign, which may be followed by a fraction part and/or an exponent part. - > Leading zeros are not allowed. (...) Numeric values that cannot be - > represented in the grammar below (such as Infinity and NaN) are not - > permitted. + > The representation of numbers is similar to that used in most + > programming languages. A number is represented in base 10 using decimal + > digits. It contains an integer component that may be prefixed with an + > optional minus sign, which may be followed by a fraction part and/or an + > exponent part. Leading zeros are not allowed. (...) Numeric values that + > cannot be represented in the grammar below (such as Infinity and NaN) + > are not permitted. - This description includes both integer and floating-point numbers. However, - C++ allows more precise storage if it is known whether the number is a - signed integer, an unsigned integer or a floating-point number. Therefore, - three different types, @ref number_integer_t, @ref number_unsigned_t and - @ref number_float_t are used. + This description includes both integer and floating-point numbers. + However, C++ allows more precise storage if it is known whether the number + is a signed integer, an unsigned integer or a floating-point number. + Therefore, three different types, @ref number_integer_t, @ref + number_unsigned_t and @ref number_float_t are used. To store floating-point numbers in C++, a type is defined by the template parameter @a NumberFloatType which chooses the type to use. @@ -641,8 +643,8 @@ class basic_json #### Default behavior - The restrictions about leading zeros is not enforced in C++. Instead, - leading zeros in floating-point literals will be ignored. Internally, the - value will be stored as decimal number. For instance, the C++ + leading zeros in floating-point literals will be ignored. Internally, + the value will be stored as decimal number. For instance, the C++ floating-point literal `01.2` will be serialized to `1.2`. During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to `null`. @@ -653,9 +655,9 @@ class basic_json > This specification allows implementations to set limits on the range and > precision of numbers accepted. Since software that implements IEEE > 754-2008 binary64 (double precision) numbers is generally available and - > widely used, good interoperability can be achieved by implementations that - > expect no more precision or range than these provide, in the sense that - > implementations will approximate JSON numbers within the expected + > widely used, good interoperability can be achieved by implementations + > that expect no more precision or range than these provide, in the sense + > that implementations will approximate JSON numbers within the expected > precision. This implementation does exactly follow this approach, as it uses double @@ -938,9 +940,9 @@ class basic_json influenced. When passed to @ref parse(std::istream&, parser_callback_t) or @ref parse(const string_t&, parser_callback_t), it is called on certain events (passed as @ref parse_event_t via parameter @a event) with a set - recursion depth @a depth and context JSON value @a parsed. The return value - of the callback function is a boolean indicating whether the element that - emitted the callback shall be kept or not. + recursion depth @a depth and context JSON value @a parsed. The return + value of the callback function is a boolean indicating whether the element + that emitted the callback shall be kept or not. We distinguish six scenarios (determined by the event type) in which the callback function can be called. The following table describes the values @@ -960,8 +962,8 @@ class basic_json - Discarded values in structured types are skipped. That is, the parser will behave as if the discarded value was never read. - - In case a value outside a structured type is skipped, it is replaced with - `null`. This case happens if the top-level element is skipped. + - In case a value outside a structured type is skipped, it is replaced + with `null`. This case happens if the top-level element is skipped. @param[in] depth the depth of the recursion during parsing @@ -1065,8 +1067,8 @@ class basic_json Create a `null` JSON value. This is the explicitly version of the `null` value constructor as it takes a null pointer as parameter. It allows to create `null` values by explicitly assigning a `nullptr` to a JSON value. - The passed null pointer itself is not read -- it is only used to choose the - right constructor. + The passed null pointer itself is not read -- it is only used to choose + the right constructor. @complexity Constant. @@ -1096,8 +1098,8 @@ class basic_json @throw std::bad_alloc if allocation for object value fails - @liveexample{The following code shows the constructor with an @ref object_t - parameter.,basic_json__object_t} + @liveexample{The following code shows the constructor with an @ref + object_t parameter.,basic_json__object_t} @sa @ref basic_json(const CompatibleObjectType&) -- create an object value from a compatible STL container @@ -1177,11 +1179,11 @@ class basic_json any type @a CompatibleArrayType that can be used to construct values of type @ref array_t. - @tparam CompatibleArrayType An object type whose `value_type` is compatible - to @ref array_t. Examples include `std::vector`, `std::deque`, `std::list`, - `std::forward_list`, `std::array`, `std::set`, `std::unordered_set`, - `std::multiset`, and `unordered_multiset` with a `value_type` from which a - @ref basic_json value can be constructed. + @tparam CompatibleArrayType An object type whose `value_type` is + compatible to @ref array_t. Examples include `std::vector`, `std::deque`, + `std::list`, `std::forward_list`, `std::array`, `std::set`, + `std::unordered_set`, `std::multiset`, and `unordered_multiset` with a + `value_type` from which a @ref basic_json value can be constructed. @param[in] val a value for the array @@ -1225,8 +1227,8 @@ class basic_json @throw std::bad_alloc if allocation for string value fails - @liveexample{The following code shows the constructor with an @ref string_t - parameter.,basic_json__string_t} + @liveexample{The following code shows the constructor with an @ref + string_t parameter.,basic_json__string_t} @sa @ref basic_json(const typename string_t::value_type*) -- create a string value from a character pointer @@ -1318,9 +1320,9 @@ class basic_json Create an integer number JSON value with a given content. @tparam T A helper type to remove this function via SFINAE in case @ref - number_integer_t is the same as `int`. In this case, this constructor would - have the same signature as @ref basic_json(const int value). Note the - helper type @a T is not visible in this constructor's interface. + number_integer_t is the same as `int`. In this case, this constructor + would have the same signature as @ref basic_json(const int value). Note + the helper type @a T is not visible in this constructor's interface. @param[in] val an integer to create a JSON number from @@ -1355,8 +1357,8 @@ class basic_json @note This constructor allows to pass enums directly to a constructor. As C++ has no way of specifying the type of an anonymous enum explicitly, we can only rely on the fact that such values implicitly convert to int. As - int may already be the same type of number_integer_t, we may need to switch - off the constructor @ref basic_json(const number_integer_t). + int may already be the same type of number_integer_t, we may need to + switch off the constructor @ref basic_json(const number_integer_t). @complexity Constant. @@ -1383,8 +1385,8 @@ class basic_json construct values of type @ref number_integer_t. @tparam CompatibleNumberIntegerType An integer type which is compatible to - @ref number_integer_t. Examples include the types `int`, `int32_t`, `long`, - and `short`. + @ref number_integer_t. Examples include the types `int`, `int32_t`, + `long`, and `short`. @param[in] val an integer to create a JSON number from @@ -1442,12 +1444,12 @@ class basic_json /*! @brief create an unsigned number (implicit) - Create an unsigned number JSON value with a given content. This constructor - allows any type @a CompatibleNumberUnsignedType that can be used to - construct values of type @ref number_unsigned_t. + Create an unsigned number JSON value with a given content. This + constructor allows any type @a CompatibleNumberUnsignedType that can be + used to construct values of type @ref number_unsigned_t. - @tparam CompatibleNumberUnsignedType An integer type which is compatible to - @ref number_unsigned_t. Examples may include the types `unsigned int`, + @tparam CompatibleNumberUnsignedType An integer type which is compatible + to @ref number_unsigned_t. Examples may include the types `unsigned int`, `uint32_t`, or `unsigned short`. @param[in] val an unsigned integer to create a JSON number from @@ -1480,8 +1482,8 @@ class basic_json @note [RFC 7159](http://www.rfc-editor.org/rfc/rfc7159.txt), section 6 disallows NaN values: - > Numeric values that cannot be represented in the grammar below (such - > as Infinity and NaN) are not permitted. + > Numeric values that cannot be represented in the grammar below (such as + > Infinity and NaN) are not permitted. In case the parameter @a val is not a number, a JSON null value is created instead. @@ -1513,15 +1515,16 @@ class basic_json constructor allows any type @a CompatibleNumberFloatType that can be used to construct values of type @ref number_float_t. - @tparam CompatibleNumberFloatType A floating-point type which is compatible - to @ref number_float_t. Examples may include the types `float` or `double`. + @tparam CompatibleNumberFloatType A floating-point type which is + compatible to @ref number_float_t. Examples may include the types `float` + or `double`. @param[in] val a floating-point to create a JSON number from @note [RFC 7159](http://www.rfc-editor.org/rfc/rfc7159.txt), section 6 disallows NaN values: - > Numeric values that cannot be represented in the grammar below (such - > as Infinity and NaN) are not permitted. + > Numeric values that cannot be represented in the grammar below (such as + > Infinity and NaN) are not permitted. In case the parameter @a val is not a number, a JSON null value is created instead. @@ -1592,13 +1595,13 @@ class basic_json used by the functions @ref array(std::initializer_list) and @ref object(std::initializer_list). - @param[in] manual_type internal parameter; when @a type_deduction is set to - `false`, the created JSON value will use the provided type (only @ref + @param[in] manual_type internal parameter; when @a type_deduction is set + to `false`, the created JSON value will use the provided type (only @ref value_t::array and @ref value_t::object are valid); when @a type_deduction is set to `true`, this parameter has no effect - @throw std::domain_error if @a type_deduction is `false`, @a manual_type is - `value_t::object`, but @a init contains an element which is not a pair + @throw std::domain_error if @a type_deduction is `false`, @a manual_type + is `value_t::object`, but @a init contains an element which is not a pair whose first element is a string; example: `"cannot create object from initializer list"` @@ -1679,8 +1682,8 @@ class basic_json list of values `a, b, c`, creates the JSON value `[a, b, c]`. If the initializer list is empty, the empty array `[]` is created. - @note This function is only needed to express two edge cases that cannot be - realized with the initializer list constructor (@ref + @note This function is only needed to express two edge cases that cannot + be realized with the initializer list constructor (@ref basic_json(std::initializer_list, bool, value_t)). These cases are: 1. creating an array whose elements are all pairs whose first element is a @@ -1723,8 +1726,8 @@ class basic_json related function @ref array(std::initializer_list), there are no cases which can only be expressed by this function. That is, any initializer list @a init can also be passed to the initializer list - constructor - @ref basic_json(std::initializer_list, bool, value_t). + constructor @ref basic_json(std::initializer_list, bool, + value_t). @param[in] init initializer list to create an object from (optional) @@ -1755,8 +1758,8 @@ class basic_json /*! @brief construct an array with count copies of given value - Constructs a JSON array value by creating @a cnt copies of a passed - value. In case @a cnt is `0`, an empty array is created. As postcondition, + Constructs a JSON array value by creating @a cnt copies of a passed value. + In case @a cnt is `0`, an empty array is created. As postcondition, `std::distance(begin(),end()) == cnt` holds. @param[in] cnt the number of JSON copies of @a val to create @@ -1784,8 +1787,8 @@ class basic_json - In case of primitive types (number, boolean, or string), @a first must be `begin()` and @a last must be `end()`. In this case, the value is copied. Otherwise, std::out_of_range is thrown. - - In case of structured types (array, object), the constructor behaves - as similar versions for `std::vector`. + - In case of structured types (array, object), the constructor behaves as + similar versions for `std::vector`. - In case of a null type, std::domain_error is thrown. @tparam InputIT an input iterator type (@ref iterator or @ref @@ -1800,8 +1803,8 @@ class basic_json boolean, or string) where an out of range error can be detected easily; example: `"iterators out of range"` @throw std::bad_alloc if allocation for object, array, or string fails - @throw std::domain_error if called with a null value; example: `"cannot use - construct with iterators from null"` + @throw std::domain_error if called with a null value; example: `"cannot + use construct with iterators from null"` @complexity Linear in distance between @a first and @a last. @@ -2042,8 +2045,8 @@ class basic_json @brief copy assignment Copy assignment operator. Copies a JSON value via the "copy and swap" - strategy: It is expressed in terms of the copy constructor, destructor, and - the swap() member function. + strategy: It is expressed in terms of the copy constructor, destructor, + and the swap() member function. @param[in] other value to copy from @@ -2143,8 +2146,8 @@ class basic_json parameter. @param[in] indent if indent is nonnegative, then array elements and object - members will be pretty-printed with that indent level. An indent level of 0 - will only insert newlines. -1 (the default) selects the most compact + members will be pretty-printed with that indent level. An indent level of + 0 will only insert newlines. -1 (the default) selects the most compact representation @return string containing the serialization of the JSON value @@ -2976,8 +2979,8 @@ class basic_json /*! @brief get a reference value (implicit) - Implict reference access to the internally stored JSON value. No copies are - made. + Implict reference access to the internally stored JSON value. No copies + are made. @warning Writing data to the referee of the result yields an undefined state. @@ -3027,14 +3030,14 @@ class basic_json /*! @brief get a value (implicit) - Implicit type conversion between the JSON value and a compatible value. The - call is realized by calling @ref get() const. + Implicit type conversion between the JSON value and a compatible value. + The call is realized by calling @ref get() const. @tparam ValueType non-pointer type compatible to the JSON value, for instance `int` for JSON integer numbers, `bool` for JSON booleans, or - `std::vector` types for JSON arrays. The character type of @ref string_t as - well as an initializer list of this type is excluded to avoid ambiguities - as these types implicitly convert to `std::string`. + `std::vector` types for JSON arrays. The character type of @ref string_t + as well as an initializer list of this type is excluded to avoid + ambiguities as these types implicitly convert to `std::string`. @return copy of the JSON value, converted to type @a ValueType @@ -3123,8 +3126,8 @@ class basic_json /*! @brief access specified array element with bounds checking - Returns a const reference to the element at specified location @a idx, with - bounds checking. + Returns a const reference to the element at specified location @a idx, + with bounds checking. @param[in] idx index of the element to access @@ -3215,8 +3218,8 @@ class basic_json /*! @brief access specified object element with bounds checking - Returns a const reference to the element at with specified key @a key, with - bounds checking. + Returns a const reference to the element at with specified key @a key, + with bounds checking. @param[in] key key of the element to access @@ -3690,8 +3693,8 @@ class basic_json @complexity Constant. - @pre The JSON value must not be `null` (would throw `std::out_of_range`) or - an empty array or object (undefined behavior, guarded by assertions). + @pre The JSON value must not be `null` (would throw `std::out_of_range`) + or an empty array or object (undefined behavior, guarded by assertions). @post The JSON value remains unchanged. @throw std::out_of_range when called on `null` value @@ -3732,8 +3735,8 @@ class basic_json @complexity Constant. - @pre The JSON value must not be `null` (would throw `std::out_of_range`) or - an empty array or object (undefined behavior, guarded by assertions). + @pre The JSON value must not be `null` (would throw `std::out_of_range`) + or an empty array or object (undefined behavior, guarded by assertions). @post The JSON value remains unchanged. @throw std::out_of_range when called on `null` value. @@ -3772,16 +3775,16 @@ class basic_json will be `null`. @param[in] pos iterator to the element to remove - @return Iterator following the last removed element. If the iterator @a pos - refers to the last element, the `end()` iterator is returned. + @return Iterator following the last removed element. If the iterator @a + pos refers to the last element, the `end()` iterator is returned. @tparam InteratorType an @ref iterator or @ref const_iterator @post Invalidates iterators and references at or after the point of the erase, including the `end()` iterator. - @throw std::domain_error if called on a `null` value; example: `"cannot use - erase() with null"` + @throw std::domain_error if called on a `null` value; example: `"cannot + use erase() with null"` @throw std::domain_error if called on an iterator which does not belong to the current JSON value; example: `"iterator does not fit current value"` @throw std::out_of_range if called on a primitive type with invalid @@ -3797,12 +3800,12 @@ class basic_json @liveexample{The example shows the result of `erase()` for different JSON types.,erase__IteratorType} - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in the - given range + @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + the given range @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key - @sa @ref erase(const size_type) -- removes the element from an array at the - given index + @sa @ref erase(const size_type) -- removes the element from an array at + the given index @since version 1.0.0 */ @@ -3871,9 +3874,9 @@ class basic_json /*! @brief remove elements given an iterator range - Removes the element specified by the range `[first; last)`. The iterator @a - first does not need to be dereferenceable if `first == last`: erasing an - empty range is a no-op. + Removes the element specified by the range `[first; last)`. The iterator + @a first does not need to be dereferenceable if `first == last`: erasing + an empty range is a no-op. If called on a primitive type other than `null`, the resulting JSON value will be `null`. @@ -3888,8 +3891,8 @@ class basic_json @post Invalidates iterators and references at or after the point of the erase, including the `end()` iterator. - @throw std::domain_error if called on a `null` value; example: `"cannot use - erase() with null"` + @throw std::domain_error if called on a `null` value; example: `"cannot + use erase() with null"` @throw std::domain_error if called on iterators which does not belong to the current JSON value; example: `"iterators do not fit current value"` @throw std::out_of_range if called on a primitive type with invalid @@ -3909,8 +3912,8 @@ class basic_json @sa @ref erase(InteratorType) -- removes the element at a given position @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key - @sa @ref erase(const size_type) -- removes the element from an array at the - given index + @sa @ref erase(const size_type) -- removes the element from an array at + the given index @since version 1.0.0 */ @@ -3986,8 +3989,8 @@ class basic_json @param[in] key value of the elements to remove @return Number of elements removed. If @a ObjectType is the default - `std::map` type, the return value will always be `0` (@a key was not found) - or `1` (@a key was found). + `std::map` type, the return value will always be `0` (@a key was not + found) or `1` (@a key was found). @post References and iterators to the erased elements are invalidated. Other references and iterators are not affected. @@ -4000,10 +4003,10 @@ class basic_json @liveexample{The example shows the effect of `erase()`.,erase__key_type} @sa @ref erase(InteratorType) -- removes the element at a given position - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in the - given range - @sa @ref erase(const size_type) -- removes the element from an array at the - given index + @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + the given range + @sa @ref erase(const size_type) -- removes the element from an array at + the given index @since version 1.0.0 */ @@ -4038,8 +4041,8 @@ class basic_json @liveexample{The example shows the effect of `erase()`.,erase__size_type} @sa @ref erase(InteratorType) -- removes the element at a given position - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in the - given range + @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + the given range @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key @@ -4078,7 +4081,8 @@ class basic_json @brief find an element in a JSON object Finds an element in a JSON object with key equivalent to @a key. If the - element is not found or the JSON value is not an object, end() is returned. + element is not found or the JSON value is not an object, end() is + returned. @param[in] key key value of the element to search for @@ -4438,9 +4442,9 @@ class basic_json @brief wrapper to access iterator member functions in range-based for This function allows to access @ref iterator::key() and @ref - iterator::value() during range-based for loops. In these loops, a reference - to the JSON values is returned, so there is no access to the underlying - iterator. + iterator::value() during range-based for loops. In these loops, a + reference to the JSON values is returned, so there is no access to the + underlying iterator. @note The name of this function is not yet final and may change in the future. @@ -4484,8 +4488,8 @@ class basic_json object | result of function `object_t::empty()` array | result of function `array_t::empty()` - @complexity Constant, as long as @ref array_t and @ref object_t satisfy the - Container concept; that is, their `empty()` functions have constant + @complexity Constant, as long as @ref array_t and @ref object_t satisfy + the Container concept; that is, their `empty()` functions have constant complexity. @requirement This function helps `basic_json` satisfying the @@ -4547,8 +4551,9 @@ class basic_json object | result of function object_t::size() array | result of function array_t::size() - @complexity Constant, as long as @ref array_t and @ref object_t satisfy the - Container concept; that is, their size() functions have constant complexity. + @complexity Constant, as long as @ref array_t and @ref object_t satisfy + the Container concept; that is, their size() functions have constant + complexity. @requirement This function helps `basic_json` satisfying the [Container](http://en.cppreference.com/w/cpp/concept/Container) @@ -4612,8 +4617,8 @@ class basic_json object | result of function `object_t::max_size()` array | result of function `array_t::max_size()` - @complexity Constant, as long as @ref array_t and @ref object_t satisfy the - Container concept; that is, their `max_size()` functions have constant + @complexity Constant, as long as @ref array_t and @ref object_t satisfy + the Container concept; that is, their `max_size()` functions have constant complexity. @requirement This function helps `basic_json` satisfying the @@ -4835,8 +4840,8 @@ class basic_json @brief add an object to an object Inserts the given element @a val to the JSON object. If the function is - called on a JSON null value, an empty object is created before inserting @a - val. + called on a JSON null value, an empty object is created before inserting + @a val. @param[in] val the value to add to the JSON object @@ -5111,8 +5116,8 @@ class basic_json @return iterator pointing to the first element inserted, or @a pos if `ilist` is empty - @complexity Linear in `ilist.size()` plus linear in the distance between @a - pos and end of the container. + @complexity Linear in `ilist.size()` plus linear in the distance between + @a pos and end of the container. @liveexample{The example shows how `insert()` is used.,insert__ilist} @@ -5757,8 +5762,8 @@ class basic_json @note A UTF-8 byte order mark is silently ignored. - @liveexample{The example below demonstrates the `parse()` function with and - without callback function.,parse__string__parser_callback_t} + @liveexample{The example below demonstrates the `parse()` function with + and without callback function.,parse__string__parser_callback_t} @sa @ref parse(std::istream&, parser_callback_t) for a version that reads from an input stream @@ -5786,11 +5791,11 @@ class basic_json @note A UTF-8 byte order mark is silently ignored. - @liveexample{The example below demonstrates the `parse()` function with and - without callback function.,parse__istream__parser_callback_t} + @liveexample{The example below demonstrates the `parse()` function with + and without callback function.,parse__istream__parser_callback_t} - @sa @ref parse(const string_t&, parser_callback_t) for a version that reads - from a string + @sa @ref parse(const string_t&, parser_callback_t) for a version that + reads from a string @since version 1.0.0 */ @@ -5923,8 +5928,8 @@ class basic_json /*! @brief escape a string - Escape a string by replacing certain special characters by a sequence of an - escape character (backslash) and another character and other control + Escape a string by replacing certain special characters by a sequence of + an escape character (backslash) and another character and other control characters by a sequence of "\u" followed by a four-digit hex representation. @@ -6046,8 +6051,8 @@ class basic_json This function is called by the public member function dump and organizes the serialization internally. The indentation level is propagated as - additional parameter. In case of arrays and objects, the function is called - recursively. Note that + additional parameter. In case of arrays and objects, the function is + called recursively. Note that - strings and object keys are escaped using `escape_string()` - integer numbers are converted implicitly via `operator<<` @@ -6241,8 +6246,8 @@ class basic_json { // Otherwise 6, 15 or 16 digits of precision allows // round-trip IEEE 754 string->float->string, - // string->double->string or string->long double->string; - // to be safe, we read this value from + // string->double->string or string->long + // double->string; to be safe, we read this value from // std::numeric_limits::digits10 std::stringstream ss; ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems @@ -7262,8 +7267,8 @@ class basic_json @brief lexical analysis This class organizes the lexical analysis during JSON deserialization. The - core of it is a scanner generated by [re2c](http://re2c.org) that processes - a buffer and recognizes tokens according to RFC 7159. + core of it is a scanner generated by [re2c](http://re2c.org) that + processes a buffer and recognizes tokens according to RFC 7159. */ class lexer { @@ -7569,13 +7574,14 @@ class basic_json 1. Escaped characters. In this case, a new character is constructed according to the nature of the escape. Some escapes create new - characters (e.g., `"\\n"` is replaced by `"\n"`), some are copied as - is (e.g., `"\\\\"`). Furthermore, Unicode escapes of the shape + characters (e.g., `"\\n"` is replaced by `"\n"`), some are copied + as is (e.g., `"\\\\"`). Furthermore, Unicode escapes of the shape `"\\uxxxx"` need special care. In this case, to_unicode takes care of the construction of the values. 2. Unescaped characters are copied as is. - @return string value of current token without opening and closing quotes + @return string value of current token without opening and closing + quotes @throw std::out_of_range if to_unicode fails */ string_t get_string() const @@ -7686,8 +7692,8 @@ class basic_json This function (and its overloads) serves to select the most approprate standard floating point number parsing function based on the type - supplied via the first parameter. Set this to - @a static_cast(nullptr). + supplied via the first parameter. Set this to @a + static_cast(nullptr). @param[in] type the @ref number_float_t in use @@ -7711,8 +7717,8 @@ class basic_json This function (and its overloads) serves to select the most approprate standard floating point number parsing function based on the type - supplied via the first parameter. Set this to - @a static_cast(nullptr). + supplied via the first parameter. Set this to @a + static_cast(nullptr). @param[in] type the @ref number_float_t in use @@ -7731,8 +7737,8 @@ class basic_json This function (and its overloads) serves to select the most approprate standard floating point number parsing function based on the type - supplied via the first parameter. Set this to - @a static_cast(nullptr). + supplied via the first parameter. Set this to @a + static_cast(nullptr). @param[in] type the @ref number_float_t in use @@ -7756,13 +7762,13 @@ class basic_json This function parses the integer component up to the radix point or exponent while collecting information about the 'floating point representation', which it stores in the result parameter. If there is - no radix point or exponent, and the number can fit into a - @ref number_integer_t or @ref number_unsigned_t then it sets the - result parameter accordingly. + no radix point or exponent, and the number can fit into a @ref + number_integer_t or @ref number_unsigned_t then it sets the result + parameter accordingly. The 'floating point representation' includes the number of significant - figures after the radix point, whether the number is in exponential - or decimal form, the capitalization of the exponent marker, and if the + figures after the radix point, whether the number is in exponential or + decimal form, the capitalization of the exponent marker, and if the optional '+' is present in the exponent. This information is necessary to perform accurate round trips of floating point numbers. @@ -8725,11 +8731,11 @@ class basic_json throw std::domain_error("values in object must be primitive"); } - // assign value to reference pointed to by JSON pointer; - // Note that if the JSON pointer is "" (i.e., points to the - // whole value), function get_and_create returns a reference - // to result itself. An assignment will then create a - // primitive value. + // assign value to reference pointed to by JSON pointer; Note + // that if the JSON pointer is "" (i.e., points to the whole + // value), function get_and_create returns a reference to + // result itself. An assignment will then create a primitive + // value. json_pointer(element.first).get_and_create(result) = element.second; } @@ -8752,9 +8758,9 @@ class basic_json @brief access specified element via JSON Pointer Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. Similar to - @ref operator[](const typename object_t::key_type&), `null` values - are created in arrays and objects if necessary. + No bound checking is performed. Similar to @ref operator[](const typename + object_t::key_type&), `null` values are created in arrays and objects if + necessary. In particular: - If the JSON pointer points to an object key that does not exist, it @@ -8841,8 +8847,8 @@ class basic_json /*! @brief access specified element via JSON Pointer - Returns a const reference to the element at with specified JSON pointer - @a ptr, with bounds checking. + Returns a const reference to the element at with specified JSON pointer @a + ptr, with bounds checking. @param[in] ptr JSON pointer to the desired element @@ -8866,10 +8872,10 @@ class basic_json /*! @brief return flattened JSON value - The function creates a JSON object whose keys are JSON pointers (see - [RFC 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all - primitive. The original JSON value can be restored using the - @ref unflatten() function. + The function creates a JSON object whose keys are JSON pointers (see [RFC + 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all + primitive. The original JSON value can be restored using the @ref + unflatten() function. @return an object that maps JSON pointers to primitve values @@ -8941,7 +8947,7 @@ class basic_json this funcion, a JSON Patch is applied to the current JSON value by executing all operations from the patch. - @param[in] patch JSON patch document + @param[in] json_patch JSON patch document @return patched document @note The application of a patch is atomic: Either all operations succeed @@ -9402,8 +9408,8 @@ class basic_json /*! @brief default JSON class -This type is the default specialization of the @ref basic_json class which uses -the standard template types. +This type is the default specialization of the @ref basic_json class which +uses the standard template types. @since version 1.0.0 */ From 639d63217e8d1e1d1b2ced521fd9971466f0091e Mon Sep 17 00:00:00 2001 From: Robert Marki Date: Wed, 18 May 2016 11:25:36 +0200 Subject: [PATCH 069/133] Define CMake/CTest tests Instead of copying the test executable and the JSON files used by the tests at install time, define CMake/CTest tests for running the json_unit executable from any build directory with the project's source directory as its working directory. - call enable_testing in the main lists file to allow the definition of tests - remove install commands from the test directory's lists file - define two tests - json_unit_default for running the default tests by executing json_unit without any arguments - json_unit_all for running all the tests by executing json_unit with the "*" argument - update the AppVeyor configuration file to use the new testing method --- CMakeLists.txt | 2 ++ appveyor.yml | 3 +-- test/CMakeLists.txt | 22 +++++++++++++--------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 18e9c651f..c0488b3b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,8 @@ cmake_minimum_required(VERSION 3.0) # define the project project(nlohmann_json VERSION 2.0.0 LANGUAGES CXX) +enable_testing() + option(BuildTests "Build the unit tests" ON) # define project variables diff --git a/appveyor.yml b/appveyor.yml index 63902ced4..a527ef766 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,5 +7,4 @@ build_script: - cmake . -G "Visual Studio 14 2015" - cmake --build . --config Release test_script: -- test\Release\json_unit.exe -- test\Release\json_unit.exe "*" +- ctest -C Release -V diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b63e5a394..c66b19c83 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,21 +1,25 @@ # The unit test executable. -add_executable(json_unit +set(JSON_UNITTEST_TARGET_NAME "json_unit") +add_executable(${JSON_UNITTEST_TARGET_NAME} "src/catch.hpp" "src/unit.cpp" ) -set_target_properties(json_unit PROPERTIES +set_target_properties(${JSON_UNITTEST_TARGET_NAME} PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>" ) -# Install the test binary. -install(TARGETS json_unit RUNTIME DESTINATION test/bin) +target_include_directories(${JSON_UNITTEST_TARGET_NAME} PRIVATE "src") +target_link_libraries(${JSON_UNITTEST_TARGET_NAME} ${JSON_TARGET_NAME}) -# Copy the test data to the install tree. -install(DIRECTORY data/ DESTINATION test/data) - -target_include_directories(json_unit PRIVATE "src") -target_link_libraries(json_unit ${JSON_TARGET_NAME}) +add_test(NAME "${JSON_UNITTEST_TARGET_NAME}_default" + COMMAND ${JSON_UNITTEST_TARGET_NAME} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} +) +add_test(NAME "${JSON_UNITTEST_TARGET_NAME}_all" + COMMAND ${JSON_UNITTEST_TARGET_NAME} "*" + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} +) From 837617122adce96d994c8dbd009a6fc54c94ec3f Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 18 May 2016 22:17:08 +0200 Subject: [PATCH 070/133] fixed #246 --- .github/CONTRIBUTING.md | 4 +--- README.md | 18 +++++++++--------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index eba242872..37876be9c 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -70,9 +70,7 @@ Please understand that I cannot accept pull requests changing only file `src/jso The following areas really need contribution: -- Getting the code to compile without errors with the latest **Microsoft Visual Studio** version. I am not using Windows, so I cannot debug code with MSVC myself. There is a job on [AppVeyor](https://ci.appveyor.com/project/nlohmann/json) though. -- Extending the **continuous integration** beyond Linux running some versions of GCC and Clang on [Travis](https://travis-ci.org/nlohmann/json) and Microsoft Visual Studio on [AppVeyor](https://ci.appveyor.com/project/nlohmann/json). We have found a lot of bugs just because several compilers behave in a slightly different manner. +- Extending the **continuous integration** toward more exotic compilers such as Android NDK, Intel's Compiler, or the bleeding-edge versions of GCC or Clang. - Improving the efficiency of the **JSON parser**. The current parser is implemented as a naive recursive descent parser with hand coded string handling. More sophisticated approaches like LALR parsers would be really appreciated. That said, parser generators like Bison or ANTLR do not play nice with single-header files -- I really would like to keep the parser inside the `json.hpp` header, and I am not aware of approaches similar to [`re2c`](http://re2c.org) for parsing. - Extending and updating existing **benchmarks** to include (the most recent version of) this library. Though efficiency is not everything, speed and memory consumption are very important characteristics for C++ developers, so having proper comparisons would be interesting. - Check the code with [**Coverity**](https://scan.coverity.com). -- Make the code **locale-independent**. The library currently only works for a locale where `.` is the decimal point character. diff --git a/README.md b/README.md index 0d2cbf45c..a2a22826b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Build Status](https://ci.appveyor.com/api/projects/status/1acb366xfyg3qybk?svg=true)](https://ci.appveyor.com/project/nlohmann/json) [![Coverage Status](https://img.shields.io/coveralls/nlohmann/json.svg)](https://coveralls.io/r/nlohmann/json) [![Try online](https://img.shields.io/badge/try-online-blue.svg)](http://melpon.org/wandbox/permlink/wuiuqYiYqRTdI3rG) -[![Documentation Status](https://img.shields.io/badge/docs-doxygen-blue.svg)](http://nlohmann.github.io/json) +[![Documentation](https://img.shields.io/badge/docs-doxygen-blue.svg)](http://nlohmann.github.io/json) [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/nlohmann/json/master/LICENSE.MIT) [![Github Releases](https://img.shields.io/github/release/nlohmann/json.svg)](https://github.com/nlohmann/json/releases) [![Github Issues](https://img.shields.io/github/issues/nlohmann/json.svg)](http://github.com/nlohmann/json/issues) @@ -46,7 +46,7 @@ Though it's 2016 already, the support for C++11 is still a bit sparse. Currently - GCC 4.9 - 6.0 (and possibly later) - Clang 3.4 - 3.9 (and possibly later) -- Microsoft Visual C++ 14.0 RC (and possibly later) +- Microsoft Visual C++ 2015 / 14.0 (and possibly later) The code is currently checked with Travis for GCC 4.9, GCC @@ -75,13 +75,13 @@ The following compilers are currently used in [continuous integration](https://t | Clang 3.7.1 | Ubuntu 14.04.3 LTS | Ubuntu clang version 3.7.1-svn253571-1~exp1 (branches/release_37) (based on LLVM 3.7.1) | | Clang 3.8.1 | Ubuntu 14.04.3 LTS | clang version 3.8.1-svn265380-1~exp1 (branches/release_38) | | Clang 3.9.0 | Ubuntu 14.04.3 LTS | clang version 3.9.0-svn267478-1~exp1 (trunk) | -| Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | -| Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | -| Clang Xcode 6.3 | Darwin Kernel Version 14.3.0 | Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) | -| Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | -| Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 | Apple LLVM version 7.0.0 (clang-700.1.76) | -| Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 | Apple LLVM version 7.0.2 (clang-700.1.81) | -| Clang Xcode 7.3 | Darwin Kernel Version 14.5.0 | Apple LLVM version 7.3.0 (clang-703.0.29) | +| Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | +| Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | +| Clang Xcode 6.3 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) | +| Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | +| Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 (OSX 10.10.5) | Apple LLVM version 7.0.0 (clang-700.1.76) | +| Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.0.2 (clang-700.1.81) | +| Clang Xcode 7.3 | Darwin Kernel Version 14.5.0 (OSX 10.11.1) | Apple LLVM version 7.3.0 (clang-703.0.29) | | Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25123.0 | ## Examples From a3f432b3dde1d71c8940961947db5938ed11ee91 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 18 May 2016 22:23:35 +0200 Subject: [PATCH 071/133] added hint to Homebrew --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a2a22826b..97d0aa635 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,8 @@ using json = nlohmann::json; to the files you want to use JSON objects. That's it. Do not forget to set the necessary switches to enable C++11 (e.g., `-std=c++11` for GCC and Clang). +:beer: If you are using OS X and [Homebrew](http://brew.sh), just type `brew tap nlohmann/json` and `brew install nlohmann_json` and you're set. + ## Supported compilers Though it's 2016 already, the support for C++11 is still a bit sparse. Currently, the following compilers are known to work: From 71a7746ccb09e2b5796bd40192747aba64c43e5a Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 25 May 2016 21:55:03 +0200 Subject: [PATCH 072/133] removed a line --- .gitignore | 2 ++ README.md | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index e1011fc2a..c610519ef 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,5 @@ working html me.nlohmann.json.docset + +android \ No newline at end of file diff --git a/README.md b/README.md index 97d0aa635..5bbef3c8a 100644 --- a/README.md +++ b/README.md @@ -50,8 +50,6 @@ Though it's 2016 already, the support for C++11 is still a bit sparse. Currently - Clang 3.4 - 3.9 (and possibly later) - Microsoft Visual C++ 2015 / 14.0 (and possibly later) -The code is currently checked with Travis for GCC 4.9, GCC - I would be happy to learn about other compilers/versions. Please note: From 7bdfde4493ce4e4dac3baa500ac0bf82a96e8826 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 28 May 2016 16:06:41 +0200 Subject: [PATCH 073/133] added a note about different NDKs (see #219) --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5bbef3c8a..ba11b70e0 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,9 @@ Please note: APP_CPPFLAGS += -frtti -fexceptions ``` -- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. + The code compiles successfully with [Android NDK](https://developer.android.com/ndk/index.html?hl=ml), Revision 9 - 11 (and possibly later) and [CrystaX's Android NDK](https://www.crystax.net/en/android/ndk) version 10. + +- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. For Android NDK using `APP_STL := gnustl_static`, please refer to [this discussion](https://github.com/nlohmann/json/issues/219). The following compilers are currently used in [continuous integration](https://travis-ci.org/nlohmann/json): From 91dfc723be178f692b9a2679596119a8c1c857e5 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 12:07:20 +0200 Subject: [PATCH 074/133] added coverity_scan --- .travis.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.travis.yml b/.travis.yml index 1ada0084c..e7ae4444c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,12 @@ language: cpp dist: trusty sudo: required +env: + global: + # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created + # via the "travis encrypt" command using the project repo's public key + - secure: "m89SSgE+ASLO38rSKx7MTXK3n5NkP9bIx95jwY71YEiuFzib30PDJ/DifKnXxBjvy/AkCGztErQRk/8ZCvq+4HXozU2knEGnL/RUitvlwbhzfh2D4lmS3BvWBGS3N3NewoPBrRmdcvnT0xjOGXxtZaJ3P74TkB9GBnlz/HmKORA=" + # from http://stackoverflow.com/a/32127147/266378 matrix: include: @@ -21,6 +27,15 @@ matrix: - ./json_unit "*" - coveralls --exclude test/src/catch.hpp --exclude test/src/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9' env: COMPILER=g++-4.9 + addons: + coverity_scan: + project: + name: "nlohmann/json" + description: "Build submitted via Travis CI" + notification_email: niels.lohmann@gmail.com + build_command_prepend: "make clean" + build_command: "make doctest" + branch_pattern: coverity_scan - os: linux compiler: gcc From 1cc77a5fe531b81e3bc03614fa8f6d73b6c6230a Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 12:15:13 +0200 Subject: [PATCH 075/133] another try for coverity-scan --- .travis.yml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index e7ae4444c..9ff83b5a2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,15 +27,6 @@ matrix: - ./json_unit "*" - coveralls --exclude test/src/catch.hpp --exclude test/src/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9' env: COMPILER=g++-4.9 - addons: - coverity_scan: - project: - name: "nlohmann/json" - description: "Build submitted via Travis CI" - notification_email: niels.lohmann@gmail.com - build_command_prepend: "make clean" - build_command: "make doctest" - branch_pattern: coverity_scan - os: linux compiler: gcc @@ -131,3 +122,13 @@ script: - if [ `which valgrind` ]; then valgrind --error-exitcode=1 --leak-check=full ./json_unit ; fi + +addons: + coverity_scan: + project: + name: "nlohmann/json" + description: "Build submitted via Travis CI" + notification_email: niels.lohmann@gmail.com + build_command_prepend: "make clean" + build_command: "make doctest" + branch_pattern: coverity_scan From b26582c0e90c2f896a10c65afd5e167f5a4195a4 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 12:29:46 +0200 Subject: [PATCH 076/133] another try for coverity-scan --- .travis.yml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9ff83b5a2..6d8290bde 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,6 +34,14 @@ matrix: apt: sources: ['ubuntu-toolchain-r-test'] packages: ['g++-5', 'valgrind'] + coverity_scan: + project: + name: "nlohmann/json" + description: "Build submitted via Travis CI" + notification_email: niels.lohmann@gmail.com + build_command_prepend: "make clean" + build_command: "make doctest" + branch_pattern: coverity_scan env: COMPILER=g++-5 # - os: linux @@ -122,13 +130,3 @@ script: - if [ `which valgrind` ]; then valgrind --error-exitcode=1 --leak-check=full ./json_unit ; fi - -addons: - coverity_scan: - project: - name: "nlohmann/json" - description: "Build submitted via Travis CI" - notification_email: niels.lohmann@gmail.com - build_command_prepend: "make clean" - build_command: "make doctest" - branch_pattern: coverity_scan From 6fed4161252edaf49cb18339ee8584c2f8477663 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 12:57:09 +0200 Subject: [PATCH 077/133] fixed used compiler --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6d8290bde..ad0afd71b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,7 +39,7 @@ matrix: name: "nlohmann/json" description: "Build submitted via Travis CI" notification_email: niels.lohmann@gmail.com - build_command_prepend: "make clean" + build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" build_command: "make doctest" branch_pattern: coverity_scan env: COMPILER=g++-5 From c0b2c6ea5d2e72b8b1f4a336b9c7994c5384621d Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 13:06:27 +0200 Subject: [PATCH 078/133] removing beta-xcode6.3 for now --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ad0afd71b..766e6c237 100644 --- a/.travis.yml +++ b/.travis.yml @@ -97,10 +97,10 @@ matrix: compiler: clang env: COMPILER=clang - - os: osx - osx_image: beta-xcode6.3 - compiler: clang - env: COMPILER=clang + # - os: osx + # osx_image: beta-xcode6.3 + # compiler: clang + # env: COMPILER=clang - os: osx osx_image: xcode6.4 From 6bdb883b5c5cc41331ff6807aa6ef4dc62bbb4ec Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 13:32:36 +0200 Subject: [PATCH 079/133] ignore build errors for coverity-scan --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 766e6c237..6d23a0dd8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,7 +40,7 @@ matrix: description: "Build submitted via Travis CI" notification_email: niels.lohmann@gmail.com build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" - build_command: "make doctest" + build_command: "make doctest || true" branch_pattern: coverity_scan env: COMPILER=g++-5 From aa8aa3ba9fbb02b5aa6e8d02831fe128d49043be Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 14:06:43 +0200 Subject: [PATCH 080/133] overworked coverity stuffy --- .travis.yml | 16 ++++++++-------- Makefile | 8 +++++++- doc/Makefile | 10 +++++++--- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6d23a0dd8..49d9efd4b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,7 +40,7 @@ matrix: description: "Build submitted via Travis CI" notification_email: niels.lohmann@gmail.com build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" - build_command: "make doctest || true" + build_command: "make coverity" branch_pattern: coverity_scan env: COMPILER=g++-5 @@ -79,13 +79,13 @@ matrix: packages: ['clang-3.8', 'valgrind'] env: COMPILER=clang++-3.8 - - os: linux - compiler: clang - addons: - apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] - packages: ['clang-3.9', 'valgrind'] - env: COMPILER=clang++-3.9 + # - os: linux + # compiler: clang + # addons: + # apt: + # sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] + # packages: ['clang-3.9', 'valgrind'] + # env: COMPILER=clang++-3.9 - os: osx osx_image: beta-xcode6.1 diff --git a/Makefile b/Makefile index 6fdc06b9d..0a52b22da 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ all: json_unit # clean up clean: rm -fr json_unit json_benchmarks fuzz fuzz-testing *.dSYM + $(MAKE) clean -Cdoc ########################################################################## @@ -30,7 +31,12 @@ json_unit: test/src/unit.cpp src/json.hpp test/src/catch.hpp # compile example files and check output doctest: - make check_output -C doc + $(MAKE) check_output -C doc + + +# copmpile example files and do not check output (for coverity-scan) +coverity: + $(MAKE) compile_only -Cdoc CXXFLAGS="-std=c++11" CPPFLAGS="-I../src" ########################################################################## diff --git a/doc/Makefile b/doc/Makefile index dc10f1dd1..a34a0798d 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -2,9 +2,6 @@ SRCDIR = ../src all: doxygen -clean: - rm -fr me.nlohmann.json.docset html - ########################################################################## # example files @@ -40,10 +37,17 @@ create_output: $(EXAMPLES:.cpp=.output) create_links: $(EXAMPLES:.cpp=.link) +# only compile files +compile_only: $(EXAMPLES:.cpp=) + # check output of all stand-alone example files check_output: $(EXAMPLES:.cpp=.test) +clean: + rm -fr me.nlohmann.json.docset html $(EXAMPLES:.cpp=) + + ########################################################################## # Doxygen HTML documentation ########################################################################## From 04e1e7b5865562c086c9fc02023de0a780c5e669 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 14:56:08 +0200 Subject: [PATCH 081/133] cleanup --- .github/CONTRIBUTING.md | 1 - .travis.yml | 2 +- Makefile | 5 ----- README.md | 1 + doc/Makefile | 3 --- 5 files changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 37876be9c..66420e9ac 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -73,4 +73,3 @@ The following areas really need contribution: - Extending the **continuous integration** toward more exotic compilers such as Android NDK, Intel's Compiler, or the bleeding-edge versions of GCC or Clang. - Improving the efficiency of the **JSON parser**. The current parser is implemented as a naive recursive descent parser with hand coded string handling. More sophisticated approaches like LALR parsers would be really appreciated. That said, parser generators like Bison or ANTLR do not play nice with single-header files -- I really would like to keep the parser inside the `json.hpp` header, and I am not aware of approaches similar to [`re2c`](http://re2c.org) for parsing. - Extending and updating existing **benchmarks** to include (the most recent version of) this library. Though efficiency is not everything, speed and memory consumption are very important characteristics for C++ developers, so having proper comparisons would be interesting. -- Check the code with [**Coverity**](https://scan.coverity.com). diff --git a/.travis.yml b/.travis.yml index 49d9efd4b..249a87574 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,7 +40,7 @@ matrix: description: "Build submitted via Travis CI" notification_email: niels.lohmann@gmail.com build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" - build_command: "make coverity" + build_command: "make" branch_pattern: coverity_scan env: COMPILER=g++-5 diff --git a/Makefile b/Makefile index 0a52b22da..6ea1d85d9 100644 --- a/Makefile +++ b/Makefile @@ -34,11 +34,6 @@ doctest: $(MAKE) check_output -C doc -# copmpile example files and do not check output (for coverity-scan) -coverity: - $(MAKE) compile_only -Cdoc CXXFLAGS="-std=c++11" CPPFLAGS="-I../src" - - ########################################################################## # fuzzing ########################################################################## diff --git a/README.md b/README.md index ba11b70e0..768943878 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![Build Status](https://travis-ci.org/nlohmann/json.svg?branch=master)](https://travis-ci.org/nlohmann/json) [![Build Status](https://ci.appveyor.com/api/projects/status/1acb366xfyg3qybk?svg=true)](https://ci.appveyor.com/project/nlohmann/json) [![Coverage Status](https://img.shields.io/coveralls/nlohmann/json.svg)](https://coveralls.io/r/nlohmann/json) +[![Coverity Scan Build Status](https://scan.coverity.com/projects/5550/badge.svg)](https://scan.coverity.com/projects/nlohmann-json) [![Try online](https://img.shields.io/badge/try-online-blue.svg)](http://melpon.org/wandbox/permlink/wuiuqYiYqRTdI3rG) [![Documentation](https://img.shields.io/badge/docs-doxygen-blue.svg)](http://nlohmann.github.io/json) [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/nlohmann/json/master/LICENSE.MIT) diff --git a/doc/Makefile b/doc/Makefile index a34a0798d..5e5459a00 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -37,9 +37,6 @@ create_output: $(EXAMPLES:.cpp=.output) create_links: $(EXAMPLES:.cpp=.link) -# only compile files -compile_only: $(EXAMPLES:.cpp=) - # check output of all stand-alone example files check_output: $(EXAMPLES:.cpp=.test) From b508d1f1c4b1b282cf56d7880a31519fce82268b Mon Sep 17 00:00:00 2001 From: Niels Date: Mon, 6 Jun 2016 18:50:39 +0200 Subject: [PATCH 082/133] fix proposal for #260 --- src/json.hpp | 4 ++-- src/json.hpp.re2c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 436467632..a8902bdb0 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8497,13 +8497,13 @@ basic_json_parser_63: if (*curptr == '-') { type = value_t::number_integer; - max = static_cast(std::numeric_limits::max()) + 1; + max = static_cast((std::numeric_limits::max)()) + 1; curptr++; } else { type = value_t::number_unsigned; - max = static_cast(std::numeric_limits::max()); + max = static_cast((std::numeric_limits::max())); } // count the significant figures diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index ba4fc007b..9fe8ca683 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -7807,13 +7807,13 @@ class basic_json if (*curptr == '-') { type = value_t::number_integer; - max = static_cast(std::numeric_limits::max()) + 1; + max = static_cast((std::numeric_limits::max)()) + 1; curptr++; } else { type = value_t::number_unsigned; - max = static_cast(std::numeric_limits::max()); + max = static_cast((std::numeric_limits::max())); } // count the significant figures From 9e2dfd19e8429356b9941d61afc03d7d4ab2cb28 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 00:20:53 +0200 Subject: [PATCH 083/133] minor cleanup --- src/json.hpp | 17 +++++++++-------- src/json.hpp.re2c | 17 +++++++++-------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 436467632..9312c4f42 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -1461,13 +1461,13 @@ class basic_json @since version 2.0.0 */ - template < typename CompatibleNumberUnsignedType, typename - std::enable_if < - std::is_constructible::value and - std::numeric_limits::is_integer and - !std::numeric_limits::is_signed, - CompatibleNumberUnsignedType >::type - = 0 > + template ::value and + std::numeric_limits::is_integer and + not std::numeric_limits::is_signed, + CompatibleNumberUnsignedType>::type + = 0> basic_json(const CompatibleNumberUnsignedType val) noexcept : m_type(value_t::number_unsigned), m_value(static_cast(val)) @@ -5079,6 +5079,7 @@ class basic_json throw std::domain_error("iterator does not fit current value"); } + // check if range iterators belong to the same JSON object if (first.m_object != last.m_object) { throw std::domain_error("iterators do not fit"); @@ -7332,7 +7333,7 @@ class basic_json @return string representation of the code point - @throw std::out_of_range if code point is >0x10ffff; example: `"code + @throw std::out_of_range if code point is > 0x10ffff; example: `"code points above 0x10FFFF are invalid"` @throw std::invalid_argument if the low surrogate is invalid; example: `""missing or wrong low surrogate""` diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index ba4fc007b..2ab300ecc 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -1461,13 +1461,13 @@ class basic_json @since version 2.0.0 */ - template < typename CompatibleNumberUnsignedType, typename - std::enable_if < - std::is_constructible::value and - std::numeric_limits::is_integer and - !std::numeric_limits::is_signed, - CompatibleNumberUnsignedType >::type - = 0 > + template ::value and + std::numeric_limits::is_integer and + not std::numeric_limits::is_signed, + CompatibleNumberUnsignedType>::type + = 0> basic_json(const CompatibleNumberUnsignedType val) noexcept : m_type(value_t::number_unsigned), m_value(static_cast(val)) @@ -5079,6 +5079,7 @@ class basic_json throw std::domain_error("iterator does not fit current value"); } + // check if range iterators belong to the same JSON object if (first.m_object != last.m_object) { throw std::domain_error("iterators do not fit"); @@ -7332,7 +7333,7 @@ class basic_json @return string representation of the code point - @throw std::out_of_range if code point is >0x10ffff; example: `"code + @throw std::out_of_range if code point is > 0x10ffff; example: `"code points above 0x10FFFF are invalid"` @throw std::invalid_argument if the low surrogate is invalid; example: `""missing or wrong low surrogate""` From 744bae7fc4eac70d01f83bdcd055880234b8ad37 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 07:00:31 +0200 Subject: [PATCH 084/133] trying to fix Travis --- .travis.yml | 65 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/.travis.yml b/.travis.yml index 249a87574..ccba5fd14 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,6 +44,17 @@ matrix: branch_pattern: coverity_scan env: COMPILER=g++-5 + # from https://github.com/travis-ci/travis-ci/issues/6120 + - os: linux + before_install: + - LLVM_VERSION=3.7.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang+llvm + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang+llvm --strip-components 1 + - export PATH=$HOME/clang+llvm/bin:$PATH + env: COMPILER=clang++ + # - os: linux # compiler: gcc # addons: @@ -55,29 +66,29 @@ matrix: # Clang 3.5 is not able to compile the code, # see https://travis-ci.org/nlohmann/json/jobs/126720186 - - os: linux - compiler: clang - addons: - apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.6'] - packages: ['clang-3.6', 'valgrind'] - env: COMPILER=clang++-3.6 - - - os: linux - compiler: clang - addons: - apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7'] - packages: ['clang-3.7', 'valgrind'] - env: COMPILER=clang++-3.7 - - - os: linux - compiler: clang - addons: - apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.8'] - packages: ['clang-3.8', 'valgrind'] - env: COMPILER=clang++-3.8 +# - os: linux +# compiler: clang +# addons: +# apt: +# sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.6'] +# packages: ['clang-3.6', 'valgrind'] +# env: COMPILER=clang++-3.6 +# +# - os: linux +# compiler: clang +# addons: +# apt: +# sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7'] +# packages: ['clang-3.7', 'valgrind'] +# env: COMPILER=clang++-3.7 +# +# - os: linux +# compiler: clang +# addons: +# apt: +# sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.8'] +# packages: ['clang-3.8', 'valgrind'] +# env: COMPILER=clang++-3.8 # - os: linux # compiler: clang @@ -97,10 +108,10 @@ matrix: compiler: clang env: COMPILER=clang - # - os: osx - # osx_image: beta-xcode6.3 - # compiler: clang - # env: COMPILER=clang + - os: osx + osx_image: beta-xcode6.3 + compiler: clang + env: COMPILER=clang - os: osx osx_image: xcode6.4 From 5173c1622282abef3c0aaccf6d52b72a3398e5b5 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 07:07:42 +0200 Subject: [PATCH 085/133] another try --- .travis.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ccba5fd14..007d6bb04 100644 --- a/.travis.yml +++ b/.travis.yml @@ -50,10 +50,18 @@ matrix: - LLVM_VERSION=3.7.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang+llvm - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang+llvm --strip-components 1 - - export PATH=$HOME/clang+llvm/bin:$PATH - env: COMPILER=clang++ + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + env: COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + + - os: linux + before_install: + - LLVM_VERSION=3.8.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + env: COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ # - os: linux # compiler: gcc From e772f06f0d391782f8c1dbf27f1f2e839fa99220 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 07:14:54 +0200 Subject: [PATCH 086/133] another try --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 007d6bb04..f577ce8c2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,8 +47,8 @@ matrix: # from https://github.com/travis-ci/travis-ci/issues/6120 - os: linux before_install: - - LLVM_VERSION=3.7.0 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - export LLVM_VERSION=3.7.0 + - export LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 @@ -56,8 +56,8 @@ matrix: - os: linux before_install: - - LLVM_VERSION=3.8.0 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - export LLVM_VERSION=3.8.0 + - export LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 From f4ae8f8e2e9ceeab02b8be6549f1bca51b28eb87 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 07:21:17 +0200 Subject: [PATCH 087/133] another try --- .travis.yml | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index f577ce8c2..29fc44592 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,22 +46,14 @@ matrix: # from https://github.com/travis-ci/travis-ci/issues/6120 - os: linux + env: + - LLVM_VERSION=3.7.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ before_install: - - export LLVM_VERSION=3.7.0 - - export LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - env: COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - - os: linux - before_install: - - export LLVM_VERSION=3.8.0 - - export LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - env: COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ # - os: linux # compiler: gcc From 32f6682177e31fa7b25d21615c44cde219ae3ba3 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 07:25:11 +0200 Subject: [PATCH 088/133] another try --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 29fc44592..8fe3cf6d2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,7 +47,7 @@ matrix: # from https://github.com/travis-ci/travis-ci/issues/6120 - os: linux env: - - LLVM_VERSION=3.7.0 + - LLVM_VERSION=3.8.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ before_install: From dfc39b95ab9becac9385c1569ce1c05bd6a2d723 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 07:54:00 +0200 Subject: [PATCH 089/133] clang does not work with travis right now --- .travis.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8fe3cf6d2..7f2dd9b65 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,16 +44,16 @@ matrix: branch_pattern: coverity_scan env: COMPILER=g++-5 - # from https://github.com/travis-ci/travis-ci/issues/6120 - - os: linux - env: - - LLVM_VERSION=3.8.0 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 +# # from https://github.com/travis-ci/travis-ci/issues/6120 +# - os: linux +# env: +# - LLVM_VERSION=3.8.0 +# - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz +# - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ +# before_install: +# - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH +# - mkdir $HOME/clang-$LLVM_VERSION +# - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 # - os: linux # compiler: gcc From 1826d12a22e14f6ce00c1218685011eea982c83e Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 08:28:50 +0200 Subject: [PATCH 090/133] added CPATH --- .travis.yml | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7f2dd9b65..3bfe5eaaa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,16 +44,17 @@ matrix: branch_pattern: coverity_scan env: COMPILER=g++-5 -# # from https://github.com/travis-ci/travis-ci/issues/6120 -# - os: linux -# env: -# - LLVM_VERSION=3.8.0 -# - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz -# - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ -# before_install: -# - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH -# - mkdir $HOME/clang-$LLVM_VERSION -# - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + # from https://github.com/travis-ci/travis-ci/issues/6120 + - os: linux + env: + - LLVM_VERSION=3.8.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPATH=$HOME/clang-$LLVM_VERSION/include + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 # - os: linux # compiler: gcc From 761880f5b746f3d7040dd8b0da3e9121d573fc14 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 08:32:56 +0200 Subject: [PATCH 091/133] CPATH does not work... --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3bfe5eaaa..26517d5c8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -49,8 +49,7 @@ matrix: env: - LLVM_VERSION=3.8.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPATH=$HOME/clang-$LLVM_VERSION/include + - COMPILER="$HOME/clang-$LLVM_VERSION/bin/clang++ -I$HOME/clang-$LLVM_VERSION/include" before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION From dd542aae7d1e157a49de0748d8347756890e3b88 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 08:40:25 +0200 Subject: [PATCH 092/133] another try --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 26517d5c8..76eeafbaf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -49,7 +49,8 @@ matrix: env: - LLVM_VERSION=3.8.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER="$HOME/clang-$LLVM_VERSION/bin/clang++ -I$HOME/clang-$LLVM_VERSION/include" + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include" before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION From dd10c89a3e8e0de8e995dc923e764ee5a6f6d2f4 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 08:53:36 +0200 Subject: [PATCH 093/133] another try --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 76eeafbaf..ce29a41bd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -50,7 +50,7 @@ matrix: - LLVM_VERSION=3.8.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include" + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION From fbbdcb19bce6eadd0a675b560fdcb7dc4080eafc Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 09:01:49 +0200 Subject: [PATCH 094/133] another try --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ce29a41bd..9871b7d49 100644 --- a/.travis.yml +++ b/.travis.yml @@ -137,7 +137,7 @@ matrix: script: - uname -a - $COMPILER --version - - make CXX=$COMPILER CXXFLAGS="-lstdc++" + - make CXX=$COMPILER - ./json_unit "*" - if [ `which valgrind` ]; then valgrind --error-exitcode=1 --leak-check=full ./json_unit ; From 32cc6fefcc1c377d3a215f0c595f1f621e100070 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 09:12:53 +0200 Subject: [PATCH 095/133] another try --- .travis.yml | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9871b7d49..76054da85 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,6 +51,7 @@ matrix: - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION @@ -102,37 +103,51 @@ matrix: - os: osx osx_image: beta-xcode6.1 compiler: clang - env: COMPILER=clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ - os: osx osx_image: beta-xcode6.2 compiler: clang - env: COMPILER=clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ - os: osx osx_image: beta-xcode6.3 compiler: clang - env: COMPILER=clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode6.4 compiler: clang - env: COMPILER=clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.1 compiler: clang - env: COMPILER=clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.2 compiler: clang - env: COMPILER=clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.3 compiler: clang - env: COMPILER=clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ script: - uname -a From f63317dce34ae34a9a26809ae277f867ac6b4348 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 09:34:46 +0200 Subject: [PATCH 096/133] another try --- .travis.yml | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/.travis.yml b/.travis.yml index 76054da85..205606bef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,10 +23,10 @@ matrix: after_success: - make clean - touch src/json.hpp - - make json_unit CXXFLAGS="-fprofile-arcs -ftest-coverage -std=c++11 -lstdc++" CXX=$COMPILER + - make json_unit CXXFLAGS="-fprofile-arcs -ftest-coverage -std=c++11 -lstdc++" - ./json_unit "*" - coveralls --exclude test/src/catch.hpp --exclude test/src/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9' - env: COMPILER=g++-4.9 + env: CXX=g++-4.9 - os: linux compiler: gcc @@ -42,16 +42,15 @@ matrix: build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" build_command: "make" branch_pattern: coverity_scan - env: COMPILER=g++-5 + env: CXX=g++-5 # from https://github.com/travis-ci/travis-ci/issues/6120 - os: linux env: - LLVM_VERSION=3.8.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CXX=$HOME/clang-$LLVM_VERSION/bin/clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION @@ -104,55 +103,55 @@ matrix: osx_image: beta-xcode6.1 compiler: clang env: - - COMPILER=clang + - CXX=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: beta-xcode6.2 compiler: clang env: - - COMPILER=clang + - CXX=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: beta-xcode6.3 compiler: clang env: - - COMPILER=clang + - CXX=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode6.4 compiler: clang env: - - COMPILER=clang + - CXX=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.1 compiler: clang env: - - COMPILER=clang + - CXX=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.2 compiler: clang env: - - COMPILER=clang + - CXX=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.3 compiler: clang env: - - COMPILER=clang + - CXX=clang - CXXFLAGS=-lstdc++ script: - uname -a - - $COMPILER --version - - make CXX=$COMPILER + - $CXX --version + - make - ./json_unit "*" - if [ `which valgrind` ]; then valgrind --error-exitcode=1 --leak-check=full ./json_unit ; From 6d19bd1108551b1b4c41cb9e83e6b7f025cc5c7f Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 09:49:11 +0200 Subject: [PATCH 097/133] Revert "another try" This reverts commit f63317dce34ae34a9a26809ae277f867ac6b4348. --- .travis.yml | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 205606bef..76054da85 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,10 +23,10 @@ matrix: after_success: - make clean - touch src/json.hpp - - make json_unit CXXFLAGS="-fprofile-arcs -ftest-coverage -std=c++11 -lstdc++" + - make json_unit CXXFLAGS="-fprofile-arcs -ftest-coverage -std=c++11 -lstdc++" CXX=$COMPILER - ./json_unit "*" - coveralls --exclude test/src/catch.hpp --exclude test/src/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9' - env: CXX=g++-4.9 + env: COMPILER=g++-4.9 - os: linux compiler: gcc @@ -42,15 +42,16 @@ matrix: build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" build_command: "make" branch_pattern: coverity_scan - env: CXX=g++-5 + env: COMPILER=g++-5 # from https://github.com/travis-ci/travis-ci/issues/6120 - os: linux env: - LLVM_VERSION=3.8.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - CXX=$HOME/clang-$LLVM_VERSION/bin/clang++ + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION @@ -103,55 +104,55 @@ matrix: osx_image: beta-xcode6.1 compiler: clang env: - - CXX=clang + - COMPILER=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: beta-xcode6.2 compiler: clang env: - - CXX=clang + - COMPILER=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: beta-xcode6.3 compiler: clang env: - - CXX=clang + - COMPILER=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode6.4 compiler: clang env: - - CXX=clang + - COMPILER=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.1 compiler: clang env: - - CXX=clang + - COMPILER=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.2 compiler: clang env: - - CXX=clang + - COMPILER=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.3 compiler: clang env: - - CXX=clang + - COMPILER=clang - CXXFLAGS=-lstdc++ script: - uname -a - - $CXX --version - - make + - $COMPILER --version + - make CXX=$COMPILER - ./json_unit "*" - if [ `which valgrind` ]; then valgrind --error-exitcode=1 --leak-check=full ./json_unit ; From a97c998791fe9242763ad242585cc5050410f775 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 09:50:43 +0200 Subject: [PATCH 098/133] removed -lc++ --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 76054da85..ed5b51976 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,7 +51,6 @@ matrix: - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION From 1f04c0349a85198c931c5279c9c313d2a62c2da0 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 10:03:18 +0200 Subject: [PATCH 099/133] readded -lc++ --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index ed5b51976..76054da85 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,6 +51,7 @@ matrix: - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION From cc5cad5b0beabde812ec30ad99132f63b7002d5b Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 10:53:18 +0200 Subject: [PATCH 100/133] another try --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 76054da85..b9fc27669 100644 --- a/.travis.yml +++ b/.travis.yml @@ -52,6 +52,7 @@ matrix: - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION From 31b24dd5c1f8dad25456218add4db080dc904142 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:02:45 +0200 Subject: [PATCH 101/133] adding more Clang versions --- .travis.yml | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/.travis.yml b/.travis.yml index b9fc27669..828142907 100644 --- a/.travis.yml +++ b/.travis.yml @@ -58,6 +58,110 @@ matrix: - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + - os: linux + env: + - LLVM_VERSION=3.7.1 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + + - os: linux + env: + - LLVM_VERSION=3.7.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + + - os: linux + env: + - LLVM_VERSION=3.6.2 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + + - os: linux + env: + - LLVM_VERSION=3.6.1 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + + - os: linux + env: + - LLVM_VERSION=3.6.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + + - os: linux + env: + - LLVM_VERSION=3.5.2 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + + - os: linux + env: + - LLVM_VERSION=3.5.1 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + + - os: linux + env: + - LLVM_VERSION=3.5.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + # - os: linux # compiler: gcc # addons: From ff8f196ca323e4624a27ec61bbd1a01fecec719c Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:13:15 +0200 Subject: [PATCH 102/133] a test --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 828142907..7d2837f47 100644 --- a/.travis.yml +++ b/.travis.yml @@ -155,8 +155,6 @@ matrix: - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION From a4058b88ecc9d6a8aaff4374031514d40673364a Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:14:02 +0200 Subject: [PATCH 103/133] another test --- .travis.yml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7d2837f47..7f0f6ed71 100644 --- a/.travis.yml +++ b/.travis.yml @@ -136,19 +136,6 @@ matrix: - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - os: linux - env: - - LLVM_VERSION=3.5.1 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - os: linux env: - LLVM_VERSION=3.5.0 From c425dc9e04f9a0ad08eb5c2e38abf537ff026bcc Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:25:00 +0200 Subject: [PATCH 104/133] trying to install clang --- .travis.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.travis.yml b/.travis.yml index 7f0f6ed71..71d69037d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -45,6 +45,18 @@ matrix: env: COMPILER=g++-5 # from https://github.com/travis-ci/travis-ci/issues/6120 + - os: linux + env: + - LLVM_VERSION=3.8.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=clang++ + - CXXFLAGS=-lc++ + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + - cd $HOME/clang-$LLVM_VERSION ; sudo cp -R * /usr/local/ + - os: linux env: - LLVM_VERSION=3.8.0 From 62f39c41ecaf5e90e891a772d3e4b40b1cda8fe5 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:29:37 +0200 Subject: [PATCH 105/133] another try --- .travis.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 71d69037d..f3a074bef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,14 +48,11 @@ matrix: - os: linux env: - LLVM_VERSION=3.8.0 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - COMPILER=clang++ - CXXFLAGS=-lc++ before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - cd $HOME/clang-$LLVM_VERSION ; sudo cp -R * /usr/local/ + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz + - sudo tar xf clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -C /usr/local --strip-components 1 - os: linux env: From 3f23e7059883198afbe00d6d3fc777227f2e63e3 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:36:03 +0200 Subject: [PATCH 106/133] another try --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f3a074bef..446981c9e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -52,7 +52,7 @@ matrix: - CXXFLAGS=-lc++ before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz - - sudo tar xf clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -C /usr/local --strip-components 1 + - sudo tar xf clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -C /usr --strip-components 1 - os: linux env: From 19be324f8780dbbf15e97fdc1eee0927fa451df5 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:38:56 +0200 Subject: [PATCH 107/133] ? --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 446981c9e..df9e9007b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -53,6 +53,8 @@ matrix: before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz - sudo tar xf clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -C /usr --strip-components 1 + - echo $PATH + - which $COMPILER - os: linux env: From 439563eb04aae069079fda361fe1f306fade293e Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:42:34 +0200 Subject: [PATCH 108/133] export --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index df9e9007b..c105dd67a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -53,8 +53,7 @@ matrix: before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz - sudo tar xf clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -C /usr --strip-components 1 - - echo $PATH - - which $COMPILER + - export - os: linux env: From 97648314a493c474802571d5e2e5584c9937e80b Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:52:12 +0200 Subject: [PATCH 109/133] setting explicit path to compiler --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c105dd67a..5746514b6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,12 +48,11 @@ matrix: - os: linux env: - LLVM_VERSION=3.8.0 - - COMPILER=clang++ + - COMPILER=/usr/bin/clang++ - CXXFLAGS=-lc++ before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz - sudo tar xf clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -C /usr --strip-components 1 - - export - os: linux env: From 48f69f40e75bbe9384151b556315e53f910ea977 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 12:04:57 +0200 Subject: [PATCH 110/133] enough for today... --- .travis.yml | 101 ++-------------------------------------------------- 1 file changed, 2 insertions(+), 99 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5746514b6..eb00f6fc2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -45,117 +45,20 @@ matrix: env: COMPILER=g++-5 # from https://github.com/travis-ci/travis-ci/issues/6120 - - os: linux - env: - - LLVM_VERSION=3.8.0 - - COMPILER=/usr/bin/clang++ - - CXXFLAGS=-lc++ - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz - - sudo tar xf clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -C /usr --strip-components 1 - - os: linux env: - LLVM_VERSION=3.8.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - COMPILER=clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - CXXFLAGS=-lc++ + - PATH=$HOME/clang-$LLVM_VERSION/bin:$PATH - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - os: linux - env: - - LLVM_VERSION=3.7.1 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - - os: linux - env: - - LLVM_VERSION=3.7.0 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - - os: linux - env: - - LLVM_VERSION=3.6.2 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - - os: linux - env: - - LLVM_VERSION=3.6.1 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - - os: linux - env: - - LLVM_VERSION=3.6.0 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - - os: linux - env: - - LLVM_VERSION=3.5.2 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - - os: linux - env: - - LLVM_VERSION=3.5.0 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - # - os: linux # compiler: gcc # addons: From 947db6ffe3b7546bef932b814a2d86eaf973c38a Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 14 Jun 2016 08:02:29 +0200 Subject: [PATCH 111/133] added Xcode 8 beta --- .travis.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.travis.yml b/.travis.yml index eb00f6fc2..9c4029b5b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -151,6 +151,13 @@ matrix: - COMPILER=clang - CXXFLAGS=-lstdc++ + - os: osx + osx_image: xcode8 + compiler: clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ + script: - uname -a - $COMPILER --version From c744d59f2d2a69cb410b9e2ba060e0feb9b8cdf2 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 14 Jun 2016 08:14:25 +0200 Subject: [PATCH 112/133] adjusted README file to reality in Travis --- README.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 768943878..71eea31b1 100644 --- a/README.md +++ b/README.md @@ -72,12 +72,9 @@ The following compilers are currently used in [continuous integration](https://t | Compiler | Operating System | Version String | |-----------------|------------------------------|----------------| -| GCC 4.9.3 | Ubuntu 14.04.3 LTS | g++-4.9 (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3 | -| GCC 5.3.0 | Ubuntu 14.04.3 LTS | g++-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204 | -| Clang 3.6.2 | Ubuntu 14.04.3 LTS | Ubuntu clang version 3.6.2-svn240577-1~exp1 (branches/release_36) (based on LLVM 3.6.2) | -| Clang 3.7.1 | Ubuntu 14.04.3 LTS | Ubuntu clang version 3.7.1-svn253571-1~exp1 (branches/release_37) (based on LLVM 3.7.1) | -| Clang 3.8.1 | Ubuntu 14.04.3 LTS | clang version 3.8.1-svn265380-1~exp1 (branches/release_38) | -| Clang 3.9.0 | Ubuntu 14.04.3 LTS | clang version 3.9.0-svn267478-1~exp1 (trunk) | +| GCC 4.9.3 | Ubuntu 14.04.4 LTS | g++-4.9 (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3 | +| GCC 5.3.0 | Ubuntu 14.04.4 LTS | g++-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204 | +| Clang 3.8.0 | Ubuntu 14.04.4 LTS | clang version 3.8.0 (tags/RELEASE_380/final) | | Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | | Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | | Clang Xcode 6.3 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) | @@ -85,6 +82,7 @@ The following compilers are currently used in [continuous integration](https://t | Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 (OSX 10.10.5) | Apple LLVM version 7.0.0 (clang-700.1.76) | | Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.0.2 (clang-700.1.81) | | Clang Xcode 7.3 | Darwin Kernel Version 14.5.0 (OSX 10.11.1) | Apple LLVM version 7.3.0 (clang-703.0.29) | +| Clang Xcode 8.0 | Darwin Kernel Version 15.5.0 (OSX 10.11.5) | Apple LLVM version 8.0.0 (clang-800.0.24.1) | | Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25123.0 | ## Examples From fb90388af5aa7ad67418573554af18a13bcb148f Mon Sep 17 00:00:00 2001 From: Tom Needham <06needhamt@gmail.com> Date: Tue, 14 Jun 2016 09:59:50 +0100 Subject: [PATCH 113/133] Fix Issue #265 --- src/json.hpp | 2 +- src/json.hpp.re2c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index f66d0b590..cbb9e5f05 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8504,7 +8504,7 @@ basic_json_parser_63: else { type = value_t::number_unsigned; - max = static_cast((std::numeric_limits::max())); + max = static_cast((std::numeric_limits::max)()); } // count the significant figures diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index f893aac0f..c60207f6f 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -7814,7 +7814,7 @@ class basic_json else { type = value_t::number_unsigned; - max = static_cast((std::numeric_limits::max())); + max = static_cast((std::numeric_limits::max)()); } // count the significant figures From 1eced269e3eb166b6e04f6505c3167157a708d25 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 14 Jun 2016 15:27:16 +0200 Subject: [PATCH 114/133] update after PR #266 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 71eea31b1..411c01397 100644 --- a/README.md +++ b/README.md @@ -434,6 +434,7 @@ I deeply appreciate the help of the following people. - [zewt](https://github.com/zewt) added useful notes to the README file about Android. - [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators and improved the integration via CMake. - [Chris Kitching](https://github.com/ChrisKitching) cleaned up the CMake files. +- [Tom Needham](https://github.com/06needhamt) fixed a subtle bug with MSVC 2015 which was also proposed by [Michael K.](https://github.com/Epidal). Thanks a lot for helping out! From bb8c7b1f4596d45c3fbac1be1ba46ee4527857ca Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 15 Jun 2016 21:28:27 +0200 Subject: [PATCH 115/133] mentioning Homebrew's `--HEAD` parameter --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 411c01397..6ef3539cc 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ using json = nlohmann::json; to the files you want to use JSON objects. That's it. Do not forget to set the necessary switches to enable C++11 (e.g., `-std=c++11` for GCC and Clang). -:beer: If you are using OS X and [Homebrew](http://brew.sh), just type `brew tap nlohmann/json` and `brew install nlohmann_json` and you're set. +:beer: If you are using OS X and [Homebrew](http://brew.sh), just type `brew tap nlohmann/json` and `brew install nlohmann_json` and you're set. If you want the bleeding edge rather than the latest release, use `brew install nlohmann_json --HEAD`. ## Supported compilers From 039565b9f5a8bbe0b9706190c0847c0a5273a653 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 18 Jun 2016 14:33:27 +0200 Subject: [PATCH 116/133] trying codecov --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 9c4029b5b..aee8874f4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,7 @@ matrix: - make json_unit CXXFLAGS="-fprofile-arcs -ftest-coverage -std=c++11 -lstdc++" CXX=$COMPILER - ./json_unit "*" - coveralls --exclude test/src/catch.hpp --exclude test/src/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9' + - bash <(curl -s https://codecov.io/bash) env: COMPILER=g++-4.9 - os: linux From 4e31a0e852907dae6e1366027c816b2512e08cbd Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 16:17:53 +0200 Subject: [PATCH 117/133] minor doc changes --- .gitignore | 3 ++- doc/Doxyfile | 2 +- src/json.hpp | 18 +++++++++--------- src/json.hpp.re2c | 18 +++++++++--------- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index c610519ef..d5bd2f7c9 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ working html me.nlohmann.json.docset -android \ No newline at end of file +android +doc/xml diff --git a/doc/Doxyfile b/doc/Doxyfile index 11faf6d03..e74a8a850 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -236,7 +236,7 @@ MAN_LINKS = NO #--------------------------------------------------------------------------- # Configuration options related to the XML output #--------------------------------------------------------------------------- -GENERATE_XML = NO +GENERATE_XML = YES XML_OUTPUT = xml XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- diff --git a/src/json.hpp b/src/json.hpp index cbb9e5f05..9d6687ddc 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -7278,17 +7278,17 @@ class basic_json enum class token_type { uninitialized, ///< indicating the scanner is uninitialized - literal_true, ///< the "true" literal - literal_false, ///< the "false" literal - literal_null, ///< the "null" literal + literal_true, ///< the `true` literal + literal_false, ///< the `false` literal + literal_null, ///< the `null` literal value_string, ///< a string -- use get_string() for actual value value_number, ///< a number -- use get_number() for actual value - begin_array, ///< the character for array begin "[" - begin_object, ///< the character for object begin "{" - end_array, ///< the character for array end "]" - end_object, ///< the character for object end "}" - name_separator, ///< the name separator ":" - value_separator, ///< the value separator "," + begin_array, ///< the character for array begin `[` + begin_object, ///< the character for object begin `{` + end_array, ///< the character for array end `]` + end_object, ///< the character for object end `}` + name_separator, ///< the name separator `:` + value_separator, ///< the value separator `,` parse_error, ///< indicating a parse error end_of_input ///< indicating the end of the input buffer }; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index c60207f6f..9681bed2f 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -7278,17 +7278,17 @@ class basic_json enum class token_type { uninitialized, ///< indicating the scanner is uninitialized - literal_true, ///< the "true" literal - literal_false, ///< the "false" literal - literal_null, ///< the "null" literal + literal_true, ///< the `true` literal + literal_false, ///< the `false` literal + literal_null, ///< the `null` literal value_string, ///< a string -- use get_string() for actual value value_number, ///< a number -- use get_number() for actual value - begin_array, ///< the character for array begin "[" - begin_object, ///< the character for object begin "{" - end_array, ///< the character for array end "]" - end_object, ///< the character for object end "}" - name_separator, ///< the name separator ":" - value_separator, ///< the value separator "," + begin_array, ///< the character for array begin `[` + begin_object, ///< the character for object begin `{` + end_array, ///< the character for array end `]` + end_object, ///< the character for object end `}` + name_separator, ///< the name separator `:` + value_separator, ///< the value separator `,` parse_error, ///< indicating a parse error end_of_input ///< indicating the end of the input buffer }; From ad7a419a030e6721998280a894b7936370c18b53 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 17:13:13 +0200 Subject: [PATCH 118/133] removed roundtripping of floats (#230) --- src/json.hpp | 186 ++++------------------------------------------ src/json.hpp.re2c | 186 ++++------------------------------------------ test/src/unit.cpp | 20 ++--- 3 files changed, 43 insertions(+), 349 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 9d6687ddc..4eec1aeb2 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -711,73 +711,6 @@ class basic_json private: - /*! - @brief a type to hold JSON type information - - This bitfield type holds information about JSON types. It is internally - used to hold the basic JSON type enumeration, as well as additional - information in the case of values that have been parsed from a string - including whether of not it was created directly or parsed, and in the - case of floating point numbers the number of significant figures in the - original representaiton and if it was in exponential form, if a '+' was - included in the exponent and the capitilization of the exponent marker. - The sole purpose of this information is to permit accurate round trips. - - @since version 2.0.0 - */ - union type_data_t - { - struct - { - /// the type of the value (@ref value_t) - uint16_t type : 4; - /// whether the number was parsed from a string - uint16_t parsed : 1; - /// whether parsed number contained an exponent ('e'/'E') - uint16_t has_exp : 1; - /// whether parsed number contained a plus in the exponent - uint16_t exp_plus : 1; - /// whether parsed number's exponent was capitalized ('E') - uint16_t exp_cap : 1; - /// the number of figures for a parsed number - uint16_t precision : 8; - } bits; - uint16_t data; - - /// return the type as value_t - operator value_t() const - { - return static_cast(bits.type); - } - - /// test type for equality (ignore other fields) - bool operator==(const value_t& rhs) const - { - return static_cast(bits.type) == rhs; - } - - /// assignment - type_data_t& operator=(value_t rhs) - { - bits.type = static_cast(rhs) & 15; // avoid overflow - return *this; - } - - /// construct from value_t - type_data_t(value_t t) noexcept - { - *reinterpret_cast(this) = 0; - bits.type = static_cast(t) & 15; // avoid overflow - } - - /// default constructor - type_data_t() noexcept - { - data = 0; - bits.type = reinterpret_cast(value_t::null); - } - }; - /// helper for exception-safe object creation template static T* create(Args&& ... args) @@ -6183,79 +6116,23 @@ class basic_json case value_t::number_float: { - // check if number was parsed from a string - if (m_type.bits.parsed) + if (m_value.number_float == 0) { - // check if parsed number had an exponent given - if (m_type.bits.has_exp) - { - // buffer size: precision (2^8-1 = 255) + other ('-.e-xxx' = 7) + null (1) - char buf[263]; - int len; - - // handle capitalization of the exponent - if (m_type.bits.exp_cap) - { - len = snprintf(buf, sizeof(buf), "%.*E", - m_type.bits.precision, m_value.number_float) + 1; - } - else - { - len = snprintf(buf, sizeof(buf), "%.*e", - m_type.bits.precision, m_value.number_float) + 1; - } - - // remove '+' sign from the exponent if necessary - if (not m_type.bits.exp_plus) - { - if (len > static_cast(sizeof(buf))) - { - len = sizeof(buf); - } - for (int i = 0; i < len; i++) - { - if (buf[i] == '+') - { - for (; i + 1 < len; i++) - { - buf[i] = buf[i + 1]; - } - } - } - } - - o << buf; - } - else - { - // no exponent - output as a decimal - std::stringstream ss; - ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems - ss << std::setprecision(m_type.bits.precision) - << std::fixed << m_value.number_float; - o << ss.str(); - } + // special case for zero to get "0.0"/"-0.0" + o << (std::signbit(m_value.number_float) ? "-0.0" : "0.0"); } else { - if (m_value.number_float == 0) - { - // special case for zero to get "0.0"/"-0.0" - o << (std::signbit(m_value.number_float) ? "-0.0" : "0.0"); - } - else - { - // Otherwise 6, 15 or 16 digits of precision allows - // round-trip IEEE 754 string->float->string, - // string->double->string or string->long - // double->string; to be safe, we read this value from - // std::numeric_limits::digits10 - std::stringstream ss; - ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems - ss << std::setprecision(std::numeric_limits::digits10) - << m_value.number_float; - o << ss.str(); - } + // Otherwise 6, 15 or 16 digits of precision allows + // round-trip IEEE 754 string->float->string, + // string->double->string or string->long + // double->string; to be safe, we read this value from + // std::numeric_limits::digits10 + std::stringstream ss; + ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems + ss << std::setprecision(std::numeric_limits::digits10) + << m_value.number_float; + o << ss.str(); } return; } @@ -6280,7 +6157,7 @@ class basic_json ////////////////////// /// the type of the current element - type_data_t m_type = value_t::null; + value_t m_type = value_t::null; /// the value of the current element json_value m_value = {}; @@ -8457,18 +8334,12 @@ basic_json_parser_63: number_integer_t or @ref number_unsigned_t then it sets the result parameter accordingly. - The 'floating point representation' includes the number of significant - figures after the radix point, whether the number is in exponential or - decimal form, the capitalization of the exponent marker, and if the - optional '+' is present in the exponent. This information is necessary - to perform accurate round trips of floating point numbers. - If the number is a floating point number the number is then parsed using @a std:strtod (or @a std:strtof or @a std::strtold). @param[out] result @ref basic_json object to receive the number, or - NAN if the conversion read past the current token. The latter case - needs to be treated by the caller function. + NAN if the conversion read past the current token. The latter case + needs to be treated by the caller function. */ void get_number(basic_json& result) const { @@ -8476,15 +8347,6 @@ basic_json_parser_63: const lexer::lexer_char_t* curptr = m_start; - // remember this number was parsed (for later serialization) - result.m_type.bits.parsed = true; - - // 'found_radix_point' will be set to 0xFF upon finding a radix - // point and later used to mask in/out the precision depending - // whether a radix is found i.e. 'precision &= found_radix_point' - uint8_t found_radix_point = 0; - uint8_t precision = 0; - // accumulate the integer conversion result (unsigned for now) number_unsigned_t value = 0; @@ -8517,22 +8379,11 @@ basic_json_parser_63: { // don't count '.' but change to float type = value_t::number_float; - - // reset precision count - precision = 0; - found_radix_point = 0xFF; continue; } // assume exponent (if not then will fail parse): change to // float, stop counting and record exponent details type = value_t::number_float; - result.m_type.bits.has_exp = true; - - // exponent capitalization - result.m_type.bits.exp_cap = (*curptr == 'E'); - - // exponent '+' sign - result.m_type.bits.exp_plus = (*(++curptr) == '+'); break; } @@ -8554,13 +8405,8 @@ basic_json_parser_63: value = temp; } } - ++precision; } - // If no radix point was found then precision would now be set to - // the number of digits, which is wrong - clear it. - result.m_type.bits.precision = precision & found_radix_point; - // save the value (if not a float) if (type == value_t::number_unsigned) { diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 9681bed2f..84235cb1b 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -711,73 +711,6 @@ class basic_json private: - /*! - @brief a type to hold JSON type information - - This bitfield type holds information about JSON types. It is internally - used to hold the basic JSON type enumeration, as well as additional - information in the case of values that have been parsed from a string - including whether of not it was created directly or parsed, and in the - case of floating point numbers the number of significant figures in the - original representaiton and if it was in exponential form, if a '+' was - included in the exponent and the capitilization of the exponent marker. - The sole purpose of this information is to permit accurate round trips. - - @since version 2.0.0 - */ - union type_data_t - { - struct - { - /// the type of the value (@ref value_t) - uint16_t type : 4; - /// whether the number was parsed from a string - uint16_t parsed : 1; - /// whether parsed number contained an exponent ('e'/'E') - uint16_t has_exp : 1; - /// whether parsed number contained a plus in the exponent - uint16_t exp_plus : 1; - /// whether parsed number's exponent was capitalized ('E') - uint16_t exp_cap : 1; - /// the number of figures for a parsed number - uint16_t precision : 8; - } bits; - uint16_t data; - - /// return the type as value_t - operator value_t() const - { - return static_cast(bits.type); - } - - /// test type for equality (ignore other fields) - bool operator==(const value_t& rhs) const - { - return static_cast(bits.type) == rhs; - } - - /// assignment - type_data_t& operator=(value_t rhs) - { - bits.type = static_cast(rhs) & 15; // avoid overflow - return *this; - } - - /// construct from value_t - type_data_t(value_t t) noexcept - { - *reinterpret_cast(this) = 0; - bits.type = static_cast(t) & 15; // avoid overflow - } - - /// default constructor - type_data_t() noexcept - { - data = 0; - bits.type = reinterpret_cast(value_t::null); - } - }; - /// helper for exception-safe object creation template static T* create(Args&& ... args) @@ -6183,79 +6116,23 @@ class basic_json case value_t::number_float: { - // check if number was parsed from a string - if (m_type.bits.parsed) + if (m_value.number_float == 0) { - // check if parsed number had an exponent given - if (m_type.bits.has_exp) - { - // buffer size: precision (2^8-1 = 255) + other ('-.e-xxx' = 7) + null (1) - char buf[263]; - int len; - - // handle capitalization of the exponent - if (m_type.bits.exp_cap) - { - len = snprintf(buf, sizeof(buf), "%.*E", - m_type.bits.precision, m_value.number_float) + 1; - } - else - { - len = snprintf(buf, sizeof(buf), "%.*e", - m_type.bits.precision, m_value.number_float) + 1; - } - - // remove '+' sign from the exponent if necessary - if (not m_type.bits.exp_plus) - { - if (len > static_cast(sizeof(buf))) - { - len = sizeof(buf); - } - for (int i = 0; i < len; i++) - { - if (buf[i] == '+') - { - for (; i + 1 < len; i++) - { - buf[i] = buf[i + 1]; - } - } - } - } - - o << buf; - } - else - { - // no exponent - output as a decimal - std::stringstream ss; - ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems - ss << std::setprecision(m_type.bits.precision) - << std::fixed << m_value.number_float; - o << ss.str(); - } + // special case for zero to get "0.0"/"-0.0" + o << (std::signbit(m_value.number_float) ? "-0.0" : "0.0"); } else { - if (m_value.number_float == 0) - { - // special case for zero to get "0.0"/"-0.0" - o << (std::signbit(m_value.number_float) ? "-0.0" : "0.0"); - } - else - { - // Otherwise 6, 15 or 16 digits of precision allows - // round-trip IEEE 754 string->float->string, - // string->double->string or string->long - // double->string; to be safe, we read this value from - // std::numeric_limits::digits10 - std::stringstream ss; - ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems - ss << std::setprecision(std::numeric_limits::digits10) - << m_value.number_float; - o << ss.str(); - } + // Otherwise 6, 15 or 16 digits of precision allows + // round-trip IEEE 754 string->float->string, + // string->double->string or string->long + // double->string; to be safe, we read this value from + // std::numeric_limits::digits10 + std::stringstream ss; + ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems + ss << std::setprecision(std::numeric_limits::digits10) + << m_value.number_float; + o << ss.str(); } return; } @@ -6280,7 +6157,7 @@ class basic_json ////////////////////// /// the type of the current element - type_data_t m_type = value_t::null; + value_t m_type = value_t::null; /// the value of the current element json_value m_value = {}; @@ -7767,18 +7644,12 @@ class basic_json number_integer_t or @ref number_unsigned_t then it sets the result parameter accordingly. - The 'floating point representation' includes the number of significant - figures after the radix point, whether the number is in exponential or - decimal form, the capitalization of the exponent marker, and if the - optional '+' is present in the exponent. This information is necessary - to perform accurate round trips of floating point numbers. - If the number is a floating point number the number is then parsed using @a std:strtod (or @a std:strtof or @a std::strtold). @param[out] result @ref basic_json object to receive the number, or - NAN if the conversion read past the current token. The latter case - needs to be treated by the caller function. + NAN if the conversion read past the current token. The latter case + needs to be treated by the caller function. */ void get_number(basic_json& result) const { @@ -7786,15 +7657,6 @@ class basic_json const lexer::lexer_char_t* curptr = m_start; - // remember this number was parsed (for later serialization) - result.m_type.bits.parsed = true; - - // 'found_radix_point' will be set to 0xFF upon finding a radix - // point and later used to mask in/out the precision depending - // whether a radix is found i.e. 'precision &= found_radix_point' - uint8_t found_radix_point = 0; - uint8_t precision = 0; - // accumulate the integer conversion result (unsigned for now) number_unsigned_t value = 0; @@ -7827,22 +7689,11 @@ class basic_json { // don't count '.' but change to float type = value_t::number_float; - - // reset precision count - precision = 0; - found_radix_point = 0xFF; continue; } // assume exponent (if not then will fail parse): change to // float, stop counting and record exponent details type = value_t::number_float; - result.m_type.bits.has_exp = true; - - // exponent capitalization - result.m_type.bits.exp_cap = (*curptr == 'E'); - - // exponent '+' sign - result.m_type.bits.exp_plus = (*(++curptr) == '+'); break; } @@ -7864,13 +7715,8 @@ class basic_json value = temp; } } - ++precision; } - // If no radix point was found then precision would now be set to - // the number of digits, which is wrong - clear it. - result.m_type.bits.precision = precision & found_radix_point; - // save the value (if not a float) if (type == value_t::number_unsigned) { diff --git a/test/src/unit.cpp b/test/src/unit.cpp index 0a2bdd104..73d58f24c 100644 --- a/test/src/unit.cpp +++ b/test/src/unit.cpp @@ -11900,14 +11900,14 @@ TEST_CASE("compliance tests from nativejson-benchmark") "test/data/json_roundtrip/roundtrip21.json", "test/data/json_roundtrip/roundtrip22.json", "test/data/json_roundtrip/roundtrip23.json", - "test/data/json_roundtrip/roundtrip24.json", - "test/data/json_roundtrip/roundtrip25.json", - "test/data/json_roundtrip/roundtrip26.json", - "test/data/json_roundtrip/roundtrip27.json", - "test/data/json_roundtrip/roundtrip28.json", + //"test/data/json_roundtrip/roundtrip24.json", // roundtrip error + //"test/data/json_roundtrip/roundtrip25.json", // roundtrip error + //"test/data/json_roundtrip/roundtrip26.json", // roundtrip error + //"test/data/json_roundtrip/roundtrip27.json", // roundtrip error + //"test/data/json_roundtrip/roundtrip28.json", // roundtrip error "test/data/json_roundtrip/roundtrip29.json", - "test/data/json_roundtrip/roundtrip30.json", - "test/data/json_roundtrip/roundtrip31.json", + //"test/data/json_roundtrip/roundtrip30.json", // roundtrip error + //"test/data/json_roundtrip/roundtrip31.json", // roundtrip error "test/data/json_roundtrip/roundtrip32.json" }) { @@ -14050,8 +14050,10 @@ TEST_CASE("regression tests") //CHECK(j2b.dump() == "23.42"); CHECK(j3a.dump() == "10000"); - CHECK(j3b.dump() == "1E04"); - CHECK(j3c.dump() == "1e04"); + CHECK(j3b.dump() == "10000"); + CHECK(j3c.dump() == "10000"); + //CHECK(j3b.dump() == "1E04"); // roundtrip error + //CHECK(j3c.dump() == "1e04"); // roundtrip error } SECTION("issue #233 - Can't use basic_json::iterator as a base iterator for std::move_iterator") From 4ff27b207ed0ee52bae6abf07f40c23edcf17509 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 17:56:58 +0200 Subject: [PATCH 119/133] fixed two typos --- test/src/unit.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/src/unit.cpp b/test/src/unit.cpp index 0a2bdd104..609e1be95 100644 --- a/test/src/unit.cpp +++ b/test/src/unit.cpp @@ -1285,7 +1285,7 @@ TEST_CASE("constructors") SECTION("create a JSON value from an input stream") { - SECTION("sts::stringstream") + SECTION("std::stringstream") { std::stringstream ss; ss << "[\"foo\",1,2,3,false,{\"one\":1}]"; @@ -14065,7 +14065,7 @@ TEST_CASE("regression tests") CHECK(dest == expected); } - SECTION("issue ##235 - ambiguous overload for 'push_back' and 'operator+='") + SECTION("issue #235 - ambiguous overload for 'push_back' and 'operator+='") { json data = {{"key", "value"}}; data.push_back({"key2", "value2"}); From 8c48ef1f73f6bf392d7fd66132c5e74b0739892e Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 18:25:43 +0200 Subject: [PATCH 120/133] updated to Catch v1.5.6 --- test/src/catch.hpp | 452 ++++++++++++++++++++++++++++++--------------- 1 file changed, 301 insertions(+), 151 deletions(-) diff --git a/test/src/catch.hpp b/test/src/catch.hpp index 5cc33a838..879fc5b1d 100644 --- a/test/src/catch.hpp +++ b/test/src/catch.hpp @@ -1,6 +1,6 @@ /* - * Catch v1.3.4 - * Generated: 2016-02-10 19:24:03.089683 + * Catch v1.5.6 + * Generated: 2016-06-09 19:20:41.460328 * ---------------------------------------------------------- * This file has been merged from multiple headers. Please don't edit it directly * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. @@ -62,7 +62,11 @@ #define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line #define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) -#define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) +#ifdef CATCH_CONFIG_COUNTER +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) +#else +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) +#endif #define INTERNAL_CATCH_STRINGIFY2( expr ) #expr #define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) @@ -89,7 +93,7 @@ // CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported? // CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported? - +// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? // **************** // Note to maintainers: if new toggles are added please document them // in configuration.md, too @@ -102,6 +106,18 @@ // All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11 +#ifdef __cplusplus + +# if __cplusplus >= 201103L +# define CATCH_CPP11_OR_GREATER +# endif + +# if __cplusplus >= 201402L +# define CATCH_CPP14_OR_GREATER +# endif + +#endif + #ifdef __clang__ # if __has_feature(cxx_nullptr) @@ -112,6 +128,10 @@ # define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT # endif +# if defined(CATCH_CPP11_OR_GREATER) +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) +# endif + #endif // __clang__ //////////////////////////////////////////////////////////////////////////////// @@ -136,9 +156,13 @@ // GCC #ifdef __GNUC__ -#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -#endif +# if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR +# endif + +# if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) && defined(CATCH_CPP11_OR_GREATER) +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS _Pragma( "GCC diagnostic ignored \"-Wparentheses\"" ) +# endif // - otherwise more recent versions define __cplusplus >= 201103L // and will get picked up below @@ -173,13 +197,20 @@ #endif +// Use __COUNTER__ if the compiler supports it +#if ( defined _MSC_VER && _MSC_VER >= 1300 ) || \ + ( defined __GNUC__ && __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 ) || \ + ( defined __clang__ && __clang_major__ >= 3 ) + +#define CATCH_INTERNAL_CONFIG_COUNTER + +#endif + //////////////////////////////////////////////////////////////////////////////// // C++ language feature support // catch all support for C++11 -#if defined(__cplusplus) && __cplusplus >= 201103L - -# define CATCH_CPP11_OR_GREATER +#if defined(CATCH_CPP11_OR_GREATER) # if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) # define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR @@ -246,6 +277,13 @@ #if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11) # define CATCH_CONFIG_CPP11_UNIQUE_PTR #endif +#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) +# define CATCH_CONFIG_COUNTER +#endif + +#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS +#endif // noexcept support: #if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT) @@ -672,24 +710,28 @@ void registerTestCaseFunction #ifdef CATCH_CONFIG_VARIADIC_MACROS /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ + static void TestName(); \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ + static void TestName() #define INTERNAL_CATCH_TESTCASE( ... ) \ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() + INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... )\ + #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ namespace{ \ - struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ + struct TestName : ClassName{ \ void test(); \ }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ } \ - void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() + void TestName::test() + #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ + INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ @@ -697,24 +739,28 @@ void registerTestCaseFunction #else /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \ + static void TestName(); \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ + static void TestName() #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() + INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), Name, Desc ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ + #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestCaseName, ClassName, TestName, Desc )\ namespace{ \ - struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ + struct TestCaseName : ClassName{ \ void test(); \ }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ } \ - void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() + void TestCaseName::test() + #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ + INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, TestName, Desc ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \ @@ -1287,37 +1333,37 @@ namespace Internal { template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs) { - return opCast( lhs ) == opCast( rhs ); + return bool( opCast( lhs ) == opCast( rhs ) ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) != opCast( rhs ); + return bool( opCast( lhs ) != opCast( rhs ) ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) < opCast( rhs ); + return bool( opCast( lhs ) < opCast( rhs ) ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) > opCast( rhs ); + return bool( opCast( lhs ) > opCast( rhs ) ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) >= opCast( rhs ); + return bool( opCast( lhs ) >= opCast( rhs ) ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) <= opCast( rhs ); + return bool( opCast( lhs ) <= opCast( rhs ) ); } }; @@ -2020,13 +2066,14 @@ namespace Catch { do { \ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ try { \ + CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ ( __catchResult <= expr ).endExpression(); \ } \ catch( ... ) { \ __catchResult.useActiveException( Catch::ResultDisposition::Normal ); \ } \ INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::isTrue( false && static_cast(expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look + } while( Catch::isTrue( false && !!(expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \ @@ -2563,10 +2610,12 @@ namespace Catch { } /////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) \ - static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ); \ - namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ) ); }\ - static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ) +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \ + static std::string translatorName( signature ); \ + namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); }\ + static std::string translatorName( signature ) + +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) // #included from: internal/catch_approx.hpp #define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED @@ -3331,6 +3380,11 @@ namespace Catch { InLexicographicalOrder, InRandomOrder }; }; + struct UseColour { enum YesOrNo { + Auto, + Yes, + No + }; }; class TestSpec; @@ -3350,7 +3404,7 @@ namespace Catch { virtual TestSpec const& testSpec() const = 0; virtual RunTests::InWhatOrder runOrder() const = 0; virtual unsigned int rngSeed() const = 0; - virtual bool forceColour() const = 0; + virtual UseColour::YesOrNo useColour() const = 0; }; } @@ -3404,7 +3458,7 @@ namespace Catch { }; class DebugOutStream : public IStream { - std::auto_ptr m_streamBuf; + CATCH_AUTO_PTR( StreamBufBase ) m_streamBuf; mutable std::ostream m_os; public: DebugOutStream(); @@ -3439,14 +3493,14 @@ namespace Catch { noThrow( false ), showHelp( false ), showInvisibles( false ), - forceColour( false ), filenamesAsTags( false ), abortAfter( -1 ), rngSeed( 0 ), verbosity( Verbosity::Normal ), warnings( WarnAbout::Nothing ), showDurations( ShowDurations::DefaultForReporter ), - runOrder( RunTests::InDeclarationOrder ) + runOrder( RunTests::InDeclarationOrder ), + useColour( UseColour::Auto ) {} bool listTests; @@ -3459,7 +3513,6 @@ namespace Catch { bool noThrow; bool showHelp; bool showInvisibles; - bool forceColour; bool filenamesAsTags; int abortAfter; @@ -3469,6 +3522,7 @@ namespace Catch { WarnAbout::What warnings; ShowDurations::OrNot showDurations; RunTests::InWhatOrder runOrder; + UseColour::YesOrNo useColour; std::string outputFilename; std::string name; @@ -3534,7 +3588,7 @@ namespace Catch { virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; } virtual RunTests::InWhatOrder runOrder() const { return m_data.runOrder; } virtual unsigned int rngSeed() const { return m_data.rngSeed; } - virtual bool forceColour() const { return m_data.forceColour; } + virtual UseColour::YesOrNo useColour() const { return m_data.useColour; } private: @@ -3552,7 +3606,7 @@ namespace Catch { } ConfigData m_data; - std::auto_ptr m_stream; + CATCH_AUTO_PTR( IStream const ) m_stream; TestSpec m_testSpec; }; @@ -3572,7 +3626,7 @@ namespace Catch { #define STITCH_CLARA_OPEN_NAMESPACE namespace Catch { // #included from: ../external/clara.h -// Version 0.0.1.1 +// Version 0.0.2.4 // Only use header guard if we are not using an outer namespace #if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE) @@ -3888,6 +3942,10 @@ namespace Tbc { #include #include +#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) +#define CLARA_PLATFORM_WINDOWS +#endif + // Use optional outer namespace #ifdef STITCH_CLARA_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE @@ -3911,9 +3969,6 @@ namespace Clara { const unsigned int consoleWidth = 80; #endif - // Use this to try and stop compiler from warning about unreachable code - inline bool isTrue( bool value ) { return value; } - using namespace Tbc; inline bool startsWith( std::string const& str, std::string const& prefix ) { @@ -3949,14 +4004,6 @@ namespace Clara { else throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); } - inline void convertInto( bool _source, bool& _dest ) { - _dest = _source; - } - template - inline void convertInto( bool, T& ) { - if( isTrue( true ) ) - throw std::runtime_error( "Invalid conversion" ); - } template struct IArgFunction { @@ -3966,7 +4013,6 @@ namespace Clara { IArgFunction( IArgFunction const& ) = default; #endif virtual void set( ConfigT& config, std::string const& value ) const = 0; - virtual void setFlag( ConfigT& config ) const = 0; virtual bool takesArg() const = 0; virtual IArgFunction* clone() const = 0; }; @@ -3988,9 +4034,6 @@ namespace Clara { void set( ConfigT& config, std::string const& value ) const { functionObj->set( config, value ); } - void setFlag( ConfigT& config ) const { - functionObj->setFlag( config ); - } bool takesArg() const { return functionObj->takesArg(); } bool isSet() const { @@ -4003,7 +4046,6 @@ namespace Clara { template struct NullBinder : IArgFunction{ virtual void set( C&, std::string const& ) const {} - virtual void setFlag( C& ) const {} virtual bool takesArg() const { return true; } virtual IArgFunction* clone() const { return new NullBinder( *this ); } }; @@ -4014,9 +4056,6 @@ namespace Clara { virtual void set( C& p, std::string const& stringValue ) const { convertInto( stringValue, p.*member ); } - virtual void setFlag( C& p ) const { - convertInto( true, p.*member ); - } virtual bool takesArg() const { return !IsBool::value; } virtual IArgFunction* clone() const { return new BoundDataMember( *this ); } M C::* member; @@ -4029,11 +4068,6 @@ namespace Clara { convertInto( stringValue, value ); (p.*member)( value ); } - virtual void setFlag( C& p ) const { - typename RemoveConstRef::type value; - convertInto( true, value ); - (p.*member)( value ); - } virtual bool takesArg() const { return !IsBool::value; } virtual IArgFunction* clone() const { return new BoundUnaryMethod( *this ); } void (C::*member)( M ); @@ -4047,9 +4081,6 @@ namespace Clara { if( value ) (p.*member)(); } - virtual void setFlag( C& p ) const { - (p.*member)(); - } virtual bool takesArg() const { return false; } virtual IArgFunction* clone() const { return new BoundNullaryMethod( *this ); } void (C::*member)(); @@ -4064,9 +4095,6 @@ namespace Clara { if( value ) function( obj ); } - virtual void setFlag( C& p ) const { - function( p ); - } virtual bool takesArg() const { return false; } virtual IArgFunction* clone() const { return new BoundUnaryFunction( *this ); } void (*function)( C& ); @@ -4080,11 +4108,6 @@ namespace Clara { convertInto( stringValue, value ); function( obj, value ); } - virtual void setFlag( C& obj ) const { - typename RemoveConstRef::type value; - convertInto( true, value ); - function( obj, value ); - } virtual bool takesArg() const { return !IsBool::value; } virtual IArgFunction* clone() const { return new BoundBinaryFunction( *this ); } void (*function)( C&, T ); @@ -4092,8 +4115,20 @@ namespace Clara { } // namespace Detail - struct Parser { - Parser() : separators( " \t=:" ) {} + inline std::vector argsToVector( int argc, char const* const* const argv ) { + std::vector args( static_cast( argc ) ); + for( std::size_t i = 0; i < static_cast( argc ); ++i ) + args[i] = argv[i]; + + return args; + } + + class Parser { + enum Mode { None, MaybeShortOpt, SlashOpt, ShortOpt, LongOpt, Positional }; + Mode mode; + std::size_t from; + bool inQuotes; + public: struct Token { enum Type { Positional, ShortOpt, LongOpt }; @@ -4102,38 +4137,75 @@ namespace Clara { std::string data; }; - void parseIntoTokens( int argc, char const* const argv[], std::vector& tokens ) const { + Parser() : mode( None ), from( 0 ), inQuotes( false ){} + + void parseIntoTokens( std::vector const& args, std::vector& tokens ) { const std::string doubleDash = "--"; - for( int i = 1; i < argc && argv[i] != doubleDash; ++i ) - parseIntoTokens( argv[i] , tokens); + for( std::size_t i = 1; i < args.size() && args[i] != doubleDash; ++i ) + parseIntoTokens( args[i], tokens); } - void parseIntoTokens( std::string arg, std::vector& tokens ) const { - while( !arg.empty() ) { - Parser::Token token( Parser::Token::Positional, arg ); - arg = ""; - if( token.data[0] == '-' ) { - if( token.data.size() > 1 && token.data[1] == '-' ) { - token = Parser::Token( Parser::Token::LongOpt, token.data.substr( 2 ) ); - } - else { - token = Parser::Token( Parser::Token::ShortOpt, token.data.substr( 1 ) ); - if( token.data.size() > 1 && separators.find( token.data[1] ) == std::string::npos ) { - arg = "-" + token.data.substr( 1 ); - token.data = token.data.substr( 0, 1 ); - } - } - } - if( token.type != Parser::Token::Positional ) { - std::size_t pos = token.data.find_first_of( separators ); - if( pos != std::string::npos ) { - arg = token.data.substr( pos+1 ); - token.data = token.data.substr( 0, pos ); - } - } - tokens.push_back( token ); + + void parseIntoTokens( std::string const& arg, std::vector& tokens ) { + for( std::size_t i = 0; i <= arg.size(); ++i ) { + char c = arg[i]; + if( c == '"' ) + inQuotes = !inQuotes; + mode = handleMode( i, c, arg, tokens ); } } - std::string separators; + Mode handleMode( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { + switch( mode ) { + case None: return handleNone( i, c ); + case MaybeShortOpt: return handleMaybeShortOpt( i, c ); + case ShortOpt: + case LongOpt: + case SlashOpt: return handleOpt( i, c, arg, tokens ); + case Positional: return handlePositional( i, c, arg, tokens ); + default: throw std::logic_error( "Unknown mode" ); + } + } + + Mode handleNone( std::size_t i, char c ) { + if( inQuotes ) { + from = i; + return Positional; + } + switch( c ) { + case '-': return MaybeShortOpt; +#ifdef CLARA_PLATFORM_WINDOWS + case '/': from = i+1; return SlashOpt; +#endif + default: from = i; return Positional; + } + } + Mode handleMaybeShortOpt( std::size_t i, char c ) { + switch( c ) { + case '-': from = i+1; return LongOpt; + default: from = i; return ShortOpt; + } + } + Mode handleOpt( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { + if( std::string( ":=\0", 3 ).find( c ) == std::string::npos ) + return mode; + + std::string optName = arg.substr( from, i-from ); + if( mode == ShortOpt ) + for( std::size_t j = 0; j < optName.size(); ++j ) + tokens.push_back( Token( Token::ShortOpt, optName.substr( j, 1 ) ) ); + else if( mode == SlashOpt && optName.size() == 1 ) + tokens.push_back( Token( Token::ShortOpt, optName ) ); + else + tokens.push_back( Token( Token::LongOpt, optName ) ); + return None; + } + Mode handlePositional( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { + if( inQuotes || std::string( "\0", 1 ).find( c ) == std::string::npos ) + return mode; + + std::string data = arg.substr( from, i-from ); + tokens.push_back( Token( Token::Positional, data ) ); + return None; + } }; template @@ -4436,21 +4508,21 @@ namespace Clara { return oss.str(); } - ConfigT parse( int argc, char const* const argv[] ) const { + ConfigT parse( std::vector const& args ) const { ConfigT config; - parseInto( argc, argv, config ); + parseInto( args, config ); return config; } - std::vector parseInto( int argc, char const* argv[], ConfigT& config ) const { - std::string processName = argv[0]; + std::vector parseInto( std::vector const& args, ConfigT& config ) const { + std::string processName = args[0]; std::size_t lastSlash = processName.find_last_of( "/\\" ); if( lastSlash != std::string::npos ) processName = processName.substr( lastSlash+1 ); m_boundProcessName.set( config, processName ); std::vector tokens; Parser parser; - parser.parseIntoTokens( argc, argv, tokens ); + parser.parseIntoTokens( args, tokens ); return populate( tokens, config ); } @@ -4481,7 +4553,7 @@ namespace Clara { arg.boundField.set( config, tokens[++i].data ); } else { - arg.boundField.setFlag( config ); + arg.boundField.set( config, "true" ); } break; } @@ -4624,6 +4696,21 @@ namespace Catch { ? ShowDurations::Always : ShowDurations::Never; } + inline void setUseColour( ConfigData& config, std::string const& value ) { + std::string mode = toLower( value ); + + if( mode == "yes" ) + config.useColour = UseColour::Yes; + else if( mode == "no" ) + config.useColour = UseColour::No; + else if( mode == "auto" ) + config.useColour = UseColour::Auto; + else + throw std::runtime_error( "colour mode must be one of: auto, yes or no" ); + } + inline void forceColour( ConfigData& config ) { + config.useColour = UseColour::Yes; + } inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) { std::ifstream f( _filename.c_str() ); if( !f.is_open() ) @@ -4710,7 +4797,7 @@ namespace Catch { cli["-d"]["--durations"] .describe( "show test durations" ) - .bind( &setShowDurations, "yes/no" ); + .bind( &setShowDurations, "yes|no" ); cli["-f"]["--input-file"] .describe( "load test names to run from a file" ) @@ -4738,8 +4825,12 @@ namespace Catch { .bind( &setRngSeed, "'time'|number" ); cli["--force-colour"] - .describe( "force colourised output" ) - .bind( &ConfigData::forceColour ); + .describe( "force colourised output (deprecated)" ) + .bind( &forceColour ); + + cli["--use-colour"] + .describe( "should output be colourised" ) + .bind( &setUseColour, "yes|no" ); return cli; } @@ -5170,6 +5261,8 @@ namespace Catch bool aborting; }; + class MultipleReporters; + struct IStreamingReporter : IShared { virtual ~IStreamingReporter(); @@ -5197,6 +5290,8 @@ namespace Catch virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; virtual void skipTest( TestCaseInfo const& testInfo ) = 0; + + virtual MultipleReporters* tryAsMulti() { return CATCH_NULL; } }; struct IReporterFactory : IShared { @@ -5414,6 +5509,10 @@ namespace TestCaseTracking { virtual void addChild( Ptr const& child ) = 0; virtual ITracker* findChild( std::string const& name ) = 0; virtual void openChild() = 0; + + // Debug/ checking + virtual bool isSectionTracker() const = 0; + virtual bool isIndexTracker() const = 0; }; class TrackerContext { @@ -5538,6 +5637,10 @@ namespace TestCaseTracking { m_parent->openChild(); } } + + virtual bool isSectionTracker() const CATCH_OVERRIDE { return false; } + virtual bool isIndexTracker() const CATCH_OVERRIDE { return false; } + void open() { m_runState = Executing; moveToThis(); @@ -5601,13 +5704,16 @@ namespace TestCaseTracking { {} virtual ~SectionTracker(); + virtual bool isSectionTracker() const CATCH_OVERRIDE { return true; } + static SectionTracker& acquire( TrackerContext& ctx, std::string const& name ) { SectionTracker* section = CATCH_NULL; ITracker& currentTracker = ctx.currentTracker(); if( ITracker* childTracker = currentTracker.findChild( name ) ) { - section = dynamic_cast( childTracker ); - assert( section ); + assert( childTracker ); + assert( childTracker->isSectionTracker() ); + section = static_cast( childTracker ); } else { section = new SectionTracker( name, ctx, ¤tTracker ); @@ -5632,13 +5738,16 @@ namespace TestCaseTracking { {} virtual ~IndexTracker(); + virtual bool isIndexTracker() const CATCH_OVERRIDE { return true; } + static IndexTracker& acquire( TrackerContext& ctx, std::string const& name, int size ) { IndexTracker* tracker = CATCH_NULL; ITracker& currentTracker = ctx.currentTracker(); if( ITracker* childTracker = currentTracker.findChild( name ) ) { - tracker = dynamic_cast( childTracker ); - assert( tracker ); + assert( childTracker ); + assert( childTracker->isIndexTracker() ); + tracker = static_cast( childTracker ); } else { tracker = new IndexTracker( name, ctx, ¤tTracker, size ); @@ -5845,6 +5954,11 @@ namespace Catch { while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); Totals deltaTotals = m_totals.delta( prevTotals ); + if( testInfo.expectedToFail() && deltaTotals.testCases.passed > 0 ) { + deltaTotals.assertions.failed++; + deltaTotals.testCases.passed--; + deltaTotals.testCases.failed++; + } m_totals.testCases += deltaTotals.testCases; m_reporter->testCaseEnded( TestCaseStats( testInfo, deltaTotals, @@ -6236,10 +6350,10 @@ namespace Catch { Catch::cout() << "For more detail usage please see the project docs\n" << std::endl; } - int applyCommandLine( int argc, char const* argv[], OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { + int applyCommandLine( int argc, char const* const* const argv, OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { try { m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail ); - m_unusedTokens = m_cli.parseInto( argc, argv, m_configData ); + m_unusedTokens = m_cli.parseInto( Clara::argsToVector( argc, argv ), m_configData ); if( m_configData.showHelp ) showHelp( m_configData.processName ); m_config.reset(); @@ -6263,16 +6377,13 @@ namespace Catch { m_config.reset(); } - int run( int argc, char const* argv[] ) { + int run( int argc, char const* const* const argv ) { int returnCode = applyCommandLine( argc, argv ); if( returnCode == 0 ) returnCode = run(); return returnCode; } - int run( int argc, char* argv[] ) { - return run( argc, const_cast( argv ) ); - } int run() { if( m_configData.showHelp ) @@ -6336,13 +6447,31 @@ namespace Catch { #include #include +#ifdef CATCH_CPP14_OR_GREATER +#include +#endif + namespace Catch { - struct LexSort { - bool operator() (TestCase i,TestCase j) const { return (i + static void shuffle( V& vector ) { + RandomNumberGenerator rng; +#ifdef CATCH_CPP14_OR_GREATER + std::shuffle( vector.begin(), vector.end(), rng ); +#else + std::random_shuffle( vector.begin(), vector.end(), rng ); +#endif + } }; inline std::vector sortTests( IConfig const& config, std::vector const& unsortedTestCases ) { @@ -6351,14 +6480,12 @@ namespace Catch { switch( config.runOrder() ) { case RunTests::InLexicographicalOrder: - std::sort( sorted.begin(), sorted.end(), LexSort() ); + std::sort( sorted.begin(), sorted.end() ); break; case RunTests::InRandomOrder: { seedRng( config ); - - RandomNumberGenerator rng; - std::random_shuffle( sorted.begin(), sorted.end(), rng ); + RandomNumberGenerator::shuffle( sorted ); } break; case RunTests::InDeclarationOrder: @@ -6377,13 +6504,15 @@ namespace Catch { it != itEnd; ++it ) { std::pair::const_iterator, bool> prev = seenFunctions.insert( *it ); - if( !prev.second ){ - Catch::cerr() - << Colour( Colour::Red ) - << "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n" - << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n" - << "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl; - exit(1); + if( !prev.second ) { + std::ostringstream ss; + + ss << Colour( Colour::Red ) + << "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n" + << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n" + << "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl; + + throw std::runtime_error(ss.str()); } } } @@ -6971,7 +7100,18 @@ namespace { IColourImpl* platformColourInstance() { static Win32ColourImpl s_instance; - return &s_instance; + + Ptr config = getCurrentContext().getConfig(); + UseColour::YesOrNo colourMode = config + ? config->useColour() + : UseColour::Auto; + if( colourMode == UseColour::Auto ) + colourMode = !isDebuggerActive() + ? UseColour::Yes + : UseColour::No; + return colourMode == UseColour::Yes + ? &s_instance + : NoColourImpl::instance(); } } // end anon namespace @@ -7022,7 +7162,14 @@ namespace { IColourImpl* platformColourInstance() { Ptr config = getCurrentContext().getConfig(); - return (config && config->forceColour()) || isatty(STDOUT_FILENO) + UseColour::YesOrNo colourMode = config + ? config->useColour() + : UseColour::Auto; + if( colourMode == UseColour::Auto ) + colourMode = (!isDebuggerActive() && isatty(STDOUT_FILENO) ) + ? UseColour::Yes + : UseColour::No; + return colourMode == UseColour::Yes ? PosixColourImpl::instance() : NoColourImpl::instance(); } @@ -7047,9 +7194,7 @@ namespace Catch { Colour::~Colour(){ if( !m_moved ) use( None ); } void Colour::use( Code _colourCode ) { - static IColourImpl* impl = isDebuggerActive() - ? NoColourImpl::instance() - : platformColourInstance(); + static IColourImpl* impl = platformColourInstance(); impl->use( _colourCode ); } @@ -7426,7 +7571,7 @@ namespace Catch { return os; } - Version libraryVersion( 1, 3, 4, "", 0 ); + Version libraryVersion( 1, 5, 6, "", 0 ); } @@ -8405,13 +8550,18 @@ public: // IStreamingReporter ++it ) (*it)->skipTest( testInfo ); } + + virtual MultipleReporters* tryAsMulti() CATCH_OVERRIDE { + return this; + } + }; Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ) { Ptr resultingReporter; if( existingReporter ) { - MultipleReporters* multi = dynamic_cast( existingReporter.get() ); + MultipleReporters* multi = existingReporter->tryAsMulti(); if( !multi ) { multi = new MultipleReporters; resultingReporter = Ptr( multi ); @@ -8591,7 +8741,7 @@ namespace Catch { virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} - virtual bool assertionEnded( AssertionStats const& assertionStats ) { + virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { assert( !m_sectionStack.empty() ); SectionNode& sectionNode = *m_sectionStack.back(); sectionNode.assertions.push_back( assertionStats ); @@ -9722,7 +9872,7 @@ namespace Catch { if( totals.testCases.total() == 0 ) { stream << Colour( Colour::Warning ) << "No tests ran\n"; } - else if( totals.assertions.total() > 0 && totals.assertions.allPassed() ) { + else if( totals.assertions.total() > 0 && totals.testCases.allPassed() ) { stream << Colour( Colour::ResultSuccess ) << "All tests passed"; stream << " (" << pluralise( totals.assertions.passed, "assertion" ) << " in " From 20e4b20528445ecb3e1de815ff27101160ac1f9c Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 21:57:32 +0200 Subject: [PATCH 121/133] fix SSL issue with coverity --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index aee8874f4..b633faae7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,6 +43,7 @@ matrix: build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" build_command: "make" branch_pattern: coverity_scan + before_install: echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt env: COMPILER=g++-5 # from https://github.com/travis-ci/travis-ci/issues/6120 From 3fe654e8276c8c0af8b7643717ae96ef8f76b3c7 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 22:12:56 +0200 Subject: [PATCH 122/133] fix for coverity --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b633faae7..d027654ef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,6 +31,7 @@ matrix: - os: linux compiler: gcc + before_install: echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt addons: apt: sources: ['ubuntu-toolchain-r-test'] @@ -43,7 +44,6 @@ matrix: build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" build_command: "make" branch_pattern: coverity_scan - before_install: echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt env: COMPILER=g++-5 # from https://github.com/travis-ci/travis-ci/issues/6120 From 0865ec87d4084a41f6710147b53c9a0ca877ef40 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 22:20:02 +0200 Subject: [PATCH 123/133] re-added GCC6 --- .travis.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index d027654ef..271ca8642 100644 --- a/.travis.yml +++ b/.travis.yml @@ -61,13 +61,13 @@ matrix: - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 -# - os: linux -# compiler: gcc -# addons: -# apt: -# sources: ['ubuntu-toolchain-r-test'] -# packages: ['g++-6', 'valgrind'] -# env: COMPILER=g++-6 + - os: linux + compiler: gcc + addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: ['g++-6', 'valgrind'] + env: COMPILER=g++-6 # Clang 3.5 is not able to compile the code, # see https://travis-ci.org/nlohmann/json/jobs/126720186 From 15a314abea0ef5e5e58c62e62198450dbc2e3339 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 22:38:54 +0200 Subject: [PATCH 124/133] updated README --- .travis.yml | 16 ++++++++-------- README.md | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 271ca8642..b459f5d5a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,6 +46,14 @@ matrix: branch_pattern: coverity_scan env: COMPILER=g++-5 + - os: linux + compiler: gcc + addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: ['g++-6', 'valgrind'] + env: COMPILER=g++-6 + # from https://github.com/travis-ci/travis-ci/issues/6120 - os: linux env: @@ -61,14 +69,6 @@ matrix: - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - os: linux - compiler: gcc - addons: - apt: - sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-6', 'valgrind'] - env: COMPILER=g++-6 - # Clang 3.5 is not able to compile the code, # see https://travis-ci.org/nlohmann/json/jobs/126720186 diff --git a/README.md b/README.md index 6ef3539cc..9f78413fc 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ The following compilers are currently used in [continuous integration](https://t |-----------------|------------------------------|----------------| | GCC 4.9.3 | Ubuntu 14.04.4 LTS | g++-4.9 (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3 | | GCC 5.3.0 | Ubuntu 14.04.4 LTS | g++-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204 | +| GCC 6.1.1 | Ubuntu 14.04.4 LTS | g++-6 (Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511 | | Clang 3.8.0 | Ubuntu 14.04.4 LTS | clang version 3.8.0 (tags/RELEASE_380/final) | | Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | | Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | @@ -81,7 +82,7 @@ The following compilers are currently used in [continuous integration](https://t | Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | | Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 (OSX 10.10.5) | Apple LLVM version 7.0.0 (clang-700.1.76) | | Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.0.2 (clang-700.1.81) | -| Clang Xcode 7.3 | Darwin Kernel Version 14.5.0 (OSX 10.11.1) | Apple LLVM version 7.3.0 (clang-703.0.29) | +| Clang Xcode 7.3 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.3.0 (clang-703.0.29) | | Clang Xcode 8.0 | Darwin Kernel Version 15.5.0 (OSX 10.11.5) | Apple LLVM version 8.0.0 (clang-800.0.24.1) | | Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25123.0 | From 3f97a5d5ad8f102a2c401706755ce9f0567564e8 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 22 Jun 2016 20:05:44 +0200 Subject: [PATCH 125/133] a conceptual quick fix for #269 --- src/json.hpp | 7 +++++-- src/json.hpp.re2c | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 9d6687ddc..09b6a800c 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -10002,13 +10002,16 @@ basic_json_parser_63: // in a second pass, traverse the remaining elements // remove my remaining elements + const auto end_index = static_cast(result.size()); while (i < source.size()) { - result.push_back(object( + // add operations in reverse order to avoid invalid + // indices + result.insert(result.begin() + end_index, { {"op", "remove"}, {"path", path + "/" + std::to_string(i)} - })); + }); ++i; } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 9681bed2f..c5de92463 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -9312,13 +9312,16 @@ class basic_json // in a second pass, traverse the remaining elements // remove my remaining elements + const auto end_index = static_cast(result.size()); while (i < source.size()) { - result.push_back(object( + // add operations in reverse order to avoid invalid + // indices + result.insert(result.begin() + end_index, { {"op", "remove"}, {"path", path + "/" + std::to_string(i)} - })); + }); ++i; } From 59e67e768f11a18df143eed033cf4fe5a34fbd1d Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 22 Jun 2016 20:09:06 +0200 Subject: [PATCH 126/133] fix for previous commit --- src/json.hpp | 4 ++-- src/json.hpp.re2c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 09b6a800c..c514015a5 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -10007,11 +10007,11 @@ basic_json_parser_63: { // add operations in reverse order to avoid invalid // indices - result.insert(result.begin() + end_index, + result.insert(result.begin() + end_index, object( { {"op", "remove"}, {"path", path + "/" + std::to_string(i)} - }); + })); ++i; } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index c5de92463..86d901145 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -9317,11 +9317,11 @@ class basic_json { // add operations in reverse order to avoid invalid // indices - result.insert(result.begin() + end_index, + result.insert(result.begin() + end_index, object( { {"op", "remove"}, {"path", path + "/" + std::to_string(i)} - }); + })); ++i; } From ecf84dddb1abb2e7e1e937279b51e91d0e77d495 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 22 Jun 2016 20:40:15 +0200 Subject: [PATCH 127/133] test case for #269 --- README.md | 2 +- test/src/unit.cpp | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9f78413fc..7efcabc5d 100644 --- a/README.md +++ b/README.md @@ -453,7 +453,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (5568705 assertions in 31 test cases) +All tests passed (5568722 assertions in 32 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/test/src/unit.cpp b/test/src/unit.cpp index 609e1be95..12611b3fe 100644 --- a/test/src/unit.cpp +++ b/test/src/unit.cpp @@ -14073,6 +14073,15 @@ TEST_CASE("regression tests") CHECK(data == json({{"key", "value"}, {"key2", "value2"}, {"key3", "value3"}})); } + + SECTION("issue #269 - diff generates incorrect patch when removing multiple array elements") + { + json doc = R"( { "arr1": [1, 2, 3, 4] } )"_json; + json expected = R"( { "arr1": [1, 2] } )"_json; + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } } // special test case to check if memory is leaked if constructor throws From 6f76c9237bacb4da34e08c9ecda514968f4f8b50 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 22 Jun 2016 22:20:55 +0200 Subject: [PATCH 128/133] overworked ChangeLog and README --- ChangeLog.md | 9 +++ README.md | 145 +++++++++++++++++++++++++++++++--------------- test/src/unit.cpp | 38 +++++++++++- 3 files changed, 142 insertions(+), 50 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index f0654ea28..a60026f14 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. This projec [Full Changelog](https://github.com/nlohmann/json/compare/v1.1.0...HEAD) +- concatenate objects [\#252](https://github.com/nlohmann/json/issues/252) - Unit test fails when doing a CMake out-of-tree build [\#241](https://github.com/nlohmann/json/issues/241) - Additional integration options [\#237](https://github.com/nlohmann/json/issues/237) - Can't use basic\_json::iterator as a base iterator for std::move\_iterator [\#233](https://github.com/nlohmann/json/issues/233) @@ -14,6 +15,7 @@ All notable changes to this project will be documented in this file. This projec - Add support for afl-fuzz testing [\#207](https://github.com/nlohmann/json/pull/207) ([mykter](https://github.com/mykter)) - 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)) +- Maybe a bug [\#258](https://github.com/nlohmann/json/issues/258) - -Wconversion warnings [\#239](https://github.com/nlohmann/json/issues/239) - ambiguous overload for 'push\_back' and 'operator+=' [\#235](https://github.com/nlohmann/json/issues/235) - double values are serialized with commas as decimal points [\#228](https://github.com/nlohmann/json/issues/228) @@ -26,11 +28,18 @@ All notable changes to this project will be documented in this file. This projec - Floating point exceptions [\#181](https://github.com/nlohmann/json/issues/181) - In basic\_json::basic\_json\(const CompatibleArrayType& val\), the requirement of CompatibleArrayType is not strict enough. [\#174](https://github.com/nlohmann/json/issues/174) - Implicit assignment to std::string fails [\#144](https://github.com/nlohmann/json/issues/144) +- Fix Issue \#265 [\#266](https://github.com/nlohmann/json/pull/266) ([06needhamt](https://github.com/06needhamt)) - 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)) +- Compiler Errors With JSON.hpp [\#265](https://github.com/nlohmann/json/issues/265) +- VS2015 compile fail [\#260](https://github.com/nlohmann/json/issues/260) +- Error when using json in g++ [\#254](https://github.com/nlohmann/json/issues/254) +- Update long-term goals [\#246](https://github.com/nlohmann/json/issues/246) +- Error compile Android NDK error: 'strtof' is not a member of 'std' [\#219](https://github.com/nlohmann/json/issues/219) - Conflicting typedef of ssize\_t on Windows 32 bit when using Boost.Python [\#204](https://github.com/nlohmann/json/issues/204) - Integer conversion to unsigned [\#178](https://github.com/nlohmann/json/issues/178) +- Define CMake/CTest tests [\#247](https://github.com/nlohmann/json/pull/247) ([robertmrk](https://github.com/robertmrk)) - Out of tree builds and a few other miscellaneous CMake cleanups. [\#242](https://github.com/nlohmann/json/pull/242) ([ChrisKitching](https://github.com/ChrisKitching)) - Implement additional integration options [\#238](https://github.com/nlohmann/json/pull/238) ([robertmrk](https://github.com/robertmrk)) - make serialization locale-independent [\#232](https://github.com/nlohmann/json/pull/232) ([nlohmann](https://github.com/nlohmann)) diff --git a/README.md b/README.md index 9f78413fc..cb05d744b 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ There are myriads of [JSON](http://json.org) libraries out there, and each may e - **Intuitive syntax**. In languages such as Python, JSON feels like a first class data type. We used all the operator magic of modern C++ to achieve the same feeling in your code. Check out the [examples below](#examples) and you know, what I mean. -- **Trivial integration**. Our whole code consists of a single header file `json.hpp`. That's it. No library, no subproject, no dependencies, no complex build system. The class is written in vanilla C++11. All in all, everything should require no adjustment of your compiler flags or project settings. +- **Trivial integration**. Our whole code consists of a single header file [`json.hpp`](https://github.com/nlohmann/json/blob/develop/src/json.hpp). That's it. No library, no subproject, no dependencies, no complex build system. The class is written in vanilla C++11. All in all, everything should require no adjustment of your compiler flags or project settings. - **Serious testing**. Our class is heavily [unit-tested](https://github.com/nlohmann/json/blob/master/test/src/unit.cpp) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](http://valgrind.org) that there are no memory leaks. @@ -28,6 +28,7 @@ Other aspects were not so important to us: See the [contribution guidelines](https://github.com/nlohmann/json/blob/master/.github/CONTRIBUTING.md#please-dont) for more information. + ## Integration The single required source, file `json.hpp` is in the `src` directory or [released here](https://github.com/nlohmann/json/releases). All you need to do is add @@ -43,48 +44,6 @@ to the files you want to use JSON objects. That's it. Do not forget to set the n :beer: If you are using OS X and [Homebrew](http://brew.sh), just type `brew tap nlohmann/json` and `brew install nlohmann_json` and you're set. If you want the bleeding edge rather than the latest release, use `brew install nlohmann_json --HEAD`. -## Supported compilers - -Though it's 2016 already, the support for C++11 is still a bit sparse. Currently, the following compilers are known to work: - -- GCC 4.9 - 6.0 (and possibly later) -- Clang 3.4 - 3.9 (and possibly later) -- Microsoft Visual C++ 2015 / 14.0 (and possibly later) - -I would be happy to learn about other compilers/versions. - -Please note: - -- GCC 4.8 does not work because of two bugs ([55817](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55817) and [57824](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57824)) in the C++11 support. Note there is a [pull request](https://github.com/nlohmann/json/pull/212) to fix some of the issues. -- Android defaults to using very old compilers and C++ libraries. To fix this, add the following to your `Application.mk`. This will switch to the LLVM C++ library, the Clang compiler, and enable C++11 and other features disabled by default. - - ``` - APP_STL := c++_shared - NDK_TOOLCHAIN_VERSION := clang3.6 - APP_CPPFLAGS += -frtti -fexceptions - ``` - - The code compiles successfully with [Android NDK](https://developer.android.com/ndk/index.html?hl=ml), Revision 9 - 11 (and possibly later) and [CrystaX's Android NDK](https://www.crystax.net/en/android/ndk) version 10. - -- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. For Android NDK using `APP_STL := gnustl_static`, please refer to [this discussion](https://github.com/nlohmann/json/issues/219). - -The following compilers are currently used in [continuous integration](https://travis-ci.org/nlohmann/json): - -| Compiler | Operating System | Version String | -|-----------------|------------------------------|----------------| -| GCC 4.9.3 | Ubuntu 14.04.4 LTS | g++-4.9 (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3 | -| GCC 5.3.0 | Ubuntu 14.04.4 LTS | g++-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204 | -| GCC 6.1.1 | Ubuntu 14.04.4 LTS | g++-6 (Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511 | -| Clang 3.8.0 | Ubuntu 14.04.4 LTS | clang version 3.8.0 (tags/RELEASE_380/final) | -| Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | -| Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | -| Clang Xcode 6.3 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) | -| Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | -| Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 (OSX 10.10.5) | Apple LLVM version 7.0.0 (clang-700.1.76) | -| Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.0.2 (clang-700.1.81) | -| Clang Xcode 7.3 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.3.0 (clang-703.0.29) | -| Clang Xcode 8.0 | Darwin Kernel Version 15.5.0 (OSX 10.11.5) | Apple LLVM version 8.0.0 (clang-800.0.24.1) | -| Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25123.0 | ## Examples @@ -167,6 +126,7 @@ json empty_object_explicit = json::object(); json array_not_object = { json::array({"currency", "USD"}), json::array({"value", 42.99}) }; ``` + ### Serialization / Deserialization You can create an object (deserialization) by appending `_json` to a string literal: @@ -175,7 +135,7 @@ You can create an object (deserialization) by appending `_json` to a string lite // create object from string literal json j = "{ \"happy\": true, \"pi\": 3.141 }"_json; -// or even nicer (thanks http://isocpp.org/blog/2015/01/json-for-modern-cpp) +// or even nicer with a raw string literal auto j2 = R"( { "happy": true, @@ -220,6 +180,7 @@ These operators work for any subclasses of `std::istream` or `std::ostream`. Please note that setting the exception bit for `failbit` is inappropriate for this use case. It will result in program termination due to the `noexcept` specifier in use. + ### STL-like access We designed the JSON class to behave just like an STL container. In fact, it satisfies the [**ReversibleContainer**](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirement. @@ -287,6 +248,7 @@ int fob_present = o.count("fob"); // 0 o.erase("foo"); ``` + ### Conversion from STL containers Any sequence container (`std::array`, `std::vector`, `std::deque`, `std::forward_list`, `std::list`) whose values can be used to construct JSON types (e.g., integers, floating point numbers, Booleans, string types, or again STL containers described in this section) can be used to create a JSON array. The same holds for similar associative containers (`std::set`, `std::multiset`, `std::unordered_set`, `std::unordered_multiset`), but in these cases the order of the elements of the array depends how the elements are ordered in the respective STL container. @@ -349,12 +311,51 @@ json j_ummap(c_ummap); // only one entry for key "three" is used // maybe {"one": true, "two": true, "three": true} ``` +### JSON Pointer and JSON Patch + +The library supports **JSON Pointer** ([RFC 6901](https://tools.ietf.org/html/rfc6901)) as alternative means to address structured values. On top of this, **JSON Patch** ([RFC 6902](https://tools.ietf.org/html/rfc6902)) allows to describe differences between two JSON values - effectively allowing patch and diff operations known from Unix. + +```cpp +// a JSON value +json j_original = R"({ + "baz": ["one", "two", "three"], + "foo": "bar" +})"_json; + +// access members with a JSON pointer (RFC 6901) +j_original["/baz/2"_json_pointer]; +// "two" + +// a JSON patch (RFC 6902) +json j_patch = R"([ + { "op": "replace", "path": "/baz", "value": "boo" }, + { "op": "add", "path": "/hello", "value": ["world"] }, + { "op": "remove", "path": "/foo"} +])"_json; + +// apply the patch +json j_result = j_original.patch(j_patch); +// { +// "baz": "boo", +// "hello": ["world"] +// } + +// calculate a JSON patch from two JSON values +json::diff(j_result, j_original); +// [ +// { "op":" replace", "path": "/baz", "value": ["one", "two", "three"] }, +// { "op":"remove","path":"/hello" }, +// { "op":"add","path":"/foo","value":"bar" } +// ] +``` + + ### Implicit conversions The type of the JSON object is determined automatically by the expression to store. Likewise, the stored value is implicitly converted. ```cpp -/// strings +// strings std::string s1 = "Hello, world!"; json js = s1; std::string s2 = js; @@ -382,6 +383,51 @@ int vi = jn.get(); // etc. ``` + +## Supported compilers + +Though it's 2016 already, the support for C++11 is still a bit sparse. Currently, the following compilers are known to work: + +- GCC 4.9 - 6.0 (and possibly later) +- Clang 3.4 - 3.9 (and possibly later) +- Microsoft Visual C++ 2015 / 14.0 (and possibly later) + +I would be happy to learn about other compilers/versions. + +Please note: + +- GCC 4.8 does not work because of two bugs ([55817](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55817) and [57824](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57824)) in the C++11 support. Note there is a [pull request](https://github.com/nlohmann/json/pull/212) to fix some of the issues. +- Android defaults to using very old compilers and C++ libraries. To fix this, add the following to your `Application.mk`. This will switch to the LLVM C++ library, the Clang compiler, and enable C++11 and other features disabled by default. + + ``` + APP_STL := c++_shared + NDK_TOOLCHAIN_VERSION := clang3.6 + APP_CPPFLAGS += -frtti -fexceptions + ``` + + The code compiles successfully with [Android NDK](https://developer.android.com/ndk/index.html?hl=ml), Revision 9 - 11 (and possibly later) and [CrystaX's Android NDK](https://www.crystax.net/en/android/ndk) version 10. + +- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. For Android NDK using `APP_STL := gnustl_static`, please refer to [this discussion](https://github.com/nlohmann/json/issues/219). + +The following compilers are currently used in continuous integration at [Travis](https://travis-ci.org/nlohmann/json) and [AppVeyor](https://ci.appveyor.com/project/nlohmann/json): + +| Compiler | Operating System | Version String | +|-----------------|------------------------------|----------------| +| GCC 4.9.3 | Ubuntu 14.04.4 LTS | g++-4.9 (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3 | +| GCC 5.3.0 | Ubuntu 14.04.4 LTS | g++-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204 | +| GCC 6.1.1 | Ubuntu 14.04.4 LTS | g++-6 (Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511 | +| Clang 3.8.0 | Ubuntu 14.04.4 LTS | clang version 3.8.0 (tags/RELEASE_380/final) | +| Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | +| Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | +| Clang Xcode 6.3 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) | +| Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | +| Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 (OSX 10.10.5) | Apple LLVM version 7.0.0 (clang-700.1.76) | +| Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.0.2 (clang-700.1.81) | +| Clang Xcode 7.3 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.3.0 (clang-703.0.29) | +| Clang Xcode 8.0 | Darwin Kernel Version 15.5.0 (OSX 10.11.5) | Apple LLVM version 8.0.0 (clang-800.0.24.1) | +| Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25123.0 | + + ## License @@ -390,11 +436,12 @@ The class is licensed under the [MIT License](http://opensource.org/licenses/MIT Copyright © 2013-2016 [Niels Lohmann](http://nlohmann.me) -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: +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. +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. + ## Thanks @@ -439,11 +486,13 @@ I deeply appreciate the help of the following people. Thanks a lot for helping out! + ## Notes - The code contains numerous debug **assertions** which can be switched off by defining the preprocessor macro `NDEBUG`, see the [documentation of `assert`](http://en.cppreference.com/w/cpp/error/assert). - As the exact type of a number is not defined in the [JSON specification](http://rfc7159.net/rfc7159), 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. + ## Execute unit tests To compile and run the tests, you need to execute @@ -453,7 +502,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (5568705 assertions in 31 test cases) +All tests passed (5568721 assertions in 32 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/test/src/unit.cpp b/test/src/unit.cpp index 609e1be95..e1c0b4c60 100644 --- a/test/src/unit.cpp +++ b/test/src/unit.cpp @@ -10371,7 +10371,7 @@ TEST_CASE("README", "[hide]") // create object from string literal json j = "{ \"happy\": true, \"pi\": 3.141 }"_json; - // or even nicer (thanks http://isocpp.org/blog/2015/01/json-for-modern-cpp) + // or even nicer with a raw string literal auto j2 = R"( { "happy": true, @@ -10499,7 +10499,7 @@ TEST_CASE("README", "[hide]") } { - /// strings + // strings std::string s1 = "Hello, world!"; json js = s1; std::string s2 = js; @@ -10522,6 +10522,40 @@ TEST_CASE("README", "[hide]") // etc. } + + { + // a JSON value + json j_original = R"({ + "baz": ["one", "two", "three"], + "foo": "bar" + })"_json; + + // access members with a JSON pointer (RFC 6901) + j_original["/baz/2"_json_pointer]; + // "two" + + // a JSON patch (RFC 6902) + json j_patch = R"([ + { "op": "replace", "path": "/baz", "value": "boo" }, + { "op": "add", "path": "/hello", "value": ["world"] }, + { "op": "remove", "path": "/foo"} + ])"_json; + + // apply the patch + json j_result = j_original.patch(j_patch); + // { + // "baz": "boo", + // "hello": ["world"] + // } + + // calculate a JSON patch from two JSON values + json::diff(j_result, j_original); + // [ + // { "op":" replace", "path": "/baz", "value": ["one", "two", "three"] }, + // { "op":"remove","path":"/hello" }, + // { "op":"add","path":"/foo","value":"bar" } + // ] + } } TEST_CASE("algorithms") From 3497fab3b539850c1d2e69f0ee20edf9ee42c9e1 Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 23 Jun 2016 05:55:48 +0200 Subject: [PATCH 129/133] cleanup --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 9f0737fb0..4bb8b0be4 100644 --- a/README.md +++ b/README.md @@ -502,11 +502,7 @@ $ make $ ./json_unit "*" =============================================================================== -<<<<<<< HEAD All tests passed (5568722 assertions in 32 test cases) -======= -All tests passed (5568721 assertions in 32 test cases) ->>>>>>> develop ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). From 39a9cfcc12fdc7e363806488bf15a7a2352ad3ad Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 23 Jun 2016 18:08:20 +0200 Subject: [PATCH 130/133] updated README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4bb8b0be4..21ff3c593 100644 --- a/README.md +++ b/README.md @@ -502,7 +502,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (5568722 assertions in 32 test cases) +All tests passed (5568715 assertions in 32 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). From 6542ae57666e8a9663e629e31598876d3a805bbf Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 23 Jun 2016 22:49:48 +0200 Subject: [PATCH 131/133] fixed re2c warnings --- Makefile | 2 +- src/json.hpp.re2c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 6ea1d85d9..56e46d145 100644 --- a/Makefile +++ b/Makefile @@ -67,7 +67,7 @@ cppcheck: # create scanner with re2c re2c: src/json.hpp.re2c - $(RE2C) --bit-vectors --nested-ifs --no-debug-info $< | $(SED) '1d' > src/json.hpp + $(RE2C) -W --bit-vectors --nested-ifs --no-debug-info $< | $(SED) '1d' > src/json.hpp # pretty printer pretty: diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 05b7ece63..aba10b496 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -7388,10 +7388,10 @@ class basic_json number { return token_type::value_number; } // string - quotation_mark = [\"]; + quotation_mark = ["]; escape = [\\]; - unescaped = [^\"\\\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F]; - single_escaped = [\"\\/bfnrt]; + unescaped = [^"\\\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F]; + single_escaped = ["\\/bfnrt]; unicode_escaped = [u][0-9a-fA-F]{4}; escaped = escape (single_escaped | unicode_escaped); char = unescaped | escaped; From b3cf45c8f5856c802d8a53e2cb1d75276c5131ba Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 23 Jun 2016 23:34:41 +0200 Subject: [PATCH 132/133] updated release information --- ChangeLog.md | 3 +++ doc/json.gif | Bin 366465 -> 451520 bytes 2 files changed, 3 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index a60026f14..ae9e562f9 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -15,9 +15,12 @@ All notable changes to this project will be documented in this file. This projec - Add support for afl-fuzz testing [\#207](https://github.com/nlohmann/json/pull/207) ([mykter](https://github.com/mykter)) - 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)) +- json::diff generates incorrect patch when removing multiple array elements. [\#269](https://github.com/nlohmann/json/issues/269) +- -Wconversion warning [\#259](https://github.com/nlohmann/json/issues/259) - Maybe a bug [\#258](https://github.com/nlohmann/json/issues/258) - -Wconversion warnings [\#239](https://github.com/nlohmann/json/issues/239) - ambiguous overload for 'push\_back' and 'operator+=' [\#235](https://github.com/nlohmann/json/issues/235) +- Incorrect dumping of parsed numbers with exponents, but without decimal places [\#230](https://github.com/nlohmann/json/issues/230) - double values are serialized with commas as decimal points [\#228](https://github.com/nlohmann/json/issues/228) - Move semantics with std::initializer\_list [\#225](https://github.com/nlohmann/json/issues/225) - abort during getline in yyfill [\#223](https://github.com/nlohmann/json/issues/223) diff --git a/doc/json.gif b/doc/json.gif index 7cd94371713db21751ebed893238fcf92ab816ed..7edafe018c464d59c673ee3913805c83a370ae35 100644 GIT binary patch literal 451520 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 m&J1#wT{Q{`kY`7bhd()naR8wcfnY%D2|xgP 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%0Ay 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

OSo0;Zc#jptn@Q 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ⅆp6D;rtR56U4iCkA-?iTw1 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 z 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 literal 366465 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%0Ao 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 {U(aX57iy79l!in<+pAp~9w16}|!>PI#I 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�mULpv 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 From 1c719561b0cfcf5eae67e983d0688ead4aa1dbdc Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 24 Jun 2016 00:14:27 +0200 Subject: [PATCH 133/133] update of documentation links --- doc/examples/README.link | 2 +- doc/examples/array.link | 2 +- doc/examples/at__object_t_key_type.link | 2 +- doc/examples/at__object_t_key_type_const.link | 2 +- doc/examples/at__size_type.link | 2 +- doc/examples/at__size_type_const.link | 2 +- doc/examples/back.link | 2 +- doc/examples/basic_json.link | 2 +- doc/examples/basic_json__CompatibleArrayType.link | 2 +- doc/examples/basic_json__CompatibleIntegerNumberType.link | 2 +- doc/examples/basic_json__CompatibleNumberFloatType.link | 2 +- doc/examples/basic_json__CompatibleObjectType.link | 2 +- doc/examples/basic_json__CompatibleStringType.link | 2 +- doc/examples/basic_json__InputIt_InputIt.link | 2 +- doc/examples/basic_json__array_t.link | 2 +- doc/examples/basic_json__basic_json.link | 2 +- doc/examples/basic_json__boolean_t.link | 2 +- doc/examples/basic_json__const_int.link | 2 +- doc/examples/basic_json__copyassignment.link | 2 +- doc/examples/basic_json__list_init_t.link | 2 +- doc/examples/basic_json__moveconstructor.link | 2 +- doc/examples/basic_json__nullptr_t.link | 2 +- doc/examples/basic_json__number_float_t.link | 2 +- doc/examples/basic_json__number_integer_t.link | 2 +- doc/examples/basic_json__object_t.link | 2 +- doc/examples/basic_json__size_type_basic_json.link | 2 +- doc/examples/basic_json__string_t.link | 2 +- doc/examples/basic_json__string_t_value_type.link | 2 +- doc/examples/basic_json__value.link | 2 +- doc/examples/basic_json__value_t.link | 2 +- doc/examples/begin.link | 2 +- doc/examples/cbegin.link | 2 +- doc/examples/cend.link | 2 +- doc/examples/clear.link | 2 +- doc/examples/count.link | 2 +- doc/examples/crbegin.link | 2 +- doc/examples/crend.link | 2 +- doc/examples/dump.link | 2 +- doc/examples/empty.link | 2 +- doc/examples/end.link | 2 +- doc/examples/erase__IteratorType.link | 2 +- doc/examples/erase__IteratorType_IteratorType.link | 2 +- doc/examples/erase__key_type.link | 2 +- doc/examples/erase__size_type.link | 2 +- doc/examples/find__key_type.link | 2 +- doc/examples/front.link | 2 +- doc/examples/get__PointerType.link | 2 +- doc/examples/get__ValueType_const.link | 2 +- doc/examples/get_ptr.link | 2 +- doc/examples/get_ref.link | 2 +- doc/examples/insert.link | 2 +- doc/examples/insert__count.link | 2 +- doc/examples/insert__ilist.link | 2 +- doc/examples/insert__range.link | 2 +- doc/examples/is_array.link | 2 +- doc/examples/is_boolean.link | 2 +- doc/examples/is_discarded.link | 2 +- doc/examples/is_null.link | 2 +- doc/examples/is_number.link | 2 +- doc/examples/is_number_float.link | 2 +- doc/examples/is_number_integer.link | 2 +- doc/examples/is_number_unsigned.link | 2 +- doc/examples/is_object.link | 2 +- doc/examples/is_primitive.link | 2 +- doc/examples/is_string.link | 2 +- doc/examples/is_structured.link | 2 +- doc/examples/max_size.link | 2 +- doc/examples/object.link | 2 +- doc/examples/operator__ValueType.link | 2 +- doc/examples/operator__equal.link | 2 +- doc/examples/operator__equal__nullptr_t.link | 2 +- doc/examples/operator__greater.link | 2 +- doc/examples/operator__greaterequal.link | 2 +- doc/examples/operator__less.link | 2 +- doc/examples/operator__lessequal.link | 2 +- doc/examples/operator__notequal.link | 2 +- doc/examples/operator__notequal__nullptr_t.link | 2 +- doc/examples/operator__value_t.link | 2 +- doc/examples/operator_deserialize.link | 2 +- doc/examples/operator_serialize.link | 2 +- doc/examples/operatorarray__key_type.link | 2 +- doc/examples/operatorarray__key_type_const.link | 2 +- doc/examples/operatorarray__size_type.link | 2 +- doc/examples/operatorarray__size_type_const.link | 2 +- doc/examples/parse__istream__parser_callback_t.link | 2 +- doc/examples/parse__string__parser_callback_t.link | 2 +- doc/examples/push_back.link | 2 +- doc/examples/push_back__object_t__value.link | 2 +- doc/examples/rbegin.link | 2 +- doc/examples/rend.link | 2 +- doc/examples/size.link | 2 +- doc/examples/swap__array_t.link | 2 +- doc/examples/swap__object_t.link | 2 +- doc/examples/swap__reference.link | 2 +- doc/examples/swap__string_t.link | 2 +- doc/examples/type.link | 2 +- 96 files changed, 96 insertions(+), 96 deletions(-) diff --git a/doc/examples/README.link b/doc/examples/README.link index a2526dc64..ed559e19f 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/array.link b/doc/examples/array.link index 626dcd25c..cafca79cf 100644 --- a/doc/examples/array.link +++ b/doc/examples/array.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/at__object_t_key_type.link b/doc/examples/at__object_t_key_type.link index f7e44b204..e01197e69 100644 --- a/doc/examples/at__object_t_key_type.link +++ b/doc/examples/at__object_t_key_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/at__object_t_key_type_const.link b/doc/examples/at__object_t_key_type_const.link index 8ba211662..2588529b8 100644 --- a/doc/examples/at__object_t_key_type_const.link +++ b/doc/examples/at__object_t_key_type_const.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/at__size_type.link b/doc/examples/at__size_type.link index 76a409c20..00e42d300 100644 --- a/doc/examples/at__size_type.link +++ b/doc/examples/at__size_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/at__size_type_const.link b/doc/examples/at__size_type_const.link index 5a1cdde95..0fefb628c 100644 --- a/doc/examples/at__size_type_const.link +++ b/doc/examples/at__size_type_const.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/back.link b/doc/examples/back.link index 49d008f5b..0b0097805 100644 --- a/doc/examples/back.link +++ b/doc/examples/back.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json.link b/doc/examples/basic_json.link index 1625c487a..e5c17c93a 100644 --- a/doc/examples/basic_json.link +++ b/doc/examples/basic_json.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__CompatibleArrayType.link b/doc/examples/basic_json__CompatibleArrayType.link index 313ae3fed..85f64862f 100644 --- a/doc/examples/basic_json__CompatibleArrayType.link +++ b/doc/examples/basic_json__CompatibleArrayType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__CompatibleIntegerNumberType.link b/doc/examples/basic_json__CompatibleIntegerNumberType.link index f994babb3..7a37e9eb2 100644 --- a/doc/examples/basic_json__CompatibleIntegerNumberType.link +++ b/doc/examples/basic_json__CompatibleIntegerNumberType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__CompatibleNumberFloatType.link b/doc/examples/basic_json__CompatibleNumberFloatType.link index 9e08b6a64..9fbc73177 100644 --- a/doc/examples/basic_json__CompatibleNumberFloatType.link +++ b/doc/examples/basic_json__CompatibleNumberFloatType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__CompatibleObjectType.link b/doc/examples/basic_json__CompatibleObjectType.link index 6d65b17a4..7512fb35a 100644 --- a/doc/examples/basic_json__CompatibleObjectType.link +++ b/doc/examples/basic_json__CompatibleObjectType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__CompatibleStringType.link b/doc/examples/basic_json__CompatibleStringType.link index 2131a163b..351d6c0ce 100644 --- a/doc/examples/basic_json__CompatibleStringType.link +++ b/doc/examples/basic_json__CompatibleStringType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__InputIt_InputIt.link b/doc/examples/basic_json__InputIt_InputIt.link index 3ce3686ad..ae46528cc 100644 --- a/doc/examples/basic_json__InputIt_InputIt.link +++ b/doc/examples/basic_json__InputIt_InputIt.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__array_t.link b/doc/examples/basic_json__array_t.link index 53322832d..70c9cb8cd 100644 --- a/doc/examples/basic_json__array_t.link +++ b/doc/examples/basic_json__array_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__basic_json.link b/doc/examples/basic_json__basic_json.link index c3109d16e..78fcbbe54 100644 --- a/doc/examples/basic_json__basic_json.link +++ b/doc/examples/basic_json__basic_json.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__boolean_t.link b/doc/examples/basic_json__boolean_t.link index 9fe211e42..c64e1fc47 100644 --- a/doc/examples/basic_json__boolean_t.link +++ b/doc/examples/basic_json__boolean_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__const_int.link b/doc/examples/basic_json__const_int.link index 73d286286..68a9e235d 100644 --- a/doc/examples/basic_json__const_int.link +++ b/doc/examples/basic_json__const_int.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__copyassignment.link b/doc/examples/basic_json__copyassignment.link index 96679cf45..efcac3062 100644 --- a/doc/examples/basic_json__copyassignment.link +++ b/doc/examples/basic_json__copyassignment.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__list_init_t.link b/doc/examples/basic_json__list_init_t.link index 5eca20502..bcdf66890 100644 --- a/doc/examples/basic_json__list_init_t.link +++ b/doc/examples/basic_json__list_init_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__moveconstructor.link b/doc/examples/basic_json__moveconstructor.link index 88002bbd8..9580d02c0 100644 --- a/doc/examples/basic_json__moveconstructor.link +++ b/doc/examples/basic_json__moveconstructor.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__nullptr_t.link b/doc/examples/basic_json__nullptr_t.link index bb26af46d..7e9177522 100644 --- a/doc/examples/basic_json__nullptr_t.link +++ b/doc/examples/basic_json__nullptr_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__number_float_t.link b/doc/examples/basic_json__number_float_t.link index a7c6b6074..47aa2553a 100644 --- a/doc/examples/basic_json__number_float_t.link +++ b/doc/examples/basic_json__number_float_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__number_integer_t.link b/doc/examples/basic_json__number_integer_t.link index 764aa649d..5d4499b59 100644 --- a/doc/examples/basic_json__number_integer_t.link +++ b/doc/examples/basic_json__number_integer_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__object_t.link b/doc/examples/basic_json__object_t.link index f6bad665a..2e07a3efb 100644 --- a/doc/examples/basic_json__object_t.link +++ b/doc/examples/basic_json__object_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__size_type_basic_json.link b/doc/examples/basic_json__size_type_basic_json.link index 6ae76b6f2..78305dcf6 100644 --- a/doc/examples/basic_json__size_type_basic_json.link +++ b/doc/examples/basic_json__size_type_basic_json.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__string_t.link b/doc/examples/basic_json__string_t.link index a5051e582..d7d02f2fb 100644 --- a/doc/examples/basic_json__string_t.link +++ b/doc/examples/basic_json__string_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__string_t_value_type.link b/doc/examples/basic_json__string_t_value_type.link index 4646b5b2a..569087684 100644 --- a/doc/examples/basic_json__string_t_value_type.link +++ b/doc/examples/basic_json__string_t_value_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__value.link b/doc/examples/basic_json__value.link index 452a1fe4f..27e1ddebd 100644 --- a/doc/examples/basic_json__value.link +++ b/doc/examples/basic_json__value.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__value_t.link b/doc/examples/basic_json__value_t.link index 774aaa255..e7e744c11 100644 --- a/doc/examples/basic_json__value_t.link +++ b/doc/examples/basic_json__value_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/begin.link b/doc/examples/begin.link index 6a76a5887..64eac7026 100644 --- a/doc/examples/begin.link +++ b/doc/examples/begin.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/cbegin.link b/doc/examples/cbegin.link index 83c75dd3c..c298c6530 100644 --- a/doc/examples/cbegin.link +++ b/doc/examples/cbegin.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/cend.link b/doc/examples/cend.link index acca215d2..61a3203d5 100644 --- a/doc/examples/cend.link +++ b/doc/examples/cend.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/clear.link b/doc/examples/clear.link index 8defa668d..9ad0a14f0 100644 --- a/doc/examples/clear.link +++ b/doc/examples/clear.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/count.link b/doc/examples/count.link index e13caf363..62833ff46 100644 --- a/doc/examples/count.link +++ b/doc/examples/count.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/crbegin.link b/doc/examples/crbegin.link index 27de8eb89..1188be1ea 100644 --- a/doc/examples/crbegin.link +++ b/doc/examples/crbegin.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/crend.link b/doc/examples/crend.link index c678236d9..4bdfef3ac 100644 --- a/doc/examples/crend.link +++ b/doc/examples/crend.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/dump.link b/doc/examples/dump.link index 35ef46533..5cf3e634b 100644 --- a/doc/examples/dump.link +++ b/doc/examples/dump.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/empty.link b/doc/examples/empty.link index fd22770cf..12aa96782 100644 --- a/doc/examples/empty.link +++ b/doc/examples/empty.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/end.link b/doc/examples/end.link index 260696d5a..462a463f1 100644 --- a/doc/examples/end.link +++ b/doc/examples/end.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/erase__IteratorType.link b/doc/examples/erase__IteratorType.link index b523066ed..854a9be5f 100644 --- a/doc/examples/erase__IteratorType.link +++ b/doc/examples/erase__IteratorType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/erase__IteratorType_IteratorType.link b/doc/examples/erase__IteratorType_IteratorType.link index b7f3da724..26e0b9034 100644 --- a/doc/examples/erase__IteratorType_IteratorType.link +++ b/doc/examples/erase__IteratorType_IteratorType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/erase__key_type.link b/doc/examples/erase__key_type.link index bef018cab..e4c2fba1d 100644 --- a/doc/examples/erase__key_type.link +++ b/doc/examples/erase__key_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/erase__size_type.link b/doc/examples/erase__size_type.link index fe2d560d5..c63abe525 100644 --- a/doc/examples/erase__size_type.link +++ b/doc/examples/erase__size_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/find__key_type.link b/doc/examples/find__key_type.link index 2bc0512d1..cd3d4fd25 100644 --- a/doc/examples/find__key_type.link +++ b/doc/examples/find__key_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/front.link b/doc/examples/front.link index 22e99c7dd..d69c7f90c 100644 --- a/doc/examples/front.link +++ b/doc/examples/front.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/get__PointerType.link b/doc/examples/get__PointerType.link index a811b26df..68a46b571 100644 --- a/doc/examples/get__PointerType.link +++ b/doc/examples/get__PointerType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/get__ValueType_const.link b/doc/examples/get__ValueType_const.link index fce774b2b..95862c671 100644 --- a/doc/examples/get__ValueType_const.link +++ b/doc/examples/get__ValueType_const.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/get_ptr.link b/doc/examples/get_ptr.link index e318d7780..13ed7d818 100644 --- a/doc/examples/get_ptr.link +++ b/doc/examples/get_ptr.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/get_ref.link b/doc/examples/get_ref.link index c0d8275a3..ef560c42c 100644 --- a/doc/examples/get_ref.link +++ b/doc/examples/get_ref.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/insert.link b/doc/examples/insert.link index 3886e04d5..9b0a1d90a 100644 --- a/doc/examples/insert.link +++ b/doc/examples/insert.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/insert__count.link b/doc/examples/insert__count.link index b97d0d69f..f6a6441d7 100644 --- a/doc/examples/insert__count.link +++ b/doc/examples/insert__count.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/insert__ilist.link b/doc/examples/insert__ilist.link index 4920588b5..eba2b5607 100644 --- a/doc/examples/insert__ilist.link +++ b/doc/examples/insert__ilist.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/insert__range.link b/doc/examples/insert__range.link index ac773f8b2..3a802b572 100644 --- a/doc/examples/insert__range.link +++ b/doc/examples/insert__range.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_array.link b/doc/examples/is_array.link index 8c8b9f825..ccd727507 100644 --- a/doc/examples/is_array.link +++ b/doc/examples/is_array.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_boolean.link b/doc/examples/is_boolean.link index 62f5fed14..5ebc9acb3 100644 --- a/doc/examples/is_boolean.link +++ b/doc/examples/is_boolean.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_discarded.link b/doc/examples/is_discarded.link index 7ce69a104..d2172392c 100644 --- a/doc/examples/is_discarded.link +++ b/doc/examples/is_discarded.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_null.link b/doc/examples/is_null.link index 6b22b9780..d40569d23 100644 --- a/doc/examples/is_null.link +++ b/doc/examples/is_null.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_number.link b/doc/examples/is_number.link index bf863a1cf..089d7893d 100644 --- a/doc/examples/is_number.link +++ b/doc/examples/is_number.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_number_float.link b/doc/examples/is_number_float.link index 38abb5985..3fa73533c 100644 --- a/doc/examples/is_number_float.link +++ b/doc/examples/is_number_float.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_number_integer.link b/doc/examples/is_number_integer.link index d6162ab0e..474cded4b 100644 --- a/doc/examples/is_number_integer.link +++ b/doc/examples/is_number_integer.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_number_unsigned.link b/doc/examples/is_number_unsigned.link index 41986cefa..0849b8e56 100644 --- a/doc/examples/is_number_unsigned.link +++ b/doc/examples/is_number_unsigned.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_object.link b/doc/examples/is_object.link index 1a304d09a..5bd827c21 100644 --- a/doc/examples/is_object.link +++ b/doc/examples/is_object.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_primitive.link b/doc/examples/is_primitive.link index eb73ffb1b..6de65c795 100644 --- a/doc/examples/is_primitive.link +++ b/doc/examples/is_primitive.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_string.link b/doc/examples/is_string.link index 6af78b0ba..86ef2b45c 100644 --- a/doc/examples/is_string.link +++ b/doc/examples/is_string.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_structured.link b/doc/examples/is_structured.link index 8ae6fd044..43385c8b7 100644 --- a/doc/examples/is_structured.link +++ b/doc/examples/is_structured.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/max_size.link b/doc/examples/max_size.link index d91bc8cda..5719ccaac 100644 --- a/doc/examples/max_size.link +++ b/doc/examples/max_size.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/object.link b/doc/examples/object.link index 575473b35..fd0f424b9 100644 --- a/doc/examples/object.link +++ b/doc/examples/object.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__ValueType.link b/doc/examples/operator__ValueType.link index 204d8f5e3..1428a679c 100644 --- a/doc/examples/operator__ValueType.link +++ b/doc/examples/operator__ValueType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__equal.link b/doc/examples/operator__equal.link index 41ae20ce3..867075204 100644 --- a/doc/examples/operator__equal.link +++ b/doc/examples/operator__equal.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__equal__nullptr_t.link b/doc/examples/operator__equal__nullptr_t.link index 49e46fd65..d52acab41 100644 --- a/doc/examples/operator__equal__nullptr_t.link +++ b/doc/examples/operator__equal__nullptr_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__greater.link b/doc/examples/operator__greater.link index 2299d6102..5499771d8 100644 --- a/doc/examples/operator__greater.link +++ b/doc/examples/operator__greater.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__greaterequal.link b/doc/examples/operator__greaterequal.link index fdd676e6e..e476f3964 100644 --- a/doc/examples/operator__greaterequal.link +++ b/doc/examples/operator__greaterequal.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__less.link b/doc/examples/operator__less.link index 5d7f6f566..d50c2207c 100644 --- a/doc/examples/operator__less.link +++ b/doc/examples/operator__less.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__lessequal.link b/doc/examples/operator__lessequal.link index 620b6aa8a..3b71a46d0 100644 --- a/doc/examples/operator__lessequal.link +++ b/doc/examples/operator__lessequal.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__notequal.link b/doc/examples/operator__notequal.link index 482b97212..49f1529ce 100644 --- a/doc/examples/operator__notequal.link +++ b/doc/examples/operator__notequal.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__notequal__nullptr_t.link b/doc/examples/operator__notequal__nullptr_t.link index 40f6bb4fe..210336234 100644 --- a/doc/examples/operator__notequal__nullptr_t.link +++ b/doc/examples/operator__notequal__nullptr_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__value_t.link b/doc/examples/operator__value_t.link index a97072328..3139efa11 100644 --- a/doc/examples/operator__value_t.link +++ b/doc/examples/operator__value_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator_deserialize.link b/doc/examples/operator_deserialize.link index 27e998d9a..fea1503eb 100644 --- a/doc/examples/operator_deserialize.link +++ b/doc/examples/operator_deserialize.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator_serialize.link b/doc/examples/operator_serialize.link index 231306ac2..45b5f4b16 100644 --- a/doc/examples/operator_serialize.link +++ b/doc/examples/operator_serialize.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operatorarray__key_type.link b/doc/examples/operatorarray__key_type.link index 40df071bf..d597ad787 100644 --- a/doc/examples/operatorarray__key_type.link +++ b/doc/examples/operatorarray__key_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operatorarray__key_type_const.link b/doc/examples/operatorarray__key_type_const.link index bba664a5c..d34adb46c 100644 --- a/doc/examples/operatorarray__key_type_const.link +++ b/doc/examples/operatorarray__key_type_const.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operatorarray__size_type.link b/doc/examples/operatorarray__size_type.link index b9d578810..aa5f718a9 100644 --- a/doc/examples/operatorarray__size_type.link +++ b/doc/examples/operatorarray__size_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operatorarray__size_type_const.link b/doc/examples/operatorarray__size_type_const.link index a1f8c98b7..a5c351e62 100644 --- a/doc/examples/operatorarray__size_type_const.link +++ b/doc/examples/operatorarray__size_type_const.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/parse__istream__parser_callback_t.link b/doc/examples/parse__istream__parser_callback_t.link index 85960e159..4d2d0a9cd 100644 --- a/doc/examples/parse__istream__parser_callback_t.link +++ b/doc/examples/parse__istream__parser_callback_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/parse__string__parser_callback_t.link b/doc/examples/parse__string__parser_callback_t.link index 9db1c3b83..1ad3b7199 100644 --- a/doc/examples/parse__string__parser_callback_t.link +++ b/doc/examples/parse__string__parser_callback_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/push_back.link b/doc/examples/push_back.link index 8ec17dbac..d0ca11be9 100644 --- a/doc/examples/push_back.link +++ b/doc/examples/push_back.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/push_back__object_t__value.link b/doc/examples/push_back__object_t__value.link index 24882e38c..04bdbd9b8 100644 --- a/doc/examples/push_back__object_t__value.link +++ b/doc/examples/push_back__object_t__value.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/rbegin.link b/doc/examples/rbegin.link index de269d74b..79ed80c38 100644 --- a/doc/examples/rbegin.link +++ b/doc/examples/rbegin.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/rend.link b/doc/examples/rend.link index 17faa9117..6e8850f06 100644 --- a/doc/examples/rend.link +++ b/doc/examples/rend.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/size.link b/doc/examples/size.link index 4cc0afa10..9b546197a 100644 --- a/doc/examples/size.link +++ b/doc/examples/size.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/swap__array_t.link b/doc/examples/swap__array_t.link index 8851fdb98..1dca248ca 100644 --- a/doc/examples/swap__array_t.link +++ b/doc/examples/swap__array_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/swap__object_t.link b/doc/examples/swap__object_t.link index 8bd7495ef..cdb94e9a6 100644 --- a/doc/examples/swap__object_t.link +++ b/doc/examples/swap__object_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/swap__reference.link b/doc/examples/swap__reference.link index 3ee4c0df8..262d1961c 100644 --- a/doc/examples/swap__reference.link +++ b/doc/examples/swap__reference.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/swap__string_t.link b/doc/examples/swap__string_t.link index 719313695..f3c448d50 100644 --- a/doc/examples/swap__string_t.link +++ b/doc/examples/swap__string_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/type.link b/doc/examples/type.link index f197d847a..ccb4422b0 100644 --- a/doc/examples/type.link +++ b/doc/examples/type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file

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¨? 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