1 | //===----------------------------------------------------------------------===// |
2 | // |
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 |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | // <unordered_map> |
10 | |
11 | // template <class Key, class T, class Hash, class Pred, class Alloc> |
12 | // bool |
13 | // operator==(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x, |
14 | // const unordered_multimap<Key, T, Hash, Pred, Alloc>& y); |
15 | // |
16 | // template <class Key, class T, class Hash, class Pred, class Alloc> |
17 | // bool |
18 | // operator!=(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x, |
19 | // const unordered_multimap<Key, T, Hash, Pred, Alloc>& y); |
20 | |
21 | #include <unordered_map> |
22 | #include <string> |
23 | #include <cassert> |
24 | #include <iterator> |
25 | |
26 | #include "test_macros.h" |
27 | #include "min_allocator.h" |
28 | |
29 | #include "test_comparisons.h" |
30 | |
31 | int main(int, char**) |
32 | { |
33 | { |
34 | typedef std::unordered_multimap<int, std::string> C; |
35 | typedef std::pair<int, std::string> P; |
36 | P a[] = |
37 | { |
38 | P(10, "ten" ), |
39 | P(20, "twenty" ), |
40 | P(20, "twenty 2" ), |
41 | P(30, "thirty" ), |
42 | P(40, "forty" ), |
43 | P(50, "fifty" ), |
44 | P(50, "fifty 2" ), |
45 | P(50, "fifty 3" ), |
46 | P(60, "sixty" ), |
47 | P(70, "seventy" ), |
48 | P(80, "eighty" ), |
49 | }; |
50 | const C c1(std::begin(arr&: a), std::end(arr&: a)); |
51 | const C c2; |
52 | assert(testEquality(c1, c2, false)); |
53 | } |
54 | { |
55 | typedef std::unordered_multimap<int, std::string> C; |
56 | typedef std::pair<int, std::string> P; |
57 | P a[] = |
58 | { |
59 | P(10, "ten" ), |
60 | P(20, "twenty" ), |
61 | P(20, "twenty 2" ), |
62 | P(30, "thirty" ), |
63 | P(40, "forty" ), |
64 | P(50, "fifty" ), |
65 | P(50, "fifty 2" ), |
66 | P(50, "fifty 3" ), |
67 | P(60, "sixty" ), |
68 | P(70, "seventy" ), |
69 | P(80, "eighty" ), |
70 | }; |
71 | const C c1(std::begin(arr&: a), std::end(arr&: a)); |
72 | const C c2 = c1; |
73 | assert(testEquality(c1, c2, true)); |
74 | } |
75 | { |
76 | typedef std::unordered_multimap<int, std::string> C; |
77 | typedef std::pair<int, std::string> P; |
78 | P a[] = |
79 | { |
80 | P(10, "ten" ), |
81 | P(20, "twenty" ), |
82 | P(20, "twenty 2" ), |
83 | P(30, "thirty" ), |
84 | P(40, "forty" ), |
85 | P(50, "fifty" ), |
86 | P(50, "fifty 2" ), |
87 | P(50, "fifty 3" ), |
88 | P(60, "sixty" ), |
89 | P(70, "seventy" ), |
90 | P(80, "eighty" ), |
91 | }; |
92 | C c1(std::begin(arr&: a), std::end(arr&: a)); |
93 | C c2 = c1; |
94 | c2.rehash(n: 30); |
95 | assert(testEquality(c1, c2, true)); |
96 | c2.insert(x: P(90, "ninety" )); |
97 | assert(testEquality(c1, c2, false)); |
98 | c1.insert(x: P(90, "ninety" )); |
99 | assert(testEquality(c1, c2, true)); |
100 | } |
101 | { |
102 | typedef std::unordered_multimap<int, std::string> C; |
103 | typedef std::pair<int, std::string> P; |
104 | P a[] = |
105 | { |
106 | P(10, "ten" ), |
107 | P(20, "twenty" ), |
108 | P(20, "twenty 2" ), |
109 | P(30, "thirty" ), |
110 | P(40, "forty" ), |
111 | P(50, "fifty" ), |
112 | P(50, "fifty 2" ), |
113 | P(50, "fifty 3" ), |
114 | P(60, "sixty" ), |
115 | P(70, "seventy" ), |
116 | P(80, "eighty" ), |
117 | }; |
118 | C c1(std::begin(arr&: a), std::end(arr&: a)); |
119 | C c2 = c1; |
120 | assert(testEquality(c1, c2, true)); |
121 | c1.insert(x: P(70, "seventy 2" )); |
122 | c2.insert(x: P(80, "eighty 2" )); |
123 | assert(testEquality(c1, c2, false)); |
124 | } |
125 | #if TEST_STD_VER >= 11 |
126 | { |
127 | typedef std::unordered_multimap<int, std::string, std::hash<int>, std::equal_to<int>, |
128 | min_allocator<std::pair<const int, std::string>>> C; |
129 | typedef std::pair<int, std::string> P; |
130 | P a[] = |
131 | { |
132 | P(10, "ten" ), |
133 | P(20, "twenty" ), |
134 | P(20, "twenty 2" ), |
135 | P(30, "thirty" ), |
136 | P(40, "forty" ), |
137 | P(50, "fifty" ), |
138 | P(50, "fifty 2" ), |
139 | P(50, "fifty 3" ), |
140 | P(60, "sixty" ), |
141 | P(70, "seventy" ), |
142 | P(80, "eighty" ), |
143 | }; |
144 | const C c1(std::begin(a), std::end(a)); |
145 | const C c2; |
146 | assert(testEquality(c1, c2, false)); |
147 | } |
148 | { |
149 | typedef std::unordered_multimap<int, std::string, std::hash<int>, std::equal_to<int>, |
150 | min_allocator<std::pair<const int, std::string>>> C; |
151 | typedef std::pair<int, std::string> P; |
152 | P a[] = |
153 | { |
154 | P(10, "ten" ), |
155 | P(20, "twenty" ), |
156 | P(20, "twenty 2" ), |
157 | P(30, "thirty" ), |
158 | P(40, "forty" ), |
159 | P(50, "fifty" ), |
160 | P(50, "fifty 2" ), |
161 | P(50, "fifty 3" ), |
162 | P(60, "sixty" ), |
163 | P(70, "seventy" ), |
164 | P(80, "eighty" ), |
165 | }; |
166 | const C c1(std::begin(a), std::end(a)); |
167 | const C c2 = c1; |
168 | assert(testEquality(c1, c2, true)); |
169 | } |
170 | { |
171 | typedef std::unordered_multimap<int, std::string, std::hash<int>, std::equal_to<int>, |
172 | min_allocator<std::pair<const int, std::string>>> C; |
173 | typedef std::pair<int, std::string> P; |
174 | P a[] = |
175 | { |
176 | P(10, "ten" ), |
177 | P(20, "twenty" ), |
178 | P(20, "twenty 2" ), |
179 | P(30, "thirty" ), |
180 | P(40, "forty" ), |
181 | P(50, "fifty" ), |
182 | P(50, "fifty 2" ), |
183 | P(50, "fifty 3" ), |
184 | P(60, "sixty" ), |
185 | P(70, "seventy" ), |
186 | P(80, "eighty" ), |
187 | }; |
188 | C c1(std::begin(a), std::end(a)); |
189 | C c2 = c1; |
190 | c2.rehash(30); |
191 | assert(testEquality(c1, c2, true)); |
192 | c2.insert(P(90, "ninety" )); |
193 | assert(testEquality(c1, c2, false)); |
194 | c1.insert(P(90, "ninety" )); |
195 | assert(testEquality(c1, c2, true)); |
196 | } |
197 | { |
198 | typedef std::unordered_multimap<int, std::string, std::hash<int>, std::equal_to<int>, |
199 | min_allocator<std::pair<const int, std::string>>> C; |
200 | typedef std::pair<int, std::string> P; |
201 | P a[] = |
202 | { |
203 | P(10, "ten" ), |
204 | P(20, "twenty" ), |
205 | P(20, "twenty 2" ), |
206 | P(30, "thirty" ), |
207 | P(40, "forty" ), |
208 | P(50, "fifty" ), |
209 | P(50, "fifty 2" ), |
210 | P(50, "fifty 3" ), |
211 | P(60, "sixty" ), |
212 | P(70, "seventy" ), |
213 | P(80, "eighty" ), |
214 | }; |
215 | C c1(std::begin(a), std::end(a)); |
216 | C c2 = c1; |
217 | assert(testEquality(c1, c2, true)); |
218 | c1.insert(P(70, "seventy 2" )); |
219 | c2.insert(P(80, "eighty 2" )); |
220 | assert(testEquality(c1, c2, false)); |
221 | } |
222 | #endif |
223 | |
224 | // Make sure we take into account the number of times that a key repeats into equality. |
225 | { |
226 | typedef std::pair<int, char> P; |
227 | P a[] = {P(1, 'a'), P(1, 'b'), P(1, 'd'), P(2, 'b')}; |
228 | P b[] = {P(1, 'a'), P(1, 'b'), P(1, 'b'), P(1, 'd'), P(2, 'b')}; |
229 | |
230 | std::unordered_multimap<int, char> c1(std::begin(arr&: a), std::end(arr&: a)); |
231 | std::unordered_multimap<int, char> c2(std::begin(arr&: b), std::end(arr&: b)); |
232 | assert(testEquality(c1, c2, false)); |
233 | } |
234 | |
235 | // Make sure we incorporate the values into the equality of the maps. |
236 | // If we were to compare only the keys (including how many time each key repeats), |
237 | // the following test would fail cause only the values differ. |
238 | { |
239 | typedef std::pair<int, char> P; |
240 | P a[] = {P(1, 'a'), P(1, 'b'), P(1, 'd'), P(2, 'b')}; |
241 | P b[] = {P(1, 'a'), P(1, 'b'), P(1, 'E'), P(2, 'b')}; |
242 | // ^ different here |
243 | |
244 | std::unordered_multimap<int, char> c1(std::begin(arr&: a), std::end(arr&: a)); |
245 | std::unordered_multimap<int, char> c2(std::begin(arr&: b), std::end(arr&: b)); |
246 | assert(testEquality(c1, c2, false)); |
247 | } |
248 | |
249 | return 0; |
250 | } |
251 | |