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