root / lab4 / .minix-src / include / c++ / unordered_set
History | View | Annotate | Download (54 KB)
1 |
// -*- C++ -*- |
---|---|
2 |
//===-------------------------- unordered_set -----------------------------===// |
3 |
// |
4 |
// The LLVM Compiler Infrastructure |
5 |
// |
6 |
// This file is dual licensed under the MIT and the University of Illinois Open |
7 |
// Source Licenses. See LICENSE.TXT for details. |
8 |
// |
9 |
//===----------------------------------------------------------------------===// |
10 |
|
11 |
#ifndef _LIBCPP_UNORDERED_SET |
12 |
#define _LIBCPP_UNORDERED_SET |
13 |
|
14 |
/* |
15 |
|
16 |
unordered_set synopsis |
17 |
|
18 |
#include <initializer_list> |
19 |
|
20 |
namespace std |
21 |
{ |
22 |
|
23 |
template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>, |
24 |
class Alloc = allocator<Value>> |
25 |
class unordered_set |
26 |
{ |
27 |
public: |
28 |
// types |
29 |
typedef Value key_type; |
30 |
typedef key_type value_type; |
31 |
typedef Hash hasher; |
32 |
typedef Pred key_equal; |
33 |
typedef Alloc allocator_type; |
34 |
typedef value_type& reference; |
35 |
typedef const value_type& const_reference; |
36 |
typedef typename allocator_traits<allocator_type>::pointer pointer; |
37 |
typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; |
38 |
typedef typename allocator_traits<allocator_type>::size_type size_type; |
39 |
typedef typename allocator_traits<allocator_type>::difference_type difference_type; |
40 |
|
41 |
typedef /unspecified/ iterator; |
42 |
typedef /unspecified/ const_iterator; |
43 |
typedef /unspecified/ local_iterator; |
44 |
typedef /unspecified/ const_local_iterator; |
45 |
|
46 |
unordered_set() |
47 |
noexcept( |
48 |
is_nothrow_default_constructible<hasher>::value && |
49 |
is_nothrow_default_constructible<key_equal>::value && |
50 |
is_nothrow_default_constructible<allocator_type>::value); |
51 |
explicit unordered_set(size_type n, const hasher& hf = hasher(), |
52 |
const key_equal& eql = key_equal(), |
53 |
const allocator_type& a = allocator_type()); |
54 |
template <class InputIterator> |
55 |
unordered_set(InputIterator f, InputIterator l, |
56 |
size_type n = 0, const hasher& hf = hasher(), |
57 |
const key_equal& eql = key_equal(), |
58 |
const allocator_type& a = allocator_type()); |
59 |
explicit unordered_set(const allocator_type&); |
60 |
unordered_set(const unordered_set&); |
61 |
unordered_set(const unordered_set&, const Allocator&); |
62 |
unordered_set(unordered_set&&) |
63 |
noexcept( |
64 |
is_nothrow_move_constructible<hasher>::value && |
65 |
is_nothrow_move_constructible<key_equal>::value && |
66 |
is_nothrow_move_constructible<allocator_type>::value); |
67 |
unordered_set(unordered_set&&, const Allocator&); |
68 |
unordered_set(initializer_list<value_type>, size_type n = 0, |
69 |
const hasher& hf = hasher(), const key_equal& eql = key_equal(), |
70 |
const allocator_type& a = allocator_type()); |
71 |
unordered_set(size_type n, const allocator_type& a); // C++14 |
72 |
unordered_set(size_type n, const hasher& hf, const allocator_type& a); // C++14 |
73 |
template <class InputIterator> |
74 |
unordered_set(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14 |
75 |
template <class InputIterator> |
76 |
unordered_set(InputIterator f, InputIterator l, size_type n, |
77 |
const hasher& hf, const allocator_type& a); // C++14 |
78 |
unordered_set(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14 |
79 |
unordered_set(initializer_list<value_type> il, size_type n, |
80 |
const hasher& hf, const allocator_type& a); // C++14 |
81 |
~unordered_set(); |
82 |
unordered_set& operator=(const unordered_set&); |
83 |
unordered_set& operator=(unordered_set&&) |
84 |
noexcept( |
85 |
allocator_type::propagate_on_container_move_assignment::value && |
86 |
is_nothrow_move_assignable<allocator_type>::value && |
87 |
is_nothrow_move_assignable<hasher>::value && |
88 |
is_nothrow_move_assignable<key_equal>::value); |
89 |
unordered_set& operator=(initializer_list<value_type>); |
90 |
|
91 |
allocator_type get_allocator() const noexcept; |
92 |
|
93 |
bool empty() const noexcept; |
94 |
size_type size() const noexcept; |
95 |
size_type max_size() const noexcept; |
96 |
|
97 |
iterator begin() noexcept; |
98 |
iterator end() noexcept; |
99 |
const_iterator begin() const noexcept; |
100 |
const_iterator end() const noexcept; |
101 |
const_iterator cbegin() const noexcept; |
102 |
const_iterator cend() const noexcept; |
103 |
|
104 |
template <class... Args> |
105 |
pair<iterator, bool> emplace(Args&&... args); |
106 |
template <class... Args> |
107 |
iterator emplace_hint(const_iterator position, Args&&... args); |
108 |
pair<iterator, bool> insert(const value_type& obj); |
109 |
pair<iterator, bool> insert(value_type&& obj); |
110 |
iterator insert(const_iterator hint, const value_type& obj); |
111 |
iterator insert(const_iterator hint, value_type&& obj); |
112 |
template <class InputIterator> |
113 |
void insert(InputIterator first, InputIterator last); |
114 |
void insert(initializer_list<value_type>); |
115 |
|
116 |
iterator erase(const_iterator position); |
117 |
iterator erase(iterator position); // C++14 |
118 |
size_type erase(const key_type& k); |
119 |
iterator erase(const_iterator first, const_iterator last); |
120 |
void clear() noexcept; |
121 |
|
122 |
void swap(unordered_set&) |
123 |
noexcept(allocator_traits<Allocator>::is_always_equal::value && |
124 |
noexcept(swap(declval<hasher&>(), declval<hasher&>())) && |
125 |
noexcept(swap(declval<key_equal&>(), declval<key_equal&>()))); // C++17 |
126 |
|
127 |
hasher hash_function() const; |
128 |
key_equal key_eq() const; |
129 |
|
130 |
iterator find(const key_type& k); |
131 |
const_iterator find(const key_type& k) const; |
132 |
size_type count(const key_type& k) const; |
133 |
pair<iterator, iterator> equal_range(const key_type& k); |
134 |
pair<const_iterator, const_iterator> equal_range(const key_type& k) const; |
135 |
|
136 |
size_type bucket_count() const noexcept; |
137 |
size_type max_bucket_count() const noexcept; |
138 |
|
139 |
size_type bucket_size(size_type n) const; |
140 |
size_type bucket(const key_type& k) const; |
141 |
|
142 |
local_iterator begin(size_type n); |
143 |
local_iterator end(size_type n); |
144 |
const_local_iterator begin(size_type n) const; |
145 |
const_local_iterator end(size_type n) const; |
146 |
const_local_iterator cbegin(size_type n) const; |
147 |
const_local_iterator cend(size_type n) const; |
148 |
|
149 |
float load_factor() const noexcept; |
150 |
float max_load_factor() const noexcept; |
151 |
void max_load_factor(float z); |
152 |
void rehash(size_type n); |
153 |
void reserve(size_type n); |
154 |
}; |
155 |
|
156 |
template <class Value, class Hash, class Pred, class Alloc> |
157 |
void swap(unordered_set<Value, Hash, Pred, Alloc>& x, |
158 |
unordered_set<Value, Hash, Pred, Alloc>& y) |
159 |
noexcept(noexcept(x.swap(y))); |
160 |
|
161 |
template <class Value, class Hash, class Pred, class Alloc> |
162 |
bool |
163 |
operator==(const unordered_set<Value, Hash, Pred, Alloc>& x, |
164 |
const unordered_set<Value, Hash, Pred, Alloc>& y); |
165 |
|
166 |
template <class Value, class Hash, class Pred, class Alloc> |
167 |
bool |
168 |
operator!=(const unordered_set<Value, Hash, Pred, Alloc>& x, |
169 |
const unordered_set<Value, Hash, Pred, Alloc>& y); |
170 |
|
171 |
template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>, |
172 |
class Alloc = allocator<Value>> |
173 |
class unordered_multiset |
174 |
{ |
175 |
public: |
176 |
// types |
177 |
typedef Value key_type; |
178 |
typedef key_type value_type; |
179 |
typedef Hash hasher; |
180 |
typedef Pred key_equal; |
181 |
typedef Alloc allocator_type; |
182 |
typedef value_type& reference; |
183 |
typedef const value_type& const_reference; |
184 |
typedef typename allocator_traits<allocator_type>::pointer pointer; |
185 |
typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; |
186 |
typedef typename allocator_traits<allocator_type>::size_type size_type; |
187 |
typedef typename allocator_traits<allocator_type>::difference_type difference_type; |
188 |
|
189 |
typedef /unspecified/ iterator; |
190 |
typedef /unspecified/ const_iterator; |
191 |
typedef /unspecified/ local_iterator; |
192 |
typedef /unspecified/ const_local_iterator; |
193 |
|
194 |
unordered_multiset() |
195 |
noexcept( |
196 |
is_nothrow_default_constructible<hasher>::value && |
197 |
is_nothrow_default_constructible<key_equal>::value && |
198 |
is_nothrow_default_constructible<allocator_type>::value); |
199 |
explicit unordered_multiset(size_type n, const hasher& hf = hasher(), |
200 |
const key_equal& eql = key_equal(), |
201 |
const allocator_type& a = allocator_type()); |
202 |
template <class InputIterator> |
203 |
unordered_multiset(InputIterator f, InputIterator l, |
204 |
size_type n = 0, const hasher& hf = hasher(), |
205 |
const key_equal& eql = key_equal(), |
206 |
const allocator_type& a = allocator_type()); |
207 |
explicit unordered_multiset(const allocator_type&); |
208 |
unordered_multiset(const unordered_multiset&); |
209 |
unordered_multiset(const unordered_multiset&, const Allocator&); |
210 |
unordered_multiset(unordered_multiset&&) |
211 |
noexcept( |
212 |
is_nothrow_move_constructible<hasher>::value && |
213 |
is_nothrow_move_constructible<key_equal>::value && |
214 |
is_nothrow_move_constructible<allocator_type>::value); |
215 |
unordered_multiset(unordered_multiset&&, const Allocator&); |
216 |
unordered_multiset(initializer_list<value_type>, size_type n = /see below/, |
217 |
const hasher& hf = hasher(), const key_equal& eql = key_equal(), |
218 |
const allocator_type& a = allocator_type()); |
219 |
unordered_multiset(size_type n, const allocator_type& a); // C++14 |
220 |
unordered_multiset(size_type n, const hasher& hf, const allocator_type& a); // C++14 |
221 |
template <class InputIterator> |
222 |
unordered_multiset(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14 |
223 |
template <class InputIterator> |
224 |
unordered_multiset(InputIterator f, InputIterator l, size_type n, |
225 |
const hasher& hf, const allocator_type& a); // C++14 |
226 |
unordered_multiset(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14 |
227 |
unordered_multiset(initializer_list<value_type> il, size_type n, |
228 |
const hasher& hf, const allocator_type& a); // C++14 |
229 |
~unordered_multiset(); |
230 |
unordered_multiset& operator=(const unordered_multiset&); |
231 |
unordered_multiset& operator=(unordered_multiset&&) |
232 |
noexcept( |
233 |
allocator_type::propagate_on_container_move_assignment::value && |
234 |
is_nothrow_move_assignable<allocator_type>::value && |
235 |
is_nothrow_move_assignable<hasher>::value && |
236 |
is_nothrow_move_assignable<key_equal>::value); |
237 |
unordered_multiset& operator=(initializer_list<value_type>); |
238 |
|
239 |
allocator_type get_allocator() const noexcept; |
240 |
|
241 |
bool empty() const noexcept; |
242 |
size_type size() const noexcept; |
243 |
size_type max_size() const noexcept; |
244 |
|
245 |
iterator begin() noexcept; |
246 |
iterator end() noexcept; |
247 |
const_iterator begin() const noexcept; |
248 |
const_iterator end() const noexcept; |
249 |
const_iterator cbegin() const noexcept; |
250 |
const_iterator cend() const noexcept; |
251 |
|
252 |
template <class... Args> |
253 |
iterator emplace(Args&&... args); |
254 |
template <class... Args> |
255 |
iterator emplace_hint(const_iterator position, Args&&... args); |
256 |
iterator insert(const value_type& obj); |
257 |
iterator insert(value_type&& obj); |
258 |
iterator insert(const_iterator hint, const value_type& obj); |
259 |
iterator insert(const_iterator hint, value_type&& obj); |
260 |
template <class InputIterator> |
261 |
void insert(InputIterator first, InputIterator last); |
262 |
void insert(initializer_list<value_type>); |
263 |
|
264 |
iterator erase(const_iterator position); |
265 |
iterator erase(iterator position); // C++14 |
266 |
size_type erase(const key_type& k); |
267 |
iterator erase(const_iterator first, const_iterator last); |
268 |
void clear() noexcept; |
269 |
|
270 |
void swap(unordered_multiset&) |
271 |
noexcept(allocator_traits<Allocator>::is_always_equal::value && |
272 |
noexcept(swap(declval<hasher&>(), declval<hasher&>())) && |
273 |
noexcept(swap(declval<key_equal&>(), declval<key_equal&>()))); // C++17 |
274 |
|
275 |
hasher hash_function() const; |
276 |
key_equal key_eq() const; |
277 |
|
278 |
iterator find(const key_type& k); |
279 |
const_iterator find(const key_type& k) const; |
280 |
size_type count(const key_type& k) const; |
281 |
pair<iterator, iterator> equal_range(const key_type& k); |
282 |
pair<const_iterator, const_iterator> equal_range(const key_type& k) const; |
283 |
|
284 |
size_type bucket_count() const noexcept; |
285 |
size_type max_bucket_count() const noexcept; |
286 |
|
287 |
size_type bucket_size(size_type n) const; |
288 |
size_type bucket(const key_type& k) const; |
289 |
|
290 |
local_iterator begin(size_type n); |
291 |
local_iterator end(size_type n); |
292 |
const_local_iterator begin(size_type n) const; |
293 |
const_local_iterator end(size_type n) const; |
294 |
const_local_iterator cbegin(size_type n) const; |
295 |
const_local_iterator cend(size_type n) const; |
296 |
|
297 |
float load_factor() const noexcept; |
298 |
float max_load_factor() const noexcept; |
299 |
void max_load_factor(float z); |
300 |
void rehash(size_type n); |
301 |
void reserve(size_type n); |
302 |
}; |
303 |
|
304 |
template <class Value, class Hash, class Pred, class Alloc> |
305 |
void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x, |
306 |
unordered_multiset<Value, Hash, Pred, Alloc>& y) |
307 |
noexcept(noexcept(x.swap(y))); |
308 |
|
309 |
template <class Value, class Hash, class Pred, class Alloc> |
310 |
bool |
311 |
operator==(const unordered_multiset<Value, Hash, Pred, Alloc>& x, |
312 |
const unordered_multiset<Value, Hash, Pred, Alloc>& y); |
313 |
|
314 |
template <class Value, class Hash, class Pred, class Alloc> |
315 |
bool |
316 |
operator!=(const unordered_multiset<Value, Hash, Pred, Alloc>& x, |
317 |
const unordered_multiset<Value, Hash, Pred, Alloc>& y); |
318 |
} // std |
319 |
|
320 |
*/ |
321 |
|
322 |
#include <__config> |
323 |
#include <__hash_table> |
324 |
#include <functional> |
325 |
|
326 |
#include <__debug> |
327 |
|
328 |
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
329 |
#pragma GCC system_header |
330 |
#endif |
331 |
|
332 |
_LIBCPP_BEGIN_NAMESPACE_STD |
333 |
|
334 |
template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>, |
335 |
class _Alloc = allocator<_Value> > |
336 |
class _LIBCPP_TYPE_VIS_ONLY unordered_set |
337 |
{ |
338 |
public: |
339 |
// types |
340 |
typedef _Value key_type; |
341 |
typedef key_type value_type; |
342 |
typedef _Hash hasher; |
343 |
typedef _Pred key_equal; |
344 |
typedef _Alloc allocator_type; |
345 |
typedef value_type& reference; |
346 |
typedef const value_type& const_reference; |
347 |
static_assert((is_same<value_type, typename allocator_type::value_type>::value), |
348 |
"Invalid allocator::value_type"); |
349 |
|
350 |
private: |
351 |
typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table; |
352 |
|
353 |
__table __table_; |
354 |
|
355 |
public: |
356 |
typedef typename __table::pointer pointer; |
357 |
typedef typename __table::const_pointer const_pointer; |
358 |
typedef typename __table::size_type size_type; |
359 |
typedef typename __table::difference_type difference_type; |
360 |
|
361 |
typedef typename __table::const_iterator iterator; |
362 |
typedef typename __table::const_iterator const_iterator; |
363 |
typedef typename __table::const_local_iterator local_iterator; |
364 |
typedef typename __table::const_local_iterator const_local_iterator; |
365 |
|
366 |
_LIBCPP_INLINE_VISIBILITY |
367 |
unordered_set() |
368 |
_NOEXCEPT_(is_nothrow_default_constructible<__table>::value) |
369 |
{ |
370 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
371 |
__get_db()->__insert_c(this); |
372 |
#endif |
373 |
} |
374 |
explicit unordered_set(size_type __n, const hasher& __hf = hasher(), |
375 |
const key_equal& __eql = key_equal()); |
376 |
#if _LIBCPP_STD_VER > 11 |
377 |
inline _LIBCPP_INLINE_VISIBILITY |
378 |
unordered_set(size_type __n, const allocator_type& __a) |
379 |
: unordered_set(__n, hasher(), key_equal(), __a) {} |
380 |
inline _LIBCPP_INLINE_VISIBILITY |
381 |
unordered_set(size_type __n, const hasher& __hf, const allocator_type& __a) |
382 |
: unordered_set(__n, __hf, key_equal(), __a) {} |
383 |
#endif |
384 |
unordered_set(size_type __n, const hasher& __hf, const key_equal& __eql, |
385 |
const allocator_type& __a); |
386 |
template <class _InputIterator> |
387 |
unordered_set(_InputIterator __first, _InputIterator __last); |
388 |
template <class _InputIterator> |
389 |
unordered_set(_InputIterator __first, _InputIterator __last, |
390 |
size_type __n, const hasher& __hf = hasher(), |
391 |
const key_equal& __eql = key_equal()); |
392 |
template <class _InputIterator> |
393 |
unordered_set(_InputIterator __first, _InputIterator __last, |
394 |
size_type __n, const hasher& __hf, const key_equal& __eql, |
395 |
const allocator_type& __a); |
396 |
#if _LIBCPP_STD_VER > 11 |
397 |
template <class _InputIterator> |
398 |
inline _LIBCPP_INLINE_VISIBILITY |
399 |
unordered_set(_InputIterator __first, _InputIterator __last, |
400 |
size_type __n, const allocator_type& __a) |
401 |
: unordered_set(__first, __last, __n, hasher(), key_equal(), __a) {} |
402 |
template <class _InputIterator> |
403 |
unordered_set(_InputIterator __first, _InputIterator __last, |
404 |
size_type __n, const hasher& __hf, const allocator_type& __a) |
405 |
: unordered_set(__first, __last, __n, __hf, key_equal(), __a) {} |
406 |
#endif |
407 |
explicit unordered_set(const allocator_type& __a); |
408 |
unordered_set(const unordered_set& __u); |
409 |
unordered_set(const unordered_set& __u, const allocator_type& __a); |
410 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
411 |
unordered_set(unordered_set&& __u) |
412 |
_NOEXCEPT_(is_nothrow_move_constructible<__table>::value); |
413 |
unordered_set(unordered_set&& __u, const allocator_type& __a); |
414 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
415 |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
416 |
unordered_set(initializer_list<value_type> __il); |
417 |
unordered_set(initializer_list<value_type> __il, size_type __n, |
418 |
const hasher& __hf = hasher(), |
419 |
const key_equal& __eql = key_equal()); |
420 |
unordered_set(initializer_list<value_type> __il, size_type __n, |
421 |
const hasher& __hf, const key_equal& __eql, |
422 |
const allocator_type& __a); |
423 |
#if _LIBCPP_STD_VER > 11 |
424 |
inline _LIBCPP_INLINE_VISIBILITY |
425 |
unordered_set(initializer_list<value_type> __il, size_type __n, |
426 |
const allocator_type& __a) |
427 |
: unordered_set(__il, __n, hasher(), key_equal(), __a) {} |
428 |
inline _LIBCPP_INLINE_VISIBILITY |
429 |
unordered_set(initializer_list<value_type> __il, size_type __n, |
430 |
const hasher& __hf, const allocator_type& __a) |
431 |
: unordered_set(__il, __n, __hf, key_equal(), __a) {} |
432 |
#endif |
433 |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
434 |
// ~unordered_set() = default; |
435 |
_LIBCPP_INLINE_VISIBILITY |
436 |
unordered_set& operator=(const unordered_set& __u) |
437 |
{ |
438 |
__table_ = __u.__table_; |
439 |
return *this; |
440 |
} |
441 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
442 |
unordered_set& operator=(unordered_set&& __u) |
443 |
_NOEXCEPT_(is_nothrow_move_assignable<__table>::value); |
444 |
#endif |
445 |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
446 |
unordered_set& operator=(initializer_list<value_type> __il); |
447 |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
448 |
|
449 |
_LIBCPP_INLINE_VISIBILITY |
450 |
allocator_type get_allocator() const _NOEXCEPT |
451 |
{return allocator_type(__table_.__node_alloc());} |
452 |
|
453 |
_LIBCPP_INLINE_VISIBILITY |
454 |
bool empty() const _NOEXCEPT {return __table_.size() == 0;} |
455 |
_LIBCPP_INLINE_VISIBILITY |
456 |
size_type size() const _NOEXCEPT {return __table_.size();} |
457 |
_LIBCPP_INLINE_VISIBILITY |
458 |
size_type max_size() const _NOEXCEPT {return __table_.max_size();} |
459 |
|
460 |
_LIBCPP_INLINE_VISIBILITY |
461 |
iterator begin() _NOEXCEPT {return __table_.begin();} |
462 |
_LIBCPP_INLINE_VISIBILITY |
463 |
iterator end() _NOEXCEPT {return __table_.end();} |
464 |
_LIBCPP_INLINE_VISIBILITY |
465 |
const_iterator begin() const _NOEXCEPT {return __table_.begin();} |
466 |
_LIBCPP_INLINE_VISIBILITY |
467 |
const_iterator end() const _NOEXCEPT {return __table_.end();} |
468 |
_LIBCPP_INLINE_VISIBILITY |
469 |
const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} |
470 |
_LIBCPP_INLINE_VISIBILITY |
471 |
const_iterator cend() const _NOEXCEPT {return __table_.end();} |
472 |
|
473 |
#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) |
474 |
template <class... _Args> |
475 |
_LIBCPP_INLINE_VISIBILITY |
476 |
pair<iterator, bool> emplace(_Args&&... __args) |
477 |
{return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);} |
478 |
template <class... _Args> |
479 |
_LIBCPP_INLINE_VISIBILITY |
480 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
481 |
iterator emplace_hint(const_iterator __p, _Args&&... __args) |
482 |
{ |
483 |
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, |
484 |
"unordered_set::emplace_hint(const_iterator, args...) called with an iterator not" |
485 |
" referring to this unordered_set"); |
486 |
return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first; |
487 |
} |
488 |
#else |
489 |
iterator emplace_hint(const_iterator, _Args&&... __args) |
490 |
{return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;} |
491 |
#endif |
492 |
#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) |
493 |
_LIBCPP_INLINE_VISIBILITY |
494 |
pair<iterator, bool> insert(const value_type& __x) |
495 |
{return __table_.__insert_unique(__x);} |
496 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
497 |
_LIBCPP_INLINE_VISIBILITY |
498 |
pair<iterator, bool> insert(value_type&& __x) |
499 |
{return __table_.__insert_unique(_VSTD::move(__x));} |
500 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
501 |
_LIBCPP_INLINE_VISIBILITY |
502 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
503 |
iterator insert(const_iterator __p, const value_type& __x) |
504 |
{ |
505 |
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, |
506 |
"unordered_set::insert(const_iterator, const value_type&) called with an iterator not" |
507 |
" referring to this unordered_set"); |
508 |
return insert(__x).first; |
509 |
} |
510 |
#else |
511 |
iterator insert(const_iterator, const value_type& __x) |
512 |
{return insert(__x).first;} |
513 |
#endif |
514 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
515 |
_LIBCPP_INLINE_VISIBILITY |
516 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
517 |
iterator insert(const_iterator __p, value_type&& __x) |
518 |
{ |
519 |
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, |
520 |
"unordered_set::insert(const_iterator, value_type&&) called with an iterator not" |
521 |
" referring to this unordered_set"); |
522 |
return insert(_VSTD::move(__x)).first; |
523 |
} |
524 |
#else |
525 |
iterator insert(const_iterator, value_type&& __x) |
526 |
{return insert(_VSTD::move(__x)).first;} |
527 |
#endif |
528 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
529 |
template <class _InputIterator> |
530 |
void insert(_InputIterator __first, _InputIterator __last); |
531 |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
532 |
_LIBCPP_INLINE_VISIBILITY |
533 |
void insert(initializer_list<value_type> __il) |
534 |
{insert(__il.begin(), __il.end());} |
535 |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
536 |
|
537 |
_LIBCPP_INLINE_VISIBILITY |
538 |
iterator erase(const_iterator __p) {return __table_.erase(__p);} |
539 |
_LIBCPP_INLINE_VISIBILITY |
540 |
size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);} |
541 |
_LIBCPP_INLINE_VISIBILITY |
542 |
iterator erase(const_iterator __first, const_iterator __last) |
543 |
{return __table_.erase(__first, __last);} |
544 |
_LIBCPP_INLINE_VISIBILITY |
545 |
void clear() _NOEXCEPT {__table_.clear();} |
546 |
|
547 |
_LIBCPP_INLINE_VISIBILITY |
548 |
void swap(unordered_set& __u) |
549 |
_NOEXCEPT_(__is_nothrow_swappable<__table>::value) |
550 |
{__table_.swap(__u.__table_);} |
551 |
|
552 |
_LIBCPP_INLINE_VISIBILITY |
553 |
hasher hash_function() const {return __table_.hash_function();} |
554 |
_LIBCPP_INLINE_VISIBILITY |
555 |
key_equal key_eq() const {return __table_.key_eq();} |
556 |
|
557 |
_LIBCPP_INLINE_VISIBILITY |
558 |
iterator find(const key_type& __k) {return __table_.find(__k);} |
559 |
_LIBCPP_INLINE_VISIBILITY |
560 |
const_iterator find(const key_type& __k) const {return __table_.find(__k);} |
561 |
_LIBCPP_INLINE_VISIBILITY |
562 |
size_type count(const key_type& __k) const {return __table_.__count_unique(__k);} |
563 |
_LIBCPP_INLINE_VISIBILITY |
564 |
pair<iterator, iterator> equal_range(const key_type& __k) |
565 |
{return __table_.__equal_range_unique(__k);} |
566 |
_LIBCPP_INLINE_VISIBILITY |
567 |
pair<const_iterator, const_iterator> equal_range(const key_type& __k) const |
568 |
{return __table_.__equal_range_unique(__k);} |
569 |
|
570 |
_LIBCPP_INLINE_VISIBILITY |
571 |
size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} |
572 |
_LIBCPP_INLINE_VISIBILITY |
573 |
size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();} |
574 |
|
575 |
_LIBCPP_INLINE_VISIBILITY |
576 |
size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);} |
577 |
_LIBCPP_INLINE_VISIBILITY |
578 |
size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} |
579 |
|
580 |
_LIBCPP_INLINE_VISIBILITY |
581 |
local_iterator begin(size_type __n) {return __table_.begin(__n);} |
582 |
_LIBCPP_INLINE_VISIBILITY |
583 |
local_iterator end(size_type __n) {return __table_.end(__n);} |
584 |
_LIBCPP_INLINE_VISIBILITY |
585 |
const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} |
586 |
_LIBCPP_INLINE_VISIBILITY |
587 |
const_local_iterator end(size_type __n) const {return __table_.cend(__n);} |
588 |
_LIBCPP_INLINE_VISIBILITY |
589 |
const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} |
590 |
_LIBCPP_INLINE_VISIBILITY |
591 |
const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} |
592 |
|
593 |
_LIBCPP_INLINE_VISIBILITY |
594 |
float load_factor() const _NOEXCEPT {return __table_.load_factor();} |
595 |
_LIBCPP_INLINE_VISIBILITY |
596 |
float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} |
597 |
_LIBCPP_INLINE_VISIBILITY |
598 |
void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} |
599 |
_LIBCPP_INLINE_VISIBILITY |
600 |
void rehash(size_type __n) {__table_.rehash(__n);} |
601 |
_LIBCPP_INLINE_VISIBILITY |
602 |
void reserve(size_type __n) {__table_.reserve(__n);} |
603 |
|
604 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
605 |
|
606 |
bool __dereferenceable(const const_iterator* __i) const |
607 |
{return __table_.__dereferenceable(__i);} |
608 |
bool __decrementable(const const_iterator* __i) const |
609 |
{return __table_.__decrementable(__i);} |
610 |
bool __addable(const const_iterator* __i, ptrdiff_t __n) const |
611 |
{return __table_.__addable(__i, __n);} |
612 |
bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const |
613 |
{return __table_.__addable(__i, __n);} |
614 |
|
615 |
#endif // _LIBCPP_DEBUG_LEVEL >= 2 |
616 |
|
617 |
}; |
618 |
|
619 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
620 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n, |
621 |
const hasher& __hf, const key_equal& __eql) |
622 |
: __table_(__hf, __eql) |
623 |
{ |
624 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
625 |
__get_db()->__insert_c(this); |
626 |
#endif |
627 |
__table_.rehash(__n); |
628 |
} |
629 |
|
630 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
631 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n, |
632 |
const hasher& __hf, const key_equal& __eql, const allocator_type& __a) |
633 |
: __table_(__hf, __eql, __a) |
634 |
{ |
635 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
636 |
__get_db()->__insert_c(this); |
637 |
#endif |
638 |
__table_.rehash(__n); |
639 |
} |
640 |
|
641 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
642 |
template <class _InputIterator> |
643 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( |
644 |
_InputIterator __first, _InputIterator __last) |
645 |
{ |
646 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
647 |
__get_db()->__insert_c(this); |
648 |
#endif |
649 |
insert(__first, __last); |
650 |
} |
651 |
|
652 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
653 |
template <class _InputIterator> |
654 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( |
655 |
_InputIterator __first, _InputIterator __last, size_type __n, |
656 |
const hasher& __hf, const key_equal& __eql) |
657 |
: __table_(__hf, __eql) |
658 |
{ |
659 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
660 |
__get_db()->__insert_c(this); |
661 |
#endif |
662 |
__table_.rehash(__n); |
663 |
insert(__first, __last); |
664 |
} |
665 |
|
666 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
667 |
template <class _InputIterator> |
668 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( |
669 |
_InputIterator __first, _InputIterator __last, size_type __n, |
670 |
const hasher& __hf, const key_equal& __eql, const allocator_type& __a) |
671 |
: __table_(__hf, __eql, __a) |
672 |
{ |
673 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
674 |
__get_db()->__insert_c(this); |
675 |
#endif |
676 |
__table_.rehash(__n); |
677 |
insert(__first, __last); |
678 |
} |
679 |
|
680 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
681 |
inline _LIBCPP_INLINE_VISIBILITY |
682 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( |
683 |
const allocator_type& __a) |
684 |
: __table_(__a) |
685 |
{ |
686 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
687 |
__get_db()->__insert_c(this); |
688 |
#endif |
689 |
} |
690 |
|
691 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
692 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( |
693 |
const unordered_set& __u) |
694 |
: __table_(__u.__table_) |
695 |
{ |
696 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
697 |
__get_db()->__insert_c(this); |
698 |
#endif |
699 |
__table_.rehash(__u.bucket_count()); |
700 |
insert(__u.begin(), __u.end()); |
701 |
} |
702 |
|
703 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
704 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( |
705 |
const unordered_set& __u, const allocator_type& __a) |
706 |
: __table_(__u.__table_, __a) |
707 |
{ |
708 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
709 |
__get_db()->__insert_c(this); |
710 |
#endif |
711 |
__table_.rehash(__u.bucket_count()); |
712 |
insert(__u.begin(), __u.end()); |
713 |
} |
714 |
|
715 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
716 |
|
717 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
718 |
inline _LIBCPP_INLINE_VISIBILITY |
719 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( |
720 |
unordered_set&& __u) |
721 |
_NOEXCEPT_(is_nothrow_move_constructible<__table>::value) |
722 |
: __table_(_VSTD::move(__u.__table_)) |
723 |
{ |
724 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
725 |
__get_db()->__insert_c(this); |
726 |
__get_db()->swap(this, &__u); |
727 |
#endif |
728 |
} |
729 |
|
730 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
731 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( |
732 |
unordered_set&& __u, const allocator_type& __a) |
733 |
: __table_(_VSTD::move(__u.__table_), __a) |
734 |
{ |
735 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
736 |
__get_db()->__insert_c(this); |
737 |
#endif |
738 |
if (__a != __u.get_allocator()) |
739 |
{ |
740 |
iterator __i = __u.begin(); |
741 |
while (__u.size() != 0) |
742 |
__table_.__insert_unique(_VSTD::move(__u.__table_.remove(__i++)->__value_)); |
743 |
} |
744 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
745 |
else |
746 |
__get_db()->swap(this, &__u); |
747 |
#endif |
748 |
} |
749 |
|
750 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
751 |
|
752 |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
753 |
|
754 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
755 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( |
756 |
initializer_list<value_type> __il) |
757 |
{ |
758 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
759 |
__get_db()->__insert_c(this); |
760 |
#endif |
761 |
insert(__il.begin(), __il.end()); |
762 |
} |
763 |
|
764 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
765 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( |
766 |
initializer_list<value_type> __il, size_type __n, const hasher& __hf, |
767 |
const key_equal& __eql) |
768 |
: __table_(__hf, __eql) |
769 |
{ |
770 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
771 |
__get_db()->__insert_c(this); |
772 |
#endif |
773 |
__table_.rehash(__n); |
774 |
insert(__il.begin(), __il.end()); |
775 |
} |
776 |
|
777 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
778 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( |
779 |
initializer_list<value_type> __il, size_type __n, const hasher& __hf, |
780 |
const key_equal& __eql, const allocator_type& __a) |
781 |
: __table_(__hf, __eql, __a) |
782 |
{ |
783 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
784 |
__get_db()->__insert_c(this); |
785 |
#endif |
786 |
__table_.rehash(__n); |
787 |
insert(__il.begin(), __il.end()); |
788 |
} |
789 |
|
790 |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
791 |
|
792 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
793 |
|
794 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
795 |
inline _LIBCPP_INLINE_VISIBILITY |
796 |
unordered_set<_Value, _Hash, _Pred, _Alloc>& |
797 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(unordered_set&& __u) |
798 |
_NOEXCEPT_(is_nothrow_move_assignable<__table>::value) |
799 |
{ |
800 |
__table_ = _VSTD::move(__u.__table_); |
801 |
return *this; |
802 |
} |
803 |
|
804 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
805 |
|
806 |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
807 |
|
808 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
809 |
inline _LIBCPP_INLINE_VISIBILITY |
810 |
unordered_set<_Value, _Hash, _Pred, _Alloc>& |
811 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=( |
812 |
initializer_list<value_type> __il) |
813 |
{ |
814 |
__table_.__assign_unique(__il.begin(), __il.end()); |
815 |
return *this; |
816 |
} |
817 |
|
818 |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
819 |
|
820 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
821 |
template <class _InputIterator> |
822 |
inline _LIBCPP_INLINE_VISIBILITY |
823 |
void |
824 |
unordered_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, |
825 |
_InputIterator __last) |
826 |
{ |
827 |
for (; __first != __last; ++__first) |
828 |
__table_.__insert_unique(*__first); |
829 |
} |
830 |
|
831 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
832 |
inline _LIBCPP_INLINE_VISIBILITY |
833 |
void |
834 |
swap(unordered_set<_Value, _Hash, _Pred, _Alloc>& __x, |
835 |
unordered_set<_Value, _Hash, _Pred, _Alloc>& __y) |
836 |
_NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) |
837 |
{ |
838 |
__x.swap(__y); |
839 |
} |
840 |
|
841 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
842 |
bool |
843 |
operator==(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x, |
844 |
const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y) |
845 |
{ |
846 |
if (__x.size() != __y.size()) |
847 |
return false; |
848 |
typedef typename unordered_set<_Value, _Hash, _Pred, _Alloc>::const_iterator |
849 |
const_iterator; |
850 |
for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end(); |
851 |
__i != __ex; ++__i) |
852 |
{ |
853 |
const_iterator __j = __y.find(*__i); |
854 |
if (__j == __ey || !(*__i == *__j)) |
855 |
return false; |
856 |
} |
857 |
return true; |
858 |
} |
859 |
|
860 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
861 |
inline _LIBCPP_INLINE_VISIBILITY |
862 |
bool |
863 |
operator!=(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x, |
864 |
const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y) |
865 |
{ |
866 |
return !(__x == __y); |
867 |
} |
868 |
|
869 |
template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>, |
870 |
class _Alloc = allocator<_Value> > |
871 |
class _LIBCPP_TYPE_VIS_ONLY unordered_multiset |
872 |
{ |
873 |
public: |
874 |
// types |
875 |
typedef _Value key_type; |
876 |
typedef key_type value_type; |
877 |
typedef _Hash hasher; |
878 |
typedef _Pred key_equal; |
879 |
typedef _Alloc allocator_type; |
880 |
typedef value_type& reference; |
881 |
typedef const value_type& const_reference; |
882 |
static_assert((is_same<value_type, typename allocator_type::value_type>::value), |
883 |
"Invalid allocator::value_type"); |
884 |
|
885 |
private: |
886 |
typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table; |
887 |
|
888 |
__table __table_; |
889 |
|
890 |
public: |
891 |
typedef typename __table::pointer pointer; |
892 |
typedef typename __table::const_pointer const_pointer; |
893 |
typedef typename __table::size_type size_type; |
894 |
typedef typename __table::difference_type difference_type; |
895 |
|
896 |
typedef typename __table::const_iterator iterator; |
897 |
typedef typename __table::const_iterator const_iterator; |
898 |
typedef typename __table::const_local_iterator local_iterator; |
899 |
typedef typename __table::const_local_iterator const_local_iterator; |
900 |
|
901 |
_LIBCPP_INLINE_VISIBILITY |
902 |
unordered_multiset() |
903 |
_NOEXCEPT_(is_nothrow_default_constructible<__table>::value) |
904 |
{ |
905 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
906 |
__get_db()->__insert_c(this); |
907 |
#endif |
908 |
} |
909 |
explicit unordered_multiset(size_type __n, const hasher& __hf = hasher(), |
910 |
const key_equal& __eql = key_equal()); |
911 |
unordered_multiset(size_type __n, const hasher& __hf, |
912 |
const key_equal& __eql, const allocator_type& __a); |
913 |
#if _LIBCPP_STD_VER > 11 |
914 |
inline _LIBCPP_INLINE_VISIBILITY |
915 |
unordered_multiset(size_type __n, const allocator_type& __a) |
916 |
: unordered_multiset(__n, hasher(), key_equal(), __a) {} |
917 |
inline _LIBCPP_INLINE_VISIBILITY |
918 |
unordered_multiset(size_type __n, const hasher& __hf, const allocator_type& __a) |
919 |
: unordered_multiset(__n, __hf, key_equal(), __a) {} |
920 |
#endif |
921 |
template <class _InputIterator> |
922 |
unordered_multiset(_InputIterator __first, _InputIterator __last); |
923 |
template <class _InputIterator> |
924 |
unordered_multiset(_InputIterator __first, _InputIterator __last, |
925 |
size_type __n, const hasher& __hf = hasher(), |
926 |
const key_equal& __eql = key_equal()); |
927 |
template <class _InputIterator> |
928 |
unordered_multiset(_InputIterator __first, _InputIterator __last, |
929 |
size_type __n , const hasher& __hf, |
930 |
const key_equal& __eql, const allocator_type& __a); |
931 |
#if _LIBCPP_STD_VER > 11 |
932 |
template <class _InputIterator> |
933 |
inline _LIBCPP_INLINE_VISIBILITY |
934 |
unordered_multiset(_InputIterator __first, _InputIterator __last, |
935 |
size_type __n, const allocator_type& __a) |
936 |
: unordered_multiset(__first, __last, __n, hasher(), key_equal(), __a) {} |
937 |
template <class _InputIterator> |
938 |
inline _LIBCPP_INLINE_VISIBILITY |
939 |
unordered_multiset(_InputIterator __first, _InputIterator __last, |
940 |
size_type __n, const hasher& __hf, const allocator_type& __a) |
941 |
: unordered_multiset(__first, __last, __n, __hf, key_equal(), __a) {} |
942 |
#endif |
943 |
explicit unordered_multiset(const allocator_type& __a); |
944 |
unordered_multiset(const unordered_multiset& __u); |
945 |
unordered_multiset(const unordered_multiset& __u, const allocator_type& __a); |
946 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
947 |
unordered_multiset(unordered_multiset&& __u) |
948 |
_NOEXCEPT_(is_nothrow_move_constructible<__table>::value); |
949 |
unordered_multiset(unordered_multiset&& __u, const allocator_type& __a); |
950 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
951 |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
952 |
unordered_multiset(initializer_list<value_type> __il); |
953 |
unordered_multiset(initializer_list<value_type> __il, size_type __n, |
954 |
const hasher& __hf = hasher(), |
955 |
const key_equal& __eql = key_equal()); |
956 |
unordered_multiset(initializer_list<value_type> __il, size_type __n, |
957 |
const hasher& __hf, const key_equal& __eql, |
958 |
const allocator_type& __a); |
959 |
#if _LIBCPP_STD_VER > 11 |
960 |
inline _LIBCPP_INLINE_VISIBILITY |
961 |
unordered_multiset(initializer_list<value_type> __il, size_type __n, const allocator_type& __a) |
962 |
: unordered_multiset(__il, __n, hasher(), key_equal(), __a) {} |
963 |
inline _LIBCPP_INLINE_VISIBILITY |
964 |
unordered_multiset(initializer_list<value_type> __il, size_type __n, const hasher& __hf, const allocator_type& __a) |
965 |
: unordered_multiset(__il, __n, __hf, key_equal(), __a) {} |
966 |
#endif |
967 |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
968 |
// ~unordered_multiset() = default; |
969 |
_LIBCPP_INLINE_VISIBILITY |
970 |
unordered_multiset& operator=(const unordered_multiset& __u) |
971 |
{ |
972 |
__table_ = __u.__table_; |
973 |
return *this; |
974 |
} |
975 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
976 |
unordered_multiset& operator=(unordered_multiset&& __u) |
977 |
_NOEXCEPT_(is_nothrow_move_assignable<__table>::value); |
978 |
#endif |
979 |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
980 |
unordered_multiset& operator=(initializer_list<value_type> __il); |
981 |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
982 |
|
983 |
_LIBCPP_INLINE_VISIBILITY |
984 |
allocator_type get_allocator() const _NOEXCEPT |
985 |
{return allocator_type(__table_.__node_alloc());} |
986 |
|
987 |
_LIBCPP_INLINE_VISIBILITY |
988 |
bool empty() const _NOEXCEPT {return __table_.size() == 0;} |
989 |
_LIBCPP_INLINE_VISIBILITY |
990 |
size_type size() const _NOEXCEPT {return __table_.size();} |
991 |
_LIBCPP_INLINE_VISIBILITY |
992 |
size_type max_size() const _NOEXCEPT {return __table_.max_size();} |
993 |
|
994 |
_LIBCPP_INLINE_VISIBILITY |
995 |
iterator begin() _NOEXCEPT {return __table_.begin();} |
996 |
_LIBCPP_INLINE_VISIBILITY |
997 |
iterator end() _NOEXCEPT {return __table_.end();} |
998 |
_LIBCPP_INLINE_VISIBILITY |
999 |
const_iterator begin() const _NOEXCEPT {return __table_.begin();} |
1000 |
_LIBCPP_INLINE_VISIBILITY |
1001 |
const_iterator end() const _NOEXCEPT {return __table_.end();} |
1002 |
_LIBCPP_INLINE_VISIBILITY |
1003 |
const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} |
1004 |
_LIBCPP_INLINE_VISIBILITY |
1005 |
const_iterator cend() const _NOEXCEPT {return __table_.end();} |
1006 |
|
1007 |
#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) |
1008 |
template <class... _Args> |
1009 |
_LIBCPP_INLINE_VISIBILITY |
1010 |
iterator emplace(_Args&&... __args) |
1011 |
{return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);} |
1012 |
template <class... _Args> |
1013 |
_LIBCPP_INLINE_VISIBILITY |
1014 |
iterator emplace_hint(const_iterator __p, _Args&&... __args) |
1015 |
{return __table_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);} |
1016 |
#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) |
1017 |
_LIBCPP_INLINE_VISIBILITY |
1018 |
iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);} |
1019 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1020 |
_LIBCPP_INLINE_VISIBILITY |
1021 |
iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));} |
1022 |
#endif |
1023 |
_LIBCPP_INLINE_VISIBILITY |
1024 |
iterator insert(const_iterator __p, const value_type& __x) |
1025 |
{return __table_.__insert_multi(__p, __x);} |
1026 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1027 |
_LIBCPP_INLINE_VISIBILITY |
1028 |
iterator insert(const_iterator __p, value_type&& __x) |
1029 |
{return __table_.__insert_multi(__p, _VSTD::move(__x));} |
1030 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1031 |
template <class _InputIterator> |
1032 |
void insert(_InputIterator __first, _InputIterator __last); |
1033 |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
1034 |
_LIBCPP_INLINE_VISIBILITY |
1035 |
void insert(initializer_list<value_type> __il) |
1036 |
{insert(__il.begin(), __il.end());} |
1037 |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
1038 |
|
1039 |
_LIBCPP_INLINE_VISIBILITY |
1040 |
iterator erase(const_iterator __p) {return __table_.erase(__p);} |
1041 |
_LIBCPP_INLINE_VISIBILITY |
1042 |
size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);} |
1043 |
_LIBCPP_INLINE_VISIBILITY |
1044 |
iterator erase(const_iterator __first, const_iterator __last) |
1045 |
{return __table_.erase(__first, __last);} |
1046 |
_LIBCPP_INLINE_VISIBILITY |
1047 |
void clear() _NOEXCEPT {__table_.clear();} |
1048 |
|
1049 |
_LIBCPP_INLINE_VISIBILITY |
1050 |
void swap(unordered_multiset& __u) |
1051 |
_NOEXCEPT_(__is_nothrow_swappable<__table>::value) |
1052 |
{__table_.swap(__u.__table_);} |
1053 |
|
1054 |
_LIBCPP_INLINE_VISIBILITY |
1055 |
hasher hash_function() const {return __table_.hash_function();} |
1056 |
_LIBCPP_INLINE_VISIBILITY |
1057 |
key_equal key_eq() const {return __table_.key_eq();} |
1058 |
|
1059 |
_LIBCPP_INLINE_VISIBILITY |
1060 |
iterator find(const key_type& __k) {return __table_.find(__k);} |
1061 |
_LIBCPP_INLINE_VISIBILITY |
1062 |
const_iterator find(const key_type& __k) const {return __table_.find(__k);} |
1063 |
_LIBCPP_INLINE_VISIBILITY |
1064 |
size_type count(const key_type& __k) const {return __table_.__count_multi(__k);} |
1065 |
_LIBCPP_INLINE_VISIBILITY |
1066 |
pair<iterator, iterator> equal_range(const key_type& __k) |
1067 |
{return __table_.__equal_range_multi(__k);} |
1068 |
_LIBCPP_INLINE_VISIBILITY |
1069 |
pair<const_iterator, const_iterator> equal_range(const key_type& __k) const |
1070 |
{return __table_.__equal_range_multi(__k);} |
1071 |
|
1072 |
_LIBCPP_INLINE_VISIBILITY |
1073 |
size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} |
1074 |
_LIBCPP_INLINE_VISIBILITY |
1075 |
size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();} |
1076 |
|
1077 |
_LIBCPP_INLINE_VISIBILITY |
1078 |
size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);} |
1079 |
_LIBCPP_INLINE_VISIBILITY |
1080 |
size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} |
1081 |
|
1082 |
_LIBCPP_INLINE_VISIBILITY |
1083 |
local_iterator begin(size_type __n) {return __table_.begin(__n);} |
1084 |
_LIBCPP_INLINE_VISIBILITY |
1085 |
local_iterator end(size_type __n) {return __table_.end(__n);} |
1086 |
_LIBCPP_INLINE_VISIBILITY |
1087 |
const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} |
1088 |
_LIBCPP_INLINE_VISIBILITY |
1089 |
const_local_iterator end(size_type __n) const {return __table_.cend(__n);} |
1090 |
_LIBCPP_INLINE_VISIBILITY |
1091 |
const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} |
1092 |
_LIBCPP_INLINE_VISIBILITY |
1093 |
const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} |
1094 |
|
1095 |
_LIBCPP_INLINE_VISIBILITY |
1096 |
float load_factor() const _NOEXCEPT {return __table_.load_factor();} |
1097 |
_LIBCPP_INLINE_VISIBILITY |
1098 |
float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} |
1099 |
_LIBCPP_INLINE_VISIBILITY |
1100 |
void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} |
1101 |
_LIBCPP_INLINE_VISIBILITY |
1102 |
void rehash(size_type __n) {__table_.rehash(__n);} |
1103 |
_LIBCPP_INLINE_VISIBILITY |
1104 |
void reserve(size_type __n) {__table_.reserve(__n);} |
1105 |
|
1106 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
1107 |
|
1108 |
bool __dereferenceable(const const_iterator* __i) const |
1109 |
{return __table_.__dereferenceable(__i);} |
1110 |
bool __decrementable(const const_iterator* __i) const |
1111 |
{return __table_.__decrementable(__i);} |
1112 |
bool __addable(const const_iterator* __i, ptrdiff_t __n) const |
1113 |
{return __table_.__addable(__i, __n);} |
1114 |
bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const |
1115 |
{return __table_.__addable(__i, __n);} |
1116 |
|
1117 |
#endif // _LIBCPP_DEBUG_LEVEL >= 2 |
1118 |
|
1119 |
}; |
1120 |
|
1121 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1122 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( |
1123 |
size_type __n, const hasher& __hf, const key_equal& __eql) |
1124 |
: __table_(__hf, __eql) |
1125 |
{ |
1126 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
1127 |
__get_db()->__insert_c(this); |
1128 |
#endif |
1129 |
__table_.rehash(__n); |
1130 |
} |
1131 |
|
1132 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1133 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( |
1134 |
size_type __n, const hasher& __hf, const key_equal& __eql, |
1135 |
const allocator_type& __a) |
1136 |
: __table_(__hf, __eql, __a) |
1137 |
{ |
1138 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
1139 |
__get_db()->__insert_c(this); |
1140 |
#endif |
1141 |
__table_.rehash(__n); |
1142 |
} |
1143 |
|
1144 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1145 |
template <class _InputIterator> |
1146 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( |
1147 |
_InputIterator __first, _InputIterator __last) |
1148 |
{ |
1149 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
1150 |
__get_db()->__insert_c(this); |
1151 |
#endif |
1152 |
insert(__first, __last); |
1153 |
} |
1154 |
|
1155 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1156 |
template <class _InputIterator> |
1157 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( |
1158 |
_InputIterator __first, _InputIterator __last, size_type __n, |
1159 |
const hasher& __hf, const key_equal& __eql) |
1160 |
: __table_(__hf, __eql) |
1161 |
{ |
1162 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
1163 |
__get_db()->__insert_c(this); |
1164 |
#endif |
1165 |
__table_.rehash(__n); |
1166 |
insert(__first, __last); |
1167 |
} |
1168 |
|
1169 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1170 |
template <class _InputIterator> |
1171 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( |
1172 |
_InputIterator __first, _InputIterator __last, size_type __n, |
1173 |
const hasher& __hf, const key_equal& __eql, const allocator_type& __a) |
1174 |
: __table_(__hf, __eql, __a) |
1175 |
{ |
1176 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
1177 |
__get_db()->__insert_c(this); |
1178 |
#endif |
1179 |
__table_.rehash(__n); |
1180 |
insert(__first, __last); |
1181 |
} |
1182 |
|
1183 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1184 |
inline _LIBCPP_INLINE_VISIBILITY |
1185 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( |
1186 |
const allocator_type& __a) |
1187 |
: __table_(__a) |
1188 |
{ |
1189 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
1190 |
__get_db()->__insert_c(this); |
1191 |
#endif |
1192 |
} |
1193 |
|
1194 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1195 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( |
1196 |
const unordered_multiset& __u) |
1197 |
: __table_(__u.__table_) |
1198 |
{ |
1199 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
1200 |
__get_db()->__insert_c(this); |
1201 |
#endif |
1202 |
__table_.rehash(__u.bucket_count()); |
1203 |
insert(__u.begin(), __u.end()); |
1204 |
} |
1205 |
|
1206 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1207 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( |
1208 |
const unordered_multiset& __u, const allocator_type& __a) |
1209 |
: __table_(__u.__table_, __a) |
1210 |
{ |
1211 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
1212 |
__get_db()->__insert_c(this); |
1213 |
#endif |
1214 |
__table_.rehash(__u.bucket_count()); |
1215 |
insert(__u.begin(), __u.end()); |
1216 |
} |
1217 |
|
1218 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1219 |
|
1220 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1221 |
inline _LIBCPP_INLINE_VISIBILITY |
1222 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( |
1223 |
unordered_multiset&& __u) |
1224 |
_NOEXCEPT_(is_nothrow_move_constructible<__table>::value) |
1225 |
: __table_(_VSTD::move(__u.__table_)) |
1226 |
{ |
1227 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
1228 |
__get_db()->__insert_c(this); |
1229 |
__get_db()->swap(this, &__u); |
1230 |
#endif |
1231 |
} |
1232 |
|
1233 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1234 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( |
1235 |
unordered_multiset&& __u, const allocator_type& __a) |
1236 |
: __table_(_VSTD::move(__u.__table_), __a) |
1237 |
{ |
1238 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
1239 |
__get_db()->__insert_c(this); |
1240 |
#endif |
1241 |
if (__a != __u.get_allocator()) |
1242 |
{ |
1243 |
iterator __i = __u.begin(); |
1244 |
while (__u.size() != 0) |
1245 |
__table_.__insert_multi(_VSTD::move(__u.__table_.remove(__i++)->__value_)); |
1246 |
} |
1247 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
1248 |
else |
1249 |
__get_db()->swap(this, &__u); |
1250 |
#endif |
1251 |
} |
1252 |
|
1253 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1254 |
|
1255 |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
1256 |
|
1257 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1258 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( |
1259 |
initializer_list<value_type> __il) |
1260 |
{ |
1261 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
1262 |
__get_db()->__insert_c(this); |
1263 |
#endif |
1264 |
insert(__il.begin(), __il.end()); |
1265 |
} |
1266 |
|
1267 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1268 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( |
1269 |
initializer_list<value_type> __il, size_type __n, const hasher& __hf, |
1270 |
const key_equal& __eql) |
1271 |
: __table_(__hf, __eql) |
1272 |
{ |
1273 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
1274 |
__get_db()->__insert_c(this); |
1275 |
#endif |
1276 |
__table_.rehash(__n); |
1277 |
insert(__il.begin(), __il.end()); |
1278 |
} |
1279 |
|
1280 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1281 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( |
1282 |
initializer_list<value_type> __il, size_type __n, const hasher& __hf, |
1283 |
const key_equal& __eql, const allocator_type& __a) |
1284 |
: __table_(__hf, __eql, __a) |
1285 |
{ |
1286 |
#if _LIBCPP_DEBUG_LEVEL >= 2 |
1287 |
__get_db()->__insert_c(this); |
1288 |
#endif |
1289 |
__table_.rehash(__n); |
1290 |
insert(__il.begin(), __il.end()); |
1291 |
} |
1292 |
|
1293 |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
1294 |
|
1295 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1296 |
|
1297 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1298 |
inline _LIBCPP_INLINE_VISIBILITY |
1299 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>& |
1300 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=( |
1301 |
unordered_multiset&& __u) |
1302 |
_NOEXCEPT_(is_nothrow_move_assignable<__table>::value) |
1303 |
{ |
1304 |
__table_ = _VSTD::move(__u.__table_); |
1305 |
return *this; |
1306 |
} |
1307 |
|
1308 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1309 |
|
1310 |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
1311 |
|
1312 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1313 |
inline |
1314 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>& |
1315 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=( |
1316 |
initializer_list<value_type> __il) |
1317 |
{ |
1318 |
__table_.__assign_multi(__il.begin(), __il.end()); |
1319 |
return *this; |
1320 |
} |
1321 |
|
1322 |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
1323 |
|
1324 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1325 |
template <class _InputIterator> |
1326 |
inline _LIBCPP_INLINE_VISIBILITY |
1327 |
void |
1328 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, |
1329 |
_InputIterator __last) |
1330 |
{ |
1331 |
for (; __first != __last; ++__first) |
1332 |
__table_.__insert_multi(*__first); |
1333 |
} |
1334 |
|
1335 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1336 |
inline _LIBCPP_INLINE_VISIBILITY |
1337 |
void |
1338 |
swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, |
1339 |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) |
1340 |
_NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) |
1341 |
{ |
1342 |
__x.swap(__y); |
1343 |
} |
1344 |
|
1345 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1346 |
bool |
1347 |
operator==(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, |
1348 |
const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) |
1349 |
{ |
1350 |
if (__x.size() != __y.size()) |
1351 |
return false; |
1352 |
typedef typename unordered_multiset<_Value, _Hash, _Pred, _Alloc>::const_iterator |
1353 |
const_iterator; |
1354 |
typedef pair<const_iterator, const_iterator> _EqRng; |
1355 |
for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;) |
1356 |
{ |
1357 |
_EqRng __xeq = __x.equal_range(*__i); |
1358 |
_EqRng __yeq = __y.equal_range(*__i); |
1359 |
if (_VSTD::distance(__xeq.first, __xeq.second) != |
1360 |
_VSTD::distance(__yeq.first, __yeq.second) || |
1361 |
!_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first)) |
1362 |
return false; |
1363 |
__i = __xeq.second; |
1364 |
} |
1365 |
return true; |
1366 |
} |
1367 |
|
1368 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
1369 |
inline _LIBCPP_INLINE_VISIBILITY |
1370 |
bool |
1371 |
operator!=(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, |
1372 |
const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) |
1373 |
{ |
1374 |
return !(__x == __y); |
1375 |
} |
1376 |
|
1377 |
_LIBCPP_END_NAMESPACE_STD |
1378 |
|
1379 |
#endif // _LIBCPP_UNORDERED_SET |