]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/libc++/include/unordered_map
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / libc++ / include / unordered_map
1 // -*- C++ -*-
2 //===-------------------------- unordered_map -----------------------------===//
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_MAP
12 #define _LIBCPP_UNORDERED_MAP
13
14 /*
15
16     unordered_map synopsis
17
18 #include <initializer_list>
19
20 namespace std
21 {
22
23 template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
24           class Alloc = allocator<pair<const Key, T>>>
25 class unordered_map
26 {
27 public:
28     // types
29     typedef Key                                                        key_type;
30     typedef T                                                          mapped_type;
31     typedef Hash                                                       hasher;
32     typedef Pred                                                       key_equal;
33     typedef Alloc                                                      allocator_type;
34     typedef pair<const key_type, mapped_type>                          value_type;
35     typedef value_type&                                                reference;
36     typedef const value_type&                                          const_reference;
37     typedef typename allocator_traits<allocator_type>::pointer         pointer;
38     typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
39     typedef typename allocator_traits<allocator_type>::size_type       size_type;
40     typedef typename allocator_traits<allocator_type>::difference_type difference_type;
41
42     typedef /unspecified/ iterator;
43     typedef /unspecified/ const_iterator;
44     typedef /unspecified/ local_iterator;
45     typedef /unspecified/ const_local_iterator;
46
47     unordered_map()
48         noexcept(
49             is_nothrow_default_constructible<hasher>::value &&
50             is_nothrow_default_constructible<key_equal>::value &&
51             is_nothrow_default_constructible<allocator_type>::value);
52     explicit unordered_map(size_type n, const hasher& hf = hasher(),
53                            const key_equal& eql = key_equal(),
54                            const allocator_type& a = allocator_type());
55     template <class InputIterator>
56         unordered_map(InputIterator f, InputIterator l,
57                       size_type n = 0, const hasher& hf = hasher(),
58                       const key_equal& eql = key_equal(),
59                       const allocator_type& a = allocator_type());
60     explicit unordered_map(const allocator_type&);
61     unordered_map(const unordered_map&);
62     unordered_map(const unordered_map&, const Allocator&);
63     unordered_map(unordered_map&&)
64         noexcept(
65             is_nothrow_move_constructible<hasher>::value &&
66             is_nothrow_move_constructible<key_equal>::value &&
67             is_nothrow_move_constructible<allocator_type>::value);
68     unordered_map(unordered_map&&, const Allocator&);
69     unordered_map(initializer_list<value_type>, size_type n = 0,
70                   const hasher& hf = hasher(), const key_equal& eql = key_equal(),
71                   const allocator_type& a = allocator_type());
72     unordered_map(size_type n, const allocator_type& a)
73       : unordered_map(n, hasher(), key_equal(), a) {}  // C++14
74     unordered_map(size_type n, const hasher& hf, const allocator_type& a)
75       : unordered_map(n, hf, key_equal(), a) {}  // C++14
76     template <class InputIterator>
77       unordered_map(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
78       : unordered_map(f, l, n, hasher(), key_equal(), a) {}  // C++14
79     template <class InputIterator>
80       unordered_map(InputIterator f, InputIterator l, size_type n, const hasher& hf, 
81         const allocator_type& a)
82       : unordered_map(f, l, n, hf, key_equal(), a) {}  // C++14
83     unordered_map(initializer_list<value_type> il, size_type n, const allocator_type& a)
84       : unordered_map(il, n, hasher(), key_equal(), a) {}  // C++14
85     unordered_map(initializer_list<value_type> il, size_type n, const hasher& hf, 
86       const allocator_type& a)
87       : unordered_map(il, n, hf, key_equal(), a) {}  // C++14
88     ~unordered_map();
89     unordered_map& operator=(const unordered_map&);
90     unordered_map& operator=(unordered_map&&)
91         noexcept(
92             allocator_type::propagate_on_container_move_assignment::value &&
93             is_nothrow_move_assignable<allocator_type>::value &&
94             is_nothrow_move_assignable<hasher>::value &&
95             is_nothrow_move_assignable<key_equal>::value);
96     unordered_map& operator=(initializer_list<value_type>);
97
98     allocator_type get_allocator() const noexcept;
99
100     bool      empty() const noexcept;
101     size_type size() const noexcept;
102     size_type max_size() const noexcept;
103
104     iterator       begin() noexcept;
105     iterator       end() noexcept;
106     const_iterator begin()  const noexcept;
107     const_iterator end()    const noexcept;
108     const_iterator cbegin() const noexcept;
109     const_iterator cend()   const noexcept;
110
111     template <class... Args>
112         pair<iterator, bool> emplace(Args&&... args);
113     template <class... Args>
114         iterator emplace_hint(const_iterator position, Args&&... args);
115     pair<iterator, bool> insert(const value_type& obj);
116     template <class P>
117         pair<iterator, bool> insert(P&& obj);
118     iterator insert(const_iterator hint, const value_type& obj);
119     template <class P>
120         iterator insert(const_iterator hint, P&& obj);
121     template <class InputIterator>
122         void insert(InputIterator first, InputIterator last);
123     void insert(initializer_list<value_type>);
124
125     iterator erase(const_iterator position);
126     size_type erase(const key_type& k);
127     iterator erase(const_iterator first, const_iterator last);
128     void clear() noexcept;
129
130     void swap(unordered_map&)
131         noexcept(
132             (!allocator_type::propagate_on_container_swap::value ||
133              __is_nothrow_swappable<allocator_type>::value) &&
134             __is_nothrow_swappable<hasher>::value &&
135             __is_nothrow_swappable<key_equal>::value);
136
137     hasher hash_function() const;
138     key_equal key_eq() const;
139
140     iterator       find(const key_type& k);
141     const_iterator find(const key_type& k) const;
142     size_type count(const key_type& k) const;
143     pair<iterator, iterator>             equal_range(const key_type& k);
144     pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
145
146     mapped_type& operator[](const key_type& k);
147     mapped_type& operator[](key_type&& k);
148
149     mapped_type&       at(const key_type& k);
150     const mapped_type& at(const key_type& k) const;
151
152     size_type bucket_count() const noexcept;
153     size_type max_bucket_count() const noexcept;
154
155     size_type bucket_size(size_type n) const;
156     size_type bucket(const key_type& k) const;
157
158     local_iterator       begin(size_type n);
159     local_iterator       end(size_type n);
160     const_local_iterator begin(size_type n) const;
161     const_local_iterator end(size_type n) const;
162     const_local_iterator cbegin(size_type n) const;
163     const_local_iterator cend(size_type n) const;
164
165     float load_factor() const noexcept;
166     float max_load_factor() const noexcept;
167     void max_load_factor(float z);
168     void rehash(size_type n);
169     void reserve(size_type n);
170 };
171
172 template <class Key, class T, class Hash, class Pred, class Alloc>
173     void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
174               unordered_map<Key, T, Hash, Pred, Alloc>& y)
175               noexcept(noexcept(x.swap(y)));
176
177 template <class Key, class T, class Hash, class Pred, class Alloc>
178     bool
179     operator==(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
180                const unordered_map<Key, T, Hash, Pred, Alloc>& y);
181
182 template <class Key, class T, class Hash, class Pred, class Alloc>
183     bool
184     operator!=(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
185                const unordered_map<Key, T, Hash, Pred, Alloc>& y);
186
187 template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
188           class Alloc = allocator<pair<const Key, T>>>
189 class unordered_multimap
190 {
191 public:
192     // types
193     typedef Key                                                        key_type;
194     typedef T                                                          mapped_type;
195     typedef Hash                                                       hasher;
196     typedef Pred                                                       key_equal;
197     typedef Alloc                                                      allocator_type;
198     typedef pair<const key_type, mapped_type>                          value_type;
199     typedef value_type&                                                reference;
200     typedef const value_type&                                          const_reference;
201     typedef typename allocator_traits<allocator_type>::pointer         pointer;
202     typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
203     typedef typename allocator_traits<allocator_type>::size_type       size_type;
204     typedef typename allocator_traits<allocator_type>::difference_type difference_type;
205
206     typedef /unspecified/ iterator;
207     typedef /unspecified/ const_iterator;
208     typedef /unspecified/ local_iterator;
209     typedef /unspecified/ const_local_iterator;
210
211     unordered_multimap()
212         noexcept(
213             is_nothrow_default_constructible<hasher>::value &&
214             is_nothrow_default_constructible<key_equal>::value &&
215             is_nothrow_default_constructible<allocator_type>::value);
216     explicit unordered_multimap(size_type n, const hasher& hf = hasher(),
217                            const key_equal& eql = key_equal(),
218                            const allocator_type& a = allocator_type());
219     template <class InputIterator>
220         unordered_multimap(InputIterator f, InputIterator l,
221                       size_type n = 0, const hasher& hf = hasher(),
222                       const key_equal& eql = key_equal(),
223                       const allocator_type& a = allocator_type());
224     explicit unordered_multimap(const allocator_type&);
225     unordered_multimap(const unordered_multimap&);
226     unordered_multimap(const unordered_multimap&, const Allocator&);
227     unordered_multimap(unordered_multimap&&)
228         noexcept(
229             is_nothrow_move_constructible<hasher>::value &&
230             is_nothrow_move_constructible<key_equal>::value &&
231             is_nothrow_move_constructible<allocator_type>::value);
232     unordered_multimap(unordered_multimap&&, const Allocator&);
233     unordered_multimap(initializer_list<value_type>, size_type n = 0,
234                   const hasher& hf = hasher(), const key_equal& eql = key_equal(),
235                   const allocator_type& a = allocator_type());
236     unordered_multimap(size_type n, const allocator_type& a)
237       : unordered_multimap(n, hasher(), key_equal(), a) {}  // C++14
238     unordered_multimap(size_type n, const hasher& hf, const allocator_type& a)
239       : unordered_multimap(n, hf, key_equal(), a) {}  // C++14
240     template <class InputIterator>
241       unordered_multimap(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
242       : unordered_multimap(f, l, n, hasher(), key_equal(), a) {}  // C++14
243     template <class InputIterator>
244       unordered_multimap(InputIterator f, InputIterator l, size_type n, const hasher& hf, 
245         const allocator_type& a)
246       : unordered_multimap(f, l, n, hf, key_equal(), a) {}  // C++14
247     unordered_multimap(initializer_list<value_type> il, size_type n, const allocator_type& a)
248       : unordered_multimap(il, n, hasher(), key_equal(), a) {}  // C++14
249     unordered_multimap(initializer_list<value_type> il, size_type n, const hasher& hf, 
250       const allocator_type& a)
251       : unordered_multimap(il, n, hf, key_equal(), a) {}  // C++14
252     ~unordered_multimap();
253     unordered_multimap& operator=(const unordered_multimap&);
254     unordered_multimap& operator=(unordered_multimap&&)
255         noexcept(
256             allocator_type::propagate_on_container_move_assignment::value &&
257             is_nothrow_move_assignable<allocator_type>::value &&
258             is_nothrow_move_assignable<hasher>::value &&
259             is_nothrow_move_assignable<key_equal>::value);
260     unordered_multimap& operator=(initializer_list<value_type>);
261
262     allocator_type get_allocator() const noexcept;
263
264     bool      empty() const noexcept;
265     size_type size() const noexcept;
266     size_type max_size() const noexcept;
267
268     iterator       begin() noexcept;
269     iterator       end() noexcept;
270     const_iterator begin()  const noexcept;
271     const_iterator end()    const noexcept;
272     const_iterator cbegin() const noexcept;
273     const_iterator cend()   const noexcept;
274
275     template <class... Args>
276         iterator emplace(Args&&... args);
277     template <class... Args>
278         iterator emplace_hint(const_iterator position, Args&&... args);
279     iterator insert(const value_type& obj);
280     template <class P>
281         iterator insert(P&& obj);
282     iterator insert(const_iterator hint, const value_type& obj);
283     template <class P>
284         iterator insert(const_iterator hint, P&& obj);
285     template <class InputIterator>
286         void insert(InputIterator first, InputIterator last);
287     void insert(initializer_list<value_type>);
288
289     iterator erase(const_iterator position);
290     size_type erase(const key_type& k);
291     iterator erase(const_iterator first, const_iterator last);
292     void clear() noexcept;
293
294     void swap(unordered_multimap&)
295         noexcept(
296             (!allocator_type::propagate_on_container_swap::value ||
297              __is_nothrow_swappable<allocator_type>::value) &&
298             __is_nothrow_swappable<hasher>::value &&
299             __is_nothrow_swappable<key_equal>::value);
300
301     hasher hash_function() const;
302     key_equal key_eq() const;
303
304     iterator       find(const key_type& k);
305     const_iterator find(const key_type& k) const;
306     size_type count(const key_type& k) const;
307     pair<iterator, iterator>             equal_range(const key_type& k);
308     pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
309
310     size_type bucket_count() const noexcept;
311     size_type max_bucket_count() const noexcept;
312
313     size_type bucket_size(size_type n) const;
314     size_type bucket(const key_type& k) const;
315
316     local_iterator       begin(size_type n);
317     local_iterator       end(size_type n);
318     const_local_iterator begin(size_type n) const;
319     const_local_iterator end(size_type n) const;
320     const_local_iterator cbegin(size_type n) const;
321     const_local_iterator cend(size_type n) const;
322
323     float load_factor() const noexcept;
324     float max_load_factor() const noexcept;
325     void max_load_factor(float z);
326     void rehash(size_type n);
327     void reserve(size_type n);
328 };
329
330 template <class Key, class T, class Hash, class Pred, class Alloc>
331     void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
332               unordered_multimap<Key, T, Hash, Pred, Alloc>& y)
333               noexcept(noexcept(x.swap(y)));
334
335 template <class Key, class T, class Hash, class Pred, class Alloc>
336     bool
337     operator==(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
338                const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
339
340 template <class Key, class T, class Hash, class Pred, class Alloc>
341     bool
342     operator!=(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
343                const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
344
345 }  // std
346
347 */
348
349 #include <__config>
350 #include <__hash_table>
351 #include <functional>
352 #include <stdexcept>
353
354 #include <__debug>
355
356 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
357 #pragma GCC system_header
358 #endif
359
360 _LIBCPP_BEGIN_NAMESPACE_STD
361
362 template <class _Key, class _Cp, class _Hash, bool = is_empty<_Hash>::value
363 #if __has_feature(is_final)
364                                          && !__is_final(_Hash)
365 #endif
366          >
367 class __unordered_map_hasher
368     : private _Hash
369 {
370 public:
371     _LIBCPP_INLINE_VISIBILITY
372     __unordered_map_hasher()
373         _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
374         : _Hash() {}
375     _LIBCPP_INLINE_VISIBILITY
376     __unordered_map_hasher(const _Hash& __h)
377         _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
378         : _Hash(__h) {}
379     _LIBCPP_INLINE_VISIBILITY
380     const _Hash& hash_function() const _NOEXCEPT {return *this;}
381     _LIBCPP_INLINE_VISIBILITY
382     size_t operator()(const _Cp& __x) const
383         {return static_cast<const _Hash&>(*this)(__x.__cc.first);}
384     _LIBCPP_INLINE_VISIBILITY
385     size_t operator()(const _Key& __x) const
386         {return static_cast<const _Hash&>(*this)(__x);}
387 };
388
389 template <class _Key, class _Cp, class _Hash>
390 class __unordered_map_hasher<_Key, _Cp, _Hash, false>
391 {
392     _Hash __hash_;
393
394 public:
395     _LIBCPP_INLINE_VISIBILITY
396     __unordered_map_hasher()
397         _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
398         : __hash_() {}
399     _LIBCPP_INLINE_VISIBILITY
400     __unordered_map_hasher(const _Hash& __h)
401         _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
402         : __hash_(__h) {}
403     _LIBCPP_INLINE_VISIBILITY
404     const _Hash& hash_function() const _NOEXCEPT {return __hash_;}
405     _LIBCPP_INLINE_VISIBILITY
406     size_t operator()(const _Cp& __x) const
407         {return __hash_(__x.__cc.first);}
408     _LIBCPP_INLINE_VISIBILITY
409     size_t operator()(const _Key& __x) const
410         {return __hash_(__x);}
411 };
412
413 template <class _Key, class _Cp, class _Pred, bool = is_empty<_Pred>::value
414 #if __has_feature(is_final)
415                                          && !__is_final(_Pred)
416 #endif
417          >
418 class __unordered_map_equal
419     : private _Pred
420 {
421 public:
422     _LIBCPP_INLINE_VISIBILITY
423     __unordered_map_equal()
424         _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
425         : _Pred() {}
426     _LIBCPP_INLINE_VISIBILITY
427     __unordered_map_equal(const _Pred& __p)
428         _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
429         : _Pred(__p) {}
430     _LIBCPP_INLINE_VISIBILITY
431     const _Pred& key_eq() const _NOEXCEPT {return *this;}
432     _LIBCPP_INLINE_VISIBILITY
433     bool operator()(const _Cp& __x, const _Cp& __y) const
434         {return static_cast<const _Pred&>(*this)(__x.__cc.first, __y.__cc.first);}
435     _LIBCPP_INLINE_VISIBILITY
436     bool operator()(const _Cp& __x, const _Key& __y) const
437         {return static_cast<const _Pred&>(*this)(__x.__cc.first, __y);}
438     _LIBCPP_INLINE_VISIBILITY
439     bool operator()(const _Key& __x, const _Cp& __y) const
440         {return static_cast<const _Pred&>(*this)(__x, __y.__cc.first);}
441 };
442
443 template <class _Key, class _Cp, class _Pred>
444 class __unordered_map_equal<_Key, _Cp, _Pred, false>
445 {
446     _Pred __pred_;
447
448 public:
449     _LIBCPP_INLINE_VISIBILITY
450     __unordered_map_equal()
451         _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
452         : __pred_() {}
453     _LIBCPP_INLINE_VISIBILITY
454     __unordered_map_equal(const _Pred& __p)
455         _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
456         : __pred_(__p) {}
457     _LIBCPP_INLINE_VISIBILITY
458     const _Pred& key_eq() const _NOEXCEPT {return __pred_;}
459     _LIBCPP_INLINE_VISIBILITY
460     bool operator()(const _Cp& __x, const _Cp& __y) const
461         {return __pred_(__x.__cc.first, __y.__cc.first);}
462     _LIBCPP_INLINE_VISIBILITY
463     bool operator()(const _Cp& __x, const _Key& __y) const
464         {return __pred_(__x.__cc.first, __y);}
465     _LIBCPP_INLINE_VISIBILITY
466     bool operator()(const _Key& __x, const _Cp& __y) const
467         {return __pred_(__x, __y.__cc.first);}
468 };
469
470 template <class _Alloc>
471 class __hash_map_node_destructor
472 {
473     typedef _Alloc                              allocator_type;
474     typedef allocator_traits<allocator_type>    __alloc_traits;
475     typedef typename __alloc_traits::value_type::value_type value_type;
476 public:
477     typedef typename __alloc_traits::pointer    pointer;
478 private:
479     typedef typename value_type::value_type::first_type     first_type;
480     typedef typename value_type::value_type::second_type    second_type;
481
482     allocator_type& __na_;
483
484     __hash_map_node_destructor& operator=(const __hash_map_node_destructor&);
485
486 public:
487     bool __first_constructed;
488     bool __second_constructed;
489
490     _LIBCPP_INLINE_VISIBILITY
491     explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT
492         : __na_(__na),
493           __first_constructed(false),
494           __second_constructed(false)
495         {}
496
497 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
498     _LIBCPP_INLINE_VISIBILITY
499     __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x)
500         _NOEXCEPT
501         : __na_(__x.__na_),
502           __first_constructed(__x.__value_constructed),
503           __second_constructed(__x.__value_constructed)
504         {
505             __x.__value_constructed = false;
506         }
507 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
508     _LIBCPP_INLINE_VISIBILITY
509     __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x)
510         : __na_(__x.__na_),
511           __first_constructed(__x.__value_constructed),
512           __second_constructed(__x.__value_constructed)
513         {
514             const_cast<bool&>(__x.__value_constructed) = false;
515         }
516 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
517
518     _LIBCPP_INLINE_VISIBILITY
519     void operator()(pointer __p) _NOEXCEPT
520     {
521         if (__second_constructed)
522             __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second));
523         if (__first_constructed)
524             __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first));
525         if (__p)
526             __alloc_traits::deallocate(__na_, __p, 1);
527     }
528 };
529
530 #if __cplusplus >= 201103L
531
532 template <class _Key, class _Tp>
533 union __hash_value_type
534 {
535     typedef _Key                                     key_type;
536     typedef _Tp                                      mapped_type;
537     typedef pair<const key_type, mapped_type>        value_type;
538     typedef pair<key_type, mapped_type>              __nc_value_type;
539
540     value_type __cc;
541     __nc_value_type __nc;
542
543     template <class ..._Args>
544     _LIBCPP_INLINE_VISIBILITY
545     __hash_value_type(_Args&& ...__args)
546         : __cc(std::forward<_Args>(__args)...) {}
547
548     _LIBCPP_INLINE_VISIBILITY
549     __hash_value_type(const __hash_value_type& __v)
550         : __cc(__v.__cc) {}
551
552     _LIBCPP_INLINE_VISIBILITY
553     __hash_value_type(__hash_value_type&& __v)
554         : __nc(std::move(__v.__nc)) {}
555
556     _LIBCPP_INLINE_VISIBILITY
557     __hash_value_type& operator=(const __hash_value_type& __v)
558         {__nc = __v.__cc; return *this;}
559
560     _LIBCPP_INLINE_VISIBILITY
561     __hash_value_type& operator=(__hash_value_type&& __v)
562         {__nc = std::move(__v.__nc); return *this;}
563
564     _LIBCPP_INLINE_VISIBILITY
565     ~__hash_value_type() {__cc.~value_type();}
566 };
567
568 #else
569
570 template <class _Key, class _Tp>
571 struct __hash_value_type
572 {
573     typedef _Key                                     key_type;
574     typedef _Tp                                      mapped_type;
575     typedef pair<const key_type, mapped_type>        value_type;
576
577     value_type __cc;
578
579     _LIBCPP_INLINE_VISIBILITY
580     __hash_value_type() {}
581
582     template <class _A0>
583     _LIBCPP_INLINE_VISIBILITY
584     __hash_value_type(const _A0& __a0)
585         : __cc(__a0) {}
586
587     template <class _A0, class _A1>
588     _LIBCPP_INLINE_VISIBILITY
589     __hash_value_type(const _A0& __a0, const _A1& __a1)
590         : __cc(__a0, __a1) {}
591 };
592
593 #endif
594
595 template <class _HashIterator>
596 class _LIBCPP_TYPE_VIS_ONLY __hash_map_iterator
597 {
598     _HashIterator __i_;
599
600     typedef pointer_traits<typename _HashIterator::pointer>      __pointer_traits;
601     typedef const typename _HashIterator::value_type::value_type::first_type key_type;
602     typedef typename _HashIterator::value_type::value_type::second_type      mapped_type;
603 public:
604     typedef forward_iterator_tag                                 iterator_category;
605     typedef pair<key_type, mapped_type>                          value_type;
606     typedef typename _HashIterator::difference_type              difference_type;
607     typedef value_type&                                          reference;
608     typedef typename __pointer_traits::template
609 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
610             rebind<value_type>
611 #else
612             rebind<value_type>::other
613 #endif
614                                                                  pointer;
615
616     _LIBCPP_INLINE_VISIBILITY
617     __hash_map_iterator() _NOEXCEPT {}
618
619     _LIBCPP_INLINE_VISIBILITY
620     __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
621
622     _LIBCPP_INLINE_VISIBILITY
623     reference operator*() const {return __i_->__cc;}
624     _LIBCPP_INLINE_VISIBILITY
625     pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
626
627     _LIBCPP_INLINE_VISIBILITY
628     __hash_map_iterator& operator++() {++__i_; return *this;}
629     _LIBCPP_INLINE_VISIBILITY
630     __hash_map_iterator operator++(int)
631     {
632         __hash_map_iterator __t(*this);
633         ++(*this);
634         return __t;
635     }
636
637     friend _LIBCPP_INLINE_VISIBILITY
638         bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
639         {return __x.__i_ == __y.__i_;}
640     friend _LIBCPP_INLINE_VISIBILITY
641         bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
642         {return __x.__i_ != __y.__i_;}
643
644     template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_map;
645     template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_multimap;
646     template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator;
647     template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator;
648     template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator;
649 };
650
651 template <class _HashIterator>
652 class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator
653 {
654     _HashIterator __i_;
655
656     typedef pointer_traits<typename _HashIterator::pointer>      __pointer_traits;
657     typedef const typename _HashIterator::value_type::value_type::first_type key_type;
658     typedef typename _HashIterator::value_type::value_type::second_type      mapped_type;
659 public:
660     typedef forward_iterator_tag                                 iterator_category;
661     typedef pair<key_type, mapped_type>                          value_type;
662     typedef typename _HashIterator::difference_type              difference_type;
663     typedef const value_type&                                    reference;
664     typedef typename __pointer_traits::template
665 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
666             rebind<const value_type>
667 #else
668             rebind<const value_type>::other
669 #endif
670                                                                  pointer;
671
672     _LIBCPP_INLINE_VISIBILITY
673     __hash_map_const_iterator() _NOEXCEPT {}
674
675     _LIBCPP_INLINE_VISIBILITY
676     __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
677     _LIBCPP_INLINE_VISIBILITY
678     __hash_map_const_iterator(
679             __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i)
680                  _NOEXCEPT
681                 : __i_(__i.__i_) {}
682
683     _LIBCPP_INLINE_VISIBILITY
684     reference operator*() const {return __i_->__cc;}
685     _LIBCPP_INLINE_VISIBILITY
686     pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
687
688     _LIBCPP_INLINE_VISIBILITY
689     __hash_map_const_iterator& operator++() {++__i_; return *this;}
690     _LIBCPP_INLINE_VISIBILITY
691     __hash_map_const_iterator operator++(int)
692     {
693         __hash_map_const_iterator __t(*this);
694         ++(*this);
695         return __t;
696     }
697
698     friend _LIBCPP_INLINE_VISIBILITY
699         bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
700         {return __x.__i_ == __y.__i_;}
701     friend _LIBCPP_INLINE_VISIBILITY
702         bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
703         {return __x.__i_ != __y.__i_;}
704
705     template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_map;
706     template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_multimap;
707     template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator;
708     template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator;
709 };
710
711 template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
712           class _Alloc = allocator<pair<const _Key, _Tp> > >
713 class _LIBCPP_TYPE_VIS_ONLY unordered_map
714 {
715 public:
716     // types
717     typedef _Key                                           key_type;
718     typedef _Tp                                            mapped_type;
719     typedef _Hash                                          hasher;
720     typedef _Pred                                          key_equal;
721     typedef _Alloc                                         allocator_type;
722     typedef pair<const key_type, mapped_type>              value_type;
723     typedef pair<key_type, mapped_type>                    __nc_value_type;
724     typedef value_type&                                    reference;
725     typedef const value_type&                              const_reference;
726     static_assert((is_same<value_type, typename allocator_type::value_type>::value),
727                   "Invalid allocator::value_type");
728
729 private:
730     typedef __hash_value_type<key_type, mapped_type>                 __value_type;
731     typedef __unordered_map_hasher<key_type, __value_type, hasher>   __hasher;
732     typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
733     typedef typename allocator_traits<allocator_type>::template
734 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
735             rebind_alloc<__value_type>
736 #else
737             rebind_alloc<__value_type>::other
738 #endif
739                                                            __allocator_type;
740
741     typedef __hash_table<__value_type, __hasher,
742                          __key_equal,  __allocator_type>   __table;
743
744     __table __table_;
745
746     typedef typename __table::__node_pointer               __node_pointer;
747     typedef typename __table::__node_const_pointer         __node_const_pointer;
748     typedef typename __table::__node_traits                __node_traits;
749     typedef typename __table::__node_allocator             __node_allocator;
750     typedef typename __table::__node                       __node;
751     typedef __hash_map_node_destructor<__node_allocator>   _Dp;
752     typedef unique_ptr<__node, _Dp>                         __node_holder;
753     typedef allocator_traits<allocator_type>               __alloc_traits;
754 public:
755     typedef typename __alloc_traits::pointer         pointer;
756     typedef typename __alloc_traits::const_pointer   const_pointer;
757     typedef typename __alloc_traits::size_type       size_type;
758     typedef typename __alloc_traits::difference_type difference_type;
759
760     typedef __hash_map_iterator<typename __table::iterator>       iterator;
761     typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
762     typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
763     typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
764
765     _LIBCPP_INLINE_VISIBILITY
766     unordered_map()
767         _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
768         {
769 #if _LIBCPP_DEBUG_LEVEL >= 2
770             __get_db()->__insert_c(this);
771 #endif
772         }
773     explicit unordered_map(size_type __n, const hasher& __hf = hasher(),
774                            const key_equal& __eql = key_equal());
775     unordered_map(size_type __n, const hasher& __hf,
776                   const key_equal& __eql,
777                   const allocator_type& __a);
778     template <class _InputIterator>
779         unordered_map(_InputIterator __first, _InputIterator __last);
780     template <class _InputIterator>
781         unordered_map(_InputIterator __first, _InputIterator __last,
782                       size_type __n, const hasher& __hf = hasher(),
783                       const key_equal& __eql = key_equal());
784     template <class _InputIterator>
785         unordered_map(_InputIterator __first, _InputIterator __last,
786                       size_type __n, const hasher& __hf,
787                       const key_equal& __eql,
788                       const allocator_type& __a);
789     explicit unordered_map(const allocator_type& __a);
790     unordered_map(const unordered_map& __u);
791     unordered_map(const unordered_map& __u, const allocator_type& __a);
792 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
793     unordered_map(unordered_map&& __u)
794         _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
795     unordered_map(unordered_map&& __u, const allocator_type& __a);
796 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
797 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
798     unordered_map(initializer_list<value_type> __il);
799     unordered_map(initializer_list<value_type> __il, size_type __n,
800                   const hasher& __hf = hasher(), const key_equal& __eql = key_equal());
801     unordered_map(initializer_list<value_type> __il, size_type __n,
802                   const hasher& __hf, const key_equal& __eql,
803                   const allocator_type& __a);
804 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
805 #if _LIBCPP_STD_VER > 11
806     _LIBCPP_INLINE_VISIBILITY
807     unordered_map(size_type __n, const allocator_type& __a)
808       : unordered_map(__n, hasher(), key_equal(), __a) {}
809     _LIBCPP_INLINE_VISIBILITY
810     unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a)
811       : unordered_map(__n, __hf, key_equal(), __a) {}
812     template <class _InputIterator>
813     _LIBCPP_INLINE_VISIBILITY
814       unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
815       : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {}
816     template <class _InputIterator>
817     _LIBCPP_INLINE_VISIBILITY
818       unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf, 
819         const allocator_type& __a)
820       : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {}
821     _LIBCPP_INLINE_VISIBILITY
822     unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
823       : unordered_map(__il, __n, hasher(), key_equal(), __a) {}
824     _LIBCPP_INLINE_VISIBILITY
825     unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf, 
826       const allocator_type& __a)
827       : unordered_map(__il, __n, __hf, key_equal(), __a) {}
828 #endif
829     // ~unordered_map() = default;
830     _LIBCPP_INLINE_VISIBILITY
831     unordered_map& operator=(const unordered_map& __u)
832     {
833 #if __cplusplus >= 201103L
834         __table_ = __u.__table_;
835 #else
836         if (this != &__u) {
837             __table_.clear();
838             __table_.hash_function() = __u.__table_.hash_function();
839             __table_.key_eq() = __u.__table_.key_eq();
840             __table_.max_load_factor() = __u.__table_.max_load_factor();
841             __table_.__copy_assign_alloc(__u.__table_);
842             insert(__u.begin(), __u.end());
843         }
844 #endif
845         return *this;
846     }
847 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
848     unordered_map& operator=(unordered_map&& __u)
849         _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
850 #endif
851 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
852     unordered_map& operator=(initializer_list<value_type> __il);
853 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
854
855     _LIBCPP_INLINE_VISIBILITY
856     allocator_type get_allocator() const _NOEXCEPT
857         {return allocator_type(__table_.__node_alloc());}
858
859     _LIBCPP_INLINE_VISIBILITY
860     bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
861     _LIBCPP_INLINE_VISIBILITY
862     size_type size() const _NOEXCEPT  {return __table_.size();}
863     _LIBCPP_INLINE_VISIBILITY
864     size_type max_size() const _NOEXCEPT {return __table_.max_size();}
865
866     _LIBCPP_INLINE_VISIBILITY
867     iterator       begin() _NOEXCEPT        {return __table_.begin();}
868     _LIBCPP_INLINE_VISIBILITY
869     iterator       end() _NOEXCEPT          {return __table_.end();}
870     _LIBCPP_INLINE_VISIBILITY
871     const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
872     _LIBCPP_INLINE_VISIBILITY
873     const_iterator end()    const _NOEXCEPT {return __table_.end();}
874     _LIBCPP_INLINE_VISIBILITY
875     const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
876     _LIBCPP_INLINE_VISIBILITY
877     const_iterator cend()   const _NOEXCEPT {return __table_.end();}
878
879 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
880 #ifndef _LIBCPP_HAS_NO_VARIADICS
881
882     template <class... _Args>
883         pair<iterator, bool> emplace(_Args&&... __args);
884
885     template <class... _Args>
886         _LIBCPP_INLINE_VISIBILITY
887 #if _LIBCPP_DEBUG_LEVEL >= 2
888         iterator emplace_hint(const_iterator __p, _Args&&... __args)
889         {
890             _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
891                 "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not"
892                 " referring to this unordered_map");
893             return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
894         }
895 #else
896         iterator emplace_hint(const_iterator, _Args&&... __args)
897             {return emplace(_VSTD::forward<_Args>(__args)...).first;}
898 #endif
899 #endif  // _LIBCPP_HAS_NO_VARIADICS
900 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
901     _LIBCPP_INLINE_VISIBILITY
902     pair<iterator, bool> insert(const value_type& __x)
903         {return __table_.__insert_unique(__x);}
904 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
905     template <class _Pp,
906               class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
907         _LIBCPP_INLINE_VISIBILITY
908         pair<iterator, bool> insert(_Pp&& __x)
909             {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));}
910 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
911     _LIBCPP_INLINE_VISIBILITY
912 #if _LIBCPP_DEBUG_LEVEL >= 2
913     iterator insert(const_iterator __p, const value_type& __x)
914         {
915             _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
916                 "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
917                 " referring to this unordered_map");
918             return insert(__x).first;
919         }
920 #else
921     iterator insert(const_iterator, const value_type& __x)
922         {return insert(__x).first;}
923 #endif
924 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
925     template <class _Pp,
926               class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
927         _LIBCPP_INLINE_VISIBILITY
928 #if _LIBCPP_DEBUG_LEVEL >= 2
929         iterator insert(const_iterator __p, _Pp&& __x)
930         {
931             _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
932                 "unordered_map::insert(const_iterator, value_type&&) called with an iterator not"
933                 " referring to this unordered_map");
934             return insert(_VSTD::forward<_Pp>(__x)).first;
935         }
936 #else
937         iterator insert(const_iterator, _Pp&& __x)
938             {return insert(_VSTD::forward<_Pp>(__x)).first;}
939 #endif
940 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
941     template <class _InputIterator>
942         void insert(_InputIterator __first, _InputIterator __last);
943 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
944     _LIBCPP_INLINE_VISIBILITY
945     void insert(initializer_list<value_type> __il)
946         {insert(__il.begin(), __il.end());}
947 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
948
949     _LIBCPP_INLINE_VISIBILITY
950     iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
951     _LIBCPP_INLINE_VISIBILITY
952     size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
953     _LIBCPP_INLINE_VISIBILITY
954     iterator erase(const_iterator __first, const_iterator __last)
955         {return __table_.erase(__first.__i_, __last.__i_);}
956     _LIBCPP_INLINE_VISIBILITY
957     void clear() _NOEXCEPT {__table_.clear();}
958
959     _LIBCPP_INLINE_VISIBILITY
960     void swap(unordered_map& __u)
961         _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
962         {__table_.swap(__u.__table_);}
963
964     _LIBCPP_INLINE_VISIBILITY
965     hasher hash_function() const
966         {return __table_.hash_function().hash_function();}
967     _LIBCPP_INLINE_VISIBILITY
968     key_equal key_eq() const
969         {return __table_.key_eq().key_eq();}
970
971     _LIBCPP_INLINE_VISIBILITY
972     iterator       find(const key_type& __k)       {return __table_.find(__k);}
973     _LIBCPP_INLINE_VISIBILITY
974     const_iterator find(const key_type& __k) const {return __table_.find(__k);}
975     _LIBCPP_INLINE_VISIBILITY
976     size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
977     _LIBCPP_INLINE_VISIBILITY
978     pair<iterator, iterator>             equal_range(const key_type& __k)
979         {return __table_.__equal_range_unique(__k);}
980     _LIBCPP_INLINE_VISIBILITY
981     pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
982         {return __table_.__equal_range_unique(__k);}
983
984     mapped_type& operator[](const key_type& __k);
985 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
986     mapped_type& operator[](key_type&& __k);
987 #endif
988
989     mapped_type&       at(const key_type& __k);
990     const mapped_type& at(const key_type& __k) const;
991
992     _LIBCPP_INLINE_VISIBILITY
993     size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
994     _LIBCPP_INLINE_VISIBILITY
995     size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
996
997     _LIBCPP_INLINE_VISIBILITY
998     size_type bucket_size(size_type __n) const
999         {return __table_.bucket_size(__n);}
1000     _LIBCPP_INLINE_VISIBILITY
1001     size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
1002
1003     _LIBCPP_INLINE_VISIBILITY
1004     local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
1005     _LIBCPP_INLINE_VISIBILITY
1006     local_iterator       end(size_type __n)          {return __table_.end(__n);}
1007     _LIBCPP_INLINE_VISIBILITY
1008     const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
1009     _LIBCPP_INLINE_VISIBILITY
1010     const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
1011     _LIBCPP_INLINE_VISIBILITY
1012     const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
1013     _LIBCPP_INLINE_VISIBILITY
1014     const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
1015
1016     _LIBCPP_INLINE_VISIBILITY
1017     float load_factor() const _NOEXCEPT {return __table_.load_factor();}
1018     _LIBCPP_INLINE_VISIBILITY
1019     float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
1020     _LIBCPP_INLINE_VISIBILITY
1021     void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
1022     _LIBCPP_INLINE_VISIBILITY
1023     void rehash(size_type __n) {__table_.rehash(__n);}
1024     _LIBCPP_INLINE_VISIBILITY
1025     void reserve(size_type __n) {__table_.reserve(__n);}
1026
1027 #if _LIBCPP_DEBUG_LEVEL >= 2
1028
1029     bool __dereferenceable(const const_iterator* __i) const
1030         {return __table_.__dereferenceable(&__i->__i_);}
1031     bool __decrementable(const const_iterator* __i) const
1032         {return __table_.__decrementable(&__i->__i_);}
1033     bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1034         {return __table_.__addable(&__i->__i_, __n);}
1035     bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1036         {return __table_.__addable(&__i->__i_, __n);}
1037
1038 #endif  // _LIBCPP_DEBUG_LEVEL >= 2
1039
1040 private:
1041 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1042     __node_holder __construct_node();
1043     template <class _A0>
1044         __node_holder
1045          __construct_node(_A0&& __a0);
1046     __node_holder __construct_node_with_key(key_type&& __k);
1047 #ifndef _LIBCPP_HAS_NO_VARIADICS
1048     template <class _A0, class _A1, class ..._Args>
1049         __node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args);
1050 #endif  // _LIBCPP_HAS_NO_VARIADICS
1051 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1052     __node_holder __construct_node_with_key(const key_type& __k);
1053 };
1054
1055 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1056 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1057         size_type __n, const hasher& __hf, const key_equal& __eql)
1058     : __table_(__hf, __eql)
1059 {
1060 #if _LIBCPP_DEBUG_LEVEL >= 2
1061     __get_db()->__insert_c(this);
1062 #endif
1063     __table_.rehash(__n);
1064 }
1065
1066 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1067 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1068         size_type __n, const hasher& __hf, const key_equal& __eql,
1069         const allocator_type& __a)
1070     : __table_(__hf, __eql, __a)
1071 {
1072 #if _LIBCPP_DEBUG_LEVEL >= 2
1073     __get_db()->__insert_c(this);
1074 #endif
1075     __table_.rehash(__n);
1076 }
1077
1078 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1079 inline _LIBCPP_INLINE_VISIBILITY
1080 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1081         const allocator_type& __a)
1082     : __table_(__a)
1083 {
1084 #if _LIBCPP_DEBUG_LEVEL >= 2
1085     __get_db()->__insert_c(this);
1086 #endif
1087 }
1088
1089 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1090 template <class _InputIterator>
1091 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1092         _InputIterator __first, _InputIterator __last)
1093 {
1094 #if _LIBCPP_DEBUG_LEVEL >= 2
1095     __get_db()->__insert_c(this);
1096 #endif
1097     insert(__first, __last);
1098 }
1099
1100 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1101 template <class _InputIterator>
1102 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1103         _InputIterator __first, _InputIterator __last, size_type __n,
1104         const hasher& __hf, const key_equal& __eql)
1105     : __table_(__hf, __eql)
1106 {
1107 #if _LIBCPP_DEBUG_LEVEL >= 2
1108     __get_db()->__insert_c(this);
1109 #endif
1110     __table_.rehash(__n);
1111     insert(__first, __last);
1112 }
1113
1114 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1115 template <class _InputIterator>
1116 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1117         _InputIterator __first, _InputIterator __last, size_type __n,
1118         const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
1119     : __table_(__hf, __eql, __a)
1120 {
1121 #if _LIBCPP_DEBUG_LEVEL >= 2
1122     __get_db()->__insert_c(this);
1123 #endif
1124     __table_.rehash(__n);
1125     insert(__first, __last);
1126 }
1127
1128 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1129 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1130         const unordered_map& __u)
1131     : __table_(__u.__table_)
1132 {
1133 #if _LIBCPP_DEBUG_LEVEL >= 2
1134     __get_db()->__insert_c(this);
1135 #endif
1136     __table_.rehash(__u.bucket_count());
1137     insert(__u.begin(), __u.end());
1138 }
1139
1140 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1141 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1142         const unordered_map& __u, const allocator_type& __a)
1143     : __table_(__u.__table_, __a)
1144 {
1145 #if _LIBCPP_DEBUG_LEVEL >= 2
1146     __get_db()->__insert_c(this);
1147 #endif
1148     __table_.rehash(__u.bucket_count());
1149     insert(__u.begin(), __u.end());
1150 }
1151
1152 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1153
1154 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1155 inline _LIBCPP_INLINE_VISIBILITY
1156 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1157         unordered_map&& __u)
1158     _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
1159     : __table_(_VSTD::move(__u.__table_))
1160 {
1161 #if _LIBCPP_DEBUG_LEVEL >= 2
1162     __get_db()->__insert_c(this);
1163     __get_db()->swap(this, &__u);
1164 #endif
1165 }
1166
1167 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1168 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1169         unordered_map&& __u, const allocator_type& __a)
1170     : __table_(_VSTD::move(__u.__table_), __a)
1171 {
1172 #if _LIBCPP_DEBUG_LEVEL >= 2
1173     __get_db()->__insert_c(this);
1174 #endif
1175     if (__a != __u.get_allocator())
1176     {
1177         iterator __i = __u.begin();
1178         while (__u.size() != 0)
1179             __table_.__insert_unique(
1180                 _VSTD::move(__u.__table_.remove((__i++).__i_)->__value_)
1181                                     );
1182     }
1183 #if _LIBCPP_DEBUG_LEVEL >= 2
1184     else
1185         __get_db()->swap(this, &__u);
1186 #endif
1187 }
1188
1189 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1190
1191 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1192
1193 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1194 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1195         initializer_list<value_type> __il)
1196 {
1197 #if _LIBCPP_DEBUG_LEVEL >= 2
1198     __get_db()->__insert_c(this);
1199 #endif
1200     insert(__il.begin(), __il.end());
1201 }
1202
1203 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1204 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1205         initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1206         const key_equal& __eql)
1207     : __table_(__hf, __eql)
1208 {
1209 #if _LIBCPP_DEBUG_LEVEL >= 2
1210     __get_db()->__insert_c(this);
1211 #endif
1212     __table_.rehash(__n);
1213     insert(__il.begin(), __il.end());
1214 }
1215
1216 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1217 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1218         initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1219         const key_equal& __eql, const allocator_type& __a)
1220     : __table_(__hf, __eql, __a)
1221 {
1222 #if _LIBCPP_DEBUG_LEVEL >= 2
1223     __get_db()->__insert_c(this);
1224 #endif
1225     __table_.rehash(__n);
1226     insert(__il.begin(), __il.end());
1227 }
1228
1229 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1230
1231 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1232
1233 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1234 inline _LIBCPP_INLINE_VISIBILITY
1235 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
1236 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u)
1237     _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
1238 {
1239     __table_ = _VSTD::move(__u.__table_);
1240     return *this;
1241 }
1242
1243 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1244
1245 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1246
1247 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1248 inline _LIBCPP_INLINE_VISIBILITY
1249 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
1250 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
1251         initializer_list<value_type> __il)
1252 {
1253     __table_.__assign_unique(__il.begin(), __il.end());
1254     return *this;
1255 }
1256
1257 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1258
1259 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1260
1261 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1262 typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
1263 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node()
1264 {
1265     __node_allocator& __na = __table_.__node_alloc();
1266     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1267     __node_traits::construct(__na, _VSTD::addressof(__h->__value_));
1268     __h.get_deleter().__first_constructed = true;
1269     __h.get_deleter().__second_constructed = true;
1270     return __h;
1271 }
1272
1273 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1274 template <class _A0>
1275 typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
1276 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0)
1277 {
1278     __node_allocator& __na = __table_.__node_alloc();
1279     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1280     __node_traits::construct(__na, _VSTD::addressof(__h->__value_),
1281                              _VSTD::forward<_A0>(__a0));
1282     __h.get_deleter().__first_constructed = true;
1283     __h.get_deleter().__second_constructed = true;
1284     return __h;
1285 }
1286
1287 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1288 typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
1289 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(key_type&& __k)
1290 {
1291     __node_allocator& __na = __table_.__node_alloc();
1292     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1293     __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), _VSTD::move(__k));
1294     __h.get_deleter().__first_constructed = true;
1295     __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
1296     __h.get_deleter().__second_constructed = true;
1297     return __h;
1298 }
1299
1300 #ifndef _LIBCPP_HAS_NO_VARIADICS
1301
1302 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1303 template <class _A0, class _A1, class ..._Args>
1304 typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
1305 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0,
1306                                                                  _A1&& __a1,
1307                                                                  _Args&&... __args)
1308 {
1309     __node_allocator& __na = __table_.__node_alloc();
1310     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1311     __node_traits::construct(__na, _VSTD::addressof(__h->__value_),
1312                              _VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1),
1313                              _VSTD::forward<_Args>(__args)...);
1314     __h.get_deleter().__first_constructed = true;
1315     __h.get_deleter().__second_constructed = true;
1316     return __h;
1317 }
1318
1319 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1320 template <class... _Args>
1321 pair<typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator, bool>
1322 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace(_Args&&... __args)
1323 {
1324     __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
1325     pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
1326     if (__r.second)
1327         __h.release();
1328     return __r;
1329 }
1330
1331 #endif  // _LIBCPP_HAS_NO_VARIADICS
1332 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1333
1334 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1335 typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
1336 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k)
1337 {
1338     __node_allocator& __na = __table_.__node_alloc();
1339     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1340     __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k);
1341     __h.get_deleter().__first_constructed = true;
1342     __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
1343     __h.get_deleter().__second_constructed = true;
1344     return _VSTD::move(__h);  // explicitly moved for C++03
1345 }
1346
1347 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1348 template <class _InputIterator>
1349 inline _LIBCPP_INLINE_VISIBILITY
1350 void
1351 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
1352                                                        _InputIterator __last)
1353 {
1354     for (; __first != __last; ++__first)
1355         __table_.__insert_unique(*__first);
1356 }
1357
1358 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1359 _Tp&
1360 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
1361 {
1362     iterator __i = find(__k);
1363     if (__i != end())
1364         return __i->second;
1365     __node_holder __h = __construct_node_with_key(__k);
1366     pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
1367     __h.release();
1368     return __r.first->second;
1369 }
1370
1371 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1372
1373 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1374 _Tp&
1375 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k)
1376 {
1377     iterator __i = find(__k);
1378     if (__i != end())
1379         return __i->second;
1380     __node_holder __h = __construct_node_with_key(_VSTD::move(__k));
1381     pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
1382     __h.release();
1383     return __r.first->second;
1384 }
1385
1386 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1387
1388 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1389 _Tp&
1390 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k)
1391 {
1392     iterator __i = find(__k);
1393 #ifndef _LIBCPP_NO_EXCEPTIONS
1394     if (__i == end())
1395         throw out_of_range("unordered_map::at: key not found");
1396 #endif  // _LIBCPP_NO_EXCEPTIONS
1397     return __i->second;
1398 }
1399
1400 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1401 const _Tp&
1402 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const
1403 {
1404     const_iterator __i = find(__k);
1405 #ifndef _LIBCPP_NO_EXCEPTIONS
1406     if (__i == end())
1407         throw out_of_range("unordered_map::at: key not found");
1408 #endif  // _LIBCPP_NO_EXCEPTIONS
1409     return __i->second;
1410 }
1411
1412 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1413 inline _LIBCPP_INLINE_VISIBILITY
1414 void
1415 swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1416      unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
1417     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
1418 {
1419     __x.swap(__y);
1420 }
1421
1422 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1423 bool
1424 operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1425            const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
1426 {
1427     if (__x.size() != __y.size())
1428         return false;
1429     typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
1430                                                                  const_iterator;
1431     for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
1432             __i != __ex; ++__i)
1433     {
1434         const_iterator __j = __y.find(__i->first);
1435         if (__j == __ey || !(*__i == *__j))
1436             return false;
1437     }
1438     return true;
1439 }
1440
1441 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1442 inline _LIBCPP_INLINE_VISIBILITY
1443 bool
1444 operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1445            const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
1446 {
1447     return !(__x == __y);
1448 }
1449
1450 template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
1451           class _Alloc = allocator<pair<const _Key, _Tp> > >
1452 class _LIBCPP_TYPE_VIS_ONLY unordered_multimap
1453 {
1454 public:
1455     // types
1456     typedef _Key                                           key_type;
1457     typedef _Tp                                            mapped_type;
1458     typedef _Hash                                          hasher;
1459     typedef _Pred                                          key_equal;
1460     typedef _Alloc                                         allocator_type;
1461     typedef pair<const key_type, mapped_type>              value_type;
1462     typedef pair<key_type, mapped_type>                    __nc_value_type;
1463     typedef value_type&                                    reference;
1464     typedef const value_type&                              const_reference;
1465     static_assert((is_same<value_type, typename allocator_type::value_type>::value),
1466                   "Invalid allocator::value_type");
1467
1468 private:
1469     typedef __hash_value_type<key_type, mapped_type>                 __value_type;
1470     typedef __unordered_map_hasher<key_type, __value_type, hasher>   __hasher;
1471     typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
1472     typedef typename allocator_traits<allocator_type>::template
1473 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
1474             rebind_alloc<__value_type>
1475 #else
1476             rebind_alloc<__value_type>::other
1477 #endif
1478                                                            __allocator_type;
1479
1480     typedef __hash_table<__value_type, __hasher,
1481                          __key_equal,  __allocator_type>   __table;
1482
1483     __table __table_;
1484
1485     typedef typename __table::__node_traits                __node_traits;
1486     typedef typename __table::__node_allocator             __node_allocator;
1487     typedef typename __table::__node                       __node;
1488     typedef __hash_map_node_destructor<__node_allocator>   _Dp;
1489     typedef unique_ptr<__node, _Dp>                         __node_holder;
1490     typedef allocator_traits<allocator_type>               __alloc_traits;
1491 public:
1492     typedef typename __alloc_traits::pointer         pointer;
1493     typedef typename __alloc_traits::const_pointer   const_pointer;
1494     typedef typename __alloc_traits::size_type       size_type;
1495     typedef typename __alloc_traits::difference_type difference_type;
1496
1497     typedef __hash_map_iterator<typename __table::iterator>       iterator;
1498     typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
1499     typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
1500     typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
1501
1502     _LIBCPP_INLINE_VISIBILITY
1503     unordered_multimap()
1504         _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
1505         {
1506 #if _LIBCPP_DEBUG_LEVEL >= 2
1507             __get_db()->__insert_c(this);
1508 #endif
1509         }
1510     explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(),
1511                                 const key_equal& __eql = key_equal());
1512     unordered_multimap(size_type __n, const hasher& __hf,
1513                                 const key_equal& __eql,
1514                                 const allocator_type& __a);
1515     template <class _InputIterator>
1516         unordered_multimap(_InputIterator __first, _InputIterator __last);
1517     template <class _InputIterator>
1518         unordered_multimap(_InputIterator __first, _InputIterator __last,
1519                       size_type __n, const hasher& __hf = hasher(),
1520                       const key_equal& __eql = key_equal());
1521     template <class _InputIterator>
1522         unordered_multimap(_InputIterator __first, _InputIterator __last,
1523                       size_type __n, const hasher& __hf,
1524                       const key_equal& __eql,
1525                       const allocator_type& __a);
1526     explicit unordered_multimap(const allocator_type& __a);
1527     unordered_multimap(const unordered_multimap& __u);
1528     unordered_multimap(const unordered_multimap& __u, const allocator_type& __a);
1529 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1530     unordered_multimap(unordered_multimap&& __u)
1531         _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
1532     unordered_multimap(unordered_multimap&& __u, const allocator_type& __a);
1533 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1534 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1535     unordered_multimap(initializer_list<value_type> __il);
1536     unordered_multimap(initializer_list<value_type> __il, size_type __n,
1537                        const hasher& __hf = hasher(),
1538                        const key_equal& __eql = key_equal());
1539     unordered_multimap(initializer_list<value_type> __il, size_type __n,
1540                        const hasher& __hf, const key_equal& __eql,
1541                        const allocator_type& __a);
1542 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1543 #if _LIBCPP_STD_VER > 11
1544     _LIBCPP_INLINE_VISIBILITY
1545     unordered_multimap(size_type __n, const allocator_type& __a)
1546       : unordered_multimap(__n, hasher(), key_equal(), __a) {}
1547     _LIBCPP_INLINE_VISIBILITY
1548     unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a)
1549       : unordered_multimap(__n, __hf, key_equal(), __a) {}
1550     template <class _InputIterator>
1551     _LIBCPP_INLINE_VISIBILITY
1552       unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
1553       : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {}
1554     template <class _InputIterator>
1555     _LIBCPP_INLINE_VISIBILITY
1556       unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf, 
1557         const allocator_type& __a)
1558       : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {}
1559     _LIBCPP_INLINE_VISIBILITY
1560     unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
1561       : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {}
1562     _LIBCPP_INLINE_VISIBILITY
1563     unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf, 
1564       const allocator_type& __a)
1565       : unordered_multimap(__il, __n, __hf, key_equal(), __a) {}
1566 #endif
1567     // ~unordered_multimap() = default;
1568     _LIBCPP_INLINE_VISIBILITY
1569     unordered_multimap& operator=(const unordered_multimap& __u)
1570     {
1571 #if __cplusplus >= 201103L
1572         __table_ = __u.__table_;
1573 #else
1574         if (this != &__u) {
1575             __table_.clear();
1576             __table_.hash_function() = __u.__table_.hash_function();
1577             __table_.key_eq() = __u.__table_.key_eq();
1578             __table_.max_load_factor() = __u.__table_.max_load_factor();
1579             __table_.__copy_assign_alloc(__u.__table_);
1580             insert(__u.begin(), __u.end());
1581         }
1582 #endif
1583         return *this;
1584     }
1585 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1586     unordered_multimap& operator=(unordered_multimap&& __u)
1587         _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
1588 #endif
1589 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1590     unordered_multimap& operator=(initializer_list<value_type> __il);
1591 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1592
1593     _LIBCPP_INLINE_VISIBILITY
1594     allocator_type get_allocator() const _NOEXCEPT
1595         {return allocator_type(__table_.__node_alloc());}
1596
1597     _LIBCPP_INLINE_VISIBILITY
1598     bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
1599     _LIBCPP_INLINE_VISIBILITY
1600     size_type size() const _NOEXCEPT  {return __table_.size();}
1601     _LIBCPP_INLINE_VISIBILITY
1602     size_type max_size() const _NOEXCEPT {return __table_.max_size();}
1603
1604     _LIBCPP_INLINE_VISIBILITY
1605     iterator       begin() _NOEXCEPT        {return __table_.begin();}
1606     _LIBCPP_INLINE_VISIBILITY
1607     iterator       end() _NOEXCEPT          {return __table_.end();}
1608     _LIBCPP_INLINE_VISIBILITY
1609     const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
1610     _LIBCPP_INLINE_VISIBILITY
1611     const_iterator end()    const _NOEXCEPT {return __table_.end();}
1612     _LIBCPP_INLINE_VISIBILITY
1613     const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
1614     _LIBCPP_INLINE_VISIBILITY
1615     const_iterator cend()   const _NOEXCEPT {return __table_.end();}
1616
1617 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1618 #ifndef _LIBCPP_HAS_NO_VARIADICS
1619
1620     template <class... _Args>
1621         iterator emplace(_Args&&... __args);
1622
1623     template <class... _Args>
1624         iterator emplace_hint(const_iterator __p, _Args&&... __args);
1625 #endif  // _LIBCPP_HAS_NO_VARIADICS
1626 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1627     _LIBCPP_INLINE_VISIBILITY
1628     iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
1629 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1630     template <class _Pp,
1631               class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1632         _LIBCPP_INLINE_VISIBILITY
1633         iterator insert(_Pp&& __x)
1634             {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));}
1635 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1636     _LIBCPP_INLINE_VISIBILITY
1637     iterator insert(const_iterator __p, const value_type& __x)
1638         {return __table_.__insert_multi(__p.__i_, __x);}
1639 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1640     template <class _Pp,
1641               class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1642         _LIBCPP_INLINE_VISIBILITY
1643         iterator insert(const_iterator __p, _Pp&& __x)
1644             {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));}
1645 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1646     template <class _InputIterator>
1647         void insert(_InputIterator __first, _InputIterator __last);
1648 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1649     _LIBCPP_INLINE_VISIBILITY
1650     void insert(initializer_list<value_type> __il)
1651         {insert(__il.begin(), __il.end());}
1652 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1653
1654     _LIBCPP_INLINE_VISIBILITY
1655     iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
1656     _LIBCPP_INLINE_VISIBILITY
1657     size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
1658     _LIBCPP_INLINE_VISIBILITY
1659     iterator erase(const_iterator __first, const_iterator __last)
1660         {return __table_.erase(__first.__i_, __last.__i_);}
1661     _LIBCPP_INLINE_VISIBILITY
1662     void clear() _NOEXCEPT {__table_.clear();}
1663
1664     _LIBCPP_INLINE_VISIBILITY
1665     void swap(unordered_multimap& __u)
1666         _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
1667         {__table_.swap(__u.__table_);}
1668
1669     _LIBCPP_INLINE_VISIBILITY
1670     hasher hash_function() const
1671         {return __table_.hash_function().hash_function();}
1672     _LIBCPP_INLINE_VISIBILITY
1673     key_equal key_eq() const
1674         {return __table_.key_eq().key_eq();}
1675
1676     _LIBCPP_INLINE_VISIBILITY
1677     iterator       find(const key_type& __k)       {return __table_.find(__k);}
1678     _LIBCPP_INLINE_VISIBILITY
1679     const_iterator find(const key_type& __k) const {return __table_.find(__k);}
1680     _LIBCPP_INLINE_VISIBILITY
1681     size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
1682     _LIBCPP_INLINE_VISIBILITY
1683     pair<iterator, iterator>             equal_range(const key_type& __k)
1684         {return __table_.__equal_range_multi(__k);}
1685     _LIBCPP_INLINE_VISIBILITY
1686     pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
1687         {return __table_.__equal_range_multi(__k);}
1688
1689     _LIBCPP_INLINE_VISIBILITY
1690     size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
1691     _LIBCPP_INLINE_VISIBILITY
1692     size_type max_bucket_count() const _NOEXCEPT
1693         {return __table_.max_bucket_count();}
1694
1695     _LIBCPP_INLINE_VISIBILITY
1696     size_type bucket_size(size_type __n) const
1697         {return __table_.bucket_size(__n);}
1698     _LIBCPP_INLINE_VISIBILITY
1699     size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
1700
1701     _LIBCPP_INLINE_VISIBILITY
1702     local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
1703     _LIBCPP_INLINE_VISIBILITY
1704     local_iterator       end(size_type __n)          {return __table_.end(__n);}
1705     _LIBCPP_INLINE_VISIBILITY
1706     const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
1707     _LIBCPP_INLINE_VISIBILITY
1708     const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
1709     _LIBCPP_INLINE_VISIBILITY
1710     const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
1711     _LIBCPP_INLINE_VISIBILITY
1712     const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
1713
1714     _LIBCPP_INLINE_VISIBILITY
1715     float load_factor() const _NOEXCEPT {return __table_.load_factor();}
1716     _LIBCPP_INLINE_VISIBILITY
1717     float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
1718     _LIBCPP_INLINE_VISIBILITY
1719     void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
1720     _LIBCPP_INLINE_VISIBILITY
1721     void rehash(size_type __n) {__table_.rehash(__n);}
1722     _LIBCPP_INLINE_VISIBILITY
1723     void reserve(size_type __n) {__table_.reserve(__n);}
1724
1725 #if _LIBCPP_DEBUG_LEVEL >= 2
1726
1727     bool __dereferenceable(const const_iterator* __i) const
1728         {return __table_.__dereferenceable(&__i->__i_);}
1729     bool __decrementable(const const_iterator* __i) const
1730         {return __table_.__decrementable(&__i->__i_);}
1731     bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1732         {return __table_.__addable(&__i->__i_, __n);}
1733     bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1734         {return __table_.__addable(&__i->__i_, __n);}
1735
1736 #endif  // _LIBCPP_DEBUG_LEVEL >= 2
1737
1738 private:
1739 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1740     __node_holder __construct_node();
1741     template <class _A0>
1742         __node_holder
1743          __construct_node(_A0&& __a0);
1744 #ifndef _LIBCPP_HAS_NO_VARIADICS
1745     template <class _A0, class _A1, class ..._Args>
1746         __node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args);
1747 #endif  // _LIBCPP_HAS_NO_VARIADICS
1748 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1749 };
1750
1751 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1752 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1753         size_type __n, const hasher& __hf, const key_equal& __eql)
1754     : __table_(__hf, __eql)
1755 {
1756 #if _LIBCPP_DEBUG_LEVEL >= 2
1757     __get_db()->__insert_c(this);
1758 #endif
1759     __table_.rehash(__n);
1760 }
1761
1762 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1763 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1764         size_type __n, const hasher& __hf, const key_equal& __eql,
1765         const allocator_type& __a)
1766     : __table_(__hf, __eql, __a)
1767 {
1768 #if _LIBCPP_DEBUG_LEVEL >= 2
1769     __get_db()->__insert_c(this);
1770 #endif
1771     __table_.rehash(__n);
1772 }
1773
1774 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1775 template <class _InputIterator>
1776 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1777         _InputIterator __first, _InputIterator __last)
1778 {
1779 #if _LIBCPP_DEBUG_LEVEL >= 2
1780     __get_db()->__insert_c(this);
1781 #endif
1782     insert(__first, __last);
1783 }
1784
1785 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1786 template <class _InputIterator>
1787 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1788         _InputIterator __first, _InputIterator __last, size_type __n,
1789         const hasher& __hf, const key_equal& __eql)
1790     : __table_(__hf, __eql)
1791 {
1792 #if _LIBCPP_DEBUG_LEVEL >= 2
1793     __get_db()->__insert_c(this);
1794 #endif
1795     __table_.rehash(__n);
1796     insert(__first, __last);
1797 }
1798
1799 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1800 template <class _InputIterator>
1801 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1802         _InputIterator __first, _InputIterator __last, size_type __n,
1803         const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
1804     : __table_(__hf, __eql, __a)
1805 {
1806 #if _LIBCPP_DEBUG_LEVEL >= 2
1807     __get_db()->__insert_c(this);
1808 #endif
1809     __table_.rehash(__n);
1810     insert(__first, __last);
1811 }
1812
1813 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1814 inline _LIBCPP_INLINE_VISIBILITY
1815 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1816         const allocator_type& __a)
1817     : __table_(__a)
1818 {
1819 #if _LIBCPP_DEBUG_LEVEL >= 2
1820     __get_db()->__insert_c(this);
1821 #endif
1822 }
1823
1824 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1825 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1826         const unordered_multimap& __u)
1827     : __table_(__u.__table_)
1828 {
1829 #if _LIBCPP_DEBUG_LEVEL >= 2
1830     __get_db()->__insert_c(this);
1831 #endif
1832     __table_.rehash(__u.bucket_count());
1833     insert(__u.begin(), __u.end());
1834 }
1835
1836 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1837 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1838         const unordered_multimap& __u, const allocator_type& __a)
1839     : __table_(__u.__table_, __a)
1840 {
1841 #if _LIBCPP_DEBUG_LEVEL >= 2
1842     __get_db()->__insert_c(this);
1843 #endif
1844     __table_.rehash(__u.bucket_count());
1845     insert(__u.begin(), __u.end());
1846 }
1847
1848 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1849
1850 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1851 inline _LIBCPP_INLINE_VISIBILITY
1852 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1853         unordered_multimap&& __u)
1854     _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
1855     : __table_(_VSTD::move(__u.__table_))
1856 {
1857 #if _LIBCPP_DEBUG_LEVEL >= 2
1858     __get_db()->__insert_c(this);
1859     __get_db()->swap(this, &__u);
1860 #endif
1861 }
1862
1863 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1864 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1865         unordered_multimap&& __u, const allocator_type& __a)
1866     : __table_(_VSTD::move(__u.__table_), __a)
1867 {
1868 #if _LIBCPP_DEBUG_LEVEL >= 2
1869     __get_db()->__insert_c(this);
1870 #endif
1871     if (__a != __u.get_allocator())
1872     {
1873         iterator __i = __u.begin();
1874         while (__u.size() != 0)
1875         {
1876             __table_.__insert_multi(
1877                 _VSTD::move(__u.__table_.remove((__i++).__i_)->__value_)
1878                                    );
1879         }
1880     }
1881 #if _LIBCPP_DEBUG_LEVEL >= 2
1882     else
1883         __get_db()->swap(this, &__u);
1884 #endif
1885 }
1886
1887 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1888
1889 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1890
1891 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1892 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1893         initializer_list<value_type> __il)
1894 {
1895 #if _LIBCPP_DEBUG_LEVEL >= 2
1896     __get_db()->__insert_c(this);
1897 #endif
1898     insert(__il.begin(), __il.end());
1899 }
1900
1901 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1902 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1903         initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1904         const key_equal& __eql)
1905     : __table_(__hf, __eql)
1906 {
1907 #if _LIBCPP_DEBUG_LEVEL >= 2
1908     __get_db()->__insert_c(this);
1909 #endif
1910     __table_.rehash(__n);
1911     insert(__il.begin(), __il.end());
1912 }
1913
1914 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1915 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1916         initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1917         const key_equal& __eql, const allocator_type& __a)
1918     : __table_(__hf, __eql, __a)
1919 {
1920 #if _LIBCPP_DEBUG_LEVEL >= 2
1921     __get_db()->__insert_c(this);
1922 #endif
1923     __table_.rehash(__n);
1924     insert(__il.begin(), __il.end());
1925 }
1926
1927 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1928
1929 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1930
1931 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1932 inline _LIBCPP_INLINE_VISIBILITY
1933 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
1934 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u)
1935     _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
1936 {
1937     __table_ = _VSTD::move(__u.__table_);
1938     return *this;
1939 }
1940
1941 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1942
1943 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1944
1945 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1946 inline _LIBCPP_INLINE_VISIBILITY
1947 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
1948 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
1949         initializer_list<value_type> __il)
1950 {
1951     __table_.__assign_multi(__il.begin(), __il.end());
1952     return *this;
1953 }
1954
1955 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1956
1957 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1958
1959 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1960 typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
1961 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node()
1962 {
1963     __node_allocator& __na = __table_.__node_alloc();
1964     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1965     __node_traits::construct(__na, _VSTD::addressof(__h->__value_));
1966     __h.get_deleter().__first_constructed = true;
1967     __h.get_deleter().__second_constructed = true;
1968     return __h;
1969 }
1970
1971 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1972 template <class _A0>
1973 typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
1974 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0)
1975 {
1976     __node_allocator& __na = __table_.__node_alloc();
1977     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1978     __node_traits::construct(__na, _VSTD::addressof(__h->__value_),
1979                              _VSTD::forward<_A0>(__a0));
1980     __h.get_deleter().__first_constructed = true;
1981     __h.get_deleter().__second_constructed = true;
1982     return __h;
1983 }
1984
1985 #ifndef _LIBCPP_HAS_NO_VARIADICS
1986
1987 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1988 template <class _A0, class _A1, class ..._Args>
1989 typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
1990 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(
1991         _A0&& __a0, _A1&& __a1, _Args&&... __args)
1992 {
1993     __node_allocator& __na = __table_.__node_alloc();
1994     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1995     __node_traits::construct(__na, _VSTD::addressof(__h->__value_),
1996                              _VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1),
1997                              _VSTD::forward<_Args>(__args)...);
1998     __h.get_deleter().__first_constructed = true;
1999     __h.get_deleter().__second_constructed = true;
2000     return __h;
2001 }
2002
2003 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2004 template <class... _Args>
2005 typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator
2006 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace(_Args&&... __args)
2007 {
2008     __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
2009     iterator __r = __table_.__node_insert_multi(__h.get());
2010     __h.release();
2011     return __r;
2012 }
2013
2014 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2015 template <class... _Args>
2016 typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator
2017 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace_hint(
2018         const_iterator __p, _Args&&... __args)
2019 {
2020     __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
2021     iterator __r = __table_.__node_insert_multi(__p.__i_, __h.get());
2022     __h.release();
2023     return __r;
2024 }
2025
2026 #endif  // _LIBCPP_HAS_NO_VARIADICS
2027 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2028
2029 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2030 template <class _InputIterator>
2031 inline _LIBCPP_INLINE_VISIBILITY
2032 void
2033 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
2034                                                             _InputIterator __last)
2035 {
2036     for (; __first != __last; ++__first)
2037         __table_.__insert_multi(*__first);
2038 }
2039
2040 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2041 inline _LIBCPP_INLINE_VISIBILITY
2042 void
2043 swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2044      unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2045     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
2046 {
2047     __x.swap(__y);
2048 }
2049
2050 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2051 bool
2052 operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2053            const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2054 {
2055     if (__x.size() != __y.size())
2056         return false;
2057     typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
2058                                                                  const_iterator;
2059     typedef pair<const_iterator, const_iterator> _EqRng;
2060     for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
2061     {
2062         _EqRng __xeq = __x.equal_range(__i->first);
2063         _EqRng __yeq = __y.equal_range(__i->first);
2064         if (_VSTD::distance(__xeq.first, __xeq.second) !=
2065             _VSTD::distance(__yeq.first, __yeq.second) ||
2066                   !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
2067             return false;
2068         __i = __xeq.second;
2069     }
2070     return true;
2071 }
2072
2073 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2074 inline _LIBCPP_INLINE_VISIBILITY
2075 bool
2076 operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2077            const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2078 {
2079     return !(__x == __y);
2080 }
2081
2082 _LIBCPP_END_NAMESPACE_STD
2083
2084 #endif  // _LIBCPP_UNORDERED_MAP