aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2015-08-26 21:58:14 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2015-08-26 21:58:14 +0100
commit66c182be120bb3777329475c67338b7c0d9ad2f4 (patch)
tree7d7ffe88f8738f87e3ee76692d9f2e1af309a69a
parente41fd1f0674bb58c4715d4656142ec9e7a9583b6 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--libstdc++-v3/include/debug/map.h83
-rw-r--r--libstdc++-v3/include/debug/unordered_map82
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); }