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_map
15 // template <class H2, class P2>
16 // void merge(unordered_map<key_type, value_type, H2, P2, allocator_type>& source);
17 // template <class H2, class P2>
18 // void merge(unordered_map<key_type, value_type, H2, P2, allocator_type>&& source);
19 // template <class H2, class P2>
20 // void merge(unordered_multimap<key_type, value_type, H2, P2, allocator_type>& source);
21 // template <class H2, class P2>
22 // void merge(unordered_multimap<key_type, value_type, H2, P2, allocator_type>&& source);
24 #include <unordered_map>
26 #include "test_macros.h"
30 bool map_equal(const Map
& map
, Map 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_map
<int, int> src
{{1, 0}, {3, 0}, {5, 0}};
56 std::unordered_map
<int, int> dst
{{2, 0}, {4, 0}, {5, 0}};
58 assert(map_equal(src
, {{5,0}}));
59 assert(map_equal(dst
, {{1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}}));
62 #ifndef TEST_HAS_NO_EXCEPTIONS
64 bool do_throw
= false;
65 typedef std::unordered_map
<Counter
<int>, int, throw_hasher
<Counter
<int>>> map_type
;
66 map_type
src({{1, 0}, {3, 0}, {5, 0}}, 0, throw_hasher
<Counter
<int>>(do_throw
));
67 map_type
dst({{2, 0}, {4, 0}, {5, 0}}, 0, throw_hasher
<Counter
<int>>(do_throw
));
69 assert(Counter_base::gConstructed
== 6);
81 assert(map_equal(src
, map_type({{1, 0}, {3, 0}, {5, 0}}, 0, throw_hasher
<Counter
<int>>(do_throw
))));
82 assert(map_equal(dst
, map_type({{2, 0}, {4, 0}, {5, 0}}, 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
100 return std::hash
<Counter
<int>>()(p
);
104 typedef std::unordered_map
<Counter
<int>, int, std::hash
<Counter
<int>>, std::equal_to
<Counter
<int>>> first_map_type
;
105 typedef std::unordered_map
<Counter
<int>, int, hasher
, equal
> second_map_type
;
106 typedef std::unordered_multimap
<Counter
<int>, int, hasher
, equal
> third_map_type
;
109 first_map_type first
{{1, 0}, {2, 0}, {3, 0}};
110 second_map_type second
{{2, 0}, {3, 0}, {4, 0}};
111 third_map_type third
{{1, 0}, {3, 0}};
113 assert(Counter_base::gConstructed
== 8);
118 assert(map_equal(first
, {{1, 0}, {2, 0}, {3, 0}, {4, 0}}));
119 assert(map_equal(second
, {{2, 0}, {3, 0}}));
120 assert(map_equal(third
, {{1, 0}, {3, 0}}));
122 assert(Counter_base::gConstructed
== 8);
124 assert(Counter_base::gConstructed
== 0);
126 first_map_type first
{{1, 0}, {2, 0}, {3, 0}};
127 second_map_type second
{{2, 0}, {3, 0}, {4, 0}};
128 third_map_type third
{{1, 0}, {3, 0}};
130 assert(Counter_base::gConstructed
== 8);
132 first
.merge(std::move(second
));
133 first
.merge(std::move(third
));
135 assert(map_equal(first
, {{1, 0}, {2, 0}, {3, 0}, {4, 0}}));
136 assert(map_equal(second
, {{2, 0}, {3, 0}}));
137 assert(map_equal(third
, {{1, 0}, {3, 0}}));
139 assert(Counter_base::gConstructed
== 8);
141 assert(Counter_base::gConstructed
== 0);
144 std::unordered_map
<int, int> first
;
146 std::unordered_map
<int, int> second
;
148 first
.merge(std::move(second
));
151 std::unordered_multimap
<int, int> second
;
153 first
.merge(std::move(second
));