Commit 66c182be by Jonathan Wakely Committed by Jonathan Wakely

try_emplace and insert_or_assign for Debug Mode.

	* include/debug/map.h (map::try_emplace, map::insert_or_assign):
	Define.
	* include/debug/unordered_map (unordered_map::try_emplace,
	unordered_map::insert_or_assign): Define.

From-SVN: r227229
parent e41fd1f0
2015-08-26 Jonathan Wakely <jwakely@redhat.com> 2015-08-26 Jonathan Wakely <jwakely@redhat.com>
* include/debug/map.h (map::try_emplace, map::insert_or_assign):
Define.
* include/debug/unordered_map (unordered_map::try_emplace,
unordered_map::insert_or_assign): Define.
PR libstdc++/66902 PR libstdc++/66902
* src/c++11/debug.cc (_S_debug_messages): Give internal linkage. * src/c++11/debug.cc (_S_debug_messages): Give internal linkage.
......
...@@ -317,6 +317,89 @@ namespace __debug ...@@ -317,6 +317,89 @@ namespace __debug
_Base::insert(__first, __last); _Base::insert(__first, __last);
} }
#if __cplusplus > 201402L
template <typename... _Args>
pair<iterator, bool>
try_emplace(const key_type& __k, _Args&&... __args)
{
auto __res = _Base::try_emplace(__k,
std::forward<_Args>(__args)...);
return { iterator(__res.first, this), __res.second };
}
template <typename... _Args>
pair<iterator, bool>
try_emplace(key_type&& __k, _Args&&... __args)
{
auto __res = _Base::try_emplace(std::move(__k),
std::forward<_Args>(__args)...);
return { iterator(__res.first, this), __res.second };
}
template <typename... _Args>
iterator
try_emplace(const_iterator __hint, const key_type& __k,
_Args&&... __args)
{
__glibcxx_check_insert(__hint);
return iterator(_Base::try_emplace(__hint.base(), __k,
std::forward<_Args>(__args)...),
this);
}
template <typename... _Args>
iterator
try_emplace(const_iterator __hint, key_type&& __k, _Args&&... __args)
{
__glibcxx_check_insert(__hint);
return iterator(_Base::try_emplace(__hint.base(), std::move(__k),
std::forward<_Args>(__args)...),
this);
}
template <typename _Obj>
std::pair<iterator, bool>
insert_or_assign(const key_type& __k, _Obj&& __obj)
{
auto __res = _Base::insert_or_assign(__k,
std::forward<_Obj>(__obj));
return { iterator(__res.first, this), __res.second };
}
template <typename _Obj>
std::pair<iterator, bool>
insert_or_assign(key_type&& __k, _Obj&& __obj)
{
auto __res = _Base::insert_or_assign(std::move(__k),
std::forward<_Obj>(__obj));
return { iterator(__res.first, this), __res.second };
}
template <typename _Obj>
iterator
insert_or_assign(const_iterator __hint,
const key_type& __k, _Obj&& __obj)
{
__glibcxx_check_insert(__hint);
return iterator(_Base::insert_or_assign(__hint.base(), __k,
std::forward<_Obj>(__obj)),
this);
}
template <typename _Obj>
iterator
insert_or_assign(const_iterator __hint, key_type&& __k, _Obj&& __obj)
{
__glibcxx_check_insert(__hint);
return iterator(_Base::insert_or_assign(__hint.base(),
std::move(__k),
std::forward<_Obj>(__obj)),
this);
}
#endif
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
iterator iterator
erase(const_iterator __position) erase(const_iterator __position)
......
...@@ -377,6 +377,88 @@ namespace __debug ...@@ -377,6 +377,88 @@ namespace __debug
_M_check_rehashed(__bucket_count); _M_check_rehashed(__bucket_count);
} }
#if __cplusplus > 201402L
template <typename... _Args>
pair<iterator, bool>
try_emplace(const key_type& __k, _Args&&... __args)
{
auto __res = _Base::try_emplace(__k,
std::forward<_Args>(__args)...);
return { iterator(__res.first, this), __res.second };
}
template <typename... _Args>
pair<iterator, bool>
try_emplace(key_type&& __k, _Args&&... __args)
{
auto __res = _Base::try_emplace(std::move(__k),
std::forward<_Args>(__args)...);
return { iterator(__res.first, this), __res.second };
}
template <typename... _Args>
iterator
try_emplace(const_iterator __hint, const key_type& __k,
_Args&&... __args)
{
__glibcxx_check_insert(__hint);
return iterator(_Base::try_emplace(__hint.base(), __k,
std::forward<_Args>(__args)...),
this);
}
template <typename... _Args>
iterator
try_emplace(const_iterator __hint, key_type&& __k, _Args&&... __args)
{
__glibcxx_check_insert(__hint);
return iterator(_Base::try_emplace(__hint.base(), std::move(__k),
std::forward<_Args>(__args)...),
this);
}
template <typename _Obj>
pair<iterator, bool>
insert_or_assign(const key_type& __k, _Obj&& __obj)
{
auto __res = _Base::insert_or_assign(__k,
std::forward<_Obj>(__obj));
return { iterator(__res.first, this), __res.second };
}
template <typename _Obj>
pair<iterator, bool>
insert_or_assign(key_type&& __k, _Obj&& __obj)
{
auto __res = _Base::insert_or_assign(std::move(__k),
std::forward<_Obj>(__obj));
return { iterator(__res.first, this), __res.second };
}
template <typename _Obj>
iterator
insert_or_assign(const_iterator __hint, const key_type& __k,
_Obj&& __obj)
{
__glibcxx_check_insert(__hint);
return iterator(_Base::insert_or_assign(__hint.base(), __k,
std::forward<_Obj>(__obj)),
this);
}
template <typename _Obj>
iterator
insert_or_assign(const_iterator __hint, key_type&& __k, _Obj&& __obj)
{
__glibcxx_check_insert(__hint);
return iterator(_Base::insert_or_assign(__hint.base(),
std::move(__k),
std::forward<_Obj>(__obj)),
this);
}
#endif
iterator iterator
find(const key_type& __key) find(const key_type& __key)
{ return iterator(_Base::find(__key), this); } { return iterator(_Base::find(__key), this); }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment