mirror of
https://github.com/nlohmann/json.git
synced 2025-07-24 02:21:01 +03:00
Merge branch 'develop' into fix/1237
This commit is contained in:
@ -2623,6 +2623,52 @@ class basic_json
|
||||
return JSONSerializer<ValueTypeCV>::from_json(*this);
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief get a value (explicit)
|
||||
|
||||
Explicit type conversion between the JSON value and a compatible value.
|
||||
The value is filled into the input parameter by calling the @ref json_serializer<ValueType>
|
||||
`from_json()` method.
|
||||
|
||||
The function is equivalent to executing
|
||||
@code {.cpp}
|
||||
ValueType v;
|
||||
JSONSerializer<ValueType>::from_json(*this, v);
|
||||
@endcode
|
||||
|
||||
This overloads is chosen if:
|
||||
- @a ValueType is not @ref basic_json,
|
||||
- @ref json_serializer<ValueType> has a `from_json()` method of the form
|
||||
`void from_json(const basic_json&, ValueType&)`, and
|
||||
|
||||
@tparam ValueType the input parameter type.
|
||||
|
||||
@return the input parameter, allowing chaining calls.
|
||||
|
||||
@throw what @ref json_serializer<ValueType> `from_json()` method throws
|
||||
|
||||
@liveexample{The example below shows several conversions from JSON values
|
||||
to other types. There a few things to note: (1) Floating-point numbers can
|
||||
be converted to integers\, (2) A JSON array can be converted to a standard
|
||||
`std::vector<short>`\, (3) A JSON object can be converted to C++
|
||||
associative containers such as `std::unordered_map<std::string\,
|
||||
json>`.,get_to}
|
||||
|
||||
@since version 3.3.0
|
||||
*/
|
||||
template<typename ValueType,
|
||||
detail::enable_if_t <
|
||||
not detail::is_basic_json<ValueType>::value and
|
||||
detail::has_from_json<basic_json_t, ValueType>::value,
|
||||
int> = 0>
|
||||
ValueType & get_to(ValueType& v) const noexcept(noexcept(
|
||||
JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), v)))
|
||||
{
|
||||
JSONSerializer<ValueType>::from_json(*this, v);
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
@brief get a pointer value (implicit)
|
||||
|
||||
@ -4915,6 +4961,26 @@ class basic_json
|
||||
return {it, res.second};
|
||||
}
|
||||
|
||||
/// Helper for insertion of an iterator
|
||||
/// @note: This uses std::distance to support GCC 4.8,
|
||||
/// see https://github.com/nlohmann/json/pull/1257
|
||||
template<typename... Args>
|
||||
iterator insert_iterator(const_iterator pos, Args&& ... args)
|
||||
{
|
||||
iterator result(this);
|
||||
assert(m_value.array != nullptr);
|
||||
|
||||
auto insert_pos = std::distance(m_value.array->begin(), pos.m_it.array_iterator);
|
||||
m_value.array->insert(pos.m_it.array_iterator, std::forward<Args>(args)...);
|
||||
result.m_it.array_iterator = m_value.array->begin() + insert_pos;
|
||||
|
||||
// This could have been written as:
|
||||
// result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val);
|
||||
// but the return value of insert is missing in GCC 4.8, so it is written this way instead.
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief inserts element
|
||||
|
||||
@ -4949,9 +5015,7 @@ class basic_json
|
||||
}
|
||||
|
||||
// insert to array and return iterator
|
||||
iterator result(this);
|
||||
result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, val);
|
||||
return result;
|
||||
return insert_iterator(pos, val);
|
||||
}
|
||||
|
||||
JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name())));
|
||||
@ -5002,9 +5066,7 @@ class basic_json
|
||||
}
|
||||
|
||||
// insert to array and return iterator
|
||||
iterator result(this);
|
||||
result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val);
|
||||
return result;
|
||||
return insert_iterator(pos, cnt, val);
|
||||
}
|
||||
|
||||
JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name())));
|
||||
@ -5066,12 +5128,7 @@ class basic_json
|
||||
}
|
||||
|
||||
// insert to array and return iterator
|
||||
iterator result(this);
|
||||
result.m_it.array_iterator = m_value.array->insert(
|
||||
pos.m_it.array_iterator,
|
||||
first.m_it.array_iterator,
|
||||
last.m_it.array_iterator);
|
||||
return result;
|
||||
return insert_iterator(pos, first.m_it.array_iterator, last.m_it.array_iterator);
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -5113,9 +5170,7 @@ class basic_json
|
||||
}
|
||||
|
||||
// insert to array and return iterator
|
||||
iterator result(this);
|
||||
result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, ilist.begin(), ilist.end());
|
||||
return result;
|
||||
return insert_iterator(pos, ilist.begin(), ilist.end());
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -7663,19 +7718,6 @@ class basic_json
|
||||
// specialization of std::swap, and std::hash
|
||||
namespace std
|
||||
{
|
||||
/*!
|
||||
@brief exchanges the values of two JSON objects
|
||||
|
||||
@since version 1.0.0
|
||||
*/
|
||||
template<>
|
||||
inline void swap<nlohmann::json>(nlohmann::json& j1, nlohmann::json& j2) noexcept(
|
||||
is_nothrow_move_constructible<nlohmann::json>::value and
|
||||
is_nothrow_move_assignable<nlohmann::json>::value
|
||||
)
|
||||
{
|
||||
j1.swap(j2);
|
||||
}
|
||||
|
||||
/// hash value for JSON objects
|
||||
template<>
|
||||
@ -7711,6 +7753,20 @@ struct less< ::nlohmann::detail::value_t>
|
||||
}
|
||||
};
|
||||
|
||||
/*!
|
||||
@brief exchanges the values of two JSON objects
|
||||
|
||||
@since version 1.0.0
|
||||
*/
|
||||
template<>
|
||||
inline void swap<nlohmann::json>(nlohmann::json& j1, nlohmann::json& j2) noexcept(
|
||||
is_nothrow_move_constructible<nlohmann::json>::value and
|
||||
is_nothrow_move_assignable<nlohmann::json>::value
|
||||
)
|
||||
{
|
||||
j1.swap(j2);
|
||||
}
|
||||
|
||||
} // namespace std
|
||||
|
||||
/*!
|
||||
|
Reference in New Issue
Block a user