✨ make emplace_back return a reference #1609
This commit is contained in:
parent
9a775bcb14
commit
1be63431f3
3 changed files with 26 additions and 8 deletions
|
@ -4952,6 +4952,8 @@ class basic_json
|
||||||
@param[in] args arguments to forward to a constructor of @ref 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
|
@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
|
@throw type_error.311 when called on a type other than JSON array or
|
||||||
null; example: `"cannot use emplace_back() with number"`
|
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
|
elements to a JSON array. Note how the `null` value was silently converted
|
||||||
to a JSON array.,emplace_back}
|
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>
|
template<class... Args>
|
||||||
void emplace_back(Args&& ... args)
|
reference emplace_back(Args&& ... args)
|
||||||
{
|
{
|
||||||
// emplace_back only works for null objects or arrays
|
// emplace_back only works for null objects or arrays
|
||||||
if (JSON_UNLIKELY(not(is_null() or is_array())))
|
if (JSON_UNLIKELY(not(is_null() or is_array())))
|
||||||
|
@ -4981,7 +4983,12 @@ class basic_json
|
||||||
}
|
}
|
||||||
|
|
||||||
// add element to array (perfect forwarding)
|
// 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)...);
|
m_value.array->emplace_back(std::forward<Args>(args)...);
|
||||||
|
return m_value.array->back();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
|
@ -17763,6 +17763,8 @@ class basic_json
|
||||||
@param[in] args arguments to forward to a constructor of @ref 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
|
@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
|
@throw type_error.311 when called on a type other than JSON array or
|
||||||
null; example: `"cannot use emplace_back() with number"`
|
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
|
elements to a JSON array. Note how the `null` value was silently converted
|
||||||
to a JSON array.,emplace_back}
|
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>
|
template<class... Args>
|
||||||
void emplace_back(Args&& ... args)
|
reference emplace_back(Args&& ... args)
|
||||||
{
|
{
|
||||||
// emplace_back only works for null objects or arrays
|
// emplace_back only works for null objects or arrays
|
||||||
if (JSON_UNLIKELY(not(is_null() or is_array())))
|
if (JSON_UNLIKELY(not(is_null() or is_array())))
|
||||||
|
@ -17792,7 +17794,12 @@ class basic_json
|
||||||
}
|
}
|
||||||
|
|
||||||
// add element to array (perfect forwarding)
|
// 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)...);
|
m_value.array->emplace_back(std::forward<Args>(args)...);
|
||||||
|
return m_value.array->back();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
|
@ -290,8 +290,10 @@ TEST_CASE("modifiers")
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j;
|
json j;
|
||||||
j.emplace_back(1);
|
auto& x1 = j.emplace_back(1);
|
||||||
j.emplace_back(2);
|
CHECK(x1 == 1);
|
||||||
|
auto& x2 = j.emplace_back(2);
|
||||||
|
CHECK(x2 == 2);
|
||||||
CHECK(j.type() == json::value_t::array);
|
CHECK(j.type() == json::value_t::array);
|
||||||
CHECK(j == json({1, 2}));
|
CHECK(j == json({1, 2}));
|
||||||
}
|
}
|
||||||
|
@ -299,7 +301,8 @@ TEST_CASE("modifiers")
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j = {1, 2, 3};
|
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.type() == json::value_t::array);
|
||||||
CHECK(j == json({1, 2, 3, "Hello"}));
|
CHECK(j == json({1, 2, 3, "Hello"}));
|
||||||
}
|
}
|
||||||
|
@ -307,7 +310,8 @@ TEST_CASE("modifiers")
|
||||||
SECTION("multiple values")
|
SECTION("multiple values")
|
||||||
{
|
{
|
||||||
json j;
|
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.type() == json::value_t::array);
|
||||||
CHECK(j == json({{"foo", "foo", "foo"}}));
|
CHECK(j == json({{"foo", "foo", "foo"}}));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue