From 1be63431f3910f09aa5ada66bc691ac391e50794 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 30 Jun 2019 12:19:41 +0200 Subject: [PATCH] :sparkles: make emplace_back return a reference #1609 --- include/nlohmann/json.hpp | 11 +++++++++-- single_include/nlohmann/json.hpp | 11 +++++++++-- test/src/unit-modifiers.cpp | 12 ++++++++---- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 58db19d7..7e94518a 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -4952,6 +4952,8 @@ class basic_json @param[in] args arguments to forward to a constructor of @ref basic_json @tparam Args compatible types to create a @ref basic_json object + @return reference to the inserted element + @throw type_error.311 when called on a type other than JSON array or null; example: `"cannot use emplace_back() with number"` @@ -4961,10 +4963,10 @@ class basic_json elements to a JSON array. Note how the `null` value was silently converted to a JSON array.,emplace_back} - @since version 2.0.8 + @since version 2.0.8, returns reference since 3.7.0 */ template - void emplace_back(Args&& ... args) + reference emplace_back(Args&& ... args) { // emplace_back only works for null objects or arrays if (JSON_UNLIKELY(not(is_null() or is_array()))) @@ -4981,7 +4983,12 @@ class basic_json } // add element to array (perfect forwarding) +#ifdef JSON_HAS_CPP_17 + return m_value.array->emplace_back(std::forward(args)...); +#else m_value.array->emplace_back(std::forward(args)...); + return m_value.array->back(); +#endif } /*! diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 08c4fc64..c2dd4e9a 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -17763,6 +17763,8 @@ class basic_json @param[in] args arguments to forward to a constructor of @ref basic_json @tparam Args compatible types to create a @ref basic_json object + @return reference to the inserted element + @throw type_error.311 when called on a type other than JSON array or null; example: `"cannot use emplace_back() with number"` @@ -17772,10 +17774,10 @@ class basic_json elements to a JSON array. Note how the `null` value was silently converted to a JSON array.,emplace_back} - @since version 2.0.8 + @since version 2.0.8, returns reference since 3.7.0 */ template - void emplace_back(Args&& ... args) + reference emplace_back(Args&& ... args) { // emplace_back only works for null objects or arrays if (JSON_UNLIKELY(not(is_null() or is_array()))) @@ -17792,7 +17794,12 @@ class basic_json } // add element to array (perfect forwarding) +#ifdef JSON_HAS_CPP_17 + return m_value.array->emplace_back(std::forward(args)...); +#else m_value.array->emplace_back(std::forward(args)...); + return m_value.array->back(); +#endif } /*! diff --git a/test/src/unit-modifiers.cpp b/test/src/unit-modifiers.cpp index 17081f22..cbfd09e4 100644 --- a/test/src/unit-modifiers.cpp +++ b/test/src/unit-modifiers.cpp @@ -290,8 +290,10 @@ TEST_CASE("modifiers") SECTION("null") { json j; - j.emplace_back(1); - j.emplace_back(2); + auto& x1 = j.emplace_back(1); + CHECK(x1 == 1); + auto& x2 = j.emplace_back(2); + CHECK(x2 == 2); CHECK(j.type() == json::value_t::array); CHECK(j == json({1, 2})); } @@ -299,7 +301,8 @@ TEST_CASE("modifiers") SECTION("array") { json j = {1, 2, 3}; - j.emplace_back("Hello"); + auto& x = j.emplace_back("Hello"); + CHECK(x == "Hello"); CHECK(j.type() == json::value_t::array); CHECK(j == json({1, 2, 3, "Hello"})); } @@ -307,7 +310,8 @@ TEST_CASE("modifiers") SECTION("multiple values") { json j; - j.emplace_back(3, "foo"); + auto& x = j.emplace_back(3, "foo"); + CHECK(x == json({"foo", "foo", "foo"})); CHECK(j.type() == json::value_t::array); CHECK(j == json({{"foo", "foo", "foo"}})); }