summaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/bits/unordered_set.h
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3/include/bits/unordered_set.h')
-rw-r--r--libstdc++-v3/include/bits/unordered_set.h190
1 files changed, 183 insertions, 7 deletions
diff --git a/libstdc++-v3/include/bits/unordered_set.h b/libstdc++-v3/include/bits/unordered_set.h
index 3efd1f94c7..85c2562f89 100644
--- a/libstdc++-v3/include/bits/unordered_set.h
+++ b/libstdc++-v3/include/bits/unordered_set.h
@@ -1,6 +1,6 @@
// unordered_set implementation -*- C++ -*-
-// Copyright (C) 2010-2016 Free Software Foundation, Inc.
+// Copyright (C) 2010-2017 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -65,6 +65,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
__detail::_Default_ranged_hash,
__detail::_Prime_rehash_policy, _Tr>;
+ template<class _Value, class _Hash, class _Pred, class _Alloc>
+ class unordered_multiset;
+
/**
* @brief A standard container composed of unique keys (containing
* at most one of each key value) in which the elements' keys are
@@ -120,6 +123,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
typedef typename _Hashtable::difference_type difference_type;
//@}
+#if __cplusplus > 201402L
+ using node_type = typename _Hashtable::node_type;
+ using insert_return_type = typename _Hashtable::insert_return_type;
+#endif
+
// construct/destroy/copy
/// Default constructor.
@@ -268,7 +276,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*
* Note that the assignment completely changes the %unordered_set and
* that the resulting %unordered_set's size is the same as the number
- * of elements assigned. Old data may be lost.
+ * of elements assigned.
*/
unordered_set&
operator=(initializer_list<value_type> __l)
@@ -277,8 +285,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
return *this;
}
- /// Returns the allocator object with which the %unordered_set was
- /// constructed.
+ /// Returns the allocator object used by the %unordered_set.
allocator_type
get_allocator() const noexcept
{ return _M_h.get_allocator(); }
@@ -471,6 +478,31 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
insert(initializer_list<value_type> __l)
{ _M_h.insert(__l); }
+#if __cplusplus > 201402L
+ /// Extract a node.
+ node_type
+ extract(const_iterator __pos)
+ {
+ __glibcxx_assert(__pos != end());
+ return _M_h.extract(__pos);
+ }
+
+ /// Extract a node.
+ node_type
+ extract(const key_type& __key)
+ { return _M_h.extract(__key); }
+
+ /// Re-insert an extracted node.
+ insert_return_type
+ insert(node_type&& __nh)
+ { return _M_h._M_reinsert_node(std::move(__nh)); }
+
+ /// Re-insert an extracted node.
+ iterator
+ insert(const_iterator, node_type&& __nh)
+ { return _M_h._M_reinsert_node(std::move(__nh)).position; }
+#endif // C++17
+
//@{
/**
* @brief Erases an element from an %unordered_set.
@@ -553,6 +585,37 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
noexcept( noexcept(_M_h.swap(__x._M_h)) )
{ _M_h.swap(__x._M_h); }
+#if __cplusplus > 201402L
+ template<typename, typename, typename>
+ friend class _Hash_merge_helper;
+
+ template<typename _H2, typename _P2>
+ void
+ merge(unordered_set<_Value, _H2, _P2, _Alloc>& __source)
+ {
+ using _Merge_helper = _Hash_merge_helper<unordered_set, _H2, _P2>;
+ _M_h._M_merge_unique(_Merge_helper::_S_get_table(__source));
+ }
+
+ template<typename _H2, typename _P2>
+ void
+ merge(unordered_set<_Value, _H2, _P2, _Alloc>&& __source)
+ { merge(__source); }
+
+ template<typename _H2, typename _P2>
+ void
+ merge(unordered_multiset<_Value, _H2, _P2, _Alloc>& __source)
+ {
+ using _Merge_helper = _Hash_merge_helper<unordered_set, _H2, _P2>;
+ _M_h._M_merge_unique(_Merge_helper::_S_get_table(__source));
+ }
+
+ template<typename _H2, typename _P2>
+ void
+ merge(unordered_multiset<_Value, _H2, _P2, _Alloc>&& __source)
+ { merge(__source); }
+#endif // C++17
+
// observers.
/// Returns the hash functor object with which the %unordered_set was
@@ -794,6 +857,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
typedef typename _Hashtable::difference_type difference_type;
//@}
+#if __cplusplus > 201402L
+ using node_type = typename _Hashtable::node_type;
+#endif
+
// construct/destroy/copy
/// Default constructor.
@@ -942,7 +1009,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*
* Note that the assignment completely changes the %unordered_multiset
* and that the resulting %unordered_multiset's size is the same as the
- * number of elements assigned. Old data may be lost.
+ * number of elements assigned.
*/
unordered_multiset&
operator=(initializer_list<value_type> __l)
@@ -951,8 +1018,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
return *this;
}
- /// Returns the allocator object with which the %unordered_multiset was
- /// constructed.
+ /// Returns the allocator object used by the %unordered_multiset.
allocator_type
get_allocator() const noexcept
{ return _M_h.get_allocator(); }
@@ -1123,6 +1189,31 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
insert(initializer_list<value_type> __l)
{ _M_h.insert(__l); }
+#if __cplusplus > 201402L
+ /// Extract a node.
+ node_type
+ extract(const_iterator __pos)
+ {
+ __glibcxx_assert(__pos != end());
+ return _M_h.extract(__pos);
+ }
+
+ /// Extract a node.
+ node_type
+ extract(const key_type& __key)
+ { return _M_h.extract(__key); }
+
+ /// Re-insert an extracted node.
+ iterator
+ insert(node_type&& __nh)
+ { return _M_h._M_reinsert_node_multi(cend(), std::move(__nh)); }
+
+ /// Re-insert an extracted node.
+ iterator
+ insert(const_iterator __hint, node_type&& __nh)
+ { return _M_h._M_reinsert_node_multi(__hint, std::move(__nh)); }
+#endif // C++17
+
//@{
/**
* @brief Erases an element from an %unordered_multiset.
@@ -1210,6 +1301,39 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
noexcept( noexcept(_M_h.swap(__x._M_h)) )
{ _M_h.swap(__x._M_h); }
+#if __cplusplus > 201402L
+ template<typename, typename, typename>
+ friend class _Hash_merge_helper;
+
+ template<typename _H2, typename _P2>
+ void
+ merge(unordered_multiset<_Value, _H2, _P2, _Alloc>& __source)
+ {
+ using _Merge_helper
+ = _Hash_merge_helper<unordered_multiset, _H2, _P2>;
+ _M_h._M_merge_multi(_Merge_helper::_S_get_table(__source));
+ }
+
+ template<typename _H2, typename _P2>
+ void
+ merge(unordered_multiset<_Value, _H2, _P2, _Alloc>&& __source)
+ { merge(__source); }
+
+ template<typename _H2, typename _P2>
+ void
+ merge(unordered_set<_Value, _H2, _P2, _Alloc>& __source)
+ {
+ using _Merge_helper
+ = _Hash_merge_helper<unordered_multiset, _H2, _P2>;
+ _M_h._M_merge_multi(_Merge_helper::_S_get_table(__source));
+ }
+
+ template<typename _H2, typename _P2>
+ void
+ merge(unordered_set<_Value, _H2, _P2, _Alloc>&& __source)
+ { merge(__source); }
+#endif // C++17
+
// observers.
/// Returns the hash functor object with which the %unordered_multiset
@@ -1431,6 +1555,58 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
{ return !(__x == __y); }
_GLIBCXX_END_NAMESPACE_CONTAINER
+
+#if __cplusplus > 201402L
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+ // Allow std::unordered_set access to internals of compatible sets.
+ template<typename _Val, typename _Hash1, typename _Eq1, typename _Alloc,
+ typename _Hash2, typename _Eq2>
+ struct _Hash_merge_helper<
+ _GLIBCXX_STD_C::unordered_set<_Val, _Hash1, _Eq1, _Alloc>, _Hash2, _Eq2>
+ {
+ private:
+ template<typename... _Tp>
+ using unordered_set = _GLIBCXX_STD_C::unordered_set<_Tp...>;
+ template<typename... _Tp>
+ using unordered_multiset = _GLIBCXX_STD_C::unordered_multiset<_Tp...>;
+
+ friend unordered_set<_Val, _Hash1, _Eq1, _Alloc>;
+
+ static auto&
+ _S_get_table(unordered_set<_Val, _Hash2, _Eq2, _Alloc>& __set)
+ { return __set._M_h; }
+
+ static auto&
+ _S_get_table(unordered_multiset<_Val, _Hash2, _Eq2, _Alloc>& __set)
+ { return __set._M_h; }
+ };
+
+ // Allow std::unordered_multiset access to internals of compatible sets.
+ template<typename _Val, typename _Hash1, typename _Eq1, typename _Alloc,
+ typename _Hash2, typename _Eq2>
+ struct _Hash_merge_helper<
+ _GLIBCXX_STD_C::unordered_multiset<_Val, _Hash1, _Eq1, _Alloc>,
+ _Hash2, _Eq2>
+ {
+ private:
+ template<typename... _Tp>
+ using unordered_set = _GLIBCXX_STD_C::unordered_set<_Tp...>;
+ template<typename... _Tp>
+ using unordered_multiset = _GLIBCXX_STD_C::unordered_multiset<_Tp...>;
+
+ friend unordered_multiset<_Val, _Hash1, _Eq1, _Alloc>;
+
+ static auto&
+ _S_get_table(unordered_set<_Val, _Hash2, _Eq2, _Alloc>& __set)
+ { return __set._M_h; }
+
+ static auto&
+ _S_get_table(unordered_multiset<_Val, _Hash2, _Eq2, _Alloc>& __set)
+ { return __set._M_h; }
+ };
+_GLIBCXX_END_NAMESPACE_VERSION
+#endif // C++17
+
} // namespace std
#endif /* _UNORDERED_SET_H */