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