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