Implement the debug versions of new overloads from P2077.
libstdc++-v3/ChangeLog:
PR libstdc++/117404
* include/debug/map.h (extract, erase): Define overloads.
* include/debug/multimap.h: Same.
* include/debug/multiset.h: Same.
* include/debug/set.h: Same.
* include/debug/unordered_map: Same (2x).
* include/debug/unordered_set: Same (2x), rename some locals.
return {};
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ template <__heterogeneous_tree_key<map> _Kt>
+ node_type
+ extract(_Kt&& __key)
+ {
+ const auto __position = find(__key);
+ if (__position != end())
+ return extract(__position);
+ return {};
+ }
+# endif
+
insert_return_type
insert(node_type&& __nh)
{
}
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ // Note that for some types _Kt this may erase more than
+ // one element, such as if _Kt::operator< checks only part
+ // of the key.
+ template <__heterogeneous_tree_key<map> _Kt>
+ size_type
+ erase(_Kt&& __x)
+ {
+ auto __victims = _Base::equal_range(__x);
+ size_type __count = 0;
+ for (auto __victim = __victims.first; __victim != __victims.second;)
+ {
+ this->_M_invalidate_if(_Equal(__victim));
+ _Base::erase(__victim++);
+ ++__count;
+ }
+ return __count;
+ }
+# endif
+
#if __cplusplus >= 201103L
iterator
erase(const_iterator __first, const_iterator __last)
return {};
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ template <__heterogeneous_tree_key<multimap> _Kt>
+ node_type
+ extract(_Kt&& __key)
+ {
+ const auto __position = find(__key);
+ if (__position != end())
+ return extract(__position);
+ return {};
+ }
+# endif
+
iterator
insert(node_type&& __nh)
{ return { _Base::insert(std::move(__nh)), this }; }
return __count;
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ template <__heterogeneous_tree_key<multimap> _Kt>
+ size_type
+ erase(_Kt&& __x)
+ {
+ auto __victims = _Base::equal_range(__x);
+ size_type __count = 0;
+ for (auto __victim = __victims.first; __victim != __victims.second;)
+ {
+ this->_M_invalidate_if(_Equal(__victim));
+ _Base::erase(__victim++);
+ ++__count;
+ }
+ return __count;
+ }
+# endif
+
#if __cplusplus >= 201103L
iterator
erase(const_iterator __first, const_iterator __last)
return {};
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ template <__heterogeneous_tree_key<multiset> _Kt>
+ node_type
+ extract(_Kt&& __key)
+ {
+ const auto __position = find(__key);
+ if (__position != end())
+ return extract(__position);
+ return {};
+ }
+#endif
+
iterator
insert(node_type&& __nh)
{ return { _Base::insert(std::move(__nh)), this }; }
return __count;
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ template <__heterogeneous_tree_key<multiset> _Kt>
+ size_type
+ erase(_Kt&& __x)
+ {
+ auto __victims = _Base::equal_range(__x);
+ size_type __count = 0;
+ for (auto __victim = __victims.first; __victim != __victims.second;)
+ {
+ this->_M_invalidate_if(_Equal(__victim));
+ _Base::erase(__victim++);
+ ++__count;
+ }
+ return __count;
+ }
+# endif
+
#if __cplusplus >= 201103L
_GLIBCXX_ABI_TAG_CXX11
iterator
return {};
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ template <__heterogeneous_tree_key<set> _Kt>
+ node_type
+ extract(_Kt&& __key)
+ {
+ const auto __position = find(__key);
+ if (__position != end())
+ return extract(__position);
+ return {};
+ }
+#endif
+
insert_return_type
insert(node_type&& __nh)
{
}
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ // Note that for some types _Kt this may erase more than
+ // one element, such as if _Kt::operator< checks only part
+ // of the key.
+ template <__heterogeneous_tree_key<set> _Kt>
+ size_type
+ erase(_Kt&& __x)
+ {
+ auto __victims = _Base::equal_range(__x);
+ size_type __count = 0;
+ for (auto __victim = __victims.first; __victim != __victims.second;)
+ {
+ this->_M_invalidate_if(_Equal(__victim));
+ _Base::erase(__victim++);
+ ++__count;
+ }
+ return __count;
+ }
+#endif
+
#if __cplusplus >= 201103L
_GLIBCXX_ABI_TAG_CXX11
iterator
return {};
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ template <__heterogeneous_hash_key<unordered_map> _Kt>
+ node_type
+ extract(_Kt&& __key)
+ {
+ const auto __position = _Base::find(__key);
+ if (__position != _Base::end())
+ return _M_extract(__position);
+ return {};
+ }
+#endif
+
insert_return_type
insert(node_type&& __nh)
{
return __ret;
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ template <__heterogeneous_hash_key<unordered_map> _Kt>
+ size_type
+ erase(_Kt&& __key)
+ {
+ auto __victim = _Base::find(__key);
+ if (__victim != _Base::end())
+ return _M_erase(__victim), 1;
+ return 0;
+ }
+#endif
+
iterator
erase(const_iterator __it)
{
return {};
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ template <__heterogeneous_hash_key<unordered_multimap> _Kt>
+ node_type
+ extract(_Kt&& __key)
+ {
+ const auto __position = _Base::find(__key);
+ if (__position != _Base::end())
+ return _M_extract(__position);
+ return {};
+ }
+#endif
+
iterator
insert(node_type&& __nh)
{ return { _Base::insert(std::move(__nh)), this }; }
return __ret;
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ template <__heterogeneous_hash_key<unordered_multimap> _Kt>
+ size_type
+ erase(_Kt&& __key)
+ {
+ size_type __count(0);
+ auto __victims = _Base::equal_range(__key);
+ for (auto __victim = __victims.first; __victim != __victims.second;)
+ {
+ _M_invalidate(__victim);
+ __victim = _Base::erase(__victim);
+ ++__count;
+ }
+ return __count;
+ }
+#endif
+
iterator
erase(const_iterator __it)
{
return {};
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ template <__heterogeneous_hash_key<unordered_set> _Kt>
+ node_type
+ extract(_Kt&& __key)
+ {
+ const auto __position = _Base::find(__key);
+ if (__position != _Base::end())
+ return _M_extract(__position);
+ return {};
+ }
+#endif
+
insert_return_type
insert(node_type&& __nh)
{
return __ret;
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ template <__heterogeneous_hash_key<unordered_set> _Kt>
+ size_type
+ erase(_Kt&& __key)
+ {
+ auto __victim = _Base::find(__key);
+ if (__victim != _Base::end())
+ return _M_erase(__victim), 1;
+ return 0;
+ }
+#endif
+
iterator
erase(const_iterator __it)
{
return {};
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ template <__heterogeneous_hash_key<unordered_multiset> _Kt>
+ node_type
+ extract(const _Kt& __key)
+ {
+ const auto __position = _Base::find(__key);
+ return __position != _Base::end() ?
+ _M_extract(__position) : node_type{};
+ }
+#endif
+
iterator
insert(node_type&& __nh)
{ return { _Base::insert(std::move(__nh)), this }; }
size_type
erase(const key_type& __key)
{
- size_type __ret(0);
- auto __pair = _Base::equal_range(__key);
- for (auto __victim = __pair.first; __victim != __pair.second;)
+ size_type __count(0);
+ auto __victims = _Base::equal_range(__key);
+ for (auto __victim = __victims.first; __victim != __victims.second;)
{
_M_invalidate(__victim);
__victim = _Base::erase(__victim);
- ++__ret;
+ ++__count;
}
-
- return __ret;
+ return __count;
}
+# ifdef __glibcxx_associative_heterogeneous_erasure
+ template <__heterogeneous_hash_key<unordered_multiset> _Kt>
+ size_type
+ erase(_Kt&& __key)
+ {
+ size_type __count(0);
+ auto __victims = _Base::equal_range(__key);
+ for (auto __victim = __victims.first; __victim != __victims.second;)
+ {
+ _M_invalidate(__victim);
+ __victim = _Base::erase(__victim);
+ ++__count;
+ }
+ return __count;
+ }
+#endif
+
iterator
erase(const_iterator __it)
{