1e4b17023SJohn Marino // unordered_set implementation -*- C++ -*- 2e4b17023SJohn Marino 3*5ce9237cSJohn Marino // Copyright (C) 2010, 2011, 2013 Free Software Foundation, Inc. 4e4b17023SJohn Marino // 5e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library. This library is free 6e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the 7e4b17023SJohn Marino // terms of the GNU General Public License as published by the 8e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option) 9e4b17023SJohn Marino // any later version. 10e4b17023SJohn Marino 11e4b17023SJohn Marino // This library is distributed in the hope that it will be useful, 12e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of 13e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14e4b17023SJohn Marino // GNU General Public License for more details. 15e4b17023SJohn Marino 16e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional 17e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version 18e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation. 19e4b17023SJohn Marino 20e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and 21e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program; 22e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23e4b17023SJohn Marino // <http://www.gnu.org/licenses/>. 24e4b17023SJohn Marino 25e4b17023SJohn Marino /** @file bits/unordered_set.h 26e4b17023SJohn Marino * This is an internal header file, included by other library headers. 27e4b17023SJohn Marino * Do not attempt to use it directly. @headername{unordered_set} 28e4b17023SJohn Marino */ 29e4b17023SJohn Marino 30e4b17023SJohn Marino #ifndef _UNORDERED_SET_H 31e4b17023SJohn Marino #define _UNORDERED_SET_H 32e4b17023SJohn Marino 33e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default) 34e4b17023SJohn Marino { 35e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 36e4b17023SJohn Marino 37e4b17023SJohn Marino // NB: When we get typedef templates these class definitions 38e4b17023SJohn Marino // will be unnecessary. 39e4b17023SJohn Marino template<class _Value, 40e4b17023SJohn Marino class _Hash = hash<_Value>, 41e4b17023SJohn Marino class _Pred = std::equal_to<_Value>, 42e4b17023SJohn Marino class _Alloc = std::allocator<_Value>, 43e4b17023SJohn Marino bool __cache_hash_code = 44e4b17023SJohn Marino __not_<__and_<is_integral<_Value>, is_empty<_Hash>, 45e4b17023SJohn Marino integral_constant<bool, !__is_final(_Hash)>, 46e4b17023SJohn Marino __detail::__is_noexcept_hash<_Value, _Hash>>>::value> 47e4b17023SJohn Marino class __unordered_set 48e4b17023SJohn Marino : public _Hashtable<_Value, _Value, _Alloc, 49e4b17023SJohn Marino std::_Identity<_Value>, _Pred, 50e4b17023SJohn Marino _Hash, __detail::_Mod_range_hashing, 51e4b17023SJohn Marino __detail::_Default_ranged_hash, 52e4b17023SJohn Marino __detail::_Prime_rehash_policy, 53*5ce9237cSJohn Marino __cache_hash_code, true, true>, 54*5ce9237cSJohn Marino __check_copy_constructible<_Alloc> 55e4b17023SJohn Marino { 56e4b17023SJohn Marino typedef _Hashtable<_Value, _Value, _Alloc, 57e4b17023SJohn Marino std::_Identity<_Value>, _Pred, 58e4b17023SJohn Marino _Hash, __detail::_Mod_range_hashing, 59e4b17023SJohn Marino __detail::_Default_ranged_hash, 60e4b17023SJohn Marino __detail::_Prime_rehash_policy, 61e4b17023SJohn Marino __cache_hash_code, true, true> 62e4b17023SJohn Marino _Base; 63e4b17023SJohn Marino 64e4b17023SJohn Marino public: 65e4b17023SJohn Marino typedef typename _Base::value_type value_type; 66e4b17023SJohn Marino typedef typename _Base::size_type size_type; 67e4b17023SJohn Marino typedef typename _Base::hasher hasher; 68e4b17023SJohn Marino typedef typename _Base::key_equal key_equal; 69e4b17023SJohn Marino typedef typename _Base::allocator_type allocator_type; 70e4b17023SJohn Marino typedef typename _Base::iterator iterator; 71e4b17023SJohn Marino typedef typename _Base::const_iterator const_iterator; 72e4b17023SJohn Marino 73e4b17023SJohn Marino explicit 74e4b17023SJohn Marino __unordered_set(size_type __n = 10, 75e4b17023SJohn Marino const hasher& __hf = hasher(), 76e4b17023SJohn Marino const key_equal& __eql = key_equal(), 77e4b17023SJohn Marino const allocator_type& __a = allocator_type()) 78e4b17023SJohn Marino : _Base(__n, __hf, __detail::_Mod_range_hashing(), 79e4b17023SJohn Marino __detail::_Default_ranged_hash(), __eql, 80e4b17023SJohn Marino std::_Identity<value_type>(), __a) 81e4b17023SJohn Marino { } 82e4b17023SJohn Marino 83e4b17023SJohn Marino template<typename _InputIterator> 84e4b17023SJohn Marino __unordered_set(_InputIterator __f, _InputIterator __l, 85e4b17023SJohn Marino size_type __n = 0, 86e4b17023SJohn Marino const hasher& __hf = hasher(), 87e4b17023SJohn Marino const key_equal& __eql = key_equal(), 88e4b17023SJohn Marino const allocator_type& __a = allocator_type()) 89e4b17023SJohn Marino : _Base(__f, __l, __n, __hf, __detail::_Mod_range_hashing(), 90e4b17023SJohn Marino __detail::_Default_ranged_hash(), __eql, 91e4b17023SJohn Marino std::_Identity<value_type>(), __a) 92e4b17023SJohn Marino { } 93e4b17023SJohn Marino 94e4b17023SJohn Marino __unordered_set(initializer_list<value_type> __l, 95e4b17023SJohn Marino size_type __n = 0, 96e4b17023SJohn Marino const hasher& __hf = hasher(), 97e4b17023SJohn Marino const key_equal& __eql = key_equal(), 98e4b17023SJohn Marino const allocator_type& __a = allocator_type()) 99e4b17023SJohn Marino : _Base(__l.begin(), __l.end(), __n, __hf, 100e4b17023SJohn Marino __detail::_Mod_range_hashing(), 101e4b17023SJohn Marino __detail::_Default_ranged_hash(), __eql, 102e4b17023SJohn Marino std::_Identity<value_type>(), __a) 103e4b17023SJohn Marino { } 104e4b17023SJohn Marino 105e4b17023SJohn Marino __unordered_set& 106e4b17023SJohn Marino operator=(initializer_list<value_type> __l) 107e4b17023SJohn Marino { 108e4b17023SJohn Marino this->clear(); 109e4b17023SJohn Marino this->insert(__l.begin(), __l.end()); 110e4b17023SJohn Marino return *this; 111e4b17023SJohn Marino } 112e4b17023SJohn Marino 113e4b17023SJohn Marino using _Base::insert; 114e4b17023SJohn Marino 115e4b17023SJohn Marino std::pair<iterator, bool> 116e4b17023SJohn Marino insert(value_type&& __v) 117e4b17023SJohn Marino { return this->_M_insert(std::move(__v), std::true_type()); } 118e4b17023SJohn Marino 119e4b17023SJohn Marino iterator 120e4b17023SJohn Marino insert(const_iterator, value_type&& __v) 121e4b17023SJohn Marino { return insert(std::move(__v)).first; } 122e4b17023SJohn Marino }; 123e4b17023SJohn Marino 124e4b17023SJohn Marino template<class _Value, 125e4b17023SJohn Marino class _Hash = hash<_Value>, 126e4b17023SJohn Marino class _Pred = std::equal_to<_Value>, 127e4b17023SJohn Marino class _Alloc = std::allocator<_Value>, 128e4b17023SJohn Marino bool __cache_hash_code = 129e4b17023SJohn Marino __not_<__and_<is_integral<_Value>, is_empty<_Hash>, 130e4b17023SJohn Marino integral_constant<bool, !__is_final(_Hash)>, 131e4b17023SJohn Marino __detail::__is_noexcept_hash<_Value, _Hash>>>::value> 132e4b17023SJohn Marino class __unordered_multiset 133e4b17023SJohn Marino : public _Hashtable<_Value, _Value, _Alloc, 134e4b17023SJohn Marino std::_Identity<_Value>, _Pred, 135e4b17023SJohn Marino _Hash, __detail::_Mod_range_hashing, 136e4b17023SJohn Marino __detail::_Default_ranged_hash, 137e4b17023SJohn Marino __detail::_Prime_rehash_policy, 138*5ce9237cSJohn Marino __cache_hash_code, true, false>, 139*5ce9237cSJohn Marino __check_copy_constructible<_Alloc> 140e4b17023SJohn Marino { 141e4b17023SJohn Marino typedef _Hashtable<_Value, _Value, _Alloc, 142e4b17023SJohn Marino std::_Identity<_Value>, _Pred, 143e4b17023SJohn Marino _Hash, __detail::_Mod_range_hashing, 144e4b17023SJohn Marino __detail::_Default_ranged_hash, 145e4b17023SJohn Marino __detail::_Prime_rehash_policy, 146e4b17023SJohn Marino __cache_hash_code, true, false> 147e4b17023SJohn Marino _Base; 148e4b17023SJohn Marino 149e4b17023SJohn Marino public: 150e4b17023SJohn Marino typedef typename _Base::value_type value_type; 151e4b17023SJohn Marino typedef typename _Base::size_type size_type; 152e4b17023SJohn Marino typedef typename _Base::hasher hasher; 153e4b17023SJohn Marino typedef typename _Base::key_equal key_equal; 154e4b17023SJohn Marino typedef typename _Base::allocator_type allocator_type; 155e4b17023SJohn Marino typedef typename _Base::iterator iterator; 156e4b17023SJohn Marino typedef typename _Base::const_iterator const_iterator; 157e4b17023SJohn Marino 158e4b17023SJohn Marino explicit 159e4b17023SJohn Marino __unordered_multiset(size_type __n = 10, 160e4b17023SJohn Marino const hasher& __hf = hasher(), 161e4b17023SJohn Marino const key_equal& __eql = key_equal(), 162e4b17023SJohn Marino const allocator_type& __a = allocator_type()) 163e4b17023SJohn Marino : _Base(__n, __hf, __detail::_Mod_range_hashing(), 164e4b17023SJohn Marino __detail::_Default_ranged_hash(), __eql, 165e4b17023SJohn Marino std::_Identity<value_type>(), __a) 166e4b17023SJohn Marino { } 167e4b17023SJohn Marino 168e4b17023SJohn Marino 169e4b17023SJohn Marino template<typename _InputIterator> 170e4b17023SJohn Marino __unordered_multiset(_InputIterator __f, _InputIterator __l, 171e4b17023SJohn Marino size_type __n = 0, 172e4b17023SJohn Marino const hasher& __hf = hasher(), 173e4b17023SJohn Marino const key_equal& __eql = key_equal(), 174e4b17023SJohn Marino const allocator_type& __a = allocator_type()) 175e4b17023SJohn Marino : _Base(__f, __l, __n, __hf, __detail::_Mod_range_hashing(), 176e4b17023SJohn Marino __detail::_Default_ranged_hash(), __eql, 177e4b17023SJohn Marino std::_Identity<value_type>(), __a) 178e4b17023SJohn Marino { } 179e4b17023SJohn Marino 180e4b17023SJohn Marino __unordered_multiset(initializer_list<value_type> __l, 181e4b17023SJohn Marino size_type __n = 0, 182e4b17023SJohn Marino const hasher& __hf = hasher(), 183e4b17023SJohn Marino const key_equal& __eql = key_equal(), 184e4b17023SJohn Marino const allocator_type& __a = allocator_type()) 185e4b17023SJohn Marino : _Base(__l.begin(), __l.end(), __n, __hf, 186e4b17023SJohn Marino __detail::_Mod_range_hashing(), 187e4b17023SJohn Marino __detail::_Default_ranged_hash(), __eql, 188e4b17023SJohn Marino std::_Identity<value_type>(), __a) 189e4b17023SJohn Marino { } 190e4b17023SJohn Marino 191e4b17023SJohn Marino __unordered_multiset& 192e4b17023SJohn Marino operator=(initializer_list<value_type> __l) 193e4b17023SJohn Marino { 194e4b17023SJohn Marino this->clear(); 195e4b17023SJohn Marino this->insert(__l.begin(), __l.end()); 196e4b17023SJohn Marino return *this; 197e4b17023SJohn Marino } 198e4b17023SJohn Marino 199e4b17023SJohn Marino using _Base::insert; 200e4b17023SJohn Marino 201e4b17023SJohn Marino iterator 202e4b17023SJohn Marino insert(value_type&& __v) 203e4b17023SJohn Marino { return this->_M_insert(std::move(__v), std::false_type()); } 204e4b17023SJohn Marino 205e4b17023SJohn Marino iterator 206e4b17023SJohn Marino insert(const_iterator, value_type&& __v) 207e4b17023SJohn Marino { return insert(std::move(__v)); } 208e4b17023SJohn Marino }; 209e4b17023SJohn Marino 210e4b17023SJohn Marino template<class _Value, class _Hash, class _Pred, class _Alloc, 211e4b17023SJohn Marino bool __cache_hash_code> 212e4b17023SJohn Marino inline void 213e4b17023SJohn Marino swap(__unordered_set<_Value, _Hash, _Pred, _Alloc, __cache_hash_code>& __x, 214e4b17023SJohn Marino __unordered_set<_Value, _Hash, _Pred, _Alloc, __cache_hash_code>& __y) 215e4b17023SJohn Marino { __x.swap(__y); } 216e4b17023SJohn Marino 217e4b17023SJohn Marino template<class _Value, class _Hash, class _Pred, class _Alloc, 218e4b17023SJohn Marino bool __cache_hash_code> 219e4b17023SJohn Marino inline void 220e4b17023SJohn Marino swap(__unordered_multiset<_Value, _Hash, _Pred, 221e4b17023SJohn Marino _Alloc, __cache_hash_code>& __x, 222e4b17023SJohn Marino __unordered_multiset<_Value, _Hash, _Pred, 223e4b17023SJohn Marino _Alloc, __cache_hash_code>& __y) 224e4b17023SJohn Marino { __x.swap(__y); } 225e4b17023SJohn Marino 226e4b17023SJohn Marino template<class _Value, class _Hash, class _Pred, class _Alloc, 227e4b17023SJohn Marino bool __cache_hash_code> 228e4b17023SJohn Marino inline bool 229e4b17023SJohn Marino operator==(const __unordered_set<_Value, _Hash, _Pred, _Alloc, 230e4b17023SJohn Marino __cache_hash_code>& __x, 231e4b17023SJohn Marino const __unordered_set<_Value, _Hash, _Pred, _Alloc, 232e4b17023SJohn Marino __cache_hash_code>& __y) 233e4b17023SJohn Marino { return __x._M_equal(__y); } 234e4b17023SJohn Marino 235e4b17023SJohn Marino template<class _Value, class _Hash, class _Pred, class _Alloc, 236e4b17023SJohn Marino bool __cache_hash_code> 237e4b17023SJohn Marino inline bool 238e4b17023SJohn Marino operator!=(const __unordered_set<_Value, _Hash, _Pred, _Alloc, 239e4b17023SJohn Marino __cache_hash_code>& __x, 240e4b17023SJohn Marino const __unordered_set<_Value, _Hash, _Pred, _Alloc, 241e4b17023SJohn Marino __cache_hash_code>& __y) 242e4b17023SJohn Marino { return !(__x == __y); } 243e4b17023SJohn Marino 244e4b17023SJohn Marino template<class _Value, class _Hash, class _Pred, class _Alloc, 245e4b17023SJohn Marino bool __cache_hash_code> 246e4b17023SJohn Marino inline bool 247e4b17023SJohn Marino operator==(const __unordered_multiset<_Value, _Hash, _Pred, _Alloc, 248e4b17023SJohn Marino __cache_hash_code>& __x, 249e4b17023SJohn Marino const __unordered_multiset<_Value, _Hash, _Pred, _Alloc, 250e4b17023SJohn Marino __cache_hash_code>& __y) 251e4b17023SJohn Marino { return __x._M_equal(__y); } 252e4b17023SJohn Marino 253e4b17023SJohn Marino template<class _Value, class _Hash, class _Pred, class _Alloc, 254e4b17023SJohn Marino bool __cache_hash_code> 255e4b17023SJohn Marino inline bool 256e4b17023SJohn Marino operator!=(const __unordered_multiset<_Value, _Hash, _Pred, _Alloc, 257e4b17023SJohn Marino __cache_hash_code>& __x, 258e4b17023SJohn Marino const __unordered_multiset<_Value, _Hash, _Pred, _Alloc, 259e4b17023SJohn Marino __cache_hash_code>& __y) 260e4b17023SJohn Marino { return !(__x == __y); } 261e4b17023SJohn Marino 262e4b17023SJohn Marino /** 263e4b17023SJohn Marino * @brief A standard container composed of unique keys (containing 264e4b17023SJohn Marino * at most one of each key value) in which the elements' keys are 265e4b17023SJohn Marino * the elements themselves. 266e4b17023SJohn Marino * 267e4b17023SJohn Marino * @ingroup unordered_associative_containers 268e4b17023SJohn Marino * 269e4b17023SJohn Marino * Meets the requirements of a <a href="tables.html#65">container</a>, and 270e4b17023SJohn Marino * <a href="tables.html#xx">unordered associative container</a> 271e4b17023SJohn Marino * 272e4b17023SJohn Marino * @param Value Type of key objects. 273e4b17023SJohn Marino * @param Hash Hashing function object type, defaults to hash<Value>. 274e4b17023SJohn Marino * @param Pred Predicate function object type, defaults to equal_to<Value>. 275e4b17023SJohn Marino * @param Alloc Allocator type, defaults to allocator<Key>. 276e4b17023SJohn Marino */ 277e4b17023SJohn Marino template<class _Value, 278e4b17023SJohn Marino class _Hash = hash<_Value>, 279e4b17023SJohn Marino class _Pred = std::equal_to<_Value>, 280e4b17023SJohn Marino class _Alloc = std::allocator<_Value> > 281e4b17023SJohn Marino class unordered_set 282e4b17023SJohn Marino : public __unordered_set<_Value, _Hash, _Pred, _Alloc> 283e4b17023SJohn Marino { 284e4b17023SJohn Marino typedef __unordered_set<_Value, _Hash, _Pred, _Alloc> _Base; 285e4b17023SJohn Marino 286e4b17023SJohn Marino public: 287e4b17023SJohn Marino typedef typename _Base::value_type value_type; 288e4b17023SJohn Marino typedef typename _Base::size_type size_type; 289e4b17023SJohn Marino typedef typename _Base::hasher hasher; 290e4b17023SJohn Marino typedef typename _Base::key_equal key_equal; 291e4b17023SJohn Marino typedef typename _Base::allocator_type allocator_type; 292e4b17023SJohn Marino 293e4b17023SJohn Marino explicit 294e4b17023SJohn Marino unordered_set(size_type __n = 10, 295e4b17023SJohn Marino const hasher& __hf = hasher(), 296e4b17023SJohn Marino const key_equal& __eql = key_equal(), 297e4b17023SJohn Marino const allocator_type& __a = allocator_type()) 298e4b17023SJohn Marino : _Base(__n, __hf, __eql, __a) 299e4b17023SJohn Marino { } 300e4b17023SJohn Marino 301e4b17023SJohn Marino template<typename _InputIterator> 302e4b17023SJohn Marino unordered_set(_InputIterator __f, _InputIterator __l, 303e4b17023SJohn Marino size_type __n = 0, 304e4b17023SJohn Marino const hasher& __hf = hasher(), 305e4b17023SJohn Marino const key_equal& __eql = key_equal(), 306e4b17023SJohn Marino const allocator_type& __a = allocator_type()) 307e4b17023SJohn Marino : _Base(__f, __l, __n, __hf, __eql, __a) 308e4b17023SJohn Marino { } 309e4b17023SJohn Marino 310e4b17023SJohn Marino unordered_set(initializer_list<value_type> __l, 311e4b17023SJohn Marino size_type __n = 0, 312e4b17023SJohn Marino const hasher& __hf = hasher(), 313e4b17023SJohn Marino const key_equal& __eql = key_equal(), 314e4b17023SJohn Marino const allocator_type& __a = allocator_type()) 315e4b17023SJohn Marino : _Base(__l.begin(), __l.end(), __n, __hf, __eql, __a) 316e4b17023SJohn Marino { } 317e4b17023SJohn Marino 318e4b17023SJohn Marino unordered_set& 319e4b17023SJohn Marino operator=(initializer_list<value_type> __l) 320e4b17023SJohn Marino { 321e4b17023SJohn Marino this->clear(); 322e4b17023SJohn Marino this->insert(__l.begin(), __l.end()); 323e4b17023SJohn Marino return *this; 324e4b17023SJohn Marino } 325e4b17023SJohn Marino }; 326e4b17023SJohn Marino 327e4b17023SJohn Marino /** 328e4b17023SJohn Marino * @brief A standard container composed of equivalent keys 329e4b17023SJohn Marino * (possibly containing multiple of each key value) in which the 330e4b17023SJohn Marino * elements' keys are the elements themselves. 331e4b17023SJohn Marino * 332e4b17023SJohn Marino * @ingroup unordered_associative_containers 333e4b17023SJohn Marino * 334e4b17023SJohn Marino * Meets the requirements of a <a href="tables.html#65">container</a>, and 335e4b17023SJohn Marino * <a href="tables.html#xx">unordered associative container</a> 336e4b17023SJohn Marino * 337e4b17023SJohn Marino * @param Value Type of key objects. 338e4b17023SJohn Marino * @param Hash Hashing function object type, defaults to hash<Value>. 339e4b17023SJohn Marino * @param Pred Predicate function object type, defaults to equal_to<Value>. 340e4b17023SJohn Marino * @param Alloc Allocator type, defaults to allocator<Key>. 341e4b17023SJohn Marino */ 342e4b17023SJohn Marino template<class _Value, 343e4b17023SJohn Marino class _Hash = hash<_Value>, 344e4b17023SJohn Marino class _Pred = std::equal_to<_Value>, 345e4b17023SJohn Marino class _Alloc = std::allocator<_Value> > 346e4b17023SJohn Marino class unordered_multiset 347e4b17023SJohn Marino : public __unordered_multiset<_Value, _Hash, _Pred, _Alloc> 348e4b17023SJohn Marino { 349e4b17023SJohn Marino typedef __unordered_multiset<_Value, _Hash, _Pred, _Alloc> _Base; 350e4b17023SJohn Marino 351e4b17023SJohn Marino public: 352e4b17023SJohn Marino typedef typename _Base::value_type value_type; 353e4b17023SJohn Marino typedef typename _Base::size_type size_type; 354e4b17023SJohn Marino typedef typename _Base::hasher hasher; 355e4b17023SJohn Marino typedef typename _Base::key_equal key_equal; 356e4b17023SJohn Marino typedef typename _Base::allocator_type allocator_type; 357e4b17023SJohn Marino 358e4b17023SJohn Marino explicit 359e4b17023SJohn Marino unordered_multiset(size_type __n = 10, 360e4b17023SJohn Marino const hasher& __hf = hasher(), 361e4b17023SJohn Marino const key_equal& __eql = key_equal(), 362e4b17023SJohn Marino const allocator_type& __a = allocator_type()) 363e4b17023SJohn Marino : _Base(__n, __hf, __eql, __a) 364e4b17023SJohn Marino { } 365e4b17023SJohn Marino 366e4b17023SJohn Marino 367e4b17023SJohn Marino template<typename _InputIterator> 368e4b17023SJohn Marino unordered_multiset(_InputIterator __f, _InputIterator __l, 369e4b17023SJohn Marino size_type __n = 0, 370e4b17023SJohn Marino const hasher& __hf = hasher(), 371e4b17023SJohn Marino const key_equal& __eql = key_equal(), 372e4b17023SJohn Marino const allocator_type& __a = allocator_type()) 373e4b17023SJohn Marino : _Base(__f, __l, __n, __hf, __eql, __a) 374e4b17023SJohn Marino { } 375e4b17023SJohn Marino 376e4b17023SJohn Marino unordered_multiset(initializer_list<value_type> __l, 377e4b17023SJohn Marino size_type __n = 0, 378e4b17023SJohn Marino const hasher& __hf = hasher(), 379e4b17023SJohn Marino const key_equal& __eql = key_equal(), 380e4b17023SJohn Marino const allocator_type& __a = allocator_type()) 381e4b17023SJohn Marino : _Base(__l.begin(), __l.end(), __n, __hf, __eql, __a) 382e4b17023SJohn Marino { } 383e4b17023SJohn Marino 384e4b17023SJohn Marino unordered_multiset& 385e4b17023SJohn Marino operator=(initializer_list<value_type> __l) 386e4b17023SJohn Marino { 387e4b17023SJohn Marino this->clear(); 388e4b17023SJohn Marino this->insert(__l.begin(), __l.end()); 389e4b17023SJohn Marino return *this; 390e4b17023SJohn Marino } 391e4b17023SJohn Marino }; 392e4b17023SJohn Marino 393e4b17023SJohn Marino template<class _Value, class _Hash, class _Pred, class _Alloc> 394e4b17023SJohn Marino inline void 395e4b17023SJohn Marino swap(unordered_set<_Value, _Hash, _Pred, _Alloc>& __x, 396e4b17023SJohn Marino unordered_set<_Value, _Hash, _Pred, _Alloc>& __y) 397e4b17023SJohn Marino { __x.swap(__y); } 398e4b17023SJohn Marino 399e4b17023SJohn Marino template<class _Value, class _Hash, class _Pred, class _Alloc> 400e4b17023SJohn Marino inline void 401e4b17023SJohn Marino swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, 402e4b17023SJohn Marino unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) 403e4b17023SJohn Marino { __x.swap(__y); } 404e4b17023SJohn Marino 405e4b17023SJohn Marino template<class _Value, class _Hash, class _Pred, class _Alloc> 406e4b17023SJohn Marino inline bool 407e4b17023SJohn Marino operator==(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x, 408e4b17023SJohn Marino const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y) 409e4b17023SJohn Marino { return __x._M_equal(__y); } 410e4b17023SJohn Marino 411e4b17023SJohn Marino template<class _Value, class _Hash, class _Pred, class _Alloc> 412e4b17023SJohn Marino inline bool 413e4b17023SJohn Marino operator!=(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x, 414e4b17023SJohn Marino const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y) 415e4b17023SJohn Marino { return !(__x == __y); } 416e4b17023SJohn Marino 417e4b17023SJohn Marino template<class _Value, class _Hash, class _Pred, class _Alloc> 418e4b17023SJohn Marino inline bool 419e4b17023SJohn Marino operator==(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, 420e4b17023SJohn Marino const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) 421e4b17023SJohn Marino { return __x._M_equal(__y); } 422e4b17023SJohn Marino 423e4b17023SJohn Marino template<class _Value, class _Hash, class _Pred, class _Alloc> 424e4b17023SJohn Marino inline bool 425e4b17023SJohn Marino operator!=(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, 426e4b17023SJohn Marino const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) 427e4b17023SJohn Marino { return !(__x == __y); } 428e4b17023SJohn Marino 429e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_CONTAINER 430e4b17023SJohn Marino } // namespace std 431e4b17023SJohn Marino 432e4b17023SJohn Marino #endif /* _UNORDERED_SET_H */ 433e4b17023SJohn Marino 434