Second half of C++17's splicing maps and sets
This commit adds a merge member function to all the map and set containers,
which splices nodes from the source container. This completes support for
P0083r3.
Differential revision: https://reviews.llvm.org/D48896
llvm-svn: 345744
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 5c4e07ae5c6f7f467b436f1b24f41ef4cf9897b3
diff --git a/include/set b/include/set
index f2ce6ea..80cc7b0 100644
--- a/include/set
+++ b/include/set
@@ -128,6 +128,15 @@
iterator erase(const_iterator first, const_iterator last);
void clear() noexcept;
+ template<class C2>
+ void merge(set<Key, C2, Allocator>& source); // C++17
+ template<class C2>
+ void merge(set<Key, C2, Allocator>&& source); // C++17
+ template<class C2>
+ void merge(multiset<Key, C2, Allocator>& source); // C++17
+ template<class C2>
+ void merge(multiset<Key, C2, Allocator>&& source); // C++17
+
void swap(set& s)
noexcept(
__is_nothrow_swappable<key_compare>::value &&
@@ -316,6 +325,15 @@
iterator erase(const_iterator first, const_iterator last);
void clear() noexcept;
+ template<class C2>
+ void merge(multiset<Key, C2, Allocator>& source); // C++17
+ template<class C2>
+ void merge(multiset<Key, C2, Allocator>&& source); // C++17
+ template<class C2>
+ void merge(set<Key, C2, Allocator>& source); // C++17
+ template<class C2>
+ void merge(set<Key, C2, Allocator>&& source); // C++17
+
void swap(multiset& s)
noexcept(
__is_nothrow_swappable<key_compare>::value &&
@@ -410,6 +428,9 @@
_LIBCPP_BEGIN_NAMESPACE_STD
+template <class _Key, class _Compare, class _Allocator>
+class multiset;
+
template <class _Key, class _Compare = less<_Key>,
class _Allocator = allocator<_Key> >
class _LIBCPP_TEMPLATE_VIS set
@@ -449,6 +470,11 @@
typedef __insert_return_type<iterator, node_type> insert_return_type;
#endif
+ template <class _Key2, class _Compare2, class _Alloc2>
+ friend class _LIBCPP_TEMPLATE_VIS set;
+ template <class _Key2, class _Compare2, class _Alloc2>
+ friend class _LIBCPP_TEMPLATE_VIS multiset;
+
_LIBCPP_INLINE_VISIBILITY
set()
_NOEXCEPT_(
@@ -681,6 +707,38 @@
{
return __tree_.template __node_handle_extract<node_type>(__it);
}
+ template <class _C2>
+ _LIBCPP_INLINE_VISIBILITY
+ void merge(set<key_type, _C2, allocator_type>& __source)
+ {
+ _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
+ "merging container with incompatible allocator");
+ __tree_.__node_handle_merge_unique(__source.__tree_);
+ }
+ template <class _C2>
+ _LIBCPP_INLINE_VISIBILITY
+ void merge(set<key_type, _C2, allocator_type>&& __source)
+ {
+ _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
+ "merging container with incompatible allocator");
+ __tree_.__node_handle_merge_unique(__source.__tree_);
+ }
+ template <class _C2>
+ _LIBCPP_INLINE_VISIBILITY
+ void merge(multiset<key_type, _C2, allocator_type>& __source)
+ {
+ _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
+ "merging container with incompatible allocator");
+ __tree_.__node_handle_merge_unique(__source.__tree_);
+ }
+ template <class _C2>
+ _LIBCPP_INLINE_VISIBILITY
+ void merge(multiset<key_type, _C2, allocator_type>&& __source)
+ {
+ _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
+ "merging container with incompatible allocator");
+ __tree_.__node_handle_merge_unique(__source.__tree_);
+ }
#endif
_LIBCPP_INLINE_VISIBILITY
@@ -891,6 +949,11 @@
typedef __set_node_handle<typename __base::__node, allocator_type> node_type;
#endif
+ template <class _Key2, class _Compare2, class _Alloc2>
+ friend class _LIBCPP_TEMPLATE_VIS set;
+ template <class _Key2, class _Compare2, class _Alloc2>
+ friend class _LIBCPP_TEMPLATE_VIS multiset;
+
// construct/copy/destroy:
_LIBCPP_INLINE_VISIBILITY
multiset()
@@ -1122,6 +1185,38 @@
{
return __tree_.template __node_handle_extract<node_type>(__it);
}
+ template <class _C2>
+ _LIBCPP_INLINE_VISIBILITY
+ void merge(multiset<key_type, _C2, allocator_type>& __source)
+ {
+ _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
+ "merging container with incompatible allocator");
+ __tree_.__node_handle_merge_multi(__source.__tree_);
+ }
+ template <class _C2>
+ _LIBCPP_INLINE_VISIBILITY
+ void merge(multiset<key_type, _C2, allocator_type>&& __source)
+ {
+ _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
+ "merging container with incompatible allocator");
+ __tree_.__node_handle_merge_multi(__source.__tree_);
+ }
+ template <class _C2>
+ _LIBCPP_INLINE_VISIBILITY
+ void merge(set<key_type, _C2, allocator_type>& __source)
+ {
+ _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
+ "merging container with incompatible allocator");
+ __tree_.__node_handle_merge_multi(__source.__tree_);
+ }
+ template <class _C2>
+ _LIBCPP_INLINE_VISIBILITY
+ void merge(set<key_type, _C2, allocator_type>&& __source)
+ {
+ _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
+ "merging container with incompatible allocator");
+ __tree_.__node_handle_merge_multi(__source.__tree_);
+ }
#endif
_LIBCPP_INLINE_VISIBILITY