1 //===----------------------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // UNSUPPORTED: c++03, c++11, c++14
13 // class unordered_multiset
15 // template <class H2, class P2>
16 // void merge(unordered_set<key_type, H2, P2, allocator_type>& source);
17 // template <class H2, class P2>
18 // void merge(unordered_set<key_type, H2, P2, allocator_type>&& source);
19 // template <class H2, class P2>
20 // void merge(unordered_multiset<key_type, H2, P2, allocator_type>& source);
21 // template <class H2, class P2>
22 // void merge(unordered_multiset<key_type, H2, P2, allocator_type>&& source);
24 #include <unordered_set>
26 #include "test_macros.h"
30 bool set_equal(const Set
& set
, Set other
)
35 #ifndef TEST_HAS_NO_EXCEPTIONS
41 throw_hasher(bool& should_throw
) : should_throw_(should_throw
) {}
43 std::size_t operator()(const T
& p
) const
47 return std::hash
<T
>()(p
);
55 std::unordered_multiset
<int> src
{1, 3, 5};
56 std::unordered_multiset
<int> dst
{2, 4, 5};
58 assert(set_equal(src
, {}));
59 assert(set_equal(dst
, {1, 2, 3, 4, 5, 5}));
62 #ifndef TEST_HAS_NO_EXCEPTIONS
64 bool do_throw
= false;
65 typedef std::unordered_multiset
<Counter
<int>, throw_hasher
<Counter
<int>>> set_type
;
66 set_type
src({1, 3, 5}, 0, throw_hasher
<Counter
<int>>(do_throw
));
67 set_type
dst({2, 4, 5}, 0, throw_hasher
<Counter
<int>>(do_throw
));
69 assert(Counter_base::gConstructed
== 6);
81 assert(set_equal(src
, set_type({1, 3, 5}, 0, throw_hasher
<Counter
<int>>(do_throw
))));
82 assert(set_equal(dst
, set_type({2, 4, 5}, 0, throw_hasher
<Counter
<int>>(do_throw
))));
85 assert(Counter_base::gConstructed
== 0);
90 bool operator()(const Counter
<int>& lhs
, const Counter
<int>& rhs
) const
98 std::size_t operator()(const Counter
<int>& p
) const { return std::hash
<Counter
<int>>()(p
); }
101 typedef std::unordered_multiset
<Counter
<int>, std::hash
<Counter
<int>>, std::equal_to
<Counter
<int>>> first_set_type
;
102 typedef std::unordered_multiset
<Counter
<int>, hasher
, equal
> second_set_type
;
103 typedef std::unordered_set
<Counter
<int>, hasher
, equal
> third_set_type
;
106 first_set_type first
{1, 2, 3};
107 second_set_type second
{2, 3, 4};
108 third_set_type third
{1, 3};
110 assert(Counter_base::gConstructed
== 8);
115 assert(set_equal(first
, {1, 2, 3, 4, 2, 3, 1, 3}));
116 assert(set_equal(second
, {}));
117 assert(set_equal(third
, {}));
119 assert(Counter_base::gConstructed
== 8);
121 assert(Counter_base::gConstructed
== 0);
123 first_set_type first
{1, 2, 3};
124 second_set_type second
{2, 3, 4};
125 third_set_type third
{1, 3};
127 assert(Counter_base::gConstructed
== 8);
129 first
.merge(std::move(second
));
130 first
.merge(std::move(third
));
132 assert(set_equal(first
, {1, 2, 3, 4, 2, 3, 1, 3}));
133 assert(set_equal(second
, {}));
134 assert(set_equal(third
, {}));
136 assert(Counter_base::gConstructed
== 8);
138 assert(Counter_base::gConstructed
== 0);
141 std::unordered_multiset
<int> first
;
143 std::unordered_multiset
<int> second
;
145 first
.merge(std::move(second
));
148 std::unordered_set
<int> second
;
150 first
.merge(std::move(second
));