]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/libc++/include/unordered_set
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / libc++ / include / unordered_set
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();
72     unordered_set& operator=(const unordered_set&);
73     unordered_set& operator=(unordered_set&&)
74         noexcept(
75             allocator_type::propagate_on_container_move_assignment::value &&
76             is_nothrow_move_assignable<allocator_type>::value &&
77             is_nothrow_move_assignable<hasher>::value &&
78             is_nothrow_move_assignable<key_equal>::value);
79     unordered_set& operator=(initializer_list<value_type>);
80
81     allocator_type get_allocator() const noexcept;
82
83     bool      empty() const noexcept;
84     size_type size() const noexcept;
85     size_type max_size() const noexcept;
86
87     iterator       begin() noexcept;
88     iterator       end() noexcept;
89     const_iterator begin()  const noexcept;
90     const_iterator end()    const noexcept;
91     const_iterator cbegin() const noexcept;
92     const_iterator cend()   const noexcept;
93
94     template <class... Args>
95         pair<iterator, bool> emplace(Args&&... args);
96     template <class... Args>
97         iterator emplace_hint(const_iterator position, Args&&... args);
98     pair<iterator, bool> insert(const value_type& obj);
99     pair<iterator, bool> insert(value_type&& obj);
100     iterator insert(const_iterator hint, const value_type& obj);
101     iterator insert(const_iterator hint, value_type&& obj);
102     template <class InputIterator>
103         void insert(InputIterator first, InputIterator last);
104     void insert(initializer_list<value_type>);
105
106     iterator erase(const_iterator position);
107     size_type erase(const key_type& k);
108     iterator erase(const_iterator first, const_iterator last);
109     void clear() noexcept;
110
111     void swap(unordered_set&)
112         noexcept(
113             (!allocator_type::propagate_on_container_swap::value ||
114              __is_nothrow_swappable<allocator_type>::value) &&
115             __is_nothrow_swappable<hasher>::value &&
116             __is_nothrow_swappable<key_equal>::value);
117
118     hasher hash_function() const;
119     key_equal key_eq() const;
120
121     iterator       find(const key_type& k);
122     const_iterator find(const key_type& k) const;
123     size_type count(const key_type& k) const;
124     pair<iterator, iterator>             equal_range(const key_type& k);
125     pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
126
127     size_type bucket_count() const noexcept;
128     size_type max_bucket_count() const noexcept;
129
130     size_type bucket_size(size_type n) const;
131     size_type bucket(const key_type& k) const;
132
133     local_iterator       begin(size_type n);
134     local_iterator       end(size_type n);
135     const_local_iterator begin(size_type n) const;
136     const_local_iterator end(size_type n) const;
137     const_local_iterator cbegin(size_type n) const;
138     const_local_iterator cend(size_type n) const;
139
140     float load_factor() const noexcept;
141     float max_load_factor() const noexcept;
142     void max_load_factor(float z);
143     void rehash(size_type n);
144     void reserve(size_type n);
145 };
146
147 template <class Value, class Hash, class Pred, class Alloc>
148     void swap(unordered_set<Value, Hash, Pred, Alloc>& x,
149               unordered_set<Value, Hash, Pred, Alloc>& y)
150               noexcept(noexcept(x.swap(y)));
151
152 template <class Value, class Hash, class Pred, class Alloc>
153     bool
154     operator==(const unordered_set<Value, Hash, Pred, Alloc>& x,
155                const unordered_set<Value, Hash, Pred, Alloc>& y);
156
157 template <class Value, class Hash, class Pred, class Alloc>
158     bool
159     operator!=(const unordered_set<Value, Hash, Pred, Alloc>& x,
160                const unordered_set<Value, Hash, Pred, Alloc>& y);
161
162 template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
163           class Alloc = allocator<Value>>
164 class unordered_multiset
165 {
166 public:
167     // types
168     typedef Value                                                      key_type;
169     typedef key_type                                                   value_type;
170     typedef Hash                                                       hasher;
171     typedef Pred                                                       key_equal;
172     typedef Alloc                                                      allocator_type;
173     typedef value_type&                                                reference;
174     typedef const value_type&                                          const_reference;
175     typedef typename allocator_traits<allocator_type>::pointer         pointer;
176     typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
177     typedef typename allocator_traits<allocator_type>::size_type       size_type;
178     typedef typename allocator_traits<allocator_type>::difference_type difference_type;
179
180     typedef /unspecified/ iterator;
181     typedef /unspecified/ const_iterator;
182     typedef /unspecified/ local_iterator;
183     typedef /unspecified/ const_local_iterator;
184
185     unordered_multiset()
186         noexcept(
187             is_nothrow_default_constructible<hasher>::value &&
188             is_nothrow_default_constructible<key_equal>::value &&
189             is_nothrow_default_constructible<allocator_type>::value);
190     explicit unordered_multiset(size_type n, const hasher& hf = hasher(),
191                            const key_equal& eql = key_equal(),
192                            const allocator_type& a = allocator_type());
193     template <class InputIterator>
194         unordered_multiset(InputIterator f, InputIterator l,
195                       size_type n = 0, const hasher& hf = hasher(),
196                       const key_equal& eql = key_equal(),
197                       const allocator_type& a = allocator_type());
198     explicit unordered_multiset(const allocator_type&);
199     unordered_multiset(const unordered_multiset&);
200     unordered_multiset(const unordered_multiset&, const Allocator&);
201     unordered_multiset(unordered_multiset&&)
202         noexcept(
203             is_nothrow_move_constructible<hasher>::value &&
204             is_nothrow_move_constructible<key_equal>::value &&
205             is_nothrow_move_constructible<allocator_type>::value);
206     unordered_multiset(unordered_multiset&&, const Allocator&);
207     unordered_multiset(initializer_list<value_type>, size_type n = /see below/,
208                   const hasher& hf = hasher(), const key_equal& eql = key_equal(),
209                   const allocator_type& a = allocator_type());
210     ~unordered_multiset();
211     unordered_multiset& operator=(const unordered_multiset&);
212     unordered_multiset& operator=(unordered_multiset&&)
213         noexcept(
214             allocator_type::propagate_on_container_move_assignment::value &&
215             is_nothrow_move_assignable<allocator_type>::value &&
216             is_nothrow_move_assignable<hasher>::value &&
217             is_nothrow_move_assignable<key_equal>::value);
218     unordered_multiset& operator=(initializer_list<value_type>);
219
220     allocator_type get_allocator() const noexcept;
221
222     bool      empty() const noexcept;
223     size_type size() const noexcept;
224     size_type max_size() const noexcept;
225
226     iterator       begin() noexcept;
227     iterator       end() noexcept;
228     const_iterator begin()  const noexcept;
229     const_iterator end()    const noexcept;
230     const_iterator cbegin() const noexcept;
231     const_iterator cend()   const noexcept;
232
233     template <class... Args>
234         iterator emplace(Args&&... args);
235     template <class... Args>
236         iterator emplace_hint(const_iterator position, Args&&... args);
237     iterator insert(const value_type& obj);
238     iterator insert(value_type&& obj);
239     iterator insert(const_iterator hint, const value_type& obj);
240     iterator insert(const_iterator hint, value_type&& obj);
241     template <class InputIterator>
242         void insert(InputIterator first, InputIterator last);
243     void insert(initializer_list<value_type>);
244
245     iterator erase(const_iterator position);
246     size_type erase(const key_type& k);
247     iterator erase(const_iterator first, const_iterator last);
248     void clear() noexcept;
249
250     void swap(unordered_multiset&)
251         noexcept(
252             (!allocator_type::propagate_on_container_swap::value ||
253              __is_nothrow_swappable<allocator_type>::value) &&
254             __is_nothrow_swappable<hasher>::value &&
255             __is_nothrow_swappable<key_equal>::value);
256
257     hasher hash_function() const;
258     key_equal key_eq() const;
259
260     iterator       find(const key_type& k);
261     const_iterator find(const key_type& k) const;
262     size_type count(const key_type& k) const;
263     pair<iterator, iterator>             equal_range(const key_type& k);
264     pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
265
266     size_type bucket_count() const noexcept;
267     size_type max_bucket_count() const noexcept;
268
269     size_type bucket_size(size_type n) const;
270     size_type bucket(const key_type& k) const;
271
272     local_iterator       begin(size_type n);
273     local_iterator       end(size_type n);
274     const_local_iterator begin(size_type n) const;
275     const_local_iterator end(size_type n) const;
276     const_local_iterator cbegin(size_type n) const;
277     const_local_iterator cend(size_type n) const;
278
279     float load_factor() const noexcept;
280     float max_load_factor() const noexcept;
281     void max_load_factor(float z);
282     void rehash(size_type n);
283     void reserve(size_type n);
284 };
285
286 template <class Value, class Hash, class Pred, class Alloc>
287     void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x,
288               unordered_multiset<Value, Hash, Pred, Alloc>& y)
289               noexcept(noexcept(x.swap(y)));
290
291 template <class Value, class Hash, class Pred, class Alloc>
292     bool
293     operator==(const unordered_multiset<Value, Hash, Pred, Alloc>& x,
294                const unordered_multiset<Value, Hash, Pred, Alloc>& y);
295
296 template <class Value, class Hash, class Pred, class Alloc>
297     bool
298     operator!=(const unordered_multiset<Value, Hash, Pred, Alloc>& x,
299                const unordered_multiset<Value, Hash, Pred, Alloc>& y);
300 }  // std
301
302 */
303
304 #include <__config>
305 #include <__hash_table>
306 #include <functional>
307
308 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
309 #pragma GCC system_header
310 #endif
311
312 _LIBCPP_BEGIN_NAMESPACE_STD
313
314 template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
315           class _Alloc = allocator<_Value> >
316 class _LIBCPP_TYPE_VIS unordered_set
317 {
318 public:
319     // types
320     typedef _Value                                                     key_type;
321     typedef key_type                                                   value_type;
322     typedef _Hash                                                      hasher;
323     typedef _Pred                                                      key_equal;
324     typedef _Alloc                                                     allocator_type;
325     typedef value_type&                                                reference;
326     typedef const value_type&                                          const_reference;
327
328 private:
329     typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
330
331     __table __table_;
332
333 public:
334     typedef typename __table::pointer         pointer;
335     typedef typename __table::const_pointer   const_pointer;
336     typedef typename __table::size_type       size_type;
337     typedef typename __table::difference_type difference_type;
338
339     typedef typename __table::const_iterator       iterator;
340     typedef typename __table::const_iterator       const_iterator;
341     typedef typename __table::const_local_iterator local_iterator;
342     typedef typename __table::const_local_iterator const_local_iterator;
343
344     _LIBCPP_INLINE_VISIBILITY
345     unordered_set()
346         _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
347         {} // = default;
348     explicit unordered_set(size_type __n, const hasher& __hf = hasher(),
349                            const key_equal& __eql = key_equal());
350     unordered_set(size_type __n, const hasher& __hf, const key_equal& __eql,
351                   const allocator_type& __a);
352     template <class _InputIterator>
353         unordered_set(_InputIterator __first, _InputIterator __last);
354     template <class _InputIterator>
355         unordered_set(_InputIterator __first, _InputIterator __last,
356                       size_type __n, const hasher& __hf = hasher(),
357                       const key_equal& __eql = key_equal());
358     template <class _InputIterator>
359         unordered_set(_InputIterator __first, _InputIterator __last,
360                       size_type __n, const hasher& __hf, const key_equal& __eql,
361                       const allocator_type& __a);
362     explicit unordered_set(const allocator_type& __a);
363     unordered_set(const unordered_set& __u);
364     unordered_set(const unordered_set& __u, const allocator_type& __a);
365 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
366     unordered_set(unordered_set&& __u)
367         _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
368     unordered_set(unordered_set&& __u, const allocator_type& __a);
369 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
370 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
371     unordered_set(initializer_list<value_type> __il);
372     unordered_set(initializer_list<value_type> __il, size_type __n,
373                   const hasher& __hf = hasher(),
374                   const key_equal& __eql = key_equal());
375     unordered_set(initializer_list<value_type> __il, size_type __n,
376                   const hasher& __hf, const key_equal& __eql,
377                   const allocator_type& __a);
378 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
379     // ~unordered_set() = default;
380     _LIBCPP_INLINE_VISIBILITY
381     unordered_set& operator=(const unordered_set& __u)
382     {
383         __table_ = __u.__table_;
384         return *this;
385     }
386 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
387     unordered_set& operator=(unordered_set&& __u)
388         _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
389 #endif
390 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
391     unordered_set& operator=(initializer_list<value_type> __il);
392 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
393
394     _LIBCPP_INLINE_VISIBILITY
395     allocator_type get_allocator() const _NOEXCEPT
396         {return allocator_type(__table_.__node_alloc());}
397
398     _LIBCPP_INLINE_VISIBILITY
399     bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
400     _LIBCPP_INLINE_VISIBILITY
401     size_type size() const _NOEXCEPT  {return __table_.size();}
402     _LIBCPP_INLINE_VISIBILITY
403     size_type max_size() const _NOEXCEPT {return __table_.max_size();}
404
405     _LIBCPP_INLINE_VISIBILITY
406     iterator       begin() _NOEXCEPT        {return __table_.begin();}
407     _LIBCPP_INLINE_VISIBILITY
408     iterator       end() _NOEXCEPT          {return __table_.end();}
409     _LIBCPP_INLINE_VISIBILITY
410     const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
411     _LIBCPP_INLINE_VISIBILITY
412     const_iterator end()    const _NOEXCEPT {return __table_.end();}
413     _LIBCPP_INLINE_VISIBILITY
414     const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
415     _LIBCPP_INLINE_VISIBILITY
416     const_iterator cend()   const _NOEXCEPT {return __table_.end();}
417
418 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
419     template <class... _Args>
420         _LIBCPP_INLINE_VISIBILITY
421         pair<iterator, bool> emplace(_Args&&... __args)
422             {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
423     template <class... _Args>
424         _LIBCPP_INLINE_VISIBILITY
425         iterator emplace_hint(const_iterator, _Args&&... __args)
426             {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;}
427 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
428     _LIBCPP_INLINE_VISIBILITY
429     pair<iterator, bool> insert(const value_type& __x)
430         {return __table_.__insert_unique(__x);}
431 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
432     _LIBCPP_INLINE_VISIBILITY
433     pair<iterator, bool> insert(value_type&& __x)
434         {return __table_.__insert_unique(_VSTD::move(__x));}
435 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
436     _LIBCPP_INLINE_VISIBILITY
437     iterator insert(const_iterator, const value_type& __x)
438         {return insert(__x).first;}
439 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
440     _LIBCPP_INLINE_VISIBILITY
441     iterator insert(const_iterator, value_type&& __x)
442         {return insert(_VSTD::move(__x)).first;}
443 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
444     template <class _InputIterator>
445         void insert(_InputIterator __first, _InputIterator __last);
446 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
447     _LIBCPP_INLINE_VISIBILITY
448     void insert(initializer_list<value_type> __il)
449         {insert(__il.begin(), __il.end());}
450 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
451
452     _LIBCPP_INLINE_VISIBILITY
453     iterator erase(const_iterator __p) {return __table_.erase(__p);}
454     _LIBCPP_INLINE_VISIBILITY
455     size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
456     _LIBCPP_INLINE_VISIBILITY
457     iterator erase(const_iterator __first, const_iterator __last)
458         {return __table_.erase(__first, __last);}
459     _LIBCPP_INLINE_VISIBILITY
460     void clear() _NOEXCEPT {__table_.clear();}
461
462     _LIBCPP_INLINE_VISIBILITY
463     void swap(unordered_set& __u)
464         _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
465         {__table_.swap(__u.__table_);}
466
467     _LIBCPP_INLINE_VISIBILITY
468     hasher hash_function() const {return __table_.hash_function();}
469     _LIBCPP_INLINE_VISIBILITY
470     key_equal key_eq() const {return __table_.key_eq();}
471
472     _LIBCPP_INLINE_VISIBILITY
473     iterator       find(const key_type& __k)       {return __table_.find(__k);}
474     _LIBCPP_INLINE_VISIBILITY
475     const_iterator find(const key_type& __k) const {return __table_.find(__k);}
476     _LIBCPP_INLINE_VISIBILITY
477     size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
478     _LIBCPP_INLINE_VISIBILITY
479     pair<iterator, iterator>             equal_range(const key_type& __k)
480         {return __table_.__equal_range_unique(__k);}
481     _LIBCPP_INLINE_VISIBILITY
482     pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
483         {return __table_.__equal_range_unique(__k);}
484
485     _LIBCPP_INLINE_VISIBILITY
486     size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
487     _LIBCPP_INLINE_VISIBILITY
488     size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
489
490     _LIBCPP_INLINE_VISIBILITY
491     size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
492     _LIBCPP_INLINE_VISIBILITY
493     size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
494
495     _LIBCPP_INLINE_VISIBILITY
496     local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
497     _LIBCPP_INLINE_VISIBILITY
498     local_iterator       end(size_type __n)          {return __table_.end(__n);}
499     _LIBCPP_INLINE_VISIBILITY
500     const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
501     _LIBCPP_INLINE_VISIBILITY
502     const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
503     _LIBCPP_INLINE_VISIBILITY
504     const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
505     _LIBCPP_INLINE_VISIBILITY
506     const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
507
508     _LIBCPP_INLINE_VISIBILITY
509     float load_factor() const _NOEXCEPT {return __table_.load_factor();}
510     _LIBCPP_INLINE_VISIBILITY
511     float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
512     _LIBCPP_INLINE_VISIBILITY
513     void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
514     _LIBCPP_INLINE_VISIBILITY
515     void rehash(size_type __n) {__table_.rehash(__n);}
516     _LIBCPP_INLINE_VISIBILITY
517     void reserve(size_type __n) {__table_.reserve(__n);}
518 };
519
520 template <class _Value, class _Hash, class _Pred, class _Alloc>
521 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n,
522         const hasher& __hf, const key_equal& __eql)
523     : __table_(__hf, __eql)
524 {
525     __table_.rehash(__n);
526 }
527
528 template <class _Value, class _Hash, class _Pred, class _Alloc>
529 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n,
530         const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
531     : __table_(__hf, __eql, __a)
532 {
533     __table_.rehash(__n);
534 }
535
536 template <class _Value, class _Hash, class _Pred, class _Alloc>
537 template <class _InputIterator>
538 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
539         _InputIterator __first, _InputIterator __last)
540 {
541     insert(__first, __last);
542 }
543
544 template <class _Value, class _Hash, class _Pred, class _Alloc>
545 template <class _InputIterator>
546 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
547         _InputIterator __first, _InputIterator __last, size_type __n,
548         const hasher& __hf, const key_equal& __eql)
549     : __table_(__hf, __eql)
550 {
551     __table_.rehash(__n);
552     insert(__first, __last);
553 }
554
555 template <class _Value, class _Hash, class _Pred, class _Alloc>
556 template <class _InputIterator>
557 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
558         _InputIterator __first, _InputIterator __last, size_type __n,
559         const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
560     : __table_(__hf, __eql, __a)
561 {
562     __table_.rehash(__n);
563     insert(__first, __last);
564 }
565
566 template <class _Value, class _Hash, class _Pred, class _Alloc>
567 inline _LIBCPP_INLINE_VISIBILITY
568 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
569         const allocator_type& __a)
570     : __table_(__a)
571 {
572 }
573
574 template <class _Value, class _Hash, class _Pred, class _Alloc>
575 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
576         const unordered_set& __u)
577     : __table_(__u.__table_)
578 {
579     __table_.rehash(__u.bucket_count());
580     insert(__u.begin(), __u.end());
581 }
582
583 template <class _Value, class _Hash, class _Pred, class _Alloc>
584 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
585         const unordered_set& __u, const allocator_type& __a)
586     : __table_(__u.__table_, __a)
587 {
588     __table_.rehash(__u.bucket_count());
589     insert(__u.begin(), __u.end());
590 }
591
592 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
593
594 template <class _Value, class _Hash, class _Pred, class _Alloc>
595 inline _LIBCPP_INLINE_VISIBILITY
596 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
597         unordered_set&& __u)
598     _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
599     : __table_(_VSTD::move(__u.__table_))
600 {
601 }
602
603 template <class _Value, class _Hash, class _Pred, class _Alloc>
604 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
605         unordered_set&& __u, const allocator_type& __a)
606     : __table_(_VSTD::move(__u.__table_), __a)
607 {
608     if (__a != __u.get_allocator())
609     {
610         iterator __i = __u.begin();
611         while (__u.size() != 0)
612             __table_.__insert_unique(_VSTD::move(__u.__table_.remove(__i++)->__value_));
613     }
614 }
615
616 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
617
618 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
619
620 template <class _Value, class _Hash, class _Pred, class _Alloc>
621 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
622         initializer_list<value_type> __il)
623 {
624     insert(__il.begin(), __il.end());
625 }
626
627 template <class _Value, class _Hash, class _Pred, class _Alloc>
628 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
629         initializer_list<value_type> __il, size_type __n, const hasher& __hf,
630         const key_equal& __eql)
631     : __table_(__hf, __eql)
632 {
633     __table_.rehash(__n);
634     insert(__il.begin(), __il.end());
635 }
636
637 template <class _Value, class _Hash, class _Pred, class _Alloc>
638 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
639         initializer_list<value_type> __il, size_type __n, const hasher& __hf,
640         const key_equal& __eql, const allocator_type& __a)
641     : __table_(__hf, __eql, __a)
642 {
643     __table_.rehash(__n);
644     insert(__il.begin(), __il.end());
645 }
646
647 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
648
649 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
650
651 template <class _Value, class _Hash, class _Pred, class _Alloc>
652 inline _LIBCPP_INLINE_VISIBILITY
653 unordered_set<_Value, _Hash, _Pred, _Alloc>&
654 unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(unordered_set&& __u)
655     _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
656 {
657     __table_ = _VSTD::move(__u.__table_);
658     return *this;
659 }
660
661 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
662
663 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
664
665 template <class _Value, class _Hash, class _Pred, class _Alloc>
666 inline _LIBCPP_INLINE_VISIBILITY
667 unordered_set<_Value, _Hash, _Pred, _Alloc>&
668 unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(
669         initializer_list<value_type> __il)
670 {
671     __table_.__assign_unique(__il.begin(), __il.end());
672     return *this;
673 }
674
675 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
676
677 template <class _Value, class _Hash, class _Pred, class _Alloc>
678 template <class _InputIterator>
679 inline _LIBCPP_INLINE_VISIBILITY
680 void
681 unordered_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
682                                                     _InputIterator __last)
683 {
684     for (; __first != __last; ++__first)
685         __table_.__insert_unique(*__first);
686 }
687
688 template <class _Value, class _Hash, class _Pred, class _Alloc>
689 inline _LIBCPP_INLINE_VISIBILITY
690 void
691 swap(unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
692      unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
693     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
694 {
695     __x.swap(__y);
696 }
697
698 template <class _Value, class _Hash, class _Pred, class _Alloc>
699 bool
700 operator==(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
701            const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
702 {
703     if (__x.size() != __y.size())
704         return false;
705     typedef typename unordered_set<_Value, _Hash, _Pred, _Alloc>::const_iterator
706                                                                  const_iterator;
707     for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
708             __i != __ex; ++__i)
709     {
710         const_iterator __j = __y.find(*__i);
711         if (__j == __ey || !(*__i == *__j))
712             return false;
713     }
714     return true;
715 }
716
717 template <class _Value, class _Hash, class _Pred, class _Alloc>
718 inline _LIBCPP_INLINE_VISIBILITY
719 bool
720 operator!=(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
721            const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
722 {
723     return !(__x == __y);
724 }
725
726 template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
727           class _Alloc = allocator<_Value> >
728 class _LIBCPP_TYPE_VIS unordered_multiset
729 {
730 public:
731     // types
732     typedef _Value                                                     key_type;
733     typedef key_type                                                   value_type;
734     typedef _Hash                                                      hasher;
735     typedef _Pred                                                      key_equal;
736     typedef _Alloc                                                     allocator_type;
737     typedef value_type&                                                reference;
738     typedef const value_type&                                          const_reference;
739
740 private:
741     typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
742
743     __table __table_;
744
745 public:
746     typedef typename __table::pointer         pointer;
747     typedef typename __table::const_pointer   const_pointer;
748     typedef typename __table::size_type       size_type;
749     typedef typename __table::difference_type difference_type;
750
751     typedef typename __table::const_iterator       iterator;
752     typedef typename __table::const_iterator       const_iterator;
753     typedef typename __table::const_local_iterator local_iterator;
754     typedef typename __table::const_local_iterator const_local_iterator;
755
756     _LIBCPP_INLINE_VISIBILITY
757     unordered_multiset()
758         _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
759         {} // = default
760     explicit unordered_multiset(size_type __n, const hasher& __hf = hasher(),
761                                 const key_equal& __eql = key_equal());
762     unordered_multiset(size_type __n, const hasher& __hf,
763                        const key_equal& __eql, const allocator_type& __a);
764     template <class _InputIterator>
765         unordered_multiset(_InputIterator __first, _InputIterator __last);
766     template <class _InputIterator>
767         unordered_multiset(_InputIterator __first, _InputIterator __last,
768                       size_type __n, const hasher& __hf = hasher(),
769                       const key_equal& __eql = key_equal());
770     template <class _InputIterator>
771         unordered_multiset(_InputIterator __first, _InputIterator __last,
772                       size_type __n , const hasher& __hf,
773                       const key_equal& __eql, const allocator_type& __a);
774     explicit unordered_multiset(const allocator_type& __a);
775     unordered_multiset(const unordered_multiset& __u);
776     unordered_multiset(const unordered_multiset& __u, const allocator_type& __a);
777 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
778     unordered_multiset(unordered_multiset&& __u)
779         _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
780     unordered_multiset(unordered_multiset&& __u, const allocator_type& __a);
781 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
782 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
783     unordered_multiset(initializer_list<value_type> __il);
784     unordered_multiset(initializer_list<value_type> __il, size_type __n,
785                        const hasher& __hf = hasher(),
786                        const key_equal& __eql = key_equal());
787     unordered_multiset(initializer_list<value_type> __il, size_type __n,
788                        const hasher& __hf, const key_equal& __eql,
789                        const allocator_type& __a);
790 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
791     // ~unordered_multiset() = default;
792     _LIBCPP_INLINE_VISIBILITY
793     unordered_multiset& operator=(const unordered_multiset& __u)
794     {
795         __table_ = __u.__table_;
796         return *this;
797     }
798 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
799     unordered_multiset& operator=(unordered_multiset&& __u)
800         _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
801 #endif
802 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
803     unordered_multiset& operator=(initializer_list<value_type> __il);
804 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
805
806     _LIBCPP_INLINE_VISIBILITY
807     allocator_type get_allocator() const _NOEXCEPT
808         {return allocator_type(__table_.__node_alloc());}
809
810     _LIBCPP_INLINE_VISIBILITY
811     bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
812     _LIBCPP_INLINE_VISIBILITY
813     size_type size() const _NOEXCEPT  {return __table_.size();}
814     _LIBCPP_INLINE_VISIBILITY
815     size_type max_size() const _NOEXCEPT {return __table_.max_size();}
816
817     _LIBCPP_INLINE_VISIBILITY
818     iterator       begin() _NOEXCEPT        {return __table_.begin();}
819     _LIBCPP_INLINE_VISIBILITY
820     iterator       end() _NOEXCEPT          {return __table_.end();}
821     _LIBCPP_INLINE_VISIBILITY
822     const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
823     _LIBCPP_INLINE_VISIBILITY
824     const_iterator end()    const _NOEXCEPT {return __table_.end();}
825     _LIBCPP_INLINE_VISIBILITY
826     const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
827     _LIBCPP_INLINE_VISIBILITY
828     const_iterator cend()   const _NOEXCEPT {return __table_.end();}
829
830 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
831     template <class... _Args>
832         _LIBCPP_INLINE_VISIBILITY
833         iterator emplace(_Args&&... __args)
834             {return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
835     template <class... _Args>
836         _LIBCPP_INLINE_VISIBILITY
837         iterator emplace_hint(const_iterator __p, _Args&&... __args)
838             {return __table_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
839 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
840     _LIBCPP_INLINE_VISIBILITY
841     iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
842 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
843     _LIBCPP_INLINE_VISIBILITY
844     iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
845 #endif
846     _LIBCPP_INLINE_VISIBILITY
847     iterator insert(const_iterator __p, const value_type& __x)
848         {return __table_.__insert_multi(__p, __x);}
849 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
850     _LIBCPP_INLINE_VISIBILITY
851     iterator insert(const_iterator __p, value_type&& __x)
852         {return __table_.__insert_multi(__p, _VSTD::move(__x));}
853 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
854     template <class _InputIterator>
855         void insert(_InputIterator __first, _InputIterator __last);
856 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
857     _LIBCPP_INLINE_VISIBILITY
858     void insert(initializer_list<value_type> __il)
859         {insert(__il.begin(), __il.end());}
860 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
861
862     _LIBCPP_INLINE_VISIBILITY
863     iterator erase(const_iterator __p) {return __table_.erase(__p);}
864     _LIBCPP_INLINE_VISIBILITY
865     size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
866     _LIBCPP_INLINE_VISIBILITY
867     iterator erase(const_iterator __first, const_iterator __last)
868         {return __table_.erase(__first, __last);}
869     _LIBCPP_INLINE_VISIBILITY
870     void clear() _NOEXCEPT {__table_.clear();}
871
872     _LIBCPP_INLINE_VISIBILITY
873     void swap(unordered_multiset& __u)
874         _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
875         {__table_.swap(__u.__table_);}
876
877     _LIBCPP_INLINE_VISIBILITY
878     hasher hash_function() const {return __table_.hash_function();}
879     _LIBCPP_INLINE_VISIBILITY
880     key_equal key_eq() const {return __table_.key_eq();}
881
882     _LIBCPP_INLINE_VISIBILITY
883     iterator       find(const key_type& __k)       {return __table_.find(__k);}
884     _LIBCPP_INLINE_VISIBILITY
885     const_iterator find(const key_type& __k) const {return __table_.find(__k);}
886     _LIBCPP_INLINE_VISIBILITY
887     size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
888     _LIBCPP_INLINE_VISIBILITY
889     pair<iterator, iterator>             equal_range(const key_type& __k)
890         {return __table_.__equal_range_multi(__k);}
891     _LIBCPP_INLINE_VISIBILITY
892     pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
893         {return __table_.__equal_range_multi(__k);}
894
895     _LIBCPP_INLINE_VISIBILITY
896     size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
897     _LIBCPP_INLINE_VISIBILITY
898     size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
899
900     _LIBCPP_INLINE_VISIBILITY
901     size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
902     _LIBCPP_INLINE_VISIBILITY
903     size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
904
905     _LIBCPP_INLINE_VISIBILITY
906     local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
907     _LIBCPP_INLINE_VISIBILITY
908     local_iterator       end(size_type __n)          {return __table_.end(__n);}
909     _LIBCPP_INLINE_VISIBILITY
910     const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
911     _LIBCPP_INLINE_VISIBILITY
912     const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
913     _LIBCPP_INLINE_VISIBILITY
914     const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
915     _LIBCPP_INLINE_VISIBILITY
916     const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
917
918     _LIBCPP_INLINE_VISIBILITY
919     float load_factor() const _NOEXCEPT {return __table_.load_factor();}
920     _LIBCPP_INLINE_VISIBILITY
921     float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
922     _LIBCPP_INLINE_VISIBILITY
923     void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
924     _LIBCPP_INLINE_VISIBILITY
925     void rehash(size_type __n) {__table_.rehash(__n);}
926     _LIBCPP_INLINE_VISIBILITY
927     void reserve(size_type __n) {__table_.reserve(__n);}
928 };
929
930 template <class _Value, class _Hash, class _Pred, class _Alloc>
931 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
932         size_type __n, const hasher& __hf, const key_equal& __eql)
933     : __table_(__hf, __eql)
934 {
935     __table_.rehash(__n);
936 }
937
938 template <class _Value, class _Hash, class _Pred, class _Alloc>
939 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
940         size_type __n, const hasher& __hf, const key_equal& __eql,
941         const allocator_type& __a)
942     : __table_(__hf, __eql, __a)
943 {
944     __table_.rehash(__n);
945 }
946
947 template <class _Value, class _Hash, class _Pred, class _Alloc>
948 template <class _InputIterator>
949 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
950         _InputIterator __first, _InputIterator __last)
951 {
952     insert(__first, __last);
953 }
954
955 template <class _Value, class _Hash, class _Pred, class _Alloc>
956 template <class _InputIterator>
957 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
958         _InputIterator __first, _InputIterator __last, size_type __n,
959         const hasher& __hf, const key_equal& __eql)
960     : __table_(__hf, __eql)
961 {
962     __table_.rehash(__n);
963     insert(__first, __last);
964 }
965
966 template <class _Value, class _Hash, class _Pred, class _Alloc>
967 template <class _InputIterator>
968 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
969         _InputIterator __first, _InputIterator __last, size_type __n,
970         const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
971     : __table_(__hf, __eql, __a)
972 {
973     __table_.rehash(__n);
974     insert(__first, __last);
975 }
976
977 template <class _Value, class _Hash, class _Pred, class _Alloc>
978 inline _LIBCPP_INLINE_VISIBILITY
979 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
980         const allocator_type& __a)
981     : __table_(__a)
982 {
983 }
984
985 template <class _Value, class _Hash, class _Pred, class _Alloc>
986 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
987         const unordered_multiset& __u)
988     : __table_(__u.__table_)
989 {
990     __table_.rehash(__u.bucket_count());
991     insert(__u.begin(), __u.end());
992 }
993
994 template <class _Value, class _Hash, class _Pred, class _Alloc>
995 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
996         const unordered_multiset& __u, const allocator_type& __a)
997     : __table_(__u.__table_, __a)
998 {
999     __table_.rehash(__u.bucket_count());
1000     insert(__u.begin(), __u.end());
1001 }
1002
1003 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1004
1005 template <class _Value, class _Hash, class _Pred, class _Alloc>
1006 inline _LIBCPP_INLINE_VISIBILITY
1007 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1008         unordered_multiset&& __u)
1009     _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
1010     : __table_(_VSTD::move(__u.__table_))
1011 {
1012 }
1013
1014 template <class _Value, class _Hash, class _Pred, class _Alloc>
1015 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1016         unordered_multiset&& __u, const allocator_type& __a)
1017     : __table_(_VSTD::move(__u.__table_), __a)
1018 {
1019     if (__a != __u.get_allocator())
1020     {
1021         iterator __i = __u.begin();
1022         while (__u.size() != 0)
1023             __table_.__insert_multi(_VSTD::move(__u.__table_.remove(__i++)->__value_));
1024     }
1025 }
1026
1027 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1028
1029 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1030
1031 template <class _Value, class _Hash, class _Pred, class _Alloc>
1032 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1033         initializer_list<value_type> __il)
1034 {
1035     insert(__il.begin(), __il.end());
1036 }
1037
1038 template <class _Value, class _Hash, class _Pred, class _Alloc>
1039 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1040         initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1041         const key_equal& __eql)
1042     : __table_(__hf, __eql)
1043 {
1044     __table_.rehash(__n);
1045     insert(__il.begin(), __il.end());
1046 }
1047
1048 template <class _Value, class _Hash, class _Pred, class _Alloc>
1049 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1050         initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1051         const key_equal& __eql, const allocator_type& __a)
1052     : __table_(__hf, __eql, __a)
1053 {
1054     __table_.rehash(__n);
1055     insert(__il.begin(), __il.end());
1056 }
1057
1058 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1059
1060 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1061
1062 template <class _Value, class _Hash, class _Pred, class _Alloc>
1063 inline _LIBCPP_INLINE_VISIBILITY
1064 unordered_multiset<_Value, _Hash, _Pred, _Alloc>&
1065 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=(
1066         unordered_multiset&& __u)
1067     _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
1068 {
1069     __table_ = _VSTD::move(__u.__table_);
1070     return *this;
1071 }
1072
1073 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1074
1075 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1076
1077 template <class _Value, class _Hash, class _Pred, class _Alloc>
1078 inline
1079 unordered_multiset<_Value, _Hash, _Pred, _Alloc>&
1080 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=(
1081         initializer_list<value_type> __il)
1082 {
1083     __table_.__assign_multi(__il.begin(), __il.end());
1084     return *this;
1085 }
1086
1087 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1088
1089 template <class _Value, class _Hash, class _Pred, class _Alloc>
1090 template <class _InputIterator>
1091 inline _LIBCPP_INLINE_VISIBILITY
1092 void
1093 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
1094                                                          _InputIterator __last)
1095 {
1096     for (; __first != __last; ++__first)
1097         __table_.__insert_multi(*__first);
1098 }
1099
1100 template <class _Value, class _Hash, class _Pred, class _Alloc>
1101 inline _LIBCPP_INLINE_VISIBILITY
1102 void
1103 swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
1104      unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
1105     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
1106 {
1107     __x.swap(__y);
1108 }
1109
1110 template <class _Value, class _Hash, class _Pred, class _Alloc>
1111 bool
1112 operator==(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
1113            const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
1114 {
1115     if (__x.size() != __y.size())
1116         return false;
1117     typedef typename unordered_multiset<_Value, _Hash, _Pred, _Alloc>::const_iterator
1118                                                                  const_iterator;
1119     typedef pair<const_iterator, const_iterator> _EqRng;
1120     for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
1121     {
1122         _EqRng __xeq = __x.equal_range(*__i);
1123         _EqRng __yeq = __y.equal_range(*__i);
1124         if (_VSTD::distance(__xeq.first, __xeq.second) !=
1125             _VSTD::distance(__yeq.first, __yeq.second) ||
1126                   !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
1127             return false;
1128         __i = __xeq.second;
1129     }
1130     return true;
1131 }
1132
1133 template <class _Value, class _Hash, class _Pred, class _Alloc>
1134 inline _LIBCPP_INLINE_VISIBILITY
1135 bool
1136 operator!=(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
1137            const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
1138 {
1139     return !(__x == __y);
1140 }
1141
1142 _LIBCPP_END_NAMESPACE_STD
1143
1144 #endif  // _LIBCPP_UNORDERED_SET