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(size_type n, const allocator_type& a); // C++14 72 unordered_set(size_type n, const hasher& hf, const allocator_type& a); // C++14 73 template <class InputIterator> 74 unordered_set(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14 75 template <class InputIterator> 76 unordered_set(InputIterator f, InputIterator l, size_type n, 77 const hasher& hf, const allocator_type& a); // C++14 78 unordered_set(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14 79 unordered_set(initializer_list<value_type> il, size_type n, 80 const hasher& hf, const allocator_type& a); // C++14 81 ~unordered_set(); 82 unordered_set& operator=(const unordered_set&); 83 unordered_set& operator=(unordered_set&&) 84 noexcept( 85 allocator_type::propagate_on_container_move_assignment::value && 86 is_nothrow_move_assignable<allocator_type>::value && 87 is_nothrow_move_assignable<hasher>::value && 88 is_nothrow_move_assignable<key_equal>::value); 89 unordered_set& operator=(initializer_list<value_type>); 90 91 allocator_type get_allocator() const noexcept; 92 93 bool empty() const noexcept; 94 size_type size() const noexcept; 95 size_type max_size() const noexcept; 96 97 iterator begin() noexcept; 98 iterator end() noexcept; 99 const_iterator begin() const noexcept; 100 const_iterator end() const noexcept; 101 const_iterator cbegin() const noexcept; 102 const_iterator cend() const noexcept; 103 104 template <class... Args> 105 pair<iterator, bool> emplace(Args&&... args); 106 template <class... Args> 107 iterator emplace_hint(const_iterator position, Args&&... args); 108 pair<iterator, bool> insert(const value_type& obj); 109 pair<iterator, bool> insert(value_type&& obj); 110 iterator insert(const_iterator hint, const value_type& obj); 111 iterator insert(const_iterator hint, value_type&& obj); 112 template <class InputIterator> 113 void insert(InputIterator first, InputIterator last); 114 void insert(initializer_list<value_type>); 115 116 iterator erase(const_iterator position); 117 size_type erase(const key_type& k); 118 iterator erase(const_iterator first, const_iterator last); 119 void clear() noexcept; 120 121 void swap(unordered_set&) 122 noexcept( 123 (!allocator_type::propagate_on_container_swap::value || 124 __is_nothrow_swappable<allocator_type>::value) && 125 __is_nothrow_swappable<hasher>::value && 126 __is_nothrow_swappable<key_equal>::value); 127 128 hasher hash_function() const; 129 key_equal key_eq() const; 130 131 iterator find(const key_type& k); 132 const_iterator find(const key_type& k) const; 133 size_type count(const key_type& k) const; 134 pair<iterator, iterator> equal_range(const key_type& k); 135 pair<const_iterator, const_iterator> equal_range(const key_type& k) const; 136 137 size_type bucket_count() const noexcept; 138 size_type max_bucket_count() const noexcept; 139 140 size_type bucket_size(size_type n) const; 141 size_type bucket(const key_type& k) const; 142 143 local_iterator begin(size_type n); 144 local_iterator end(size_type n); 145 const_local_iterator begin(size_type n) const; 146 const_local_iterator end(size_type n) const; 147 const_local_iterator cbegin(size_type n) const; 148 const_local_iterator cend(size_type n) const; 149 150 float load_factor() const noexcept; 151 float max_load_factor() const noexcept; 152 void max_load_factor(float z); 153 void rehash(size_type n); 154 void reserve(size_type n); 155 }; 156 157 template <class Value, class Hash, class Pred, class Alloc> 158 void swap(unordered_set<Value, Hash, Pred, Alloc>& x, 159 unordered_set<Value, Hash, Pred, Alloc>& y) 160 noexcept(noexcept(x.swap(y))); 161 162 template <class Value, class Hash, class Pred, class Alloc> 163 bool 164 operator==(const unordered_set<Value, Hash, Pred, Alloc>& x, 165 const unordered_set<Value, Hash, Pred, Alloc>& y); 166 167 template <class Value, class Hash, class Pred, class Alloc> 168 bool 169 operator!=(const unordered_set<Value, Hash, Pred, Alloc>& x, 170 const unordered_set<Value, Hash, Pred, Alloc>& y); 171 172 template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>, 173 class Alloc = allocator<Value>> 174 class unordered_multiset 175 { 176 public: 177 // types 178 typedef Value key_type; 179 typedef key_type value_type; 180 typedef Hash hasher; 181 typedef Pred key_equal; 182 typedef Alloc allocator_type; 183 typedef value_type& reference; 184 typedef const value_type& const_reference; 185 typedef typename allocator_traits<allocator_type>::pointer pointer; 186 typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; 187 typedef typename allocator_traits<allocator_type>::size_type size_type; 188 typedef typename allocator_traits<allocator_type>::difference_type difference_type; 189 190 typedef /unspecified/ iterator; 191 typedef /unspecified/ const_iterator; 192 typedef /unspecified/ local_iterator; 193 typedef /unspecified/ const_local_iterator; 194 195 unordered_multiset() 196 noexcept( 197 is_nothrow_default_constructible<hasher>::value && 198 is_nothrow_default_constructible<key_equal>::value && 199 is_nothrow_default_constructible<allocator_type>::value); 200 explicit unordered_multiset(size_type n, const hasher& hf = hasher(), 201 const key_equal& eql = key_equal(), 202 const allocator_type& a = allocator_type()); 203 template <class InputIterator> 204 unordered_multiset(InputIterator f, InputIterator l, 205 size_type n = 0, const hasher& hf = hasher(), 206 const key_equal& eql = key_equal(), 207 const allocator_type& a = allocator_type()); 208 explicit unordered_multiset(const allocator_type&); 209 unordered_multiset(const unordered_multiset&); 210 unordered_multiset(const unordered_multiset&, const Allocator&); 211 unordered_multiset(unordered_multiset&&) 212 noexcept( 213 is_nothrow_move_constructible<hasher>::value && 214 is_nothrow_move_constructible<key_equal>::value && 215 is_nothrow_move_constructible<allocator_type>::value); 216 unordered_multiset(unordered_multiset&&, const Allocator&); 217 unordered_multiset(initializer_list<value_type>, size_type n = /see below/, 218 const hasher& hf = hasher(), const key_equal& eql = key_equal(), 219 const allocator_type& a = allocator_type()); 220 unordered_multiset(size_type n, const allocator_type& a); // C++14 221 unordered_multiset(size_type n, const hasher& hf, const allocator_type& a); // C++14 222 template <class InputIterator> 223 unordered_multiset(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14 224 template <class InputIterator> 225 unordered_multiset(InputIterator f, InputIterator l, size_type n, 226 const hasher& hf, const allocator_type& a); // C++14 227 unordered_multiset(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14 228 unordered_multiset(initializer_list<value_type> il, size_type n, 229 const hasher& hf, const allocator_type& a); // C++14 230 ~unordered_multiset(); 231 unordered_multiset& operator=(const unordered_multiset&); 232 unordered_multiset& operator=(unordered_multiset&&) 233 noexcept( 234 allocator_type::propagate_on_container_move_assignment::value && 235 is_nothrow_move_assignable<allocator_type>::value && 236 is_nothrow_move_assignable<hasher>::value && 237 is_nothrow_move_assignable<key_equal>::value); 238 unordered_multiset& operator=(initializer_list<value_type>); 239 240 allocator_type get_allocator() const noexcept; 241 242 bool empty() const noexcept; 243 size_type size() const noexcept; 244 size_type max_size() const noexcept; 245 246 iterator begin() noexcept; 247 iterator end() noexcept; 248 const_iterator begin() const noexcept; 249 const_iterator end() const noexcept; 250 const_iterator cbegin() const noexcept; 251 const_iterator cend() const noexcept; 252 253 template <class... Args> 254 iterator emplace(Args&&... args); 255 template <class... Args> 256 iterator emplace_hint(const_iterator position, Args&&... args); 257 iterator insert(const value_type& obj); 258 iterator insert(value_type&& obj); 259 iterator insert(const_iterator hint, const value_type& obj); 260 iterator insert(const_iterator hint, value_type&& obj); 261 template <class InputIterator> 262 void insert(InputIterator first, InputIterator last); 263 void insert(initializer_list<value_type>); 264 265 iterator erase(const_iterator position); 266 size_type erase(const key_type& k); 267 iterator erase(const_iterator first, const_iterator last); 268 void clear() noexcept; 269 270 void swap(unordered_multiset&) 271 noexcept( 272 (!allocator_type::propagate_on_container_swap::value || 273 __is_nothrow_swappable<allocator_type>::value) && 274 __is_nothrow_swappable<hasher>::value && 275 __is_nothrow_swappable<key_equal>::value); 276 277 hasher hash_function() const; 278 key_equal key_eq() const; 279 280 iterator find(const key_type& k); 281 const_iterator find(const key_type& k) const; 282 size_type count(const key_type& k) const; 283 pair<iterator, iterator> equal_range(const key_type& k); 284 pair<const_iterator, const_iterator> equal_range(const key_type& k) const; 285 286 size_type bucket_count() const noexcept; 287 size_type max_bucket_count() const noexcept; 288 289 size_type bucket_size(size_type n) const; 290 size_type bucket(const key_type& k) const; 291 292 local_iterator begin(size_type n); 293 local_iterator end(size_type n); 294 const_local_iterator begin(size_type n) const; 295 const_local_iterator end(size_type n) const; 296 const_local_iterator cbegin(size_type n) const; 297 const_local_iterator cend(size_type n) const; 298 299 float load_factor() const noexcept; 300 float max_load_factor() const noexcept; 301 void max_load_factor(float z); 302 void rehash(size_type n); 303 void reserve(size_type n); 304 }; 305 306 template <class Value, class Hash, class Pred, class Alloc> 307 void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x, 308 unordered_multiset<Value, Hash, Pred, Alloc>& y) 309 noexcept(noexcept(x.swap(y))); 310 311 template <class Value, class Hash, class Pred, class Alloc> 312 bool 313 operator==(const unordered_multiset<Value, Hash, Pred, Alloc>& x, 314 const unordered_multiset<Value, Hash, Pred, Alloc>& y); 315 316 template <class Value, class Hash, class Pred, class Alloc> 317 bool 318 operator!=(const unordered_multiset<Value, Hash, Pred, Alloc>& x, 319 const unordered_multiset<Value, Hash, Pred, Alloc>& y); 320 } // std 321 322 */ 323 324 #include <__config> 325 #include <__hash_table> 326 #include <functional> 327 328 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 329 #pragma GCC system_header 330 #endif 331 332 _LIBCPP_BEGIN_NAMESPACE_STD 333 334 template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>, 335 class _Alloc = allocator<_Value> > 336 class _LIBCPP_TYPE_VIS_ONLY unordered_set 337 { 338 public: 339 // types 340 typedef _Value key_type; 341 typedef key_type value_type; 342 typedef _Hash hasher; 343 typedef _Pred key_equal; 344 typedef _Alloc allocator_type; 345 typedef value_type& reference; 346 typedef const value_type& const_reference; 347 static_assert((is_same<value_type, typename allocator_type::value_type>::value), 348 "Invalid allocator::value_type"); 349 350 private: 351 typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table; 352 353 __table __table_; 354 355 public: 356 typedef typename __table::pointer pointer; 357 typedef typename __table::const_pointer const_pointer; 358 typedef typename __table::size_type size_type; 359 typedef typename __table::difference_type difference_type; 360 361 typedef typename __table::const_iterator iterator; 362 typedef typename __table::const_iterator const_iterator; 363 typedef typename __table::const_local_iterator local_iterator; 364 typedef typename __table::const_local_iterator const_local_iterator; 365 366 _LIBCPP_INLINE_VISIBILITY 367 unordered_set() 368 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) 369 { 370 #if _LIBCPP_DEBUG_LEVEL >= 2 371 __get_db()->__insert_c(this); 372 #endif 373 } 374 explicit unordered_set(size_type __n, const hasher& __hf = hasher(), 375 const key_equal& __eql = key_equal()); 376 #if _LIBCPP_STD_VER > 11 377 inline _LIBCPP_INLINE_VISIBILITY 378 unordered_set(size_type __n, const allocator_type& __a) 379 : unordered_set(__n, hasher(), key_equal(), __a) {} 380 inline _LIBCPP_INLINE_VISIBILITY 381 unordered_set(size_type __n, const hasher& __hf, const allocator_type& __a) 382 : unordered_set(__n, __hf, key_equal(), __a) {} 383 #endif 384 unordered_set(size_type __n, const hasher& __hf, const key_equal& __eql, 385 const allocator_type& __a); 386 template <class _InputIterator> 387 unordered_set(_InputIterator __first, _InputIterator __last); 388 template <class _InputIterator> 389 unordered_set(_InputIterator __first, _InputIterator __last, 390 size_type __n, const hasher& __hf = hasher(), 391 const key_equal& __eql = key_equal()); 392 template <class _InputIterator> 393 unordered_set(_InputIterator __first, _InputIterator __last, 394 size_type __n, const hasher& __hf, const key_equal& __eql, 395 const allocator_type& __a); 396 #if _LIBCPP_STD_VER > 11 397 template <class _InputIterator> 398 inline _LIBCPP_INLINE_VISIBILITY 399 unordered_set(_InputIterator __first, _InputIterator __last, 400 size_type __n, const allocator_type& __a) 401 : unordered_set(__first, __last, __n, hasher(), key_equal(), __a) {} 402 template <class _InputIterator> 403 unordered_set(_InputIterator __first, _InputIterator __last, 404 size_type __n, const hasher& __hf, const allocator_type& __a) 405 : unordered_set(__first, __last, __n, __hf, key_equal(), __a) {} 406 #endif 407 explicit unordered_set(const allocator_type& __a); 408 unordered_set(const unordered_set& __u); 409 unordered_set(const unordered_set& __u, const allocator_type& __a); 410 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 411 unordered_set(unordered_set&& __u) 412 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); 413 unordered_set(unordered_set&& __u, const allocator_type& __a); 414 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 415 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 416 unordered_set(initializer_list<value_type> __il); 417 unordered_set(initializer_list<value_type> __il, size_type __n, 418 const hasher& __hf = hasher(), 419 const key_equal& __eql = key_equal()); 420 unordered_set(initializer_list<value_type> __il, size_type __n, 421 const hasher& __hf, const key_equal& __eql, 422 const allocator_type& __a); 423 #if _LIBCPP_STD_VER > 11 424 inline _LIBCPP_INLINE_VISIBILITY 425 unordered_set(initializer_list<value_type> __il, size_type __n, 426 const allocator_type& __a) 427 : unordered_set(__il, __n, hasher(), key_equal(), __a) {} 428 inline _LIBCPP_INLINE_VISIBILITY 429 unordered_set(initializer_list<value_type> __il, size_type __n, 430 const hasher& __hf, const allocator_type& __a) 431 : unordered_set(__il, __n, __hf, key_equal(), __a) {} 432 #endif 433 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 434 // ~unordered_set() = default; 435 _LIBCPP_INLINE_VISIBILITY 436 unordered_set& operator=(const unordered_set& __u) 437 { 438 __table_ = __u.__table_; 439 return *this; 440 } 441 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 442 unordered_set& operator=(unordered_set&& __u) 443 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); 444 #endif 445 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 446 unordered_set& operator=(initializer_list<value_type> __il); 447 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 448 449 _LIBCPP_INLINE_VISIBILITY 450 allocator_type get_allocator() const _NOEXCEPT 451 {return allocator_type(__table_.__node_alloc());} 452 453 _LIBCPP_INLINE_VISIBILITY 454 bool empty() const _NOEXCEPT {return __table_.size() == 0;} 455 _LIBCPP_INLINE_VISIBILITY 456 size_type size() const _NOEXCEPT {return __table_.size();} 457 _LIBCPP_INLINE_VISIBILITY 458 size_type max_size() const _NOEXCEPT {return __table_.max_size();} 459 460 _LIBCPP_INLINE_VISIBILITY 461 iterator begin() _NOEXCEPT {return __table_.begin();} 462 _LIBCPP_INLINE_VISIBILITY 463 iterator end() _NOEXCEPT {return __table_.end();} 464 _LIBCPP_INLINE_VISIBILITY 465 const_iterator begin() const _NOEXCEPT {return __table_.begin();} 466 _LIBCPP_INLINE_VISIBILITY 467 const_iterator end() const _NOEXCEPT {return __table_.end();} 468 _LIBCPP_INLINE_VISIBILITY 469 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} 470 _LIBCPP_INLINE_VISIBILITY 471 const_iterator cend() const _NOEXCEPT {return __table_.end();} 472 473 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 474 template <class... _Args> 475 _LIBCPP_INLINE_VISIBILITY 476 pair<iterator, bool> emplace(_Args&&... __args) 477 {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);} 478 template <class... _Args> 479 _LIBCPP_INLINE_VISIBILITY 480 #if _LIBCPP_DEBUG_LEVEL >= 2 481 iterator emplace_hint(const_iterator __p, _Args&&... __args) 482 { 483 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, 484 "unordered_set::emplace_hint(const_iterator, args...) called with an iterator not" 485 " referring to this unordered_set"); 486 return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first; 487 } 488 #else 489 iterator emplace_hint(const_iterator, _Args&&... __args) 490 {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;} 491 #endif 492 #endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 493 _LIBCPP_INLINE_VISIBILITY 494 pair<iterator, bool> insert(const value_type& __x) 495 {return __table_.__insert_unique(__x);} 496 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 497 _LIBCPP_INLINE_VISIBILITY 498 pair<iterator, bool> insert(value_type&& __x) 499 {return __table_.__insert_unique(_VSTD::move(__x));} 500 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 501 _LIBCPP_INLINE_VISIBILITY 502 #if _LIBCPP_DEBUG_LEVEL >= 2 503 iterator insert(const_iterator __p, const value_type& __x) 504 { 505 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, 506 "unordered_set::insert(const_iterator, const value_type&) called with an iterator not" 507 " referring to this unordered_set"); 508 return insert(__x).first; 509 } 510 #else 511 iterator insert(const_iterator, const value_type& __x) 512 {return insert(__x).first;} 513 #endif 514 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 515 _LIBCPP_INLINE_VISIBILITY 516 #if _LIBCPP_DEBUG_LEVEL >= 2 517 iterator insert(const_iterator __p, value_type&& __x) 518 { 519 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, 520 "unordered_set::insert(const_iterator, value_type&&) called with an iterator not" 521 " referring to this unordered_set"); 522 return insert(_VSTD::move(__x)).first; 523 } 524 #else 525 iterator insert(const_iterator, value_type&& __x) 526 {return insert(_VSTD::move(__x)).first;} 527 #endif 528 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 529 template <class _InputIterator> 530 void insert(_InputIterator __first, _InputIterator __last); 531 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 532 _LIBCPP_INLINE_VISIBILITY 533 void insert(initializer_list<value_type> __il) 534 {insert(__il.begin(), __il.end());} 535 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 536 537 _LIBCPP_INLINE_VISIBILITY 538 iterator erase(const_iterator __p) {return __table_.erase(__p);} 539 _LIBCPP_INLINE_VISIBILITY 540 size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);} 541 _LIBCPP_INLINE_VISIBILITY 542 iterator erase(const_iterator __first, const_iterator __last) 543 {return __table_.erase(__first, __last);} 544 _LIBCPP_INLINE_VISIBILITY 545 void clear() _NOEXCEPT {__table_.clear();} 546 547 _LIBCPP_INLINE_VISIBILITY 548 void swap(unordered_set& __u) 549 _NOEXCEPT_(__is_nothrow_swappable<__table>::value) 550 {__table_.swap(__u.__table_);} 551 552 _LIBCPP_INLINE_VISIBILITY 553 hasher hash_function() const {return __table_.hash_function();} 554 _LIBCPP_INLINE_VISIBILITY 555 key_equal key_eq() const {return __table_.key_eq();} 556 557 _LIBCPP_INLINE_VISIBILITY 558 iterator find(const key_type& __k) {return __table_.find(__k);} 559 _LIBCPP_INLINE_VISIBILITY 560 const_iterator find(const key_type& __k) const {return __table_.find(__k);} 561 _LIBCPP_INLINE_VISIBILITY 562 size_type count(const key_type& __k) const {return __table_.__count_unique(__k);} 563 _LIBCPP_INLINE_VISIBILITY 564 pair<iterator, iterator> equal_range(const key_type& __k) 565 {return __table_.__equal_range_unique(__k);} 566 _LIBCPP_INLINE_VISIBILITY 567 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const 568 {return __table_.__equal_range_unique(__k);} 569 570 _LIBCPP_INLINE_VISIBILITY 571 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} 572 _LIBCPP_INLINE_VISIBILITY 573 size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();} 574 575 _LIBCPP_INLINE_VISIBILITY 576 size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);} 577 _LIBCPP_INLINE_VISIBILITY 578 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} 579 580 _LIBCPP_INLINE_VISIBILITY 581 local_iterator begin(size_type __n) {return __table_.begin(__n);} 582 _LIBCPP_INLINE_VISIBILITY 583 local_iterator end(size_type __n) {return __table_.end(__n);} 584 _LIBCPP_INLINE_VISIBILITY 585 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} 586 _LIBCPP_INLINE_VISIBILITY 587 const_local_iterator end(size_type __n) const {return __table_.cend(__n);} 588 _LIBCPP_INLINE_VISIBILITY 589 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} 590 _LIBCPP_INLINE_VISIBILITY 591 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} 592 593 _LIBCPP_INLINE_VISIBILITY 594 float load_factor() const _NOEXCEPT {return __table_.load_factor();} 595 _LIBCPP_INLINE_VISIBILITY 596 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} 597 _LIBCPP_INLINE_VISIBILITY 598 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} 599 _LIBCPP_INLINE_VISIBILITY 600 void rehash(size_type __n) {__table_.rehash(__n);} 601 _LIBCPP_INLINE_VISIBILITY 602 void reserve(size_type __n) {__table_.reserve(__n);} 603 604 #if _LIBCPP_DEBUG_LEVEL >= 2 605 606 bool __dereferenceable(const const_iterator* __i) const 607 {return __table_.__dereferenceable(__i);} 608 bool __decrementable(const const_iterator* __i) const 609 {return __table_.__decrementable(__i);} 610 bool __addable(const const_iterator* __i, ptrdiff_t __n) const 611 {return __table_.__addable(__i, __n);} 612 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const 613 {return __table_.__addable(__i, __n);} 614 615 #endif // _LIBCPP_DEBUG_LEVEL >= 2 616 617 }; 618 619 template <class _Value, class _Hash, class _Pred, class _Alloc> 620 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n, 621 const hasher& __hf, const key_equal& __eql) 622 : __table_(__hf, __eql) 623 { 624 #if _LIBCPP_DEBUG_LEVEL >= 2 625 __get_db()->__insert_c(this); 626 #endif 627 __table_.rehash(__n); 628 } 629 630 template <class _Value, class _Hash, class _Pred, class _Alloc> 631 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n, 632 const hasher& __hf, const key_equal& __eql, const allocator_type& __a) 633 : __table_(__hf, __eql, __a) 634 { 635 #if _LIBCPP_DEBUG_LEVEL >= 2 636 __get_db()->__insert_c(this); 637 #endif 638 __table_.rehash(__n); 639 } 640 641 template <class _Value, class _Hash, class _Pred, class _Alloc> 642 template <class _InputIterator> 643 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 644 _InputIterator __first, _InputIterator __last) 645 { 646 #if _LIBCPP_DEBUG_LEVEL >= 2 647 __get_db()->__insert_c(this); 648 #endif 649 insert(__first, __last); 650 } 651 652 template <class _Value, class _Hash, class _Pred, class _Alloc> 653 template <class _InputIterator> 654 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 655 _InputIterator __first, _InputIterator __last, size_type __n, 656 const hasher& __hf, const key_equal& __eql) 657 : __table_(__hf, __eql) 658 { 659 #if _LIBCPP_DEBUG_LEVEL >= 2 660 __get_db()->__insert_c(this); 661 #endif 662 __table_.rehash(__n); 663 insert(__first, __last); 664 } 665 666 template <class _Value, class _Hash, class _Pred, class _Alloc> 667 template <class _InputIterator> 668 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 669 _InputIterator __first, _InputIterator __last, size_type __n, 670 const hasher& __hf, const key_equal& __eql, const allocator_type& __a) 671 : __table_(__hf, __eql, __a) 672 { 673 #if _LIBCPP_DEBUG_LEVEL >= 2 674 __get_db()->__insert_c(this); 675 #endif 676 __table_.rehash(__n); 677 insert(__first, __last); 678 } 679 680 template <class _Value, class _Hash, class _Pred, class _Alloc> 681 inline _LIBCPP_INLINE_VISIBILITY 682 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 683 const allocator_type& __a) 684 : __table_(__a) 685 { 686 #if _LIBCPP_DEBUG_LEVEL >= 2 687 __get_db()->__insert_c(this); 688 #endif 689 } 690 691 template <class _Value, class _Hash, class _Pred, class _Alloc> 692 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 693 const unordered_set& __u) 694 : __table_(__u.__table_) 695 { 696 #if _LIBCPP_DEBUG_LEVEL >= 2 697 __get_db()->__insert_c(this); 698 #endif 699 __table_.rehash(__u.bucket_count()); 700 insert(__u.begin(), __u.end()); 701 } 702 703 template <class _Value, class _Hash, class _Pred, class _Alloc> 704 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 705 const unordered_set& __u, const allocator_type& __a) 706 : __table_(__u.__table_, __a) 707 { 708 #if _LIBCPP_DEBUG_LEVEL >= 2 709 __get_db()->__insert_c(this); 710 #endif 711 __table_.rehash(__u.bucket_count()); 712 insert(__u.begin(), __u.end()); 713 } 714 715 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 716 717 template <class _Value, class _Hash, class _Pred, class _Alloc> 718 inline _LIBCPP_INLINE_VISIBILITY 719 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 720 unordered_set&& __u) 721 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) 722 : __table_(_VSTD::move(__u.__table_)) 723 { 724 #if _LIBCPP_DEBUG_LEVEL >= 2 725 __get_db()->__insert_c(this); 726 __get_db()->swap(this, &__u); 727 #endif 728 } 729 730 template <class _Value, class _Hash, class _Pred, class _Alloc> 731 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 732 unordered_set&& __u, const allocator_type& __a) 733 : __table_(_VSTD::move(__u.__table_), __a) 734 { 735 #if _LIBCPP_DEBUG_LEVEL >= 2 736 __get_db()->__insert_c(this); 737 #endif 738 if (__a != __u.get_allocator()) 739 { 740 iterator __i = __u.begin(); 741 while (__u.size() != 0) 742 __table_.__insert_unique(_VSTD::move(__u.__table_.remove(__i++)->__value_)); 743 } 744 #if _LIBCPP_DEBUG_LEVEL >= 2 745 else 746 __get_db()->swap(this, &__u); 747 #endif 748 } 749 750 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 751 752 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 753 754 template <class _Value, class _Hash, class _Pred, class _Alloc> 755 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 756 initializer_list<value_type> __il) 757 { 758 #if _LIBCPP_DEBUG_LEVEL >= 2 759 __get_db()->__insert_c(this); 760 #endif 761 insert(__il.begin(), __il.end()); 762 } 763 764 template <class _Value, class _Hash, class _Pred, class _Alloc> 765 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 766 initializer_list<value_type> __il, size_type __n, const hasher& __hf, 767 const key_equal& __eql) 768 : __table_(__hf, __eql) 769 { 770 #if _LIBCPP_DEBUG_LEVEL >= 2 771 __get_db()->__insert_c(this); 772 #endif 773 __table_.rehash(__n); 774 insert(__il.begin(), __il.end()); 775 } 776 777 template <class _Value, class _Hash, class _Pred, class _Alloc> 778 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 779 initializer_list<value_type> __il, size_type __n, const hasher& __hf, 780 const key_equal& __eql, const allocator_type& __a) 781 : __table_(__hf, __eql, __a) 782 { 783 #if _LIBCPP_DEBUG_LEVEL >= 2 784 __get_db()->__insert_c(this); 785 #endif 786 __table_.rehash(__n); 787 insert(__il.begin(), __il.end()); 788 } 789 790 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 791 792 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 793 794 template <class _Value, class _Hash, class _Pred, class _Alloc> 795 inline _LIBCPP_INLINE_VISIBILITY 796 unordered_set<_Value, _Hash, _Pred, _Alloc>& 797 unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(unordered_set&& __u) 798 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) 799 { 800 __table_ = _VSTD::move(__u.__table_); 801 return *this; 802 } 803 804 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 805 806 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 807 808 template <class _Value, class _Hash, class _Pred, class _Alloc> 809 inline _LIBCPP_INLINE_VISIBILITY 810 unordered_set<_Value, _Hash, _Pred, _Alloc>& 811 unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=( 812 initializer_list<value_type> __il) 813 { 814 __table_.__assign_unique(__il.begin(), __il.end()); 815 return *this; 816 } 817 818 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 819 820 template <class _Value, class _Hash, class _Pred, class _Alloc> 821 template <class _InputIterator> 822 inline _LIBCPP_INLINE_VISIBILITY 823 void 824 unordered_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, 825 _InputIterator __last) 826 { 827 for (; __first != __last; ++__first) 828 __table_.__insert_unique(*__first); 829 } 830 831 template <class _Value, class _Hash, class _Pred, class _Alloc> 832 inline _LIBCPP_INLINE_VISIBILITY 833 void 834 swap(unordered_set<_Value, _Hash, _Pred, _Alloc>& __x, 835 unordered_set<_Value, _Hash, _Pred, _Alloc>& __y) 836 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 837 { 838 __x.swap(__y); 839 } 840 841 template <class _Value, class _Hash, class _Pred, class _Alloc> 842 bool 843 operator==(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x, 844 const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y) 845 { 846 if (__x.size() != __y.size()) 847 return false; 848 typedef typename unordered_set<_Value, _Hash, _Pred, _Alloc>::const_iterator 849 const_iterator; 850 for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end(); 851 __i != __ex; ++__i) 852 { 853 const_iterator __j = __y.find(*__i); 854 if (__j == __ey || !(*__i == *__j)) 855 return false; 856 } 857 return true; 858 } 859 860 template <class _Value, class _Hash, class _Pred, class _Alloc> 861 inline _LIBCPP_INLINE_VISIBILITY 862 bool 863 operator!=(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x, 864 const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y) 865 { 866 return !(__x == __y); 867 } 868 869 template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>, 870 class _Alloc = allocator<_Value> > 871 class _LIBCPP_TYPE_VIS_ONLY unordered_multiset 872 { 873 public: 874 // types 875 typedef _Value key_type; 876 typedef key_type value_type; 877 typedef _Hash hasher; 878 typedef _Pred key_equal; 879 typedef _Alloc allocator_type; 880 typedef value_type& reference; 881 typedef const value_type& const_reference; 882 static_assert((is_same<value_type, typename allocator_type::value_type>::value), 883 "Invalid allocator::value_type"); 884 885 private: 886 typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table; 887 888 __table __table_; 889 890 public: 891 typedef typename __table::pointer pointer; 892 typedef typename __table::const_pointer const_pointer; 893 typedef typename __table::size_type size_type; 894 typedef typename __table::difference_type difference_type; 895 896 typedef typename __table::const_iterator iterator; 897 typedef typename __table::const_iterator const_iterator; 898 typedef typename __table::const_local_iterator local_iterator; 899 typedef typename __table::const_local_iterator const_local_iterator; 900 901 _LIBCPP_INLINE_VISIBILITY 902 unordered_multiset() 903 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) 904 { 905 #if _LIBCPP_DEBUG_LEVEL >= 2 906 __get_db()->__insert_c(this); 907 #endif 908 } 909 explicit unordered_multiset(size_type __n, const hasher& __hf = hasher(), 910 const key_equal& __eql = key_equal()); 911 unordered_multiset(size_type __n, const hasher& __hf, 912 const key_equal& __eql, const allocator_type& __a); 913 #if _LIBCPP_STD_VER > 11 914 inline _LIBCPP_INLINE_VISIBILITY 915 unordered_multiset(size_type __n, const allocator_type& __a) 916 : unordered_multiset(__n, hasher(), key_equal(), __a) {} 917 inline _LIBCPP_INLINE_VISIBILITY 918 unordered_multiset(size_type __n, const hasher& __hf, const allocator_type& __a) 919 : unordered_multiset(__n, __hf, key_equal(), __a) {} 920 #endif 921 template <class _InputIterator> 922 unordered_multiset(_InputIterator __first, _InputIterator __last); 923 template <class _InputIterator> 924 unordered_multiset(_InputIterator __first, _InputIterator __last, 925 size_type __n, const hasher& __hf = hasher(), 926 const key_equal& __eql = key_equal()); 927 template <class _InputIterator> 928 unordered_multiset(_InputIterator __first, _InputIterator __last, 929 size_type __n , const hasher& __hf, 930 const key_equal& __eql, const allocator_type& __a); 931 #if _LIBCPP_STD_VER > 11 932 template <class _InputIterator> 933 inline _LIBCPP_INLINE_VISIBILITY 934 unordered_multiset(_InputIterator __first, _InputIterator __last, 935 size_type __n, const allocator_type& __a) 936 : unordered_multiset(__first, __last, __n, hasher(), key_equal(), __a) {} 937 template <class _InputIterator> 938 inline _LIBCPP_INLINE_VISIBILITY 939 unordered_multiset(_InputIterator __first, _InputIterator __last, 940 size_type __n, const hasher& __hf, const allocator_type& __a) 941 : unordered_multiset(__first, __last, __n, __hf, key_equal(), __a) {} 942 #endif 943 explicit unordered_multiset(const allocator_type& __a); 944 unordered_multiset(const unordered_multiset& __u); 945 unordered_multiset(const unordered_multiset& __u, const allocator_type& __a); 946 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 947 unordered_multiset(unordered_multiset&& __u) 948 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); 949 unordered_multiset(unordered_multiset&& __u, const allocator_type& __a); 950 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 951 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 952 unordered_multiset(initializer_list<value_type> __il); 953 unordered_multiset(initializer_list<value_type> __il, size_type __n, 954 const hasher& __hf = hasher(), 955 const key_equal& __eql = key_equal()); 956 unordered_multiset(initializer_list<value_type> __il, size_type __n, 957 const hasher& __hf, const key_equal& __eql, 958 const allocator_type& __a); 959 #if _LIBCPP_STD_VER > 11 960 inline _LIBCPP_INLINE_VISIBILITY 961 unordered_multiset(initializer_list<value_type> __il, size_type __n, const allocator_type& __a) 962 : unordered_multiset(__il, __n, hasher(), key_equal(), __a) {} 963 inline _LIBCPP_INLINE_VISIBILITY 964 unordered_multiset(initializer_list<value_type> __il, size_type __n, const hasher& __hf, const allocator_type& __a) 965 : unordered_multiset(__il, __n, __hf, key_equal(), __a) {} 966 #endif 967 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 968 // ~unordered_multiset() = default; 969 _LIBCPP_INLINE_VISIBILITY 970 unordered_multiset& operator=(const unordered_multiset& __u) 971 { 972 __table_ = __u.__table_; 973 return *this; 974 } 975 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 976 unordered_multiset& operator=(unordered_multiset&& __u) 977 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); 978 #endif 979 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 980 unordered_multiset& operator=(initializer_list<value_type> __il); 981 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 982 983 _LIBCPP_INLINE_VISIBILITY 984 allocator_type get_allocator() const _NOEXCEPT 985 {return allocator_type(__table_.__node_alloc());} 986 987 _LIBCPP_INLINE_VISIBILITY 988 bool empty() const _NOEXCEPT {return __table_.size() == 0;} 989 _LIBCPP_INLINE_VISIBILITY 990 size_type size() const _NOEXCEPT {return __table_.size();} 991 _LIBCPP_INLINE_VISIBILITY 992 size_type max_size() const _NOEXCEPT {return __table_.max_size();} 993 994 _LIBCPP_INLINE_VISIBILITY 995 iterator begin() _NOEXCEPT {return __table_.begin();} 996 _LIBCPP_INLINE_VISIBILITY 997 iterator end() _NOEXCEPT {return __table_.end();} 998 _LIBCPP_INLINE_VISIBILITY 999 const_iterator begin() const _NOEXCEPT {return __table_.begin();} 1000 _LIBCPP_INLINE_VISIBILITY 1001 const_iterator end() const _NOEXCEPT {return __table_.end();} 1002 _LIBCPP_INLINE_VISIBILITY 1003 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} 1004 _LIBCPP_INLINE_VISIBILITY 1005 const_iterator cend() const _NOEXCEPT {return __table_.end();} 1006 1007 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 1008 template <class... _Args> 1009 _LIBCPP_INLINE_VISIBILITY 1010 iterator emplace(_Args&&... __args) 1011 {return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);} 1012 template <class... _Args> 1013 _LIBCPP_INLINE_VISIBILITY 1014 iterator emplace_hint(const_iterator __p, _Args&&... __args) 1015 {return __table_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);} 1016 #endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 1017 _LIBCPP_INLINE_VISIBILITY 1018 iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);} 1019 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1020 _LIBCPP_INLINE_VISIBILITY 1021 iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));} 1022 #endif 1023 _LIBCPP_INLINE_VISIBILITY 1024 iterator insert(const_iterator __p, const value_type& __x) 1025 {return __table_.__insert_multi(__p, __x);} 1026 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1027 _LIBCPP_INLINE_VISIBILITY 1028 iterator insert(const_iterator __p, value_type&& __x) 1029 {return __table_.__insert_multi(__p, _VSTD::move(__x));} 1030 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1031 template <class _InputIterator> 1032 void insert(_InputIterator __first, _InputIterator __last); 1033 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1034 _LIBCPP_INLINE_VISIBILITY 1035 void insert(initializer_list<value_type> __il) 1036 {insert(__il.begin(), __il.end());} 1037 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1038 1039 _LIBCPP_INLINE_VISIBILITY 1040 iterator erase(const_iterator __p) {return __table_.erase(__p);} 1041 _LIBCPP_INLINE_VISIBILITY 1042 size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);} 1043 _LIBCPP_INLINE_VISIBILITY 1044 iterator erase(const_iterator __first, const_iterator __last) 1045 {return __table_.erase(__first, __last);} 1046 _LIBCPP_INLINE_VISIBILITY 1047 void clear() _NOEXCEPT {__table_.clear();} 1048 1049 _LIBCPP_INLINE_VISIBILITY 1050 void swap(unordered_multiset& __u) 1051 _NOEXCEPT_(__is_nothrow_swappable<__table>::value) 1052 {__table_.swap(__u.__table_);} 1053 1054 _LIBCPP_INLINE_VISIBILITY 1055 hasher hash_function() const {return __table_.hash_function();} 1056 _LIBCPP_INLINE_VISIBILITY 1057 key_equal key_eq() const {return __table_.key_eq();} 1058 1059 _LIBCPP_INLINE_VISIBILITY 1060 iterator find(const key_type& __k) {return __table_.find(__k);} 1061 _LIBCPP_INLINE_VISIBILITY 1062 const_iterator find(const key_type& __k) const {return __table_.find(__k);} 1063 _LIBCPP_INLINE_VISIBILITY 1064 size_type count(const key_type& __k) const {return __table_.__count_multi(__k);} 1065 _LIBCPP_INLINE_VISIBILITY 1066 pair<iterator, iterator> equal_range(const key_type& __k) 1067 {return __table_.__equal_range_multi(__k);} 1068 _LIBCPP_INLINE_VISIBILITY 1069 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const 1070 {return __table_.__equal_range_multi(__k);} 1071 1072 _LIBCPP_INLINE_VISIBILITY 1073 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} 1074 _LIBCPP_INLINE_VISIBILITY 1075 size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();} 1076 1077 _LIBCPP_INLINE_VISIBILITY 1078 size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);} 1079 _LIBCPP_INLINE_VISIBILITY 1080 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} 1081 1082 _LIBCPP_INLINE_VISIBILITY 1083 local_iterator begin(size_type __n) {return __table_.begin(__n);} 1084 _LIBCPP_INLINE_VISIBILITY 1085 local_iterator end(size_type __n) {return __table_.end(__n);} 1086 _LIBCPP_INLINE_VISIBILITY 1087 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} 1088 _LIBCPP_INLINE_VISIBILITY 1089 const_local_iterator end(size_type __n) const {return __table_.cend(__n);} 1090 _LIBCPP_INLINE_VISIBILITY 1091 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} 1092 _LIBCPP_INLINE_VISIBILITY 1093 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} 1094 1095 _LIBCPP_INLINE_VISIBILITY 1096 float load_factor() const _NOEXCEPT {return __table_.load_factor();} 1097 _LIBCPP_INLINE_VISIBILITY 1098 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} 1099 _LIBCPP_INLINE_VISIBILITY 1100 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} 1101 _LIBCPP_INLINE_VISIBILITY 1102 void rehash(size_type __n) {__table_.rehash(__n);} 1103 _LIBCPP_INLINE_VISIBILITY 1104 void reserve(size_type __n) {__table_.reserve(__n);} 1105 1106 #if _LIBCPP_DEBUG_LEVEL >= 2 1107 1108 bool __dereferenceable(const const_iterator* __i) const 1109 {return __table_.__dereferenceable(__i);} 1110 bool __decrementable(const const_iterator* __i) const 1111 {return __table_.__decrementable(__i);} 1112 bool __addable(const const_iterator* __i, ptrdiff_t __n) const 1113 {return __table_.__addable(__i, __n);} 1114 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const 1115 {return __table_.__addable(__i, __n);} 1116 1117 #endif // _LIBCPP_DEBUG_LEVEL >= 2 1118 1119 }; 1120 1121 template <class _Value, class _Hash, class _Pred, class _Alloc> 1122 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 1123 size_type __n, const hasher& __hf, const key_equal& __eql) 1124 : __table_(__hf, __eql) 1125 { 1126 #if _LIBCPP_DEBUG_LEVEL >= 2 1127 __get_db()->__insert_c(this); 1128 #endif 1129 __table_.rehash(__n); 1130 } 1131 1132 template <class _Value, class _Hash, class _Pred, class _Alloc> 1133 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 1134 size_type __n, const hasher& __hf, const key_equal& __eql, 1135 const allocator_type& __a) 1136 : __table_(__hf, __eql, __a) 1137 { 1138 #if _LIBCPP_DEBUG_LEVEL >= 2 1139 __get_db()->__insert_c(this); 1140 #endif 1141 __table_.rehash(__n); 1142 } 1143 1144 template <class _Value, class _Hash, class _Pred, class _Alloc> 1145 template <class _InputIterator> 1146 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 1147 _InputIterator __first, _InputIterator __last) 1148 { 1149 #if _LIBCPP_DEBUG_LEVEL >= 2 1150 __get_db()->__insert_c(this); 1151 #endif 1152 insert(__first, __last); 1153 } 1154 1155 template <class _Value, class _Hash, class _Pred, class _Alloc> 1156 template <class _InputIterator> 1157 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 1158 _InputIterator __first, _InputIterator __last, size_type __n, 1159 const hasher& __hf, const key_equal& __eql) 1160 : __table_(__hf, __eql) 1161 { 1162 #if _LIBCPP_DEBUG_LEVEL >= 2 1163 __get_db()->__insert_c(this); 1164 #endif 1165 __table_.rehash(__n); 1166 insert(__first, __last); 1167 } 1168 1169 template <class _Value, class _Hash, class _Pred, class _Alloc> 1170 template <class _InputIterator> 1171 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 1172 _InputIterator __first, _InputIterator __last, size_type __n, 1173 const hasher& __hf, const key_equal& __eql, const allocator_type& __a) 1174 : __table_(__hf, __eql, __a) 1175 { 1176 #if _LIBCPP_DEBUG_LEVEL >= 2 1177 __get_db()->__insert_c(this); 1178 #endif 1179 __table_.rehash(__n); 1180 insert(__first, __last); 1181 } 1182 1183 template <class _Value, class _Hash, class _Pred, class _Alloc> 1184 inline _LIBCPP_INLINE_VISIBILITY 1185 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 1186 const allocator_type& __a) 1187 : __table_(__a) 1188 { 1189 #if _LIBCPP_DEBUG_LEVEL >= 2 1190 __get_db()->__insert_c(this); 1191 #endif 1192 } 1193 1194 template <class _Value, class _Hash, class _Pred, class _Alloc> 1195 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 1196 const unordered_multiset& __u) 1197 : __table_(__u.__table_) 1198 { 1199 #if _LIBCPP_DEBUG_LEVEL >= 2 1200 __get_db()->__insert_c(this); 1201 #endif 1202 __table_.rehash(__u.bucket_count()); 1203 insert(__u.begin(), __u.end()); 1204 } 1205 1206 template <class _Value, class _Hash, class _Pred, class _Alloc> 1207 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 1208 const unordered_multiset& __u, const allocator_type& __a) 1209 : __table_(__u.__table_, __a) 1210 { 1211 #if _LIBCPP_DEBUG_LEVEL >= 2 1212 __get_db()->__insert_c(this); 1213 #endif 1214 __table_.rehash(__u.bucket_count()); 1215 insert(__u.begin(), __u.end()); 1216 } 1217 1218 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1219 1220 template <class _Value, class _Hash, class _Pred, class _Alloc> 1221 inline _LIBCPP_INLINE_VISIBILITY 1222 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 1223 unordered_multiset&& __u) 1224 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) 1225 : __table_(_VSTD::move(__u.__table_)) 1226 { 1227 #if _LIBCPP_DEBUG_LEVEL >= 2 1228 __get_db()->__insert_c(this); 1229 __get_db()->swap(this, &__u); 1230 #endif 1231 } 1232 1233 template <class _Value, class _Hash, class _Pred, class _Alloc> 1234 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 1235 unordered_multiset&& __u, const allocator_type& __a) 1236 : __table_(_VSTD::move(__u.__table_), __a) 1237 { 1238 #if _LIBCPP_DEBUG_LEVEL >= 2 1239 __get_db()->__insert_c(this); 1240 #endif 1241 if (__a != __u.get_allocator()) 1242 { 1243 iterator __i = __u.begin(); 1244 while (__u.size() != 0) 1245 __table_.__insert_multi(_VSTD::move(__u.__table_.remove(__i++)->__value_)); 1246 } 1247 #if _LIBCPP_DEBUG_LEVEL >= 2 1248 else 1249 __get_db()->swap(this, &__u); 1250 #endif 1251 } 1252 1253 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1254 1255 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1256 1257 template <class _Value, class _Hash, class _Pred, class _Alloc> 1258 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 1259 initializer_list<value_type> __il) 1260 { 1261 #if _LIBCPP_DEBUG_LEVEL >= 2 1262 __get_db()->__insert_c(this); 1263 #endif 1264 insert(__il.begin(), __il.end()); 1265 } 1266 1267 template <class _Value, class _Hash, class _Pred, class _Alloc> 1268 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 1269 initializer_list<value_type> __il, size_type __n, const hasher& __hf, 1270 const key_equal& __eql) 1271 : __table_(__hf, __eql) 1272 { 1273 #if _LIBCPP_DEBUG_LEVEL >= 2 1274 __get_db()->__insert_c(this); 1275 #endif 1276 __table_.rehash(__n); 1277 insert(__il.begin(), __il.end()); 1278 } 1279 1280 template <class _Value, class _Hash, class _Pred, class _Alloc> 1281 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 1282 initializer_list<value_type> __il, size_type __n, const hasher& __hf, 1283 const key_equal& __eql, const allocator_type& __a) 1284 : __table_(__hf, __eql, __a) 1285 { 1286 #if _LIBCPP_DEBUG_LEVEL >= 2 1287 __get_db()->__insert_c(this); 1288 #endif 1289 __table_.rehash(__n); 1290 insert(__il.begin(), __il.end()); 1291 } 1292 1293 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1294 1295 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1296 1297 template <class _Value, class _Hash, class _Pred, class _Alloc> 1298 inline _LIBCPP_INLINE_VISIBILITY 1299 unordered_multiset<_Value, _Hash, _Pred, _Alloc>& 1300 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=( 1301 unordered_multiset&& __u) 1302 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) 1303 { 1304 __table_ = _VSTD::move(__u.__table_); 1305 return *this; 1306 } 1307 1308 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1309 1310 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1311 1312 template <class _Value, class _Hash, class _Pred, class _Alloc> 1313 inline 1314 unordered_multiset<_Value, _Hash, _Pred, _Alloc>& 1315 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=( 1316 initializer_list<value_type> __il) 1317 { 1318 __table_.__assign_multi(__il.begin(), __il.end()); 1319 return *this; 1320 } 1321 1322 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1323 1324 template <class _Value, class _Hash, class _Pred, class _Alloc> 1325 template <class _InputIterator> 1326 inline _LIBCPP_INLINE_VISIBILITY 1327 void 1328 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, 1329 _InputIterator __last) 1330 { 1331 for (; __first != __last; ++__first) 1332 __table_.__insert_multi(*__first); 1333 } 1334 1335 template <class _Value, class _Hash, class _Pred, class _Alloc> 1336 inline _LIBCPP_INLINE_VISIBILITY 1337 void 1338 swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, 1339 unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) 1340 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 1341 { 1342 __x.swap(__y); 1343 } 1344 1345 template <class _Value, class _Hash, class _Pred, class _Alloc> 1346 bool 1347 operator==(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, 1348 const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) 1349 { 1350 if (__x.size() != __y.size()) 1351 return false; 1352 typedef typename unordered_multiset<_Value, _Hash, _Pred, _Alloc>::const_iterator 1353 const_iterator; 1354 typedef pair<const_iterator, const_iterator> _EqRng; 1355 for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;) 1356 { 1357 _EqRng __xeq = __x.equal_range(*__i); 1358 _EqRng __yeq = __y.equal_range(*__i); 1359 if (_VSTD::distance(__xeq.first, __xeq.second) != 1360 _VSTD::distance(__yeq.first, __yeq.second) || 1361 !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first)) 1362 return false; 1363 __i = __xeq.second; 1364 } 1365 return true; 1366 } 1367 1368 template <class _Value, class _Hash, class _Pred, class _Alloc> 1369 inline _LIBCPP_INLINE_VISIBILITY 1370 bool 1371 operator!=(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, 1372 const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) 1373 { 1374 return !(__x == __y); 1375 } 1376 1377 _LIBCPP_END_NAMESPACE_STD 1378 1379 #endif // _LIBCPP_UNORDERED_SET 1380