diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2015-08-26 21:58:14 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2015-08-26 21:58:14 +0100 |
commit | 66c182be120bb3777329475c67338b7c0d9ad2f4 (patch) | |
tree | 7d7ffe88f8738f87e3ee76692d9f2e1af309a69a | |
parent | e41fd1f0674bb58c4715d4656142ec9e7a9583b6 (diff) | |
download | gcc-66c182be120bb3777329475c67338b7c0d9ad2f4.zip gcc-66c182be120bb3777329475c67338b7c0d9ad2f4.tar.gz gcc-66c182be120bb3777329475c67338b7c0d9ad2f4.tar.bz2 |
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
-rw-r--r-- | libstdc++-v3/ChangeLog | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/map.h | 83 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/unordered_map | 82 |
3 files changed, 170 insertions, 0 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1422cc4..0bc0aca 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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. diff --git a/libstdc++-v3/include/debug/map.h b/libstdc++-v3/include/debug/map.h index d45cf79..914d721 100644 --- a/libstdc++-v3/include/debug/map.h +++ b/libstdc++-v3/include/debug/map.h @@ -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) diff --git a/libstdc++-v3/include/debug/unordered_map b/libstdc++-v3/include/debug/unordered_map index cc3bc3f..1bbdb61 100644 --- a/libstdc++-v3/include/debug/unordered_map +++ b/libstdc++-v3/include/debug/unordered_map @@ -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); } |