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