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
This commit is contained in:
parent
e41fd1f067
commit
66c182be12
3 changed files with 170 additions and 0 deletions
|
@ -1,5 +1,10 @@
|
|||
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
|
||||
* src/c++11/debug.cc (_S_debug_messages): Give internal linkage.
|
||||
|
||||
|
|
|
@ -317,6 +317,89 @@ namespace __debug
|
|||
_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
|
||||
iterator
|
||||
erase(const_iterator __position)
|
||||
|
|
|
@ -377,6 +377,88 @@ namespace __debug
|
|||
_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
|
||||
find(const key_type& __key)
|
||||
{ return iterator(_Base::find(__key), this); }
|
||||
|
|
Loading…
Add table
Reference in a new issue