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