Skip to content

Commit

Permalink
✨ make emplace_back return a reference #1609
Browse files Browse the repository at this point in the history
  • Loading branch information
nlohmann committed Jun 30, 2019
1 parent 9a775bc commit 1be6343
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 8 deletions.
11 changes: 9 additions & 2 deletions include/nlohmann/json.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand All @@ -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<class... Args>
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())))
Expand All @@ -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>(args)...);
#else
m_value.array->emplace_back(std::forward<Args>(args)...);
return m_value.array->back();
#endif
}

/*!
Expand Down
11 changes: 9 additions & 2 deletions single_include/nlohmann/json.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"`

Expand All @@ -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<class... Args>
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())))
Expand All @@ -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>(args)...);
#else
m_value.array->emplace_back(std::forward<Args>(args)...);
return m_value.array->back();
#endif
}

/*!
Expand Down
12 changes: 8 additions & 4 deletions test/src/unit-modifiers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -290,24 +290,28 @@ 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}));
}

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"}));
}

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"}}));
}
Expand Down

0 comments on commit 1be6343

Please sign in to comment.