• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// -*- C++ -*-
2//===----------------------------------------------------------------------===//
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__HASH_TABLE
12#define _LIBCPP__HASH_TABLE
13
14#include <__config>
15#include <initializer_list>
16#include <memory>
17#include <iterator>
18#include <algorithm>
19#include <cmath>
20#include <utility>
21#include <type_traits>
22
23#include <__debug>
24
25#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
26#pragma GCC system_header
27#endif
28
29_LIBCPP_PUSH_MACROS
30#include <__undef_macros>
31
32
33_LIBCPP_BEGIN_NAMESPACE_STD
34
35#ifndef _LIBCPP_CXX03_LANG
36template <class _Key, class _Tp>
37union __hash_value_type;
38#else
39template <class _Key, class _Tp>
40struct __hash_value_type;
41#endif
42
43template <class _Key, class _Cp, class _Hash,
44          bool =  is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value>
45class __unordered_map_hasher;
46
47template <class _Key, class _Cp, class _Pred,
48          bool = is_empty<_Pred>::value && !__libcpp_is_final<_Pred>::value
49         >
50class __unordered_map_equal;
51
52#ifndef _LIBCPP_CXX03_LANG
53template <class _Tp>
54struct __is_hash_value_type_imp : false_type {};
55
56template <class _Key, class _Value>
57struct __is_hash_value_type_imp<__hash_value_type<_Key, _Value>> : true_type {};
58
59template <class ..._Args>
60struct __is_hash_value_type : false_type {};
61
62template <class _One>
63struct __is_hash_value_type<_One> : __is_hash_value_type_imp<typename __uncvref<_One>::type> {};
64#endif
65
66_LIBCPP_FUNC_VIS
67size_t __next_prime(size_t __n);
68
69template <class _NodePtr>
70struct __hash_node_base
71{
72    typedef typename pointer_traits<_NodePtr>::element_type __node_type;
73    typedef __hash_node_base __first_node;
74    typedef typename __rebind_pointer<_NodePtr, __first_node>::type __node_base_pointer;
75    typedef _NodePtr __node_pointer;
76
77#if defined(_LIBCPP_ABI_FIX_UNORDERED_NODE_POINTER_UB)
78  typedef __node_base_pointer __next_pointer;
79#else
80  typedef typename conditional<
81      is_pointer<__node_pointer>::value,
82      __node_base_pointer,
83      __node_pointer>::type   __next_pointer;
84#endif
85
86    __next_pointer    __next_;
87
88    _LIBCPP_INLINE_VISIBILITY
89    __next_pointer __ptr() _NOEXCEPT {
90        return static_cast<__next_pointer>(
91            pointer_traits<__node_base_pointer>::pointer_to(*this));
92    }
93
94    _LIBCPP_INLINE_VISIBILITY
95    __node_pointer __upcast() _NOEXCEPT {
96        return static_cast<__node_pointer>(
97            pointer_traits<__node_base_pointer>::pointer_to(*this));
98    }
99
100    _LIBCPP_INLINE_VISIBILITY
101    size_t __hash() const _NOEXCEPT {
102        return static_cast<__node_type const&>(*this).__hash_;
103    }
104
105    _LIBCPP_INLINE_VISIBILITY __hash_node_base() _NOEXCEPT : __next_(nullptr) {}
106};
107
108template <class _Tp, class _VoidPtr>
109struct __hash_node
110    : public __hash_node_base
111             <
112                 typename __rebind_pointer<_VoidPtr, __hash_node<_Tp, _VoidPtr> >::type
113             >
114{
115    typedef _Tp __node_value_type;
116
117    size_t            __hash_;
118    __node_value_type __value_;
119};
120
121inline _LIBCPP_INLINE_VISIBILITY
122bool
123__is_hash_power2(size_t __bc)
124{
125    return __bc > 2 && !(__bc & (__bc - 1));
126}
127
128inline _LIBCPP_INLINE_VISIBILITY
129size_t
130__constrain_hash(size_t __h, size_t __bc)
131{
132    return !(__bc & (__bc - 1)) ? __h & (__bc - 1) :
133        (__h < __bc ? __h : __h % __bc);
134}
135
136inline _LIBCPP_INLINE_VISIBILITY
137size_t
138__next_hash_pow2(size_t __n)
139{
140    return __n < 2 ? __n : (size_t(1) << (std::numeric_limits<size_t>::digits - __clz(__n-1)));
141}
142
143
144template <class _Tp, class _Hash, class _Equal, class _Alloc> class __hash_table;
145
146template <class _NodePtr>      class _LIBCPP_TEMPLATE_VIS __hash_iterator;
147template <class _ConstNodePtr> class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
148template <class _NodePtr>      class _LIBCPP_TEMPLATE_VIS __hash_local_iterator;
149template <class _ConstNodePtr> class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
150template <class _HashIterator> class _LIBCPP_TEMPLATE_VIS __hash_map_iterator;
151template <class _HashIterator> class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
152
153template <class _Tp>
154struct __hash_key_value_types {
155  static_assert(!is_reference<_Tp>::value && !is_const<_Tp>::value, "");
156  typedef _Tp key_type;
157  typedef _Tp __node_value_type;
158  typedef _Tp __container_value_type;
159  static const bool __is_map = false;
160
161  _LIBCPP_INLINE_VISIBILITY
162  static key_type const& __get_key(_Tp const& __v) {
163    return __v;
164  }
165  _LIBCPP_INLINE_VISIBILITY
166  static __container_value_type const& __get_value(__node_value_type const& __v) {
167    return __v;
168  }
169  _LIBCPP_INLINE_VISIBILITY
170  static __container_value_type* __get_ptr(__node_value_type& __n) {
171    return _VSTD::addressof(__n);
172  }
173#ifndef _LIBCPP_CXX03_LANG
174  _LIBCPP_INLINE_VISIBILITY
175  static  __container_value_type&& __move(__node_value_type& __v) {
176    return _VSTD::move(__v);
177  }
178#endif
179};
180
181template <class _Key, class _Tp>
182struct __hash_key_value_types<__hash_value_type<_Key, _Tp> > {
183  typedef _Key                                         key_type;
184  typedef _Tp                                          mapped_type;
185  typedef __hash_value_type<_Key, _Tp>                 __node_value_type;
186  typedef pair<const _Key, _Tp>                        __container_value_type;
187  typedef pair<_Key, _Tp>                              __nc_value_type;
188  typedef __container_value_type                       __map_value_type;
189  static const bool __is_map = true;
190
191  _LIBCPP_INLINE_VISIBILITY
192  static key_type const& __get_key(__container_value_type const& __v) {
193    return __v.first;
194  }
195
196  template <class _Up>
197  _LIBCPP_INLINE_VISIBILITY
198  static typename enable_if<__is_same_uncvref<_Up, __node_value_type>::value,
199      __container_value_type const&>::type
200  __get_value(_Up& __t) {
201    return __t.__cc;
202  }
203
204  template <class _Up>
205  _LIBCPP_INLINE_VISIBILITY
206  static typename enable_if<__is_same_uncvref<_Up, __container_value_type>::value,
207      __container_value_type const&>::type
208  __get_value(_Up& __t) {
209    return __t;
210  }
211
212  _LIBCPP_INLINE_VISIBILITY
213  static __container_value_type* __get_ptr(__node_value_type& __n) {
214    return _VSTD::addressof(__n.__cc);
215  }
216#ifndef _LIBCPP_CXX03_LANG
217  _LIBCPP_INLINE_VISIBILITY
218  static __nc_value_type&& __move(__node_value_type& __v) {
219    return _VSTD::move(__v.__nc);
220  }
221#endif
222
223};
224
225template <class _Tp, class _AllocPtr, class _KVTypes = __hash_key_value_types<_Tp>,
226          bool = _KVTypes::__is_map>
227struct __hash_map_pointer_types {};
228
229template <class _Tp, class _AllocPtr, class _KVTypes>
230struct __hash_map_pointer_types<_Tp, _AllocPtr, _KVTypes, true> {
231  typedef typename _KVTypes::__map_value_type   _Mv;
232  typedef typename __rebind_pointer<_AllocPtr, _Mv>::type
233                                                       __map_value_type_pointer;
234  typedef typename __rebind_pointer<_AllocPtr, const _Mv>::type
235                                                 __const_map_value_type_pointer;
236};
237
238template <class _NodePtr, class _NodeT = typename pointer_traits<_NodePtr>::element_type>
239struct __hash_node_types;
240
241template <class _NodePtr, class _Tp, class _VoidPtr>
242struct __hash_node_types<_NodePtr, __hash_node<_Tp, _VoidPtr> >
243    : public __hash_key_value_types<_Tp>, __hash_map_pointer_types<_Tp, _VoidPtr>
244
245{
246  typedef __hash_key_value_types<_Tp>           __base;
247
248public:
249  typedef ptrdiff_t difference_type;
250  typedef size_t size_type;
251
252  typedef typename __rebind_pointer<_NodePtr, void>::type       __void_pointer;
253
254  typedef typename pointer_traits<_NodePtr>::element_type       __node_type;
255  typedef _NodePtr                                              __node_pointer;
256
257  typedef __hash_node_base<__node_pointer>                      __node_base_type;
258  typedef typename __rebind_pointer<_NodePtr, __node_base_type>::type
259                                                             __node_base_pointer;
260
261  typedef typename __node_base_type::__next_pointer          __next_pointer;
262
263  typedef _Tp                                                 __node_value_type;
264  typedef typename __rebind_pointer<_VoidPtr, __node_value_type>::type
265                                                      __node_value_type_pointer;
266  typedef typename __rebind_pointer<_VoidPtr, const __node_value_type>::type
267                                                __const_node_value_type_pointer;
268
269private:
270    static_assert(!is_const<__node_type>::value,
271                "_NodePtr should never be a pointer to const");
272    static_assert((is_same<typename pointer_traits<_VoidPtr>::element_type, void>::value),
273                  "_VoidPtr does not point to unqualified void type");
274    static_assert((is_same<typename __rebind_pointer<_VoidPtr, __node_type>::type,
275                          _NodePtr>::value), "_VoidPtr does not rebind to _NodePtr.");
276};
277
278template <class _HashIterator>
279struct __hash_node_types_from_iterator;
280template <class _NodePtr>
281struct __hash_node_types_from_iterator<__hash_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {};
282template <class _NodePtr>
283struct __hash_node_types_from_iterator<__hash_const_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {};
284template <class _NodePtr>
285struct __hash_node_types_from_iterator<__hash_local_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {};
286template <class _NodePtr>
287struct __hash_node_types_from_iterator<__hash_const_local_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {};
288
289
290template <class _NodeValueTp, class _VoidPtr>
291struct __make_hash_node_types {
292  typedef __hash_node<_NodeValueTp, _VoidPtr> _NodeTp;
293  typedef typename __rebind_pointer<_VoidPtr, _NodeTp>::type _NodePtr;
294  typedef __hash_node_types<_NodePtr> type;
295};
296
297template <class _NodePtr>
298class _LIBCPP_TEMPLATE_VIS __hash_iterator
299{
300    typedef __hash_node_types<_NodePtr> _NodeTypes;
301    typedef _NodePtr                            __node_pointer;
302    typedef typename _NodeTypes::__next_pointer __next_pointer;
303
304    __next_pointer            __node_;
305
306public:
307    typedef forward_iterator_tag                           iterator_category;
308    typedef typename _NodeTypes::__node_value_type         value_type;
309    typedef typename _NodeTypes::difference_type           difference_type;
310    typedef value_type&                                    reference;
311    typedef typename _NodeTypes::__node_value_type_pointer pointer;
312
313    _LIBCPP_INLINE_VISIBILITY __hash_iterator() _NOEXCEPT : __node_(nullptr) {
314        _LIBCPP_DEBUG_MODE(__get_db()->__insert_i(this));
315    }
316
317#if _LIBCPP_DEBUG_LEVEL >= 2
318    _LIBCPP_INLINE_VISIBILITY
319    __hash_iterator(const __hash_iterator& __i)
320        : __node_(__i.__node_)
321    {
322        __get_db()->__iterator_copy(this, &__i);
323    }
324
325    _LIBCPP_INLINE_VISIBILITY
326    ~__hash_iterator()
327    {
328        __get_db()->__erase_i(this);
329    }
330
331    _LIBCPP_INLINE_VISIBILITY
332    __hash_iterator& operator=(const __hash_iterator& __i)
333    {
334        if (this != &__i)
335        {
336            __get_db()->__iterator_copy(this, &__i);
337            __node_ = __i.__node_;
338        }
339        return *this;
340    }
341#endif  // _LIBCPP_DEBUG_LEVEL >= 2
342
343    _LIBCPP_INLINE_VISIBILITY
344    reference operator*() const {
345        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
346                             "Attempted to dereference a non-dereferenceable unordered container iterator");
347        return __node_->__upcast()->__value_;
348    }
349
350    _LIBCPP_INLINE_VISIBILITY
351    pointer operator->() const {
352        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
353                           "Attempted to dereference a non-dereferenceable unordered container iterator");
354        return pointer_traits<pointer>::pointer_to(__node_->__upcast()->__value_);
355    }
356
357    _LIBCPP_INLINE_VISIBILITY
358    __hash_iterator& operator++() {
359        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
360                       "Attempted to increment non-incrementable unordered container iterator");
361        __node_ = __node_->__next_;
362        return *this;
363    }
364
365    _LIBCPP_INLINE_VISIBILITY
366    __hash_iterator operator++(int)
367    {
368        __hash_iterator __t(*this);
369        ++(*this);
370        return __t;
371    }
372
373    friend _LIBCPP_INLINE_VISIBILITY
374    bool operator==(const __hash_iterator& __x, const __hash_iterator& __y)
375    {
376        return __x.__node_ == __y.__node_;
377    }
378    friend _LIBCPP_INLINE_VISIBILITY
379    bool operator!=(const __hash_iterator& __x, const __hash_iterator& __y)
380        {return !(__x == __y);}
381
382private:
383#if _LIBCPP_DEBUG_LEVEL >= 2
384    _LIBCPP_INLINE_VISIBILITY
385    __hash_iterator(__next_pointer __node, const void* __c) _NOEXCEPT
386        : __node_(__node)
387        {
388            __get_db()->__insert_ic(this, __c);
389        }
390#else
391    _LIBCPP_INLINE_VISIBILITY
392    __hash_iterator(__next_pointer __node) _NOEXCEPT
393        : __node_(__node)
394        {}
395#endif
396    template <class, class, class, class> friend class __hash_table;
397    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
398    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_iterator;
399    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
400    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
401};
402
403template <class _NodePtr>
404class _LIBCPP_TEMPLATE_VIS __hash_const_iterator
405{
406    static_assert(!is_const<typename pointer_traits<_NodePtr>::element_type>::value, "");
407    typedef __hash_node_types<_NodePtr> _NodeTypes;
408    typedef _NodePtr                            __node_pointer;
409    typedef typename _NodeTypes::__next_pointer __next_pointer;
410
411    __next_pointer __node_;
412
413public:
414    typedef __hash_iterator<_NodePtr> __non_const_iterator;
415
416    typedef forward_iterator_tag                                 iterator_category;
417    typedef typename _NodeTypes::__node_value_type               value_type;
418    typedef typename _NodeTypes::difference_type                 difference_type;
419    typedef const value_type&                                    reference;
420    typedef typename _NodeTypes::__const_node_value_type_pointer pointer;
421
422
423    _LIBCPP_INLINE_VISIBILITY __hash_const_iterator() _NOEXCEPT : __node_(nullptr) {
424        _LIBCPP_DEBUG_MODE(__get_db()->__insert_i(this));
425    }
426
427    _LIBCPP_INLINE_VISIBILITY
428    __hash_const_iterator(const __non_const_iterator& __x) _NOEXCEPT
429        : __node_(__x.__node_)
430    {
431        _LIBCPP_DEBUG_MODE(__get_db()->__iterator_copy(this, &__x));
432    }
433
434#if _LIBCPP_DEBUG_LEVEL >= 2
435    _LIBCPP_INLINE_VISIBILITY
436    __hash_const_iterator(const __hash_const_iterator& __i)
437        : __node_(__i.__node_)
438    {
439        __get_db()->__iterator_copy(this, &__i);
440    }
441
442    _LIBCPP_INLINE_VISIBILITY
443    ~__hash_const_iterator()
444    {
445        __get_db()->__erase_i(this);
446    }
447
448    _LIBCPP_INLINE_VISIBILITY
449    __hash_const_iterator& operator=(const __hash_const_iterator& __i)
450    {
451        if (this != &__i)
452        {
453            __get_db()->__iterator_copy(this, &__i);
454            __node_ = __i.__node_;
455        }
456        return *this;
457    }
458#endif  // _LIBCPP_DEBUG_LEVEL >= 2
459
460    _LIBCPP_INLINE_VISIBILITY
461    reference operator*() const {
462        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
463                           "Attempted to dereference a non-dereferenceable unordered container const_iterator");
464        return __node_->__upcast()->__value_;
465    }
466    _LIBCPP_INLINE_VISIBILITY
467    pointer operator->() const {
468        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
469                           "Attempted to dereference a non-dereferenceable unordered container const_iterator");
470        return pointer_traits<pointer>::pointer_to(__node_->__upcast()->__value_);
471    }
472
473    _LIBCPP_INLINE_VISIBILITY
474    __hash_const_iterator& operator++() {
475        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
476                             "Attempted to increment non-incrementable unordered container const_iterator");
477        __node_ = __node_->__next_;
478        return *this;
479    }
480
481    _LIBCPP_INLINE_VISIBILITY
482    __hash_const_iterator operator++(int)
483    {
484        __hash_const_iterator __t(*this);
485        ++(*this);
486        return __t;
487    }
488
489    friend _LIBCPP_INLINE_VISIBILITY
490    bool operator==(const __hash_const_iterator& __x, const __hash_const_iterator& __y)
491    {
492        return __x.__node_ == __y.__node_;
493    }
494    friend _LIBCPP_INLINE_VISIBILITY
495    bool operator!=(const __hash_const_iterator& __x, const __hash_const_iterator& __y)
496        {return !(__x == __y);}
497
498private:
499#if _LIBCPP_DEBUG_LEVEL >= 2
500    _LIBCPP_INLINE_VISIBILITY
501    __hash_const_iterator(__next_pointer __node, const void* __c) _NOEXCEPT
502        : __node_(__node)
503        {
504            __get_db()->__insert_ic(this, __c);
505        }
506#else
507    _LIBCPP_INLINE_VISIBILITY
508    __hash_const_iterator(__next_pointer __node) _NOEXCEPT
509        : __node_(__node)
510        {}
511#endif
512    template <class, class, class, class> friend class __hash_table;
513    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
514    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
515    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
516};
517
518template <class _NodePtr>
519class _LIBCPP_TEMPLATE_VIS __hash_local_iterator
520{
521    typedef __hash_node_types<_NodePtr> _NodeTypes;
522    typedef _NodePtr                            __node_pointer;
523    typedef typename _NodeTypes::__next_pointer __next_pointer;
524
525    __next_pointer         __node_;
526    size_t                 __bucket_;
527    size_t                 __bucket_count_;
528
529public:
530    typedef forward_iterator_tag                                iterator_category;
531    typedef typename _NodeTypes::__node_value_type              value_type;
532    typedef typename _NodeTypes::difference_type                difference_type;
533    typedef value_type&                                         reference;
534    typedef typename _NodeTypes::__node_value_type_pointer      pointer;
535
536    _LIBCPP_INLINE_VISIBILITY __hash_local_iterator() _NOEXCEPT : __node_(nullptr) {
537        _LIBCPP_DEBUG_MODE(__get_db()->__insert_i(this));
538    }
539
540#if _LIBCPP_DEBUG_LEVEL >= 2
541    _LIBCPP_INLINE_VISIBILITY
542    __hash_local_iterator(const __hash_local_iterator& __i)
543        : __node_(__i.__node_),
544          __bucket_(__i.__bucket_),
545          __bucket_count_(__i.__bucket_count_)
546    {
547        __get_db()->__iterator_copy(this, &__i);
548    }
549
550    _LIBCPP_INLINE_VISIBILITY
551    ~__hash_local_iterator()
552    {
553        __get_db()->__erase_i(this);
554    }
555
556    _LIBCPP_INLINE_VISIBILITY
557    __hash_local_iterator& operator=(const __hash_local_iterator& __i)
558    {
559        if (this != &__i)
560        {
561            __get_db()->__iterator_copy(this, &__i);
562            __node_ = __i.__node_;
563            __bucket_ = __i.__bucket_;
564            __bucket_count_ = __i.__bucket_count_;
565        }
566        return *this;
567    }
568#endif  // _LIBCPP_DEBUG_LEVEL >= 2
569
570    _LIBCPP_INLINE_VISIBILITY
571    reference operator*() const {
572        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
573                           "Attempted to dereference a non-dereferenceable unordered container local_iterator");
574        return __node_->__upcast()->__value_;
575    }
576
577    _LIBCPP_INLINE_VISIBILITY
578    pointer operator->() const {
579        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
580                             "Attempted to dereference a non-dereferenceable unordered container local_iterator");
581        return pointer_traits<pointer>::pointer_to(__node_->__upcast()->__value_);
582    }
583
584    _LIBCPP_INLINE_VISIBILITY
585    __hash_local_iterator& operator++() {
586        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
587                       "Attempted to increment non-incrementable unordered container local_iterator");
588        __node_ = __node_->__next_;
589        if (__node_ != nullptr && __constrain_hash(__node_->__hash(), __bucket_count_) != __bucket_)
590            __node_ = nullptr;
591        return *this;
592    }
593
594    _LIBCPP_INLINE_VISIBILITY
595    __hash_local_iterator operator++(int)
596    {
597        __hash_local_iterator __t(*this);
598        ++(*this);
599        return __t;
600    }
601
602    friend _LIBCPP_INLINE_VISIBILITY
603    bool operator==(const __hash_local_iterator& __x, const __hash_local_iterator& __y)
604    {
605        return __x.__node_ == __y.__node_;
606    }
607    friend _LIBCPP_INLINE_VISIBILITY
608    bool operator!=(const __hash_local_iterator& __x, const __hash_local_iterator& __y)
609        {return !(__x == __y);}
610
611private:
612#if _LIBCPP_DEBUG_LEVEL >= 2
613    _LIBCPP_INLINE_VISIBILITY
614    __hash_local_iterator(__next_pointer __node, size_t __bucket,
615                          size_t __bucket_count, const void* __c) _NOEXCEPT
616        : __node_(__node),
617          __bucket_(__bucket),
618          __bucket_count_(__bucket_count)
619        {
620            __get_db()->__insert_ic(this, __c);
621            if (__node_ != nullptr)
622                __node_ = __node_->__next_;
623        }
624#else
625    _LIBCPP_INLINE_VISIBILITY
626    __hash_local_iterator(__next_pointer __node, size_t __bucket,
627                          size_t __bucket_count) _NOEXCEPT
628        : __node_(__node),
629          __bucket_(__bucket),
630          __bucket_count_(__bucket_count)
631        {
632            if (__node_ != nullptr)
633                __node_ = __node_->__next_;
634        }
635#endif
636    template <class, class, class, class> friend class __hash_table;
637    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
638    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_iterator;
639};
640
641template <class _ConstNodePtr>
642class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator
643{
644    typedef __hash_node_types<_ConstNodePtr> _NodeTypes;
645    typedef _ConstNodePtr                       __node_pointer;
646    typedef typename _NodeTypes::__next_pointer __next_pointer;
647
648    __next_pointer         __node_;
649    size_t                 __bucket_;
650    size_t                 __bucket_count_;
651
652    typedef pointer_traits<__node_pointer>          __pointer_traits;
653    typedef typename __pointer_traits::element_type __node;
654    typedef typename remove_const<__node>::type     __non_const_node;
655    typedef typename __rebind_pointer<__node_pointer, __non_const_node>::type
656        __non_const_node_pointer;
657public:
658    typedef __hash_local_iterator<__non_const_node_pointer>
659                                                    __non_const_iterator;
660
661    typedef forward_iterator_tag                                 iterator_category;
662    typedef typename _NodeTypes::__node_value_type               value_type;
663    typedef typename _NodeTypes::difference_type                 difference_type;
664    typedef const value_type&                                    reference;
665    typedef typename _NodeTypes::__const_node_value_type_pointer pointer;
666
667
668    _LIBCPP_INLINE_VISIBILITY __hash_const_local_iterator() _NOEXCEPT : __node_(nullptr) {
669        _LIBCPP_DEBUG_MODE(__get_db()->__insert_i(this));
670    }
671
672    _LIBCPP_INLINE_VISIBILITY
673    __hash_const_local_iterator(const __non_const_iterator& __x) _NOEXCEPT
674        : __node_(__x.__node_),
675          __bucket_(__x.__bucket_),
676          __bucket_count_(__x.__bucket_count_)
677    {
678        _LIBCPP_DEBUG_MODE(__get_db()->__iterator_copy(this, &__x));
679    }
680
681#if _LIBCPP_DEBUG_LEVEL >= 2
682    _LIBCPP_INLINE_VISIBILITY
683    __hash_const_local_iterator(const __hash_const_local_iterator& __i)
684        : __node_(__i.__node_),
685          __bucket_(__i.__bucket_),
686          __bucket_count_(__i.__bucket_count_)
687    {
688        __get_db()->__iterator_copy(this, &__i);
689    }
690
691    _LIBCPP_INLINE_VISIBILITY
692    ~__hash_const_local_iterator()
693    {
694        __get_db()->__erase_i(this);
695    }
696
697    _LIBCPP_INLINE_VISIBILITY
698    __hash_const_local_iterator& operator=(const __hash_const_local_iterator& __i)
699    {
700        if (this != &__i)
701        {
702            __get_db()->__iterator_copy(this, &__i);
703            __node_ = __i.__node_;
704            __bucket_ = __i.__bucket_;
705            __bucket_count_ = __i.__bucket_count_;
706        }
707        return *this;
708    }
709#endif  // _LIBCPP_DEBUG_LEVEL >= 2
710
711    _LIBCPP_INLINE_VISIBILITY
712    reference operator*() const {
713        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
714                           "Attempted to dereference a non-dereferenceable unordered container const_local_iterator");
715        return __node_->__upcast()->__value_;
716    }
717
718    _LIBCPP_INLINE_VISIBILITY
719    pointer operator->() const {
720        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
721                           "Attempted to dereference a non-dereferenceable unordered container const_local_iterator");
722        return pointer_traits<pointer>::pointer_to(__node_->__upcast()->__value_);
723    }
724
725    _LIBCPP_INLINE_VISIBILITY
726    __hash_const_local_iterator& operator++() {
727        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
728                       "Attempted to increment non-incrementable unordered container const_local_iterator");
729        __node_ = __node_->__next_;
730        if (__node_ != nullptr && __constrain_hash(__node_->__hash(), __bucket_count_) != __bucket_)
731            __node_ = nullptr;
732        return *this;
733    }
734
735    _LIBCPP_INLINE_VISIBILITY
736    __hash_const_local_iterator operator++(int)
737    {
738        __hash_const_local_iterator __t(*this);
739        ++(*this);
740        return __t;
741    }
742
743    friend _LIBCPP_INLINE_VISIBILITY
744    bool operator==(const __hash_const_local_iterator& __x, const __hash_const_local_iterator& __y)
745    {
746        return __x.__node_ == __y.__node_;
747    }
748    friend _LIBCPP_INLINE_VISIBILITY
749    bool operator!=(const __hash_const_local_iterator& __x, const __hash_const_local_iterator& __y)
750        {return !(__x == __y);}
751
752private:
753#if _LIBCPP_DEBUG_LEVEL >= 2
754    _LIBCPP_INLINE_VISIBILITY
755    __hash_const_local_iterator(__next_pointer __node, size_t __bucket,
756                                size_t __bucket_count, const void* __c) _NOEXCEPT
757        : __node_(__node),
758          __bucket_(__bucket),
759          __bucket_count_(__bucket_count)
760        {
761            __get_db()->__insert_ic(this, __c);
762            if (__node_ != nullptr)
763                __node_ = __node_->__next_;
764        }
765#else
766    _LIBCPP_INLINE_VISIBILITY
767    __hash_const_local_iterator(__next_pointer __node, size_t __bucket,
768                                size_t __bucket_count) _NOEXCEPT
769        : __node_(__node),
770          __bucket_(__bucket),
771          __bucket_count_(__bucket_count)
772        {
773            if (__node_ != nullptr)
774                __node_ = __node_->__next_;
775        }
776#endif
777    template <class, class, class, class> friend class __hash_table;
778    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
779};
780
781template <class _Alloc>
782class __bucket_list_deallocator
783{
784    typedef _Alloc                                          allocator_type;
785    typedef allocator_traits<allocator_type>                __alloc_traits;
786    typedef typename __alloc_traits::size_type              size_type;
787
788    __compressed_pair<size_type, allocator_type> __data_;
789public:
790    typedef typename __alloc_traits::pointer pointer;
791
792    _LIBCPP_INLINE_VISIBILITY
793    __bucket_list_deallocator()
794        _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
795        : __data_(0) {}
796
797    _LIBCPP_INLINE_VISIBILITY
798    __bucket_list_deallocator(const allocator_type& __a, size_type __size)
799        _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
800        : __data_(__size, __a) {}
801
802#ifndef _LIBCPP_CXX03_LANG
803    _LIBCPP_INLINE_VISIBILITY
804    __bucket_list_deallocator(__bucket_list_deallocator&& __x)
805        _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
806        : __data_(_VSTD::move(__x.__data_))
807    {
808        __x.size() = 0;
809    }
810#endif
811
812    _LIBCPP_INLINE_VISIBILITY
813    size_type& size() _NOEXCEPT {return __data_.first();}
814    _LIBCPP_INLINE_VISIBILITY
815    size_type  size() const _NOEXCEPT {return __data_.first();}
816
817    _LIBCPP_INLINE_VISIBILITY
818    allocator_type& __alloc() _NOEXCEPT {return __data_.second();}
819    _LIBCPP_INLINE_VISIBILITY
820    const allocator_type& __alloc() const _NOEXCEPT {return __data_.second();}
821
822    _LIBCPP_INLINE_VISIBILITY
823    void operator()(pointer __p) _NOEXCEPT
824    {
825        __alloc_traits::deallocate(__alloc(), __p, size());
826    }
827};
828
829template <class _Alloc> class __hash_map_node_destructor;
830
831template <class _Alloc>
832class __hash_node_destructor
833{
834    typedef _Alloc                                          allocator_type;
835    typedef allocator_traits<allocator_type>                __alloc_traits;
836
837public:
838    typedef typename __alloc_traits::pointer                pointer;
839private:
840    typedef __hash_node_types<pointer> _NodeTypes;
841
842    allocator_type& __na_;
843
844    __hash_node_destructor& operator=(const __hash_node_destructor&);
845
846public:
847    bool __value_constructed;
848
849    _LIBCPP_INLINE_VISIBILITY
850    explicit __hash_node_destructor(allocator_type& __na,
851                                    bool __constructed = false) _NOEXCEPT
852        : __na_(__na),
853          __value_constructed(__constructed)
854        {}
855
856    _LIBCPP_INLINE_VISIBILITY
857    void operator()(pointer __p) _NOEXCEPT
858    {
859        if (__value_constructed)
860            __alloc_traits::destroy(__na_, _NodeTypes::__get_ptr(__p->__value_));
861        if (__p)
862            __alloc_traits::deallocate(__na_, __p, 1);
863    }
864
865    template <class> friend class __hash_map_node_destructor;
866};
867
868
869#ifndef _LIBCPP_CXX03_LANG
870template <class _Key, class _Hash, class _Equal, class _Alloc>
871struct __diagnose_hash_table_helper {
872  static constexpr bool __trigger_diagnostics()
873    _LIBCPP_DIAGNOSE_WARNING(__check_hash_requirements<_Key, _Hash>::value
874                         && !__invokable<_Hash const&, _Key const&>::value,
875      "the specified hash functor does not provide a const call operator")
876    _LIBCPP_DIAGNOSE_WARNING(is_copy_constructible<_Equal>::value
877                          && !__invokable<_Equal const&, _Key const&, _Key const&>::value,
878      "the specified comparator type does not provide a const call operator")
879  {
880    static_assert(__check_hash_requirements<_Key, _Hash>::value,
881      "the specified hash does not meet the Hash requirements");
882    static_assert(is_copy_constructible<_Equal>::value,
883      "the specified comparator is required to be copy constructible");
884    return true;
885  }
886};
887
888template <class _Key, class _Value, class _Hash, class _Equal, class _Alloc>
889struct __diagnose_hash_table_helper<
890  __hash_value_type<_Key, _Value>,
891  __unordered_map_hasher<_Key, __hash_value_type<_Key, _Value>, _Hash>,
892  __unordered_map_equal<_Key, __hash_value_type<_Key, _Value>, _Equal>,
893  _Alloc>
894: __diagnose_hash_table_helper<_Key, _Hash, _Equal, _Alloc>
895{
896};
897#endif // _LIBCPP_CXX03_LANG
898
899template <class _Tp, class _Hash, class _Equal, class _Alloc>
900class __hash_table
901{
902public:
903    typedef _Tp    value_type;
904    typedef _Hash  hasher;
905    typedef _Equal key_equal;
906    typedef _Alloc allocator_type;
907
908private:
909    typedef allocator_traits<allocator_type> __alloc_traits;
910    typedef typename
911      __make_hash_node_types<value_type, typename __alloc_traits::void_pointer>::type
912                                                                     _NodeTypes;
913public:
914
915    typedef typename _NodeTypes::__node_value_type           __node_value_type;
916    typedef typename _NodeTypes::__container_value_type      __container_value_type;
917    typedef typename _NodeTypes::key_type                    key_type;
918    typedef value_type&                              reference;
919    typedef const value_type&                        const_reference;
920    typedef typename __alloc_traits::pointer         pointer;
921    typedef typename __alloc_traits::const_pointer   const_pointer;
922#ifndef _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE
923    typedef typename __alloc_traits::size_type       size_type;
924#else
925    typedef typename _NodeTypes::size_type           size_type;
926#endif
927    typedef typename _NodeTypes::difference_type     difference_type;
928public:
929    // Create __node
930
931    typedef typename _NodeTypes::__node_type __node;
932    typedef typename __rebind_alloc_helper<__alloc_traits, __node>::type __node_allocator;
933    typedef allocator_traits<__node_allocator>       __node_traits;
934    typedef typename _NodeTypes::__void_pointer      __void_pointer;
935    typedef typename _NodeTypes::__node_pointer      __node_pointer;
936    typedef typename _NodeTypes::__node_pointer      __node_const_pointer;
937    typedef typename _NodeTypes::__node_base_type    __first_node;
938    typedef typename _NodeTypes::__node_base_pointer __node_base_pointer;
939    typedef typename _NodeTypes::__next_pointer      __next_pointer;
940
941private:
942    // check for sane allocator pointer rebinding semantics. Rebinding the
943    // allocator for a new pointer type should be exactly the same as rebinding
944    // the pointer using 'pointer_traits'.
945    static_assert((is_same<__node_pointer, typename __node_traits::pointer>::value),
946                  "Allocator does not rebind pointers in a sane manner.");
947    typedef typename __rebind_alloc_helper<__node_traits, __first_node>::type
948        __node_base_allocator;
949    typedef allocator_traits<__node_base_allocator> __node_base_traits;
950    static_assert((is_same<__node_base_pointer, typename __node_base_traits::pointer>::value),
951                 "Allocator does not rebind pointers in a sane manner.");
952
953private:
954
955    typedef typename __rebind_alloc_helper<__node_traits, __next_pointer>::type __pointer_allocator;
956    typedef __bucket_list_deallocator<__pointer_allocator> __bucket_list_deleter;
957    typedef unique_ptr<__next_pointer[], __bucket_list_deleter> __bucket_list;
958    typedef allocator_traits<__pointer_allocator>          __pointer_alloc_traits;
959    typedef typename __bucket_list_deleter::pointer       __node_pointer_pointer;
960
961#ifndef _LIBCPP_CXX03_LANG
962    static_assert(__diagnose_hash_table_helper<_Tp, _Hash, _Equal, _Alloc>::__trigger_diagnostics(), "");
963#endif
964
965    // --- Member data begin ---
966    __bucket_list                                         __bucket_list_;
967    __compressed_pair<__first_node, __node_allocator>     __p1_;
968    __compressed_pair<size_type, hasher>                  __p2_;
969    __compressed_pair<float, key_equal>                   __p3_;
970    // --- Member data end ---
971
972    _LIBCPP_INLINE_VISIBILITY
973    size_type& size() _NOEXCEPT {return __p2_.first();}
974public:
975    _LIBCPP_INLINE_VISIBILITY
976    size_type  size() const _NOEXCEPT {return __p2_.first();}
977
978    _LIBCPP_INLINE_VISIBILITY
979    hasher& hash_function() _NOEXCEPT {return __p2_.second();}
980    _LIBCPP_INLINE_VISIBILITY
981    const hasher& hash_function() const _NOEXCEPT {return __p2_.second();}
982
983    _LIBCPP_INLINE_VISIBILITY
984    float& max_load_factor() _NOEXCEPT {return __p3_.first();}
985    _LIBCPP_INLINE_VISIBILITY
986    float  max_load_factor() const _NOEXCEPT {return __p3_.first();}
987
988    _LIBCPP_INLINE_VISIBILITY
989    key_equal& key_eq() _NOEXCEPT {return __p3_.second();}
990    _LIBCPP_INLINE_VISIBILITY
991    const key_equal& key_eq() const _NOEXCEPT {return __p3_.second();}
992
993    _LIBCPP_INLINE_VISIBILITY
994    __node_allocator& __node_alloc() _NOEXCEPT {return __p1_.second();}
995    _LIBCPP_INLINE_VISIBILITY
996    const __node_allocator& __node_alloc() const _NOEXCEPT
997        {return __p1_.second();}
998
999public:
1000    typedef __hash_iterator<__node_pointer>                   iterator;
1001    typedef __hash_const_iterator<__node_pointer>             const_iterator;
1002    typedef __hash_local_iterator<__node_pointer>             local_iterator;
1003    typedef __hash_const_local_iterator<__node_pointer>       const_local_iterator;
1004
1005    _LIBCPP_INLINE_VISIBILITY
1006    __hash_table()
1007        _NOEXCEPT_(
1008            is_nothrow_default_constructible<__bucket_list>::value &&
1009            is_nothrow_default_constructible<__first_node>::value &&
1010            is_nothrow_default_constructible<__node_allocator>::value &&
1011            is_nothrow_default_constructible<hasher>::value &&
1012            is_nothrow_default_constructible<key_equal>::value);
1013    _LIBCPP_INLINE_VISIBILITY
1014    __hash_table(const hasher& __hf, const key_equal& __eql);
1015    __hash_table(const hasher& __hf, const key_equal& __eql,
1016                 const allocator_type& __a);
1017    explicit __hash_table(const allocator_type& __a);
1018    __hash_table(const __hash_table& __u);
1019    __hash_table(const __hash_table& __u, const allocator_type& __a);
1020#ifndef _LIBCPP_CXX03_LANG
1021    __hash_table(__hash_table&& __u)
1022        _NOEXCEPT_(
1023            is_nothrow_move_constructible<__bucket_list>::value &&
1024            is_nothrow_move_constructible<__first_node>::value &&
1025            is_nothrow_move_constructible<__node_allocator>::value &&
1026            is_nothrow_move_constructible<hasher>::value &&
1027            is_nothrow_move_constructible<key_equal>::value);
1028    __hash_table(__hash_table&& __u, const allocator_type& __a);
1029#endif  // _LIBCPP_CXX03_LANG
1030    ~__hash_table();
1031
1032    __hash_table& operator=(const __hash_table& __u);
1033#ifndef _LIBCPP_CXX03_LANG
1034    _LIBCPP_INLINE_VISIBILITY
1035    __hash_table& operator=(__hash_table&& __u)
1036        _NOEXCEPT_(
1037            __node_traits::propagate_on_container_move_assignment::value &&
1038            is_nothrow_move_assignable<__node_allocator>::value &&
1039            is_nothrow_move_assignable<hasher>::value &&
1040            is_nothrow_move_assignable<key_equal>::value);
1041#endif
1042    template <class _InputIterator>
1043        void __assign_unique(_InputIterator __first, _InputIterator __last);
1044    template <class _InputIterator>
1045        void __assign_multi(_InputIterator __first, _InputIterator __last);
1046
1047    _LIBCPP_INLINE_VISIBILITY
1048    size_type max_size() const _NOEXCEPT
1049    {
1050        return std::min<size_type>(
1051            __node_traits::max_size(__node_alloc()),
1052            numeric_limits<difference_type >::max()
1053        );
1054    }
1055
1056    pair<iterator, bool> __node_insert_unique(__node_pointer __nd);
1057    iterator             __node_insert_multi(__node_pointer __nd);
1058    iterator             __node_insert_multi(const_iterator __p,
1059                                             __node_pointer __nd);
1060
1061#ifndef _LIBCPP_CXX03_LANG
1062    template <class _Key, class ..._Args>
1063    _LIBCPP_INLINE_VISIBILITY
1064    pair<iterator, bool> __emplace_unique_key_args(_Key const& __k, _Args&&... __args);
1065
1066    template <class... _Args>
1067    _LIBCPP_INLINE_VISIBILITY
1068    pair<iterator, bool> __emplace_unique_impl(_Args&&... __args);
1069
1070    template <class _Pp>
1071    _LIBCPP_INLINE_VISIBILITY
1072    pair<iterator, bool> __emplace_unique(_Pp&& __x) {
1073      return __emplace_unique_extract_key(_VSTD::forward<_Pp>(__x),
1074                                          __can_extract_key<_Pp, key_type>());
1075    }
1076
1077    template <class _First, class _Second>
1078    _LIBCPP_INLINE_VISIBILITY
1079    typename enable_if<
1080        __can_extract_map_key<_First, key_type, __container_value_type>::value,
1081        pair<iterator, bool>
1082    >::type __emplace_unique(_First&& __f, _Second&& __s) {
1083        return __emplace_unique_key_args(__f, _VSTD::forward<_First>(__f),
1084                                              _VSTD::forward<_Second>(__s));
1085    }
1086
1087    template <class... _Args>
1088    _LIBCPP_INLINE_VISIBILITY
1089    pair<iterator, bool> __emplace_unique(_Args&&... __args) {
1090      return __emplace_unique_impl(_VSTD::forward<_Args>(__args)...);
1091    }
1092
1093    template <class _Pp>
1094    _LIBCPP_INLINE_VISIBILITY
1095    pair<iterator, bool>
1096    __emplace_unique_extract_key(_Pp&& __x, __extract_key_fail_tag) {
1097      return __emplace_unique_impl(_VSTD::forward<_Pp>(__x));
1098    }
1099    template <class _Pp>
1100    _LIBCPP_INLINE_VISIBILITY
1101    pair<iterator, bool>
1102    __emplace_unique_extract_key(_Pp&& __x, __extract_key_self_tag) {
1103      return __emplace_unique_key_args(__x, _VSTD::forward<_Pp>(__x));
1104    }
1105    template <class _Pp>
1106    _LIBCPP_INLINE_VISIBILITY
1107    pair<iterator, bool>
1108    __emplace_unique_extract_key(_Pp&& __x, __extract_key_first_tag) {
1109      return __emplace_unique_key_args(__x.first, _VSTD::forward<_Pp>(__x));
1110    }
1111
1112    template <class... _Args>
1113    _LIBCPP_INLINE_VISIBILITY
1114    iterator __emplace_multi(_Args&&... __args);
1115    template <class... _Args>
1116    _LIBCPP_INLINE_VISIBILITY
1117    iterator __emplace_hint_multi(const_iterator __p, _Args&&... __args);
1118
1119
1120    _LIBCPP_INLINE_VISIBILITY
1121    pair<iterator, bool>
1122    __insert_unique(__container_value_type&& __x) {
1123      return __emplace_unique_key_args(_NodeTypes::__get_key(__x), _VSTD::move(__x));
1124    }
1125
1126    template <class _Pp, class = typename enable_if<
1127            !__is_same_uncvref<_Pp, __container_value_type>::value
1128        >::type>
1129    _LIBCPP_INLINE_VISIBILITY
1130    pair<iterator, bool> __insert_unique(_Pp&& __x) {
1131      return __emplace_unique(_VSTD::forward<_Pp>(__x));
1132    }
1133
1134    template <class _Pp>
1135    _LIBCPP_INLINE_VISIBILITY
1136    iterator __insert_multi(_Pp&& __x) {
1137      return __emplace_multi(_VSTD::forward<_Pp>(__x));
1138    }
1139
1140    template <class _Pp>
1141    _LIBCPP_INLINE_VISIBILITY
1142    iterator __insert_multi(const_iterator __p, _Pp&& __x) {
1143        return __emplace_hint_multi(__p, _VSTD::forward<_Pp>(__x));
1144    }
1145
1146#else  // !defined(_LIBCPP_CXX03_LANG)
1147    template <class _Key, class _Args>
1148    _LIBCPP_INLINE_VISIBILITY
1149    pair<iterator, bool> __emplace_unique_key_args(_Key const&, _Args& __args);
1150
1151    iterator __insert_multi(const __container_value_type& __x);
1152    iterator __insert_multi(const_iterator __p, const __container_value_type& __x);
1153#endif
1154
1155    _LIBCPP_INLINE_VISIBILITY
1156    pair<iterator, bool> __insert_unique(const __container_value_type& __x) {
1157        return __emplace_unique_key_args(_NodeTypes::__get_key(__x), __x);
1158    }
1159
1160    void clear() _NOEXCEPT;
1161    void rehash(size_type __n);
1162    _LIBCPP_INLINE_VISIBILITY void reserve(size_type __n)
1163        {rehash(static_cast<size_type>(ceil(__n / max_load_factor())));}
1164
1165    _LIBCPP_INLINE_VISIBILITY
1166    size_type bucket_count() const _NOEXCEPT
1167    {
1168        return __bucket_list_.get_deleter().size();
1169    }
1170
1171    _LIBCPP_INLINE_VISIBILITY
1172    iterator       begin() _NOEXCEPT;
1173    _LIBCPP_INLINE_VISIBILITY
1174    iterator       end() _NOEXCEPT;
1175    _LIBCPP_INLINE_VISIBILITY
1176    const_iterator begin() const _NOEXCEPT;
1177    _LIBCPP_INLINE_VISIBILITY
1178    const_iterator end() const _NOEXCEPT;
1179
1180    template <class _Key>
1181        _LIBCPP_INLINE_VISIBILITY
1182        size_type bucket(const _Key& __k) const
1183        {
1184            _LIBCPP_ASSERT(bucket_count() > 0,
1185                "unordered container::bucket(key) called when bucket_count() == 0");
1186            return __constrain_hash(hash_function()(__k), bucket_count());
1187        }
1188
1189    template <class _Key>
1190        iterator       find(const _Key& __x);
1191    template <class _Key>
1192        const_iterator find(const _Key& __x) const;
1193
1194    typedef __hash_node_destructor<__node_allocator> _Dp;
1195    typedef unique_ptr<__node, _Dp> __node_holder;
1196
1197    iterator erase(const_iterator __p);
1198    iterator erase(const_iterator __first, const_iterator __last);
1199    template <class _Key>
1200        size_type __erase_unique(const _Key& __k);
1201    template <class _Key>
1202        size_type __erase_multi(const _Key& __k);
1203    __node_holder remove(const_iterator __p) _NOEXCEPT;
1204
1205    template <class _Key>
1206        _LIBCPP_INLINE_VISIBILITY
1207        size_type __count_unique(const _Key& __k) const;
1208    template <class _Key>
1209        size_type __count_multi(const _Key& __k) const;
1210
1211    template <class _Key>
1212        pair<iterator, iterator>
1213        __equal_range_unique(const _Key& __k);
1214    template <class _Key>
1215        pair<const_iterator, const_iterator>
1216        __equal_range_unique(const _Key& __k) const;
1217
1218    template <class _Key>
1219        pair<iterator, iterator>
1220        __equal_range_multi(const _Key& __k);
1221    template <class _Key>
1222        pair<const_iterator, const_iterator>
1223        __equal_range_multi(const _Key& __k) const;
1224
1225    void swap(__hash_table& __u)
1226#if _LIBCPP_STD_VER <= 11
1227        _NOEXCEPT_DEBUG_(
1228            __is_nothrow_swappable<hasher>::value && __is_nothrow_swappable<key_equal>::value
1229            && (!allocator_traits<__pointer_allocator>::propagate_on_container_swap::value
1230                  || __is_nothrow_swappable<__pointer_allocator>::value)
1231            && (!__node_traits::propagate_on_container_swap::value
1232                  || __is_nothrow_swappable<__node_allocator>::value)
1233            );
1234#else
1235     _NOEXCEPT_DEBUG_(__is_nothrow_swappable<hasher>::value && __is_nothrow_swappable<key_equal>::value);
1236#endif
1237
1238    _LIBCPP_INLINE_VISIBILITY
1239    size_type max_bucket_count() const _NOEXCEPT
1240        {return max_size(); }
1241    size_type bucket_size(size_type __n) const;
1242    _LIBCPP_INLINE_VISIBILITY float load_factor() const _NOEXCEPT
1243    {
1244        size_type __bc = bucket_count();
1245        return __bc != 0 ? (float)size() / __bc : 0.f;
1246    }
1247    _LIBCPP_INLINE_VISIBILITY void max_load_factor(float __mlf) _NOEXCEPT
1248    {
1249        _LIBCPP_ASSERT(__mlf > 0,
1250            "unordered container::max_load_factor(lf) called with lf <= 0");
1251        max_load_factor() = _VSTD::max(__mlf, load_factor());
1252    }
1253
1254    _LIBCPP_INLINE_VISIBILITY
1255    local_iterator
1256    begin(size_type __n)
1257    {
1258        _LIBCPP_ASSERT(__n < bucket_count(),
1259            "unordered container::begin(n) called with n >= bucket_count()");
1260#if _LIBCPP_DEBUG_LEVEL >= 2
1261        return local_iterator(__bucket_list_[__n], __n, bucket_count(), this);
1262#else
1263        return local_iterator(__bucket_list_[__n], __n, bucket_count());
1264#endif
1265    }
1266
1267    _LIBCPP_INLINE_VISIBILITY
1268    local_iterator
1269    end(size_type __n)
1270    {
1271        _LIBCPP_ASSERT(__n < bucket_count(),
1272            "unordered container::end(n) called with n >= bucket_count()");
1273#if _LIBCPP_DEBUG_LEVEL >= 2
1274        return local_iterator(nullptr, __n, bucket_count(), this);
1275#else
1276        return local_iterator(nullptr, __n, bucket_count());
1277#endif
1278    }
1279
1280    _LIBCPP_INLINE_VISIBILITY
1281    const_local_iterator
1282    cbegin(size_type __n) const
1283    {
1284        _LIBCPP_ASSERT(__n < bucket_count(),
1285            "unordered container::cbegin(n) called with n >= bucket_count()");
1286#if _LIBCPP_DEBUG_LEVEL >= 2
1287        return const_local_iterator(__bucket_list_[__n], __n, bucket_count(), this);
1288#else
1289        return const_local_iterator(__bucket_list_[__n], __n, bucket_count());
1290#endif
1291    }
1292
1293    _LIBCPP_INLINE_VISIBILITY
1294    const_local_iterator
1295    cend(size_type __n) const
1296    {
1297        _LIBCPP_ASSERT(__n < bucket_count(),
1298            "unordered container::cend(n) called with n >= bucket_count()");
1299#if _LIBCPP_DEBUG_LEVEL >= 2
1300        return const_local_iterator(nullptr, __n, bucket_count(), this);
1301#else
1302        return const_local_iterator(nullptr, __n, bucket_count());
1303#endif
1304    }
1305
1306#if _LIBCPP_DEBUG_LEVEL >= 2
1307
1308    bool __dereferenceable(const const_iterator* __i) const;
1309    bool __decrementable(const const_iterator* __i) const;
1310    bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
1311    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
1312
1313#endif  // _LIBCPP_DEBUG_LEVEL >= 2
1314
1315private:
1316    void __rehash(size_type __n);
1317
1318#ifndef _LIBCPP_CXX03_LANG
1319    template <class ..._Args>
1320    __node_holder __construct_node(_Args&& ...__args);
1321
1322    template <class _First, class ..._Rest>
1323    __node_holder __construct_node_hash(size_t __hash, _First&& __f, _Rest&&... __rest);
1324#else // _LIBCPP_CXX03_LANG
1325    __node_holder __construct_node(const __container_value_type& __v);
1326    __node_holder __construct_node_hash(size_t __hash, const __container_value_type& __v);
1327#endif
1328
1329
1330    _LIBCPP_INLINE_VISIBILITY
1331    void __copy_assign_alloc(const __hash_table& __u)
1332        {__copy_assign_alloc(__u, integral_constant<bool,
1333             __node_traits::propagate_on_container_copy_assignment::value>());}
1334    void __copy_assign_alloc(const __hash_table& __u, true_type);
1335    _LIBCPP_INLINE_VISIBILITY
1336        void __copy_assign_alloc(const __hash_table&, false_type) {}
1337
1338#ifndef _LIBCPP_CXX03_LANG
1339    void __move_assign(__hash_table& __u, false_type);
1340    void __move_assign(__hash_table& __u, true_type)
1341        _NOEXCEPT_(
1342            is_nothrow_move_assignable<__node_allocator>::value &&
1343            is_nothrow_move_assignable<hasher>::value &&
1344            is_nothrow_move_assignable<key_equal>::value);
1345    _LIBCPP_INLINE_VISIBILITY
1346    void __move_assign_alloc(__hash_table& __u)
1347        _NOEXCEPT_(
1348            !__node_traits::propagate_on_container_move_assignment::value ||
1349            (is_nothrow_move_assignable<__pointer_allocator>::value &&
1350             is_nothrow_move_assignable<__node_allocator>::value))
1351        {__move_assign_alloc(__u, integral_constant<bool,
1352             __node_traits::propagate_on_container_move_assignment::value>());}
1353    _LIBCPP_INLINE_VISIBILITY
1354    void __move_assign_alloc(__hash_table& __u, true_type)
1355        _NOEXCEPT_(
1356            is_nothrow_move_assignable<__pointer_allocator>::value &&
1357            is_nothrow_move_assignable<__node_allocator>::value)
1358    {
1359        __bucket_list_.get_deleter().__alloc() =
1360                _VSTD::move(__u.__bucket_list_.get_deleter().__alloc());
1361        __node_alloc() = _VSTD::move(__u.__node_alloc());
1362    }
1363    _LIBCPP_INLINE_VISIBILITY
1364        void __move_assign_alloc(__hash_table&, false_type) _NOEXCEPT {}
1365#endif // _LIBCPP_CXX03_LANG
1366
1367    void __deallocate_node(__next_pointer __np) _NOEXCEPT;
1368    __next_pointer __detach() _NOEXCEPT;
1369
1370    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
1371    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
1372};
1373
1374template <class _Tp, class _Hash, class _Equal, class _Alloc>
1375inline
1376__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table()
1377    _NOEXCEPT_(
1378        is_nothrow_default_constructible<__bucket_list>::value &&
1379        is_nothrow_default_constructible<__first_node>::value &&
1380        is_nothrow_default_constructible<__node_allocator>::value &&
1381        is_nothrow_default_constructible<hasher>::value &&
1382        is_nothrow_default_constructible<key_equal>::value)
1383    : __p2_(0),
1384      __p3_(1.0f)
1385{
1386}
1387
1388template <class _Tp, class _Hash, class _Equal, class _Alloc>
1389inline
1390__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const hasher& __hf,
1391                                                       const key_equal& __eql)
1392    : __bucket_list_(nullptr, __bucket_list_deleter()),
1393      __p1_(),
1394      __p2_(0, __hf),
1395      __p3_(1.0f, __eql)
1396{
1397}
1398
1399template <class _Tp, class _Hash, class _Equal, class _Alloc>
1400__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const hasher& __hf,
1401                                                       const key_equal& __eql,
1402                                                       const allocator_type& __a)
1403    : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
1404      __p1_(__second_tag(), __node_allocator(__a)),
1405      __p2_(0, __hf),
1406      __p3_(1.0f, __eql)
1407{
1408}
1409
1410template <class _Tp, class _Hash, class _Equal, class _Alloc>
1411__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const allocator_type& __a)
1412    : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
1413      __p1_(__second_tag(), __node_allocator(__a)),
1414      __p2_(0),
1415      __p3_(1.0f)
1416{
1417}
1418
1419template <class _Tp, class _Hash, class _Equal, class _Alloc>
1420__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const __hash_table& __u)
1421    : __bucket_list_(nullptr,
1422          __bucket_list_deleter(allocator_traits<__pointer_allocator>::
1423              select_on_container_copy_construction(
1424                  __u.__bucket_list_.get_deleter().__alloc()), 0)),
1425      __p1_(__second_tag(), allocator_traits<__node_allocator>::
1426          select_on_container_copy_construction(__u.__node_alloc())),
1427      __p2_(0, __u.hash_function()),
1428      __p3_(__u.__p3_)
1429{
1430}
1431
1432template <class _Tp, class _Hash, class _Equal, class _Alloc>
1433__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const __hash_table& __u,
1434                                                       const allocator_type& __a)
1435    : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
1436      __p1_(__second_tag(), __node_allocator(__a)),
1437      __p2_(0, __u.hash_function()),
1438      __p3_(__u.__p3_)
1439{
1440}
1441
1442#ifndef _LIBCPP_CXX03_LANG
1443
1444template <class _Tp, class _Hash, class _Equal, class _Alloc>
1445__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u)
1446        _NOEXCEPT_(
1447            is_nothrow_move_constructible<__bucket_list>::value &&
1448            is_nothrow_move_constructible<__first_node>::value &&
1449            is_nothrow_move_constructible<__node_allocator>::value &&
1450            is_nothrow_move_constructible<hasher>::value &&
1451            is_nothrow_move_constructible<key_equal>::value)
1452    : __bucket_list_(_VSTD::move(__u.__bucket_list_)),
1453      __p1_(_VSTD::move(__u.__p1_)),
1454      __p2_(_VSTD::move(__u.__p2_)),
1455      __p3_(_VSTD::move(__u.__p3_))
1456{
1457    if (size() > 0)
1458    {
1459        __bucket_list_[__constrain_hash(__p1_.first().__next_->__hash(), bucket_count())] =
1460            __p1_.first().__ptr();
1461        __u.__p1_.first().__next_ = nullptr;
1462        __u.size() = 0;
1463    }
1464}
1465
1466template <class _Tp, class _Hash, class _Equal, class _Alloc>
1467__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u,
1468                                                       const allocator_type& __a)
1469    : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
1470      __p1_(__second_tag(), __node_allocator(__a)),
1471      __p2_(0, _VSTD::move(__u.hash_function())),
1472      __p3_(_VSTD::move(__u.__p3_))
1473{
1474    if (__a == allocator_type(__u.__node_alloc()))
1475    {
1476        __bucket_list_.reset(__u.__bucket_list_.release());
1477        __bucket_list_.get_deleter().size() = __u.__bucket_list_.get_deleter().size();
1478        __u.__bucket_list_.get_deleter().size() = 0;
1479        if (__u.size() > 0)
1480        {
1481            __p1_.first().__next_ = __u.__p1_.first().__next_;
1482            __u.__p1_.first().__next_ = nullptr;
1483            __bucket_list_[__constrain_hash(__p1_.first().__next_->__hash(), bucket_count())] =
1484                __p1_.first().__ptr();
1485            size() = __u.size();
1486            __u.size() = 0;
1487        }
1488    }
1489}
1490
1491#endif  // _LIBCPP_CXX03_LANG
1492
1493template <class _Tp, class _Hash, class _Equal, class _Alloc>
1494__hash_table<_Tp, _Hash, _Equal, _Alloc>::~__hash_table()
1495{
1496#if defined(_LIBCPP_CXX03_LANG)
1497    static_assert((is_copy_constructible<key_equal>::value),
1498                 "Predicate must be copy-constructible.");
1499    static_assert((is_copy_constructible<hasher>::value),
1500                 "Hasher must be copy-constructible.");
1501#endif
1502
1503    __deallocate_node(__p1_.first().__next_);
1504#if _LIBCPP_DEBUG_LEVEL >= 2
1505    __get_db()->__erase_c(this);
1506#endif
1507}
1508
1509template <class _Tp, class _Hash, class _Equal, class _Alloc>
1510void
1511__hash_table<_Tp, _Hash, _Equal, _Alloc>::__copy_assign_alloc(
1512        const __hash_table& __u, true_type)
1513{
1514    if (__node_alloc() != __u.__node_alloc())
1515    {
1516        clear();
1517        __bucket_list_.reset();
1518        __bucket_list_.get_deleter().size() = 0;
1519    }
1520    __bucket_list_.get_deleter().__alloc() = __u.__bucket_list_.get_deleter().__alloc();
1521    __node_alloc() = __u.__node_alloc();
1522}
1523
1524template <class _Tp, class _Hash, class _Equal, class _Alloc>
1525__hash_table<_Tp, _Hash, _Equal, _Alloc>&
1526__hash_table<_Tp, _Hash, _Equal, _Alloc>::operator=(const __hash_table& __u)
1527{
1528    if (this != &__u)
1529    {
1530        __copy_assign_alloc(__u);
1531        hash_function() = __u.hash_function();
1532        key_eq() = __u.key_eq();
1533        max_load_factor() = __u.max_load_factor();
1534        __assign_multi(__u.begin(), __u.end());
1535    }
1536    return *this;
1537}
1538
1539template <class _Tp, class _Hash, class _Equal, class _Alloc>
1540void
1541__hash_table<_Tp, _Hash, _Equal, _Alloc>::__deallocate_node(__next_pointer __np)
1542    _NOEXCEPT
1543{
1544    __node_allocator& __na = __node_alloc();
1545    while (__np != nullptr)
1546    {
1547        __next_pointer __next = __np->__next_;
1548#if _LIBCPP_DEBUG_LEVEL >= 2
1549        __c_node* __c = __get_db()->__find_c_and_lock(this);
1550        for (__i_node** __p = __c->end_; __p != __c->beg_; )
1551        {
1552            --__p;
1553            iterator* __i = static_cast<iterator*>((*__p)->__i_);
1554            if (__i->__node_ == __np)
1555            {
1556                (*__p)->__c_ = nullptr;
1557                if (--__c->end_ != __p)
1558                    memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
1559            }
1560        }
1561        __get_db()->unlock();
1562#endif
1563        __node_pointer __real_np = __np->__upcast();
1564        __node_traits::destroy(__na, _NodeTypes::__get_ptr(__real_np->__value_));
1565        __node_traits::deallocate(__na, __real_np, 1);
1566        __np = __next;
1567    }
1568}
1569
1570template <class _Tp, class _Hash, class _Equal, class _Alloc>
1571typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__next_pointer
1572__hash_table<_Tp, _Hash, _Equal, _Alloc>::__detach() _NOEXCEPT
1573{
1574    size_type __bc = bucket_count();
1575    for (size_type __i = 0; __i < __bc; ++__i)
1576        __bucket_list_[__i] = nullptr;
1577    size() = 0;
1578    __next_pointer __cache = __p1_.first().__next_;
1579    __p1_.first().__next_ = nullptr;
1580    return __cache;
1581}
1582
1583#ifndef _LIBCPP_CXX03_LANG
1584
1585template <class _Tp, class _Hash, class _Equal, class _Alloc>
1586void
1587__hash_table<_Tp, _Hash, _Equal, _Alloc>::__move_assign(
1588        __hash_table& __u, true_type)
1589    _NOEXCEPT_(
1590        is_nothrow_move_assignable<__node_allocator>::value &&
1591        is_nothrow_move_assignable<hasher>::value &&
1592        is_nothrow_move_assignable<key_equal>::value)
1593{
1594    clear();
1595    __bucket_list_.reset(__u.__bucket_list_.release());
1596    __bucket_list_.get_deleter().size() = __u.__bucket_list_.get_deleter().size();
1597    __u.__bucket_list_.get_deleter().size() = 0;
1598    __move_assign_alloc(__u);
1599    size() = __u.size();
1600    hash_function() = _VSTD::move(__u.hash_function());
1601    max_load_factor() = __u.max_load_factor();
1602    key_eq() = _VSTD::move(__u.key_eq());
1603    __p1_.first().__next_ = __u.__p1_.first().__next_;
1604    if (size() > 0)
1605    {
1606        __bucket_list_[__constrain_hash(__p1_.first().__next_->__hash(), bucket_count())] =
1607            __p1_.first().__ptr();
1608        __u.__p1_.first().__next_ = nullptr;
1609        __u.size() = 0;
1610    }
1611#if _LIBCPP_DEBUG_LEVEL >= 2
1612    __get_db()->swap(this, &__u);
1613#endif
1614}
1615
1616template <class _Tp, class _Hash, class _Equal, class _Alloc>
1617void
1618__hash_table<_Tp, _Hash, _Equal, _Alloc>::__move_assign(
1619        __hash_table& __u, false_type)
1620{
1621    if (__node_alloc() == __u.__node_alloc())
1622        __move_assign(__u, true_type());
1623    else
1624    {
1625        hash_function() = _VSTD::move(__u.hash_function());
1626        key_eq() = _VSTD::move(__u.key_eq());
1627        max_load_factor() = __u.max_load_factor();
1628        if (bucket_count() != 0)
1629        {
1630            __next_pointer __cache = __detach();
1631#ifndef _LIBCPP_NO_EXCEPTIONS
1632            try
1633            {
1634#endif  // _LIBCPP_NO_EXCEPTIONS
1635                const_iterator __i = __u.begin();
1636                while (__cache != nullptr && __u.size() != 0)
1637                {
1638                    __cache->__upcast()->__value_ =
1639                        _VSTD::move(__u.remove(__i++)->__value_);
1640                    __next_pointer __next = __cache->__next_;
1641                    __node_insert_multi(__cache->__upcast());
1642                    __cache = __next;
1643                }
1644#ifndef _LIBCPP_NO_EXCEPTIONS
1645            }
1646            catch (...)
1647            {
1648                __deallocate_node(__cache);
1649                throw;
1650            }
1651#endif  // _LIBCPP_NO_EXCEPTIONS
1652            __deallocate_node(__cache);
1653        }
1654        const_iterator __i = __u.begin();
1655        while (__u.size() != 0)
1656        {
1657            __node_holder __h = __construct_node(_NodeTypes::__move(__u.remove(__i++)->__value_));
1658            __node_insert_multi(__h.get());
1659            __h.release();
1660        }
1661    }
1662}
1663
1664template <class _Tp, class _Hash, class _Equal, class _Alloc>
1665inline
1666__hash_table<_Tp, _Hash, _Equal, _Alloc>&
1667__hash_table<_Tp, _Hash, _Equal, _Alloc>::operator=(__hash_table&& __u)
1668    _NOEXCEPT_(
1669        __node_traits::propagate_on_container_move_assignment::value &&
1670        is_nothrow_move_assignable<__node_allocator>::value &&
1671        is_nothrow_move_assignable<hasher>::value &&
1672        is_nothrow_move_assignable<key_equal>::value)
1673{
1674    __move_assign(__u, integral_constant<bool,
1675                  __node_traits::propagate_on_container_move_assignment::value>());
1676    return *this;
1677}
1678
1679#endif  // _LIBCPP_CXX03_LANG
1680
1681template <class _Tp, class _Hash, class _Equal, class _Alloc>
1682template <class _InputIterator>
1683void
1684__hash_table<_Tp, _Hash, _Equal, _Alloc>::__assign_unique(_InputIterator __first,
1685                                                          _InputIterator __last)
1686{
1687    typedef iterator_traits<_InputIterator> _ITraits;
1688    typedef typename _ITraits::value_type _ItValueType;
1689    static_assert((is_same<_ItValueType, __container_value_type>::value),
1690                  "__assign_unique may only be called with the containers value type");
1691
1692    if (bucket_count() != 0)
1693    {
1694        __next_pointer __cache = __detach();
1695#ifndef _LIBCPP_NO_EXCEPTIONS
1696        try
1697        {
1698#endif  // _LIBCPP_NO_EXCEPTIONS
1699            for (; __cache != nullptr && __first != __last; ++__first)
1700            {
1701                __cache->__upcast()->__value_ = *__first;
1702                __next_pointer __next = __cache->__next_;
1703                __node_insert_unique(__cache->__upcast());
1704                __cache = __next;
1705            }
1706#ifndef _LIBCPP_NO_EXCEPTIONS
1707        }
1708        catch (...)
1709        {
1710            __deallocate_node(__cache);
1711            throw;
1712        }
1713#endif  // _LIBCPP_NO_EXCEPTIONS
1714        __deallocate_node(__cache);
1715    }
1716    for (; __first != __last; ++__first)
1717        __insert_unique(*__first);
1718}
1719
1720template <class _Tp, class _Hash, class _Equal, class _Alloc>
1721template <class _InputIterator>
1722void
1723__hash_table<_Tp, _Hash, _Equal, _Alloc>::__assign_multi(_InputIterator __first,
1724                                                         _InputIterator __last)
1725{
1726    typedef iterator_traits<_InputIterator> _ITraits;
1727    typedef typename _ITraits::value_type _ItValueType;
1728    static_assert((is_same<_ItValueType, __container_value_type>::value ||
1729                  is_same<_ItValueType, __node_value_type>::value),
1730                  "__assign_multi may only be called with the containers value type"
1731                  " or the nodes value type");
1732    if (bucket_count() != 0)
1733    {
1734        __next_pointer __cache = __detach();
1735#ifndef _LIBCPP_NO_EXCEPTIONS
1736        try
1737        {
1738#endif  // _LIBCPP_NO_EXCEPTIONS
1739            for (; __cache != nullptr && __first != __last; ++__first)
1740            {
1741                __cache->__upcast()->__value_ = *__first;
1742                __next_pointer __next = __cache->__next_;
1743                __node_insert_multi(__cache->__upcast());
1744                __cache = __next;
1745            }
1746#ifndef _LIBCPP_NO_EXCEPTIONS
1747        }
1748        catch (...)
1749        {
1750            __deallocate_node(__cache);
1751            throw;
1752        }
1753#endif  // _LIBCPP_NO_EXCEPTIONS
1754        __deallocate_node(__cache);
1755    }
1756    for (; __first != __last; ++__first)
1757        __insert_multi(_NodeTypes::__get_value(*__first));
1758}
1759
1760template <class _Tp, class _Hash, class _Equal, class _Alloc>
1761inline
1762typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
1763__hash_table<_Tp, _Hash, _Equal, _Alloc>::begin() _NOEXCEPT
1764{
1765#if _LIBCPP_DEBUG_LEVEL >= 2
1766    return iterator(__p1_.first().__next_, this);
1767#else
1768    return iterator(__p1_.first().__next_);
1769#endif
1770}
1771
1772template <class _Tp, class _Hash, class _Equal, class _Alloc>
1773inline
1774typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
1775__hash_table<_Tp, _Hash, _Equal, _Alloc>::end() _NOEXCEPT
1776{
1777#if _LIBCPP_DEBUG_LEVEL >= 2
1778    return iterator(nullptr, this);
1779#else
1780    return iterator(nullptr);
1781#endif
1782}
1783
1784template <class _Tp, class _Hash, class _Equal, class _Alloc>
1785inline
1786typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator
1787__hash_table<_Tp, _Hash, _Equal, _Alloc>::begin() const _NOEXCEPT
1788{
1789#if _LIBCPP_DEBUG_LEVEL >= 2
1790    return const_iterator(__p1_.first().__next_, this);
1791#else
1792    return const_iterator(__p1_.first().__next_);
1793#endif
1794}
1795
1796template <class _Tp, class _Hash, class _Equal, class _Alloc>
1797inline
1798typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator
1799__hash_table<_Tp, _Hash, _Equal, _Alloc>::end() const _NOEXCEPT
1800{
1801#if _LIBCPP_DEBUG_LEVEL >= 2
1802    return const_iterator(nullptr, this);
1803#else
1804    return const_iterator(nullptr);
1805#endif
1806}
1807
1808template <class _Tp, class _Hash, class _Equal, class _Alloc>
1809void
1810__hash_table<_Tp, _Hash, _Equal, _Alloc>::clear() _NOEXCEPT
1811{
1812    if (size() > 0)
1813    {
1814        __deallocate_node(__p1_.first().__next_);
1815        __p1_.first().__next_ = nullptr;
1816        size_type __bc = bucket_count();
1817        for (size_type __i = 0; __i < __bc; ++__i)
1818            __bucket_list_[__i] = nullptr;
1819        size() = 0;
1820    }
1821}
1822
1823template <class _Tp, class _Hash, class _Equal, class _Alloc>
1824pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool>
1825__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_unique(__node_pointer __nd)
1826{
1827    __nd->__hash_ = hash_function()(__nd->__value_);
1828    size_type __bc = bucket_count();
1829    bool __inserted = false;
1830    __next_pointer __ndptr;
1831    size_t __chash;
1832    if (__bc != 0)
1833    {
1834        __chash = __constrain_hash(__nd->__hash_, __bc);
1835        __ndptr = __bucket_list_[__chash];
1836        if (__ndptr != nullptr)
1837        {
1838            for (__ndptr = __ndptr->__next_; __ndptr != nullptr &&
1839                                             __constrain_hash(__ndptr->__hash(), __bc) == __chash;
1840                                                     __ndptr = __ndptr->__next_)
1841            {
1842                if (key_eq()(__ndptr->__upcast()->__value_, __nd->__value_))
1843                    goto __done;
1844            }
1845        }
1846    }
1847    {
1848        if (size()+1 > __bc * max_load_factor() || __bc == 0)
1849        {
1850            rehash(_VSTD::max<size_type>(2 * __bc + !__is_hash_power2(__bc),
1851                           size_type(ceil(float(size() + 1) / max_load_factor()))));
1852            __bc = bucket_count();
1853            __chash = __constrain_hash(__nd->__hash_, __bc);
1854        }
1855        // insert_after __bucket_list_[__chash], or __first_node if bucket is null
1856        __next_pointer __pn = __bucket_list_[__chash];
1857        if (__pn == nullptr)
1858        {
1859            __pn =__p1_.first().__ptr();
1860            __nd->__next_ = __pn->__next_;
1861            __pn->__next_ = __nd->__ptr();
1862            // fix up __bucket_list_
1863            __bucket_list_[__chash] = __pn;
1864            if (__nd->__next_ != nullptr)
1865                __bucket_list_[__constrain_hash(__nd->__next_->__hash(), __bc)] = __nd->__ptr();
1866        }
1867        else
1868        {
1869            __nd->__next_ = __pn->__next_;
1870            __pn->__next_ = __nd->__ptr();
1871        }
1872        __ndptr = __nd->__ptr();
1873        // increment size
1874        ++size();
1875        __inserted = true;
1876    }
1877__done:
1878#if _LIBCPP_DEBUG_LEVEL >= 2
1879    return pair<iterator, bool>(iterator(__ndptr, this), __inserted);
1880#else
1881    return pair<iterator, bool>(iterator(__ndptr), __inserted);
1882#endif
1883}
1884
1885template <class _Tp, class _Hash, class _Equal, class _Alloc>
1886typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
1887__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi(__node_pointer __cp)
1888{
1889    __cp->__hash_ = hash_function()(__cp->__value_);
1890    size_type __bc = bucket_count();
1891    if (size()+1 > __bc * max_load_factor() || __bc == 0)
1892    {
1893        rehash(_VSTD::max<size_type>(2 * __bc + !__is_hash_power2(__bc),
1894                       size_type(ceil(float(size() + 1) / max_load_factor()))));
1895        __bc = bucket_count();
1896    }
1897    size_t __chash = __constrain_hash(__cp->__hash_, __bc);
1898    __next_pointer __pn = __bucket_list_[__chash];
1899    if (__pn == nullptr)
1900    {
1901        __pn =__p1_.first().__ptr();
1902        __cp->__next_ = __pn->__next_;
1903        __pn->__next_ = __cp->__ptr();
1904        // fix up __bucket_list_
1905        __bucket_list_[__chash] = __pn;
1906        if (__cp->__next_ != nullptr)
1907            __bucket_list_[__constrain_hash(__cp->__next_->__hash(), __bc)]
1908                = __cp->__ptr();
1909    }
1910    else
1911    {
1912        for (bool __found = false; __pn->__next_ != nullptr &&
1913                                   __constrain_hash(__pn->__next_->__hash(), __bc) == __chash;
1914                                                           __pn = __pn->__next_)
1915        {
1916            //      __found    key_eq()     action
1917            //      false       false       loop
1918            //      true        true        loop
1919            //      false       true        set __found to true
1920            //      true        false       break
1921            if (__found != (__pn->__next_->__hash() == __cp->__hash_ &&
1922                            key_eq()(__pn->__next_->__upcast()->__value_, __cp->__value_)))
1923            {
1924                if (!__found)
1925                    __found = true;
1926                else
1927                    break;
1928            }
1929        }
1930        __cp->__next_ = __pn->__next_;
1931        __pn->__next_ = __cp->__ptr();
1932        if (__cp->__next_ != nullptr)
1933        {
1934            size_t __nhash = __constrain_hash(__cp->__next_->__hash(), __bc);
1935            if (__nhash != __chash)
1936                __bucket_list_[__nhash] = __cp->__ptr();
1937        }
1938    }
1939    ++size();
1940#if _LIBCPP_DEBUG_LEVEL >= 2
1941    return iterator(__cp->__ptr(), this);
1942#else
1943    return iterator(__cp->__ptr());
1944#endif
1945}
1946
1947template <class _Tp, class _Hash, class _Equal, class _Alloc>
1948typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
1949__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi(
1950        const_iterator __p, __node_pointer __cp)
1951{
1952#if _LIBCPP_DEBUG_LEVEL >= 2
1953    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
1954        "unordered container::emplace_hint(const_iterator, args...) called with an iterator not"
1955        " referring to this unordered container");
1956#endif
1957    if (__p != end() && key_eq()(*__p, __cp->__value_))
1958    {
1959        __next_pointer __np = __p.__node_;
1960        __cp->__hash_ = __np->__hash();
1961        size_type __bc = bucket_count();
1962        if (size()+1 > __bc * max_load_factor() || __bc == 0)
1963        {
1964            rehash(_VSTD::max<size_type>(2 * __bc + !__is_hash_power2(__bc),
1965                           size_type(ceil(float(size() + 1) / max_load_factor()))));
1966            __bc = bucket_count();
1967        }
1968        size_t __chash = __constrain_hash(__cp->__hash_, __bc);
1969        __next_pointer __pp = __bucket_list_[__chash];
1970        while (__pp->__next_ != __np)
1971            __pp = __pp->__next_;
1972        __cp->__next_ = __np;
1973        __pp->__next_ = static_cast<__next_pointer>(__cp);
1974        ++size();
1975#if _LIBCPP_DEBUG_LEVEL >= 2
1976        return iterator(static_cast<__next_pointer>(__cp), this);
1977#else
1978        return iterator(static_cast<__next_pointer>(__cp));
1979#endif
1980    }
1981    return __node_insert_multi(__cp);
1982}
1983
1984
1985
1986#ifndef _LIBCPP_CXX03_LANG
1987template <class _Tp, class _Hash, class _Equal, class _Alloc>
1988template <class _Key, class ..._Args>
1989pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool>
1990__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_unique_key_args(_Key const& __k, _Args&&... __args)
1991#else
1992template <class _Tp, class _Hash, class _Equal, class _Alloc>
1993template <class _Key, class _Args>
1994pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool>
1995__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_unique_key_args(_Key const& __k, _Args& __args)
1996#endif
1997{
1998
1999    size_t __hash = hash_function()(__k);
2000    size_type __bc = bucket_count();
2001    bool __inserted = false;
2002    __next_pointer __nd;
2003    size_t __chash;
2004    if (__bc != 0)
2005    {
2006        __chash = __constrain_hash(__hash, __bc);
2007        __nd = __bucket_list_[__chash];
2008        if (__nd != nullptr)
2009        {
2010            for (__nd = __nd->__next_; __nd != nullptr &&
2011                (__nd->__hash() == __hash || __constrain_hash(__nd->__hash(), __bc) == __chash);
2012                                                           __nd = __nd->__next_)
2013            {
2014                if (key_eq()(__nd->__upcast()->__value_, __k))
2015                    goto __done;
2016            }
2017        }
2018    }
2019    {
2020#ifndef _LIBCPP_CXX03_LANG
2021        __node_holder __h = __construct_node_hash(__hash, _VSTD::forward<_Args>(__args)...);
2022#else
2023        __node_holder __h = __construct_node_hash(__hash, __args);
2024#endif
2025        if (size()+1 > __bc * max_load_factor() || __bc == 0)
2026        {
2027            rehash(_VSTD::max<size_type>(2 * __bc + !__is_hash_power2(__bc),
2028                           size_type(ceil(float(size() + 1) / max_load_factor()))));
2029            __bc = bucket_count();
2030            __chash = __constrain_hash(__hash, __bc);
2031        }
2032        // insert_after __bucket_list_[__chash], or __first_node if bucket is null
2033        __next_pointer __pn = __bucket_list_[__chash];
2034        if (__pn == nullptr)
2035        {
2036            __pn = __p1_.first().__ptr();
2037            __h->__next_ = __pn->__next_;
2038            __pn->__next_ = __h.get()->__ptr();
2039            // fix up __bucket_list_
2040            __bucket_list_[__chash] = __pn;
2041            if (__h->__next_ != nullptr)
2042                __bucket_list_[__constrain_hash(__h->__next_->__hash(), __bc)]
2043                    = __h.get()->__ptr();
2044        }
2045        else
2046        {
2047            __h->__next_ = __pn->__next_;
2048            __pn->__next_ = static_cast<__next_pointer>(__h.get());
2049        }
2050        __nd = static_cast<__next_pointer>(__h.release());
2051        // increment size
2052        ++size();
2053        __inserted = true;
2054    }
2055__done:
2056#if _LIBCPP_DEBUG_LEVEL >= 2
2057    return pair<iterator, bool>(iterator(__nd, this), __inserted);
2058#else
2059    return pair<iterator, bool>(iterator(__nd), __inserted);
2060#endif
2061}
2062
2063#ifndef _LIBCPP_CXX03_LANG
2064
2065template <class _Tp, class _Hash, class _Equal, class _Alloc>
2066template <class... _Args>
2067pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool>
2068__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_unique_impl(_Args&&... __args)
2069{
2070    __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
2071    pair<iterator, bool> __r = __node_insert_unique(__h.get());
2072    if (__r.second)
2073        __h.release();
2074    return __r;
2075}
2076
2077template <class _Tp, class _Hash, class _Equal, class _Alloc>
2078template <class... _Args>
2079typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
2080__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_multi(_Args&&... __args)
2081{
2082    __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
2083    iterator __r = __node_insert_multi(__h.get());
2084    __h.release();
2085    return __r;
2086}
2087
2088template <class _Tp, class _Hash, class _Equal, class _Alloc>
2089template <class... _Args>
2090typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
2091__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_hint_multi(
2092        const_iterator __p, _Args&&... __args)
2093{
2094#if _LIBCPP_DEBUG_LEVEL >= 2
2095    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
2096        "unordered container::emplace_hint(const_iterator, args...) called with an iterator not"
2097        " referring to this unordered container");
2098#endif
2099    __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
2100    iterator __r = __node_insert_multi(__p, __h.get());
2101    __h.release();
2102    return __r;
2103}
2104
2105#else // _LIBCPP_CXX03_LANG
2106
2107template <class _Tp, class _Hash, class _Equal, class _Alloc>
2108typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
2109__hash_table<_Tp, _Hash, _Equal, _Alloc>::__insert_multi(const __container_value_type& __x)
2110{
2111    __node_holder __h = __construct_node(__x);
2112    iterator __r = __node_insert_multi(__h.get());
2113    __h.release();
2114    return __r;
2115}
2116
2117template <class _Tp, class _Hash, class _Equal, class _Alloc>
2118typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
2119__hash_table<_Tp, _Hash, _Equal, _Alloc>::__insert_multi(const_iterator __p,
2120                                                         const __container_value_type& __x)
2121{
2122#if _LIBCPP_DEBUG_LEVEL >= 2
2123    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
2124        "unordered container::insert(const_iterator, lvalue) called with an iterator not"
2125        " referring to this unordered container");
2126#endif
2127    __node_holder __h = __construct_node(__x);
2128    iterator __r = __node_insert_multi(__p, __h.get());
2129    __h.release();
2130    return __r;
2131}
2132
2133#endif  // _LIBCPP_CXX03_LANG
2134
2135template <class _Tp, class _Hash, class _Equal, class _Alloc>
2136void
2137__hash_table<_Tp, _Hash, _Equal, _Alloc>::rehash(size_type __n)
2138    _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
2139{
2140    if (__n == 1)
2141        __n = 2;
2142    else if (__n & (__n - 1))
2143        __n = __next_prime(__n);
2144    size_type __bc = bucket_count();
2145    if (__n > __bc)
2146        __rehash(__n);
2147    else if (__n < __bc)
2148    {
2149        __n = _VSTD::max<size_type>
2150              (
2151                  __n,
2152                  __is_hash_power2(__bc) ? __next_hash_pow2(size_t(ceil(float(size()) / max_load_factor()))) :
2153                                           __next_prime(size_t(ceil(float(size()) / max_load_factor())))
2154              );
2155        if (__n < __bc)
2156            __rehash(__n);
2157    }
2158}
2159
2160template <class _Tp, class _Hash, class _Equal, class _Alloc>
2161void
2162__hash_table<_Tp, _Hash, _Equal, _Alloc>::__rehash(size_type __nbc)
2163{
2164#if _LIBCPP_DEBUG_LEVEL >= 2
2165    __get_db()->__invalidate_all(this);
2166#endif  // _LIBCPP_DEBUG_LEVEL >= 2
2167    __pointer_allocator& __npa = __bucket_list_.get_deleter().__alloc();
2168    __bucket_list_.reset(__nbc > 0 ?
2169                      __pointer_alloc_traits::allocate(__npa, __nbc) : nullptr);
2170    __bucket_list_.get_deleter().size() = __nbc;
2171    if (__nbc > 0)
2172    {
2173        for (size_type __i = 0; __i < __nbc; ++__i)
2174            __bucket_list_[__i] = nullptr;
2175        __next_pointer __pp = __p1_.first().__ptr();
2176        __next_pointer __cp = __pp->__next_;
2177        if (__cp != nullptr)
2178        {
2179            size_type __chash = __constrain_hash(__cp->__hash(), __nbc);
2180            __bucket_list_[__chash] = __pp;
2181            size_type __phash = __chash;
2182            for (__pp = __cp, __cp = __cp->__next_; __cp != nullptr;
2183                                                           __cp = __pp->__next_)
2184            {
2185                __chash = __constrain_hash(__cp->__hash(), __nbc);
2186                if (__chash == __phash)
2187                    __pp = __cp;
2188                else
2189                {
2190                    if (__bucket_list_[__chash] == nullptr)
2191                    {
2192                        __bucket_list_[__chash] = __pp;
2193                        __pp = __cp;
2194                        __phash = __chash;
2195                    }
2196                    else
2197                    {
2198                        __next_pointer __np = __cp;
2199                        for (; __np->__next_ != nullptr &&
2200                               key_eq()(__cp->__upcast()->__value_,
2201                                        __np->__next_->__upcast()->__value_);
2202                                                           __np = __np->__next_)
2203                            ;
2204                        __pp->__next_ = __np->__next_;
2205                        __np->__next_ = __bucket_list_[__chash]->__next_;
2206                        __bucket_list_[__chash]->__next_ = __cp;
2207
2208                    }
2209                }
2210            }
2211        }
2212    }
2213}
2214
2215template <class _Tp, class _Hash, class _Equal, class _Alloc>
2216template <class _Key>
2217typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
2218__hash_table<_Tp, _Hash, _Equal, _Alloc>::find(const _Key& __k)
2219{
2220    size_t __hash = hash_function()(__k);
2221    size_type __bc = bucket_count();
2222    if (__bc != 0)
2223    {
2224        size_t __chash = __constrain_hash(__hash, __bc);
2225        __next_pointer __nd = __bucket_list_[__chash];
2226        if (__nd != nullptr)
2227        {
2228            for (__nd = __nd->__next_; __nd != nullptr &&
2229                (__nd->__hash() == __hash
2230                  || __constrain_hash(__nd->__hash(), __bc) == __chash);
2231                                                           __nd = __nd->__next_)
2232            {
2233                if ((__nd->__hash() == __hash)
2234                    && key_eq()(__nd->__upcast()->__value_, __k))
2235#if _LIBCPP_DEBUG_LEVEL >= 2
2236                    return iterator(__nd, this);
2237#else
2238                    return iterator(__nd);
2239#endif
2240            }
2241        }
2242    }
2243    return end();
2244}
2245
2246template <class _Tp, class _Hash, class _Equal, class _Alloc>
2247template <class _Key>
2248typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator
2249__hash_table<_Tp, _Hash, _Equal, _Alloc>::find(const _Key& __k) const
2250{
2251    size_t __hash = hash_function()(__k);
2252    size_type __bc = bucket_count();
2253    if (__bc != 0)
2254    {
2255        size_t __chash = __constrain_hash(__hash, __bc);
2256        __next_pointer __nd = __bucket_list_[__chash];
2257        if (__nd != nullptr)
2258        {
2259            for (__nd = __nd->__next_; __nd != nullptr &&
2260                (__hash == __nd->__hash()
2261                    || __constrain_hash(__nd->__hash(), __bc) == __chash);
2262                                                           __nd = __nd->__next_)
2263            {
2264                if ((__nd->__hash() == __hash)
2265                    && key_eq()(__nd->__upcast()->__value_, __k))
2266#if _LIBCPP_DEBUG_LEVEL >= 2
2267                    return const_iterator(__nd, this);
2268#else
2269                    return const_iterator(__nd);
2270#endif
2271            }
2272        }
2273
2274    }
2275    return end();
2276}
2277
2278#ifndef _LIBCPP_CXX03_LANG
2279
2280template <class _Tp, class _Hash, class _Equal, class _Alloc>
2281template <class ..._Args>
2282typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder
2283__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node(_Args&& ...__args)
2284{
2285    static_assert(!__is_hash_value_type<_Args...>::value,
2286                  "Construct cannot be called with a hash value type");
2287    __node_allocator& __na = __node_alloc();
2288    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
2289    __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_), _VSTD::forward<_Args>(__args)...);
2290    __h.get_deleter().__value_constructed = true;
2291    __h->__hash_ = hash_function()(__h->__value_);
2292    __h->__next_ = nullptr;
2293    return __h;
2294}
2295
2296template <class _Tp, class _Hash, class _Equal, class _Alloc>
2297template <class _First, class ..._Rest>
2298typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder
2299__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node_hash(
2300    size_t __hash, _First&& __f, _Rest&& ...__rest)
2301{
2302    static_assert(!__is_hash_value_type<_First, _Rest...>::value,
2303                  "Construct cannot be called with a hash value type");
2304    __node_allocator& __na = __node_alloc();
2305    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
2306    __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_),
2307                             _VSTD::forward<_First>(__f),
2308                             _VSTD::forward<_Rest>(__rest)...);
2309    __h.get_deleter().__value_constructed = true;
2310    __h->__hash_ = __hash;
2311    __h->__next_ = nullptr;
2312    return __h;
2313}
2314
2315#else  // _LIBCPP_CXX03_LANG
2316
2317template <class _Tp, class _Hash, class _Equal, class _Alloc>
2318typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder
2319__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node(const __container_value_type& __v)
2320{
2321    __node_allocator& __na = __node_alloc();
2322    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
2323    __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_), __v);
2324    __h.get_deleter().__value_constructed = true;
2325    __h->__hash_ = hash_function()(__h->__value_);
2326    __h->__next_ = nullptr;
2327    return _LIBCPP_EXPLICIT_MOVE(__h);  // explicitly moved for C++03
2328}
2329
2330template <class _Tp, class _Hash, class _Equal, class _Alloc>
2331typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder
2332__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node_hash(size_t __hash,
2333                                                                const __container_value_type& __v)
2334{
2335    __node_allocator& __na = __node_alloc();
2336    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
2337    __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_), __v);
2338    __h.get_deleter().__value_constructed = true;
2339    __h->__hash_ = __hash;
2340    __h->__next_ = nullptr;
2341    return _LIBCPP_EXPLICIT_MOVE(__h);  // explicitly moved for C++03
2342}
2343
2344#endif  // _LIBCPP_CXX03_LANG
2345
2346template <class _Tp, class _Hash, class _Equal, class _Alloc>
2347typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
2348__hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __p)
2349{
2350    __next_pointer __np = __p.__node_;
2351#if _LIBCPP_DEBUG_LEVEL >= 2
2352    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
2353        "unordered container erase(iterator) called with an iterator not"
2354        " referring to this container");
2355    _LIBCPP_ASSERT(__p != end(),
2356        "unordered container erase(iterator) called with a non-dereferenceable iterator");
2357    iterator __r(__np, this);
2358#else
2359    iterator __r(__np);
2360#endif
2361    ++__r;
2362    remove(__p);
2363    return __r;
2364}
2365
2366template <class _Tp, class _Hash, class _Equal, class _Alloc>
2367typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
2368__hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __first,
2369                                                const_iterator __last)
2370{
2371#if _LIBCPP_DEBUG_LEVEL >= 2
2372    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
2373        "unodered container::erase(iterator, iterator) called with an iterator not"
2374        " referring to this unodered container");
2375    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__last) == this,
2376        "unodered container::erase(iterator, iterator) called with an iterator not"
2377        " referring to this unodered container");
2378#endif
2379    for (const_iterator __p = __first; __first != __last; __p = __first)
2380    {
2381        ++__first;
2382        erase(__p);
2383    }
2384    __next_pointer __np = __last.__node_;
2385#if _LIBCPP_DEBUG_LEVEL >= 2
2386    return iterator (__np, this);
2387#else
2388    return iterator (__np);
2389#endif
2390}
2391
2392template <class _Tp, class _Hash, class _Equal, class _Alloc>
2393template <class _Key>
2394typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type
2395__hash_table<_Tp, _Hash, _Equal, _Alloc>::__erase_unique(const _Key& __k)
2396{
2397    iterator __i = find(__k);
2398    if (__i == end())
2399        return 0;
2400    erase(__i);
2401    return 1;
2402}
2403
2404template <class _Tp, class _Hash, class _Equal, class _Alloc>
2405template <class _Key>
2406typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type
2407__hash_table<_Tp, _Hash, _Equal, _Alloc>::__erase_multi(const _Key& __k)
2408{
2409    size_type __r = 0;
2410    iterator __i = find(__k);
2411    if (__i != end())
2412    {
2413        iterator __e = end();
2414        do
2415        {
2416            erase(__i++);
2417            ++__r;
2418        } while (__i != __e && key_eq()(*__i, __k));
2419    }
2420    return __r;
2421}
2422
2423template <class _Tp, class _Hash, class _Equal, class _Alloc>
2424typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder
2425__hash_table<_Tp, _Hash, _Equal, _Alloc>::remove(const_iterator __p) _NOEXCEPT
2426{
2427    // current node
2428    __next_pointer __cn = __p.__node_;
2429    size_type __bc = bucket_count();
2430    size_t __chash = __constrain_hash(__cn->__hash(), __bc);
2431    // find previous node
2432    __next_pointer __pn = __bucket_list_[__chash];
2433    for (; __pn->__next_ != __cn; __pn = __pn->__next_)
2434        ;
2435    // Fix up __bucket_list_
2436        // if __pn is not in same bucket (before begin is not in same bucket) &&
2437        //    if __cn->__next_ is not in same bucket (nullptr is not in same bucket)
2438    if (__pn == __p1_.first().__ptr()
2439            || __constrain_hash(__pn->__hash(), __bc) != __chash)
2440    {
2441        if (__cn->__next_ == nullptr
2442            || __constrain_hash(__cn->__next_->__hash(), __bc) != __chash)
2443            __bucket_list_[__chash] = nullptr;
2444    }
2445        // if __cn->__next_ is not in same bucket (nullptr is in same bucket)
2446    if (__cn->__next_ != nullptr)
2447    {
2448        size_t __nhash = __constrain_hash(__cn->__next_->__hash(), __bc);
2449        if (__nhash != __chash)
2450            __bucket_list_[__nhash] = __pn;
2451    }
2452    // remove __cn
2453    __pn->__next_ = __cn->__next_;
2454    __cn->__next_ = nullptr;
2455    --size();
2456#if _LIBCPP_DEBUG_LEVEL >= 2
2457    __c_node* __c = __get_db()->__find_c_and_lock(this);
2458    for (__i_node** __dp = __c->end_; __dp != __c->beg_; )
2459    {
2460        --__dp;
2461        iterator* __i = static_cast<iterator*>((*__dp)->__i_);
2462        if (__i->__node_ == __cn)
2463        {
2464            (*__dp)->__c_ = nullptr;
2465            if (--__c->end_ != __dp)
2466                memmove(__dp, __dp+1, (__c->end_ - __dp)*sizeof(__i_node*));
2467        }
2468    }
2469    __get_db()->unlock();
2470#endif
2471    return __node_holder(__cn->__upcast(), _Dp(__node_alloc(), true));
2472}
2473
2474template <class _Tp, class _Hash, class _Equal, class _Alloc>
2475template <class _Key>
2476inline
2477typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type
2478__hash_table<_Tp, _Hash, _Equal, _Alloc>::__count_unique(const _Key& __k) const
2479{
2480    return static_cast<size_type>(find(__k) != end());
2481}
2482
2483template <class _Tp, class _Hash, class _Equal, class _Alloc>
2484template <class _Key>
2485typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type
2486__hash_table<_Tp, _Hash, _Equal, _Alloc>::__count_multi(const _Key& __k) const
2487{
2488    size_type __r = 0;
2489    const_iterator __i = find(__k);
2490    if (__i != end())
2491    {
2492        const_iterator __e = end();
2493        do
2494        {
2495            ++__i;
2496            ++__r;
2497        } while (__i != __e && key_eq()(*__i, __k));
2498    }
2499    return __r;
2500}
2501
2502template <class _Tp, class _Hash, class _Equal, class _Alloc>
2503template <class _Key>
2504pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator,
2505     typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator>
2506__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_unique(
2507        const _Key& __k)
2508{
2509    iterator __i = find(__k);
2510    iterator __j = __i;
2511    if (__i != end())
2512        ++__j;
2513    return pair<iterator, iterator>(__i, __j);
2514}
2515
2516template <class _Tp, class _Hash, class _Equal, class _Alloc>
2517template <class _Key>
2518pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator,
2519     typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator>
2520__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_unique(
2521        const _Key& __k) const
2522{
2523    const_iterator __i = find(__k);
2524    const_iterator __j = __i;
2525    if (__i != end())
2526        ++__j;
2527    return pair<const_iterator, const_iterator>(__i, __j);
2528}
2529
2530template <class _Tp, class _Hash, class _Equal, class _Alloc>
2531template <class _Key>
2532pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator,
2533     typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator>
2534__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_multi(
2535        const _Key& __k)
2536{
2537    iterator __i = find(__k);
2538    iterator __j = __i;
2539    if (__i != end())
2540    {
2541        iterator __e = end();
2542        do
2543        {
2544            ++__j;
2545        } while (__j != __e && key_eq()(*__j, __k));
2546    }
2547    return pair<iterator, iterator>(__i, __j);
2548}
2549
2550template <class _Tp, class _Hash, class _Equal, class _Alloc>
2551template <class _Key>
2552pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator,
2553     typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator>
2554__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_multi(
2555        const _Key& __k) const
2556{
2557    const_iterator __i = find(__k);
2558    const_iterator __j = __i;
2559    if (__i != end())
2560    {
2561        const_iterator __e = end();
2562        do
2563        {
2564            ++__j;
2565        } while (__j != __e && key_eq()(*__j, __k));
2566    }
2567    return pair<const_iterator, const_iterator>(__i, __j);
2568}
2569
2570template <class _Tp, class _Hash, class _Equal, class _Alloc>
2571void
2572__hash_table<_Tp, _Hash, _Equal, _Alloc>::swap(__hash_table& __u)
2573#if _LIBCPP_STD_VER <= 11
2574    _NOEXCEPT_DEBUG_(
2575        __is_nothrow_swappable<hasher>::value && __is_nothrow_swappable<key_equal>::value
2576        && (!allocator_traits<__pointer_allocator>::propagate_on_container_swap::value
2577              || __is_nothrow_swappable<__pointer_allocator>::value)
2578        && (!__node_traits::propagate_on_container_swap::value
2579              || __is_nothrow_swappable<__node_allocator>::value)
2580            )
2581#else
2582  _NOEXCEPT_DEBUG_(__is_nothrow_swappable<hasher>::value && __is_nothrow_swappable<key_equal>::value)
2583#endif
2584{
2585    _LIBCPP_ASSERT(__node_traits::propagate_on_container_swap::value ||
2586                   this->__node_alloc() == __u.__node_alloc(),
2587                   "list::swap: Either propagate_on_container_swap must be true"
2588                   " or the allocators must compare equal");
2589    {
2590    __node_pointer_pointer __npp = __bucket_list_.release();
2591    __bucket_list_.reset(__u.__bucket_list_.release());
2592    __u.__bucket_list_.reset(__npp);
2593    }
2594    _VSTD::swap(__bucket_list_.get_deleter().size(), __u.__bucket_list_.get_deleter().size());
2595    __swap_allocator(__bucket_list_.get_deleter().__alloc(),
2596             __u.__bucket_list_.get_deleter().__alloc());
2597    __swap_allocator(__node_alloc(), __u.__node_alloc());
2598    _VSTD::swap(__p1_.first().__next_, __u.__p1_.first().__next_);
2599    __p2_.swap(__u.__p2_);
2600    __p3_.swap(__u.__p3_);
2601    if (size() > 0)
2602        __bucket_list_[__constrain_hash(__p1_.first().__next_->__hash(), bucket_count())] =
2603            __p1_.first().__ptr();
2604    if (__u.size() > 0)
2605        __u.__bucket_list_[__constrain_hash(__u.__p1_.first().__next_->__hash(), __u.bucket_count())] =
2606            __u.__p1_.first().__ptr();
2607#if _LIBCPP_DEBUG_LEVEL >= 2
2608    __get_db()->swap(this, &__u);
2609#endif
2610}
2611
2612template <class _Tp, class _Hash, class _Equal, class _Alloc>
2613typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type
2614__hash_table<_Tp, _Hash, _Equal, _Alloc>::bucket_size(size_type __n) const
2615{
2616    _LIBCPP_ASSERT(__n < bucket_count(),
2617        "unordered container::bucket_size(n) called with n >= bucket_count()");
2618    __next_pointer __np = __bucket_list_[__n];
2619    size_type __bc = bucket_count();
2620    size_type __r = 0;
2621    if (__np != nullptr)
2622    {
2623        for (__np = __np->__next_; __np != nullptr &&
2624                                   __constrain_hash(__np->__hash(), __bc) == __n;
2625                                                    __np = __np->__next_, ++__r)
2626            ;
2627    }
2628    return __r;
2629}
2630
2631template <class _Tp, class _Hash, class _Equal, class _Alloc>
2632inline _LIBCPP_INLINE_VISIBILITY
2633void
2634swap(__hash_table<_Tp, _Hash, _Equal, _Alloc>& __x,
2635     __hash_table<_Tp, _Hash, _Equal, _Alloc>& __y)
2636    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
2637{
2638    __x.swap(__y);
2639}
2640
2641#if _LIBCPP_DEBUG_LEVEL >= 2
2642
2643template <class _Tp, class _Hash, class _Equal, class _Alloc>
2644bool
2645__hash_table<_Tp, _Hash, _Equal, _Alloc>::__dereferenceable(const const_iterator* __i) const
2646{
2647    return __i->__node_ != nullptr;
2648}
2649
2650template <class _Tp, class _Hash, class _Equal, class _Alloc>
2651bool
2652__hash_table<_Tp, _Hash, _Equal, _Alloc>::__decrementable(const const_iterator*) const
2653{
2654    return false;
2655}
2656
2657template <class _Tp, class _Hash, class _Equal, class _Alloc>
2658bool
2659__hash_table<_Tp, _Hash, _Equal, _Alloc>::__addable(const const_iterator*, ptrdiff_t) const
2660{
2661    return false;
2662}
2663
2664template <class _Tp, class _Hash, class _Equal, class _Alloc>
2665bool
2666__hash_table<_Tp, _Hash, _Equal, _Alloc>::__subscriptable(const const_iterator*, ptrdiff_t) const
2667{
2668    return false;
2669}
2670
2671#endif  // _LIBCPP_DEBUG_LEVEL >= 2
2672
2673_LIBCPP_END_NAMESPACE_STD
2674
2675_LIBCPP_POP_MACROS
2676
2677#endif  // _LIBCPP__HASH_TABLE
2678