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