1 // -*- C++ -*- 2 //===-------------------------- unordered_map -----------------------------===// 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_MAP 12 #define _LIBCPP_UNORDERED_MAP 13 14 /* 15 16 unordered_map synopsis 17 18 #include <initializer_list> 19 20 namespace std 21 { 22 23 template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, 24 class Alloc = allocator<pair<const Key, T>>> 25 class unordered_map 26 { 27 public: 28 // types 29 typedef Key key_type; 30 typedef T mapped_type; 31 typedef Hash hasher; 32 typedef Pred key_equal; 33 typedef Alloc allocator_type; 34 typedef pair<const key_type, mapped_type> value_type; 35 typedef value_type& reference; 36 typedef const value_type& const_reference; 37 typedef typename allocator_traits<allocator_type>::pointer pointer; 38 typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; 39 typedef typename allocator_traits<allocator_type>::size_type size_type; 40 typedef typename allocator_traits<allocator_type>::difference_type difference_type; 41 42 typedef /unspecified/ iterator; 43 typedef /unspecified/ const_iterator; 44 typedef /unspecified/ local_iterator; 45 typedef /unspecified/ const_local_iterator; 46 47 unordered_map() 48 noexcept( 49 is_nothrow_default_constructible<hasher>::value && 50 is_nothrow_default_constructible<key_equal>::value && 51 is_nothrow_default_constructible<allocator_type>::value); 52 explicit unordered_map(size_type n, const hasher& hf = hasher(), 53 const key_equal& eql = key_equal(), 54 const allocator_type& a = allocator_type()); 55 template <class InputIterator> 56 unordered_map(InputIterator f, InputIterator l, 57 size_type n = 0, const hasher& hf = hasher(), 58 const key_equal& eql = key_equal(), 59 const allocator_type& a = allocator_type()); 60 explicit unordered_map(const allocator_type&); 61 unordered_map(const unordered_map&); 62 unordered_map(const unordered_map&, const Allocator&); 63 unordered_map(unordered_map&&) 64 noexcept( 65 is_nothrow_move_constructible<hasher>::value && 66 is_nothrow_move_constructible<key_equal>::value && 67 is_nothrow_move_constructible<allocator_type>::value); 68 unordered_map(unordered_map&&, const Allocator&); 69 unordered_map(initializer_list<value_type>, size_type n = 0, 70 const hasher& hf = hasher(), const key_equal& eql = key_equal(), 71 const allocator_type& a = allocator_type()); 72 unordered_map(size_type n, const allocator_type& a) 73 : unordered_map(n, hasher(), key_equal(), a) {} // C++14 74 unordered_map(size_type n, const hasher& hf, const allocator_type& a) 75 : unordered_map(n, hf, key_equal(), a) {} // C++14 76 template <class InputIterator> 77 unordered_map(InputIterator f, InputIterator l, size_type n, const allocator_type& a) 78 : unordered_map(f, l, n, hasher(), key_equal(), a) {} // C++14 79 template <class InputIterator> 80 unordered_map(InputIterator f, InputIterator l, size_type n, const hasher& hf, 81 const allocator_type& a) 82 : unordered_map(f, l, n, hf, key_equal(), a) {} // C++14 83 unordered_map(initializer_list<value_type> il, size_type n, const allocator_type& a) 84 : unordered_map(il, n, hasher(), key_equal(), a) {} // C++14 85 unordered_map(initializer_list<value_type> il, size_type n, const hasher& hf, 86 const allocator_type& a) 87 : unordered_map(il, n, hf, key_equal(), a) {} // C++14 88 ~unordered_map(); 89 unordered_map& operator=(const unordered_map&); 90 unordered_map& operator=(unordered_map&&) 91 noexcept( 92 allocator_type::propagate_on_container_move_assignment::value && 93 is_nothrow_move_assignable<allocator_type>::value && 94 is_nothrow_move_assignable<hasher>::value && 95 is_nothrow_move_assignable<key_equal>::value); 96 unordered_map& operator=(initializer_list<value_type>); 97 98 allocator_type get_allocator() const noexcept; 99 100 bool empty() const noexcept; 101 size_type size() const noexcept; 102 size_type max_size() const noexcept; 103 104 iterator begin() noexcept; 105 iterator end() noexcept; 106 const_iterator begin() const noexcept; 107 const_iterator end() const noexcept; 108 const_iterator cbegin() const noexcept; 109 const_iterator cend() const noexcept; 110 111 template <class... Args> 112 pair<iterator, bool> emplace(Args&&... args); 113 template <class... Args> 114 iterator emplace_hint(const_iterator position, Args&&... args); 115 pair<iterator, bool> insert(const value_type& obj); 116 template <class P> 117 pair<iterator, bool> insert(P&& obj); 118 iterator insert(const_iterator hint, const value_type& obj); 119 template <class P> 120 iterator insert(const_iterator hint, P&& obj); 121 template <class InputIterator> 122 void insert(InputIterator first, InputIterator last); 123 void insert(initializer_list<value_type>); 124 125 iterator erase(const_iterator position); 126 size_type erase(const key_type& k); 127 iterator erase(const_iterator first, const_iterator last); 128 void clear() noexcept; 129 130 void swap(unordered_map&) 131 noexcept( 132 (!allocator_type::propagate_on_container_swap::value || 133 __is_nothrow_swappable<allocator_type>::value) && 134 __is_nothrow_swappable<hasher>::value && 135 __is_nothrow_swappable<key_equal>::value); 136 137 hasher hash_function() const; 138 key_equal key_eq() const; 139 140 iterator find(const key_type& k); 141 const_iterator find(const key_type& k) const; 142 size_type count(const key_type& k) const; 143 pair<iterator, iterator> equal_range(const key_type& k); 144 pair<const_iterator, const_iterator> equal_range(const key_type& k) const; 145 146 mapped_type& operator[](const key_type& k); 147 mapped_type& operator[](key_type&& k); 148 149 mapped_type& at(const key_type& k); 150 const mapped_type& at(const key_type& k) const; 151 152 size_type bucket_count() const noexcept; 153 size_type max_bucket_count() const noexcept; 154 155 size_type bucket_size(size_type n) const; 156 size_type bucket(const key_type& k) const; 157 158 local_iterator begin(size_type n); 159 local_iterator end(size_type n); 160 const_local_iterator begin(size_type n) const; 161 const_local_iterator end(size_type n) const; 162 const_local_iterator cbegin(size_type n) const; 163 const_local_iterator cend(size_type n) const; 164 165 float load_factor() const noexcept; 166 float max_load_factor() const noexcept; 167 void max_load_factor(float z); 168 void rehash(size_type n); 169 void reserve(size_type n); 170 }; 171 172 template <class Key, class T, class Hash, class Pred, class Alloc> 173 void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 174 unordered_map<Key, T, Hash, Pred, Alloc>& y) 175 noexcept(noexcept(x.swap(y))); 176 177 template <class Key, class T, class Hash, class Pred, class Alloc> 178 bool 179 operator==(const unordered_map<Key, T, Hash, Pred, Alloc>& x, 180 const unordered_map<Key, T, Hash, Pred, Alloc>& y); 181 182 template <class Key, class T, class Hash, class Pred, class Alloc> 183 bool 184 operator!=(const unordered_map<Key, T, Hash, Pred, Alloc>& x, 185 const unordered_map<Key, T, Hash, Pred, Alloc>& y); 186 187 template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, 188 class Alloc = allocator<pair<const Key, T>>> 189 class unordered_multimap 190 { 191 public: 192 // types 193 typedef Key key_type; 194 typedef T mapped_type; 195 typedef Hash hasher; 196 typedef Pred key_equal; 197 typedef Alloc allocator_type; 198 typedef pair<const key_type, mapped_type> value_type; 199 typedef value_type& reference; 200 typedef const value_type& const_reference; 201 typedef typename allocator_traits<allocator_type>::pointer pointer; 202 typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; 203 typedef typename allocator_traits<allocator_type>::size_type size_type; 204 typedef typename allocator_traits<allocator_type>::difference_type difference_type; 205 206 typedef /unspecified/ iterator; 207 typedef /unspecified/ const_iterator; 208 typedef /unspecified/ local_iterator; 209 typedef /unspecified/ const_local_iterator; 210 211 unordered_multimap() 212 noexcept( 213 is_nothrow_default_constructible<hasher>::value && 214 is_nothrow_default_constructible<key_equal>::value && 215 is_nothrow_default_constructible<allocator_type>::value); 216 explicit unordered_multimap(size_type n, const hasher& hf = hasher(), 217 const key_equal& eql = key_equal(), 218 const allocator_type& a = allocator_type()); 219 template <class InputIterator> 220 unordered_multimap(InputIterator f, InputIterator l, 221 size_type n = 0, const hasher& hf = hasher(), 222 const key_equal& eql = key_equal(), 223 const allocator_type& a = allocator_type()); 224 explicit unordered_multimap(const allocator_type&); 225 unordered_multimap(const unordered_multimap&); 226 unordered_multimap(const unordered_multimap&, const Allocator&); 227 unordered_multimap(unordered_multimap&&) 228 noexcept( 229 is_nothrow_move_constructible<hasher>::value && 230 is_nothrow_move_constructible<key_equal>::value && 231 is_nothrow_move_constructible<allocator_type>::value); 232 unordered_multimap(unordered_multimap&&, const Allocator&); 233 unordered_multimap(initializer_list<value_type>, size_type n = 0, 234 const hasher& hf = hasher(), const key_equal& eql = key_equal(), 235 const allocator_type& a = allocator_type()); 236 unordered_multimap(size_type n, const allocator_type& a) 237 : unordered_multimap(n, hasher(), key_equal(), a) {} // C++14 238 unordered_multimap(size_type n, const hasher& hf, const allocator_type& a) 239 : unordered_multimap(n, hf, key_equal(), a) {} // C++14 240 template <class InputIterator> 241 unordered_multimap(InputIterator f, InputIterator l, size_type n, const allocator_type& a) 242 : unordered_multimap(f, l, n, hasher(), key_equal(), a) {} // C++14 243 template <class InputIterator> 244 unordered_multimap(InputIterator f, InputIterator l, size_type n, const hasher& hf, 245 const allocator_type& a) 246 : unordered_multimap(f, l, n, hf, key_equal(), a) {} // C++14 247 unordered_multimap(initializer_list<value_type> il, size_type n, const allocator_type& a) 248 : unordered_multimap(il, n, hasher(), key_equal(), a) {} // C++14 249 unordered_multimap(initializer_list<value_type> il, size_type n, const hasher& hf, 250 const allocator_type& a) 251 : unordered_multimap(il, n, hf, key_equal(), a) {} // C++14 252 ~unordered_multimap(); 253 unordered_multimap& operator=(const unordered_multimap&); 254 unordered_multimap& operator=(unordered_multimap&&) 255 noexcept( 256 allocator_type::propagate_on_container_move_assignment::value && 257 is_nothrow_move_assignable<allocator_type>::value && 258 is_nothrow_move_assignable<hasher>::value && 259 is_nothrow_move_assignable<key_equal>::value); 260 unordered_multimap& operator=(initializer_list<value_type>); 261 262 allocator_type get_allocator() const noexcept; 263 264 bool empty() const noexcept; 265 size_type size() const noexcept; 266 size_type max_size() const noexcept; 267 268 iterator begin() noexcept; 269 iterator end() noexcept; 270 const_iterator begin() const noexcept; 271 const_iterator end() const noexcept; 272 const_iterator cbegin() const noexcept; 273 const_iterator cend() const noexcept; 274 275 template <class... Args> 276 iterator emplace(Args&&... args); 277 template <class... Args> 278 iterator emplace_hint(const_iterator position, Args&&... args); 279 iterator insert(const value_type& obj); 280 template <class P> 281 iterator insert(P&& obj); 282 iterator insert(const_iterator hint, const value_type& obj); 283 template <class P> 284 iterator insert(const_iterator hint, P&& obj); 285 template <class InputIterator> 286 void insert(InputIterator first, InputIterator last); 287 void insert(initializer_list<value_type>); 288 289 iterator erase(const_iterator position); 290 size_type erase(const key_type& k); 291 iterator erase(const_iterator first, const_iterator last); 292 void clear() noexcept; 293 294 void swap(unordered_multimap&) 295 noexcept( 296 (!allocator_type::propagate_on_container_swap::value || 297 __is_nothrow_swappable<allocator_type>::value) && 298 __is_nothrow_swappable<hasher>::value && 299 __is_nothrow_swappable<key_equal>::value); 300 301 hasher hash_function() const; 302 key_equal key_eq() const; 303 304 iterator find(const key_type& k); 305 const_iterator find(const key_type& k) const; 306 size_type count(const key_type& k) const; 307 pair<iterator, iterator> equal_range(const key_type& k); 308 pair<const_iterator, const_iterator> equal_range(const key_type& k) const; 309 310 size_type bucket_count() const noexcept; 311 size_type max_bucket_count() const noexcept; 312 313 size_type bucket_size(size_type n) const; 314 size_type bucket(const key_type& k) const; 315 316 local_iterator begin(size_type n); 317 local_iterator end(size_type n); 318 const_local_iterator begin(size_type n) const; 319 const_local_iterator end(size_type n) const; 320 const_local_iterator cbegin(size_type n) const; 321 const_local_iterator cend(size_type n) const; 322 323 float load_factor() const noexcept; 324 float max_load_factor() const noexcept; 325 void max_load_factor(float z); 326 void rehash(size_type n); 327 void reserve(size_type n); 328 }; 329 330 template <class Key, class T, class Hash, class Pred, class Alloc> 331 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 332 unordered_multimap<Key, T, Hash, Pred, Alloc>& y) 333 noexcept(noexcept(x.swap(y))); 334 335 template <class Key, class T, class Hash, class Pred, class Alloc> 336 bool 337 operator==(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 338 const unordered_multimap<Key, T, Hash, Pred, Alloc>& y); 339 340 template <class Key, class T, class Hash, class Pred, class Alloc> 341 bool 342 operator!=(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 343 const unordered_multimap<Key, T, Hash, Pred, Alloc>& y); 344 345 } // std 346 347 */ 348 349 #include <__config> 350 #include <__hash_table> 351 #include <functional> 352 #include <stdexcept> 353 354 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 355 #pragma GCC system_header 356 #endif 357 358 _LIBCPP_BEGIN_NAMESPACE_STD 359 360 template <class _Key, class _Cp, class _Hash, bool = is_empty<_Hash>::value 361 #if __has_feature(is_final) 362 && !__is_final(_Hash) 363 #endif 364 > 365 class __unordered_map_hasher 366 : private _Hash 367 { 368 public: 369 _LIBCPP_INLINE_VISIBILITY 370 __unordered_map_hasher() 371 _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value) 372 : _Hash() {} 373 _LIBCPP_INLINE_VISIBILITY 374 __unordered_map_hasher(const _Hash& __h) 375 _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value) 376 : _Hash(__h) {} 377 _LIBCPP_INLINE_VISIBILITY 378 const _Hash& hash_function() const _NOEXCEPT {return *this;} 379 _LIBCPP_INLINE_VISIBILITY 380 size_t operator()(const _Cp& __x) const 381 {return static_cast<const _Hash&>(*this)(__x.__cc.first);} 382 _LIBCPP_INLINE_VISIBILITY 383 size_t operator()(const _Key& __x) const 384 {return static_cast<const _Hash&>(*this)(__x);} 385 }; 386 387 template <class _Key, class _Cp, class _Hash> 388 class __unordered_map_hasher<_Key, _Cp, _Hash, false> 389 { 390 _Hash __hash_; 391 392 public: 393 _LIBCPP_INLINE_VISIBILITY 394 __unordered_map_hasher() 395 _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value) 396 : __hash_() {} 397 _LIBCPP_INLINE_VISIBILITY 398 __unordered_map_hasher(const _Hash& __h) 399 _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value) 400 : __hash_(__h) {} 401 _LIBCPP_INLINE_VISIBILITY 402 const _Hash& hash_function() const _NOEXCEPT {return __hash_;} 403 _LIBCPP_INLINE_VISIBILITY 404 size_t operator()(const _Cp& __x) const 405 {return __hash_(__x.__cc.first);} 406 _LIBCPP_INLINE_VISIBILITY 407 size_t operator()(const _Key& __x) const 408 {return __hash_(__x);} 409 }; 410 411 template <class _Key, class _Cp, class _Pred, bool = is_empty<_Pred>::value 412 #if __has_feature(is_final) 413 && !__is_final(_Pred) 414 #endif 415 > 416 class __unordered_map_equal 417 : private _Pred 418 { 419 public: 420 _LIBCPP_INLINE_VISIBILITY 421 __unordered_map_equal() 422 _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value) 423 : _Pred() {} 424 _LIBCPP_INLINE_VISIBILITY 425 __unordered_map_equal(const _Pred& __p) 426 _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value) 427 : _Pred(__p) {} 428 _LIBCPP_INLINE_VISIBILITY 429 const _Pred& key_eq() const _NOEXCEPT {return *this;} 430 _LIBCPP_INLINE_VISIBILITY 431 bool operator()(const _Cp& __x, const _Cp& __y) const 432 {return static_cast<const _Pred&>(*this)(__x.__cc.first, __y.__cc.first);} 433 _LIBCPP_INLINE_VISIBILITY 434 bool operator()(const _Cp& __x, const _Key& __y) const 435 {return static_cast<const _Pred&>(*this)(__x.__cc.first, __y);} 436 _LIBCPP_INLINE_VISIBILITY 437 bool operator()(const _Key& __x, const _Cp& __y) const 438 {return static_cast<const _Pred&>(*this)(__x, __y.__cc.first);} 439 }; 440 441 template <class _Key, class _Cp, class _Pred> 442 class __unordered_map_equal<_Key, _Cp, _Pred, false> 443 { 444 _Pred __pred_; 445 446 public: 447 _LIBCPP_INLINE_VISIBILITY 448 __unordered_map_equal() 449 _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value) 450 : __pred_() {} 451 _LIBCPP_INLINE_VISIBILITY 452 __unordered_map_equal(const _Pred& __p) 453 _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value) 454 : __pred_(__p) {} 455 _LIBCPP_INLINE_VISIBILITY 456 const _Pred& key_eq() const _NOEXCEPT {return __pred_;} 457 _LIBCPP_INLINE_VISIBILITY 458 bool operator()(const _Cp& __x, const _Cp& __y) const 459 {return __pred_(__x.__cc.first, __y.__cc.first);} 460 _LIBCPP_INLINE_VISIBILITY 461 bool operator()(const _Cp& __x, const _Key& __y) const 462 {return __pred_(__x.__cc.first, __y);} 463 _LIBCPP_INLINE_VISIBILITY 464 bool operator()(const _Key& __x, const _Cp& __y) const 465 {return __pred_(__x, __y.__cc.first);} 466 }; 467 468 template <class _Alloc> 469 class __hash_map_node_destructor 470 { 471 typedef _Alloc allocator_type; 472 typedef allocator_traits<allocator_type> __alloc_traits; 473 typedef typename __alloc_traits::value_type::value_type value_type; 474 public: 475 typedef typename __alloc_traits::pointer pointer; 476 private: 477 typedef typename value_type::value_type::first_type first_type; 478 typedef typename value_type::value_type::second_type second_type; 479 480 allocator_type& __na_; 481 482 __hash_map_node_destructor& operator=(const __hash_map_node_destructor&); 483 484 public: 485 bool __first_constructed; 486 bool __second_constructed; 487 488 _LIBCPP_INLINE_VISIBILITY 489 explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT 490 : __na_(__na), 491 __first_constructed(false), 492 __second_constructed(false) 493 {} 494 495 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 496 _LIBCPP_INLINE_VISIBILITY 497 __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x) 498 _NOEXCEPT 499 : __na_(__x.__na_), 500 __first_constructed(__x.__value_constructed), 501 __second_constructed(__x.__value_constructed) 502 { 503 __x.__value_constructed = false; 504 } 505 #else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 506 _LIBCPP_INLINE_VISIBILITY 507 __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x) 508 : __na_(__x.__na_), 509 __first_constructed(__x.__value_constructed), 510 __second_constructed(__x.__value_constructed) 511 { 512 const_cast<bool&>(__x.__value_constructed) = false; 513 } 514 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 515 516 _LIBCPP_INLINE_VISIBILITY 517 void operator()(pointer __p) _NOEXCEPT 518 { 519 if (__second_constructed) 520 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second)); 521 if (__first_constructed) 522 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first)); 523 if (__p) 524 __alloc_traits::deallocate(__na_, __p, 1); 525 } 526 }; 527 528 #if __cplusplus >= 201103L 529 530 template <class _Key, class _Tp> 531 union __hash_value_type 532 { 533 typedef _Key key_type; 534 typedef _Tp mapped_type; 535 typedef pair<const key_type, mapped_type> value_type; 536 typedef pair<key_type, mapped_type> __nc_value_type; 537 538 value_type __cc; 539 __nc_value_type __nc; 540 541 template <class ..._Args> 542 _LIBCPP_INLINE_VISIBILITY 543 __hash_value_type(_Args&& ...__args) 544 : __cc(std::forward<_Args>(__args)...) {} 545 546 _LIBCPP_INLINE_VISIBILITY 547 __hash_value_type(const __hash_value_type& __v) 548 : __cc(__v.__cc) {} 549 550 _LIBCPP_INLINE_VISIBILITY 551 __hash_value_type(__hash_value_type&& __v) 552 : __nc(std::move(__v.__nc)) {} 553 554 _LIBCPP_INLINE_VISIBILITY 555 __hash_value_type& operator=(const __hash_value_type& __v) 556 {__nc = __v.__cc; return *this;} 557 558 _LIBCPP_INLINE_VISIBILITY 559 __hash_value_type& operator=(__hash_value_type&& __v) 560 {__nc = std::move(__v.__nc); return *this;} 561 562 _LIBCPP_INLINE_VISIBILITY 563 ~__hash_value_type() {__cc.~value_type();} 564 }; 565 566 #else 567 568 template <class _Key, class _Tp> 569 struct __hash_value_type 570 { 571 typedef _Key key_type; 572 typedef _Tp mapped_type; 573 typedef pair<const key_type, mapped_type> value_type; 574 575 value_type __cc; 576 577 _LIBCPP_INLINE_VISIBILITY 578 __hash_value_type() {} 579 580 template <class _A0> 581 _LIBCPP_INLINE_VISIBILITY 582 __hash_value_type(const _A0& __a0) 583 : __cc(__a0) {} 584 585 template <class _A0, class _A1> 586 _LIBCPP_INLINE_VISIBILITY 587 __hash_value_type(const _A0& __a0, const _A1& __a1) 588 : __cc(__a0, __a1) {} 589 }; 590 591 #endif 592 593 template <class _HashIterator> 594 class _LIBCPP_TYPE_VIS_ONLY __hash_map_iterator 595 { 596 _HashIterator __i_; 597 598 typedef pointer_traits<typename _HashIterator::pointer> __pointer_traits; 599 typedef const typename _HashIterator::value_type::value_type::first_type key_type; 600 typedef typename _HashIterator::value_type::value_type::second_type mapped_type; 601 public: 602 typedef forward_iterator_tag iterator_category; 603 typedef pair<key_type, mapped_type> value_type; 604 typedef typename _HashIterator::difference_type difference_type; 605 typedef value_type& reference; 606 typedef typename __pointer_traits::template 607 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 608 rebind<value_type> 609 #else 610 rebind<value_type>::other 611 #endif 612 pointer; 613 614 _LIBCPP_INLINE_VISIBILITY 615 __hash_map_iterator() _NOEXCEPT {} 616 617 _LIBCPP_INLINE_VISIBILITY 618 __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {} 619 620 _LIBCPP_INLINE_VISIBILITY 621 reference operator*() const {return __i_->__cc;} 622 _LIBCPP_INLINE_VISIBILITY 623 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);} 624 625 _LIBCPP_INLINE_VISIBILITY 626 __hash_map_iterator& operator++() {++__i_; return *this;} 627 _LIBCPP_INLINE_VISIBILITY 628 __hash_map_iterator operator++(int) 629 { 630 __hash_map_iterator __t(*this); 631 ++(*this); 632 return __t; 633 } 634 635 friend _LIBCPP_INLINE_VISIBILITY 636 bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y) 637 {return __x.__i_ == __y.__i_;} 638 friend _LIBCPP_INLINE_VISIBILITY 639 bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y) 640 {return __x.__i_ != __y.__i_;} 641 642 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_map; 643 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_multimap; 644 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator; 645 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator; 646 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator; 647 }; 648 649 template <class _HashIterator> 650 class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator 651 { 652 _HashIterator __i_; 653 654 typedef pointer_traits<typename _HashIterator::pointer> __pointer_traits; 655 typedef const typename _HashIterator::value_type::value_type::first_type key_type; 656 typedef typename _HashIterator::value_type::value_type::second_type mapped_type; 657 public: 658 typedef forward_iterator_tag iterator_category; 659 typedef pair<key_type, mapped_type> value_type; 660 typedef typename _HashIterator::difference_type difference_type; 661 typedef const value_type& reference; 662 typedef typename __pointer_traits::template 663 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 664 rebind<const value_type> 665 #else 666 rebind<const value_type>::other 667 #endif 668 pointer; 669 670 _LIBCPP_INLINE_VISIBILITY 671 __hash_map_const_iterator() _NOEXCEPT {} 672 673 _LIBCPP_INLINE_VISIBILITY 674 __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {} 675 _LIBCPP_INLINE_VISIBILITY 676 __hash_map_const_iterator( 677 __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i) 678 _NOEXCEPT 679 : __i_(__i.__i_) {} 680 681 _LIBCPP_INLINE_VISIBILITY 682 reference operator*() const {return __i_->__cc;} 683 _LIBCPP_INLINE_VISIBILITY 684 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);} 685 686 _LIBCPP_INLINE_VISIBILITY 687 __hash_map_const_iterator& operator++() {++__i_; return *this;} 688 _LIBCPP_INLINE_VISIBILITY 689 __hash_map_const_iterator operator++(int) 690 { 691 __hash_map_const_iterator __t(*this); 692 ++(*this); 693 return __t; 694 } 695 696 friend _LIBCPP_INLINE_VISIBILITY 697 bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y) 698 {return __x.__i_ == __y.__i_;} 699 friend _LIBCPP_INLINE_VISIBILITY 700 bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y) 701 {return __x.__i_ != __y.__i_;} 702 703 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_map; 704 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_multimap; 705 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator; 706 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator; 707 }; 708 709 template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>, 710 class _Alloc = allocator<pair<const _Key, _Tp> > > 711 class _LIBCPP_TYPE_VIS_ONLY unordered_map 712 { 713 public: 714 // types 715 typedef _Key key_type; 716 typedef _Tp mapped_type; 717 typedef _Hash hasher; 718 typedef _Pred key_equal; 719 typedef _Alloc allocator_type; 720 typedef pair<const key_type, mapped_type> value_type; 721 typedef pair<key_type, mapped_type> __nc_value_type; 722 typedef value_type& reference; 723 typedef const value_type& const_reference; 724 static_assert((is_same<value_type, typename allocator_type::value_type>::value), 725 "Invalid allocator::value_type"); 726 727 private: 728 typedef __hash_value_type<key_type, mapped_type> __value_type; 729 typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher; 730 typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal; 731 typedef typename allocator_traits<allocator_type>::template 732 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 733 rebind_alloc<__value_type> 734 #else 735 rebind_alloc<__value_type>::other 736 #endif 737 __allocator_type; 738 739 typedef __hash_table<__value_type, __hasher, 740 __key_equal, __allocator_type> __table; 741 742 __table __table_; 743 744 typedef typename __table::__node_pointer __node_pointer; 745 typedef typename __table::__node_const_pointer __node_const_pointer; 746 typedef typename __table::__node_traits __node_traits; 747 typedef typename __table::__node_allocator __node_allocator; 748 typedef typename __table::__node __node; 749 typedef __hash_map_node_destructor<__node_allocator> _Dp; 750 typedef unique_ptr<__node, _Dp> __node_holder; 751 typedef allocator_traits<allocator_type> __alloc_traits; 752 public: 753 typedef typename __alloc_traits::pointer pointer; 754 typedef typename __alloc_traits::const_pointer const_pointer; 755 typedef typename __alloc_traits::size_type size_type; 756 typedef typename __alloc_traits::difference_type difference_type; 757 758 typedef __hash_map_iterator<typename __table::iterator> iterator; 759 typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; 760 typedef __hash_map_iterator<typename __table::local_iterator> local_iterator; 761 typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator; 762 763 _LIBCPP_INLINE_VISIBILITY 764 unordered_map() 765 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) 766 { 767 #if _LIBCPP_DEBUG_LEVEL >= 2 768 __get_db()->__insert_c(this); 769 #endif 770 } 771 explicit unordered_map(size_type __n, const hasher& __hf = hasher(), 772 const key_equal& __eql = key_equal()); 773 unordered_map(size_type __n, const hasher& __hf, 774 const key_equal& __eql, 775 const allocator_type& __a); 776 template <class _InputIterator> 777 unordered_map(_InputIterator __first, _InputIterator __last); 778 template <class _InputIterator> 779 unordered_map(_InputIterator __first, _InputIterator __last, 780 size_type __n, const hasher& __hf = hasher(), 781 const key_equal& __eql = key_equal()); 782 template <class _InputIterator> 783 unordered_map(_InputIterator __first, _InputIterator __last, 784 size_type __n, const hasher& __hf, 785 const key_equal& __eql, 786 const allocator_type& __a); 787 explicit unordered_map(const allocator_type& __a); 788 unordered_map(const unordered_map& __u); 789 unordered_map(const unordered_map& __u, const allocator_type& __a); 790 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 791 unordered_map(unordered_map&& __u) 792 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); 793 unordered_map(unordered_map&& __u, const allocator_type& __a); 794 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 795 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 796 unordered_map(initializer_list<value_type> __il); 797 unordered_map(initializer_list<value_type> __il, size_type __n, 798 const hasher& __hf = hasher(), const key_equal& __eql = key_equal()); 799 unordered_map(initializer_list<value_type> __il, size_type __n, 800 const hasher& __hf, const key_equal& __eql, 801 const allocator_type& __a); 802 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 803 #if _LIBCPP_STD_VER > 11 804 _LIBCPP_INLINE_VISIBILITY 805 unordered_map(size_type __n, const allocator_type& __a) 806 : unordered_map(__n, hasher(), key_equal(), __a) {} 807 _LIBCPP_INLINE_VISIBILITY 808 unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a) 809 : unordered_map(__n, __hf, key_equal(), __a) {} 810 template <class _InputIterator> 811 _LIBCPP_INLINE_VISIBILITY 812 unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a) 813 : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {} 814 template <class _InputIterator> 815 _LIBCPP_INLINE_VISIBILITY 816 unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf, 817 const allocator_type& __a) 818 : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {} 819 _LIBCPP_INLINE_VISIBILITY 820 unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a) 821 : unordered_map(__il, __n, hasher(), key_equal(), __a) {} 822 _LIBCPP_INLINE_VISIBILITY 823 unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf, 824 const allocator_type& __a) 825 : unordered_map(__il, __n, __hf, key_equal(), __a) {} 826 #endif 827 // ~unordered_map() = default; 828 _LIBCPP_INLINE_VISIBILITY 829 unordered_map& operator=(const unordered_map& __u) 830 { 831 #if __cplusplus >= 201103L 832 __table_ = __u.__table_; 833 #else 834 if (this != &__u) { 835 __table_.clear(); 836 __table_.hash_function() = __u.__table_.hash_function(); 837 __table_.key_eq() = __u.__table_.key_eq(); 838 __table_.max_load_factor() = __u.__table_.max_load_factor(); 839 __table_.__copy_assign_alloc(__u.__table_); 840 insert(__u.begin(), __u.end()); 841 } 842 #endif 843 return *this; 844 } 845 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 846 unordered_map& operator=(unordered_map&& __u) 847 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); 848 #endif 849 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 850 unordered_map& operator=(initializer_list<value_type> __il); 851 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 852 853 _LIBCPP_INLINE_VISIBILITY 854 allocator_type get_allocator() const _NOEXCEPT 855 {return allocator_type(__table_.__node_alloc());} 856 857 _LIBCPP_INLINE_VISIBILITY 858 bool empty() const _NOEXCEPT {return __table_.size() == 0;} 859 _LIBCPP_INLINE_VISIBILITY 860 size_type size() const _NOEXCEPT {return __table_.size();} 861 _LIBCPP_INLINE_VISIBILITY 862 size_type max_size() const _NOEXCEPT {return __table_.max_size();} 863 864 _LIBCPP_INLINE_VISIBILITY 865 iterator begin() _NOEXCEPT {return __table_.begin();} 866 _LIBCPP_INLINE_VISIBILITY 867 iterator end() _NOEXCEPT {return __table_.end();} 868 _LIBCPP_INLINE_VISIBILITY 869 const_iterator begin() const _NOEXCEPT {return __table_.begin();} 870 _LIBCPP_INLINE_VISIBILITY 871 const_iterator end() const _NOEXCEPT {return __table_.end();} 872 _LIBCPP_INLINE_VISIBILITY 873 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} 874 _LIBCPP_INLINE_VISIBILITY 875 const_iterator cend() const _NOEXCEPT {return __table_.end();} 876 877 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 878 #ifndef _LIBCPP_HAS_NO_VARIADICS 879 880 template <class... _Args> 881 pair<iterator, bool> emplace(_Args&&... __args); 882 883 template <class... _Args> 884 _LIBCPP_INLINE_VISIBILITY 885 #if _LIBCPP_DEBUG_LEVEL >= 2 886 iterator emplace_hint(const_iterator __p, _Args&&... __args) 887 { 888 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, 889 "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not" 890 " referring to this unordered_map"); 891 return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first; 892 } 893 #else 894 iterator emplace_hint(const_iterator, _Args&&... __args) 895 {return emplace(_VSTD::forward<_Args>(__args)...).first;} 896 #endif 897 #endif // _LIBCPP_HAS_NO_VARIADICS 898 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 899 _LIBCPP_INLINE_VISIBILITY 900 pair<iterator, bool> insert(const value_type& __x) 901 {return __table_.__insert_unique(__x);} 902 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 903 template <class _Pp, 904 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 905 _LIBCPP_INLINE_VISIBILITY 906 pair<iterator, bool> insert(_Pp&& __x) 907 {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));} 908 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 909 _LIBCPP_INLINE_VISIBILITY 910 #if _LIBCPP_DEBUG_LEVEL >= 2 911 iterator insert(const_iterator __p, const value_type& __x) 912 { 913 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, 914 "unordered_map::insert(const_iterator, const value_type&) called with an iterator not" 915 " referring to this unordered_map"); 916 return insert(__x).first; 917 } 918 #else 919 iterator insert(const_iterator, const value_type& __x) 920 {return insert(__x).first;} 921 #endif 922 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 923 template <class _Pp, 924 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 925 _LIBCPP_INLINE_VISIBILITY 926 #if _LIBCPP_DEBUG_LEVEL >= 2 927 iterator insert(const_iterator __p, _Pp&& __x) 928 { 929 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, 930 "unordered_map::insert(const_iterator, value_type&&) called with an iterator not" 931 " referring to this unordered_map"); 932 return insert(_VSTD::forward<_Pp>(__x)).first; 933 } 934 #else 935 iterator insert(const_iterator, _Pp&& __x) 936 {return insert(_VSTD::forward<_Pp>(__x)).first;} 937 #endif 938 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 939 template <class _InputIterator> 940 void insert(_InputIterator __first, _InputIterator __last); 941 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 942 _LIBCPP_INLINE_VISIBILITY 943 void insert(initializer_list<value_type> __il) 944 {insert(__il.begin(), __il.end());} 945 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 946 947 _LIBCPP_INLINE_VISIBILITY 948 iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);} 949 _LIBCPP_INLINE_VISIBILITY 950 size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);} 951 _LIBCPP_INLINE_VISIBILITY 952 iterator erase(const_iterator __first, const_iterator __last) 953 {return __table_.erase(__first.__i_, __last.__i_);} 954 _LIBCPP_INLINE_VISIBILITY 955 void clear() _NOEXCEPT {__table_.clear();} 956 957 _LIBCPP_INLINE_VISIBILITY 958 void swap(unordered_map& __u) 959 _NOEXCEPT_(__is_nothrow_swappable<__table>::value) 960 {__table_.swap(__u.__table_);} 961 962 _LIBCPP_INLINE_VISIBILITY 963 hasher hash_function() const 964 {return __table_.hash_function().hash_function();} 965 _LIBCPP_INLINE_VISIBILITY 966 key_equal key_eq() const 967 {return __table_.key_eq().key_eq();} 968 969 _LIBCPP_INLINE_VISIBILITY 970 iterator find(const key_type& __k) {return __table_.find(__k);} 971 _LIBCPP_INLINE_VISIBILITY 972 const_iterator find(const key_type& __k) const {return __table_.find(__k);} 973 _LIBCPP_INLINE_VISIBILITY 974 size_type count(const key_type& __k) const {return __table_.__count_unique(__k);} 975 _LIBCPP_INLINE_VISIBILITY 976 pair<iterator, iterator> equal_range(const key_type& __k) 977 {return __table_.__equal_range_unique(__k);} 978 _LIBCPP_INLINE_VISIBILITY 979 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const 980 {return __table_.__equal_range_unique(__k);} 981 982 mapped_type& operator[](const key_type& __k); 983 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 984 mapped_type& operator[](key_type&& __k); 985 #endif 986 987 mapped_type& at(const key_type& __k); 988 const mapped_type& at(const key_type& __k) const; 989 990 _LIBCPP_INLINE_VISIBILITY 991 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} 992 _LIBCPP_INLINE_VISIBILITY 993 size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();} 994 995 _LIBCPP_INLINE_VISIBILITY 996 size_type bucket_size(size_type __n) const 997 {return __table_.bucket_size(__n);} 998 _LIBCPP_INLINE_VISIBILITY 999 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} 1000 1001 _LIBCPP_INLINE_VISIBILITY 1002 local_iterator begin(size_type __n) {return __table_.begin(__n);} 1003 _LIBCPP_INLINE_VISIBILITY 1004 local_iterator end(size_type __n) {return __table_.end(__n);} 1005 _LIBCPP_INLINE_VISIBILITY 1006 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} 1007 _LIBCPP_INLINE_VISIBILITY 1008 const_local_iterator end(size_type __n) const {return __table_.cend(__n);} 1009 _LIBCPP_INLINE_VISIBILITY 1010 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} 1011 _LIBCPP_INLINE_VISIBILITY 1012 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} 1013 1014 _LIBCPP_INLINE_VISIBILITY 1015 float load_factor() const _NOEXCEPT {return __table_.load_factor();} 1016 _LIBCPP_INLINE_VISIBILITY 1017 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} 1018 _LIBCPP_INLINE_VISIBILITY 1019 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} 1020 _LIBCPP_INLINE_VISIBILITY 1021 void rehash(size_type __n) {__table_.rehash(__n);} 1022 _LIBCPP_INLINE_VISIBILITY 1023 void reserve(size_type __n) {__table_.reserve(__n);} 1024 1025 #if _LIBCPP_DEBUG_LEVEL >= 2 1026 1027 bool __dereferenceable(const const_iterator* __i) const 1028 {return __table_.__dereferenceable(&__i->__i_);} 1029 bool __decrementable(const const_iterator* __i) const 1030 {return __table_.__decrementable(&__i->__i_);} 1031 bool __addable(const const_iterator* __i, ptrdiff_t __n) const 1032 {return __table_.__addable(&__i->__i_, __n);} 1033 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const 1034 {return __table_.__addable(&__i->__i_, __n);} 1035 1036 #endif // _LIBCPP_DEBUG_LEVEL >= 2 1037 1038 private: 1039 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1040 __node_holder __construct_node(); 1041 template <class _A0> 1042 __node_holder 1043 __construct_node(_A0&& __a0); 1044 __node_holder __construct_node_with_key(key_type&& __k); 1045 #ifndef _LIBCPP_HAS_NO_VARIADICS 1046 template <class _A0, class _A1, class ..._Args> 1047 __node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args); 1048 #endif // _LIBCPP_HAS_NO_VARIADICS 1049 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1050 __node_holder __construct_node_with_key(const key_type& __k); 1051 }; 1052 1053 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1054 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 1055 size_type __n, const hasher& __hf, const key_equal& __eql) 1056 : __table_(__hf, __eql) 1057 { 1058 #if _LIBCPP_DEBUG_LEVEL >= 2 1059 __get_db()->__insert_c(this); 1060 #endif 1061 __table_.rehash(__n); 1062 } 1063 1064 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1065 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 1066 size_type __n, const hasher& __hf, const key_equal& __eql, 1067 const allocator_type& __a) 1068 : __table_(__hf, __eql, __a) 1069 { 1070 #if _LIBCPP_DEBUG_LEVEL >= 2 1071 __get_db()->__insert_c(this); 1072 #endif 1073 __table_.rehash(__n); 1074 } 1075 1076 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1077 inline _LIBCPP_INLINE_VISIBILITY 1078 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 1079 const allocator_type& __a) 1080 : __table_(__a) 1081 { 1082 #if _LIBCPP_DEBUG_LEVEL >= 2 1083 __get_db()->__insert_c(this); 1084 #endif 1085 } 1086 1087 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1088 template <class _InputIterator> 1089 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 1090 _InputIterator __first, _InputIterator __last) 1091 { 1092 #if _LIBCPP_DEBUG_LEVEL >= 2 1093 __get_db()->__insert_c(this); 1094 #endif 1095 insert(__first, __last); 1096 } 1097 1098 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1099 template <class _InputIterator> 1100 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 1101 _InputIterator __first, _InputIterator __last, size_type __n, 1102 const hasher& __hf, const key_equal& __eql) 1103 : __table_(__hf, __eql) 1104 { 1105 #if _LIBCPP_DEBUG_LEVEL >= 2 1106 __get_db()->__insert_c(this); 1107 #endif 1108 __table_.rehash(__n); 1109 insert(__first, __last); 1110 } 1111 1112 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1113 template <class _InputIterator> 1114 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 1115 _InputIterator __first, _InputIterator __last, size_type __n, 1116 const hasher& __hf, const key_equal& __eql, const allocator_type& __a) 1117 : __table_(__hf, __eql, __a) 1118 { 1119 #if _LIBCPP_DEBUG_LEVEL >= 2 1120 __get_db()->__insert_c(this); 1121 #endif 1122 __table_.rehash(__n); 1123 insert(__first, __last); 1124 } 1125 1126 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1127 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 1128 const unordered_map& __u) 1129 : __table_(__u.__table_) 1130 { 1131 #if _LIBCPP_DEBUG_LEVEL >= 2 1132 __get_db()->__insert_c(this); 1133 #endif 1134 __table_.rehash(__u.bucket_count()); 1135 insert(__u.begin(), __u.end()); 1136 } 1137 1138 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1139 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 1140 const unordered_map& __u, const allocator_type& __a) 1141 : __table_(__u.__table_, __a) 1142 { 1143 #if _LIBCPP_DEBUG_LEVEL >= 2 1144 __get_db()->__insert_c(this); 1145 #endif 1146 __table_.rehash(__u.bucket_count()); 1147 insert(__u.begin(), __u.end()); 1148 } 1149 1150 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1151 1152 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1153 inline _LIBCPP_INLINE_VISIBILITY 1154 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 1155 unordered_map&& __u) 1156 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) 1157 : __table_(_VSTD::move(__u.__table_)) 1158 { 1159 #if _LIBCPP_DEBUG_LEVEL >= 2 1160 __get_db()->__insert_c(this); 1161 __get_db()->swap(this, &__u); 1162 #endif 1163 } 1164 1165 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1166 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 1167 unordered_map&& __u, const allocator_type& __a) 1168 : __table_(_VSTD::move(__u.__table_), __a) 1169 { 1170 #if _LIBCPP_DEBUG_LEVEL >= 2 1171 __get_db()->__insert_c(this); 1172 #endif 1173 if (__a != __u.get_allocator()) 1174 { 1175 iterator __i = __u.begin(); 1176 while (__u.size() != 0) 1177 __table_.__insert_unique( 1178 _VSTD::move(__u.__table_.remove((__i++).__i_)->__value_) 1179 ); 1180 } 1181 #if _LIBCPP_DEBUG_LEVEL >= 2 1182 else 1183 __get_db()->swap(this, &__u); 1184 #endif 1185 } 1186 1187 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1188 1189 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1190 1191 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1192 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 1193 initializer_list<value_type> __il) 1194 { 1195 #if _LIBCPP_DEBUG_LEVEL >= 2 1196 __get_db()->__insert_c(this); 1197 #endif 1198 insert(__il.begin(), __il.end()); 1199 } 1200 1201 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1202 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 1203 initializer_list<value_type> __il, size_type __n, const hasher& __hf, 1204 const key_equal& __eql) 1205 : __table_(__hf, __eql) 1206 { 1207 #if _LIBCPP_DEBUG_LEVEL >= 2 1208 __get_db()->__insert_c(this); 1209 #endif 1210 __table_.rehash(__n); 1211 insert(__il.begin(), __il.end()); 1212 } 1213 1214 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1215 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 1216 initializer_list<value_type> __il, size_type __n, const hasher& __hf, 1217 const key_equal& __eql, const allocator_type& __a) 1218 : __table_(__hf, __eql, __a) 1219 { 1220 #if _LIBCPP_DEBUG_LEVEL >= 2 1221 __get_db()->__insert_c(this); 1222 #endif 1223 __table_.rehash(__n); 1224 insert(__il.begin(), __il.end()); 1225 } 1226 1227 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1228 1229 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1230 1231 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1232 inline _LIBCPP_INLINE_VISIBILITY 1233 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& 1234 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u) 1235 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) 1236 { 1237 __table_ = _VSTD::move(__u.__table_); 1238 return *this; 1239 } 1240 1241 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1242 1243 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1244 1245 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1246 inline _LIBCPP_INLINE_VISIBILITY 1247 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& 1248 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=( 1249 initializer_list<value_type> __il) 1250 { 1251 __table_.__assign_unique(__il.begin(), __il.end()); 1252 return *this; 1253 } 1254 1255 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1256 1257 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1258 1259 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1260 typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder 1261 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node() 1262 { 1263 __node_allocator& __na = __table_.__node_alloc(); 1264 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1265 __node_traits::construct(__na, _VSTD::addressof(__h->__value_)); 1266 __h.get_deleter().__first_constructed = true; 1267 __h.get_deleter().__second_constructed = true; 1268 return __h; 1269 } 1270 1271 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1272 template <class _A0> 1273 typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder 1274 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0) 1275 { 1276 __node_allocator& __na = __table_.__node_alloc(); 1277 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1278 __node_traits::construct(__na, _VSTD::addressof(__h->__value_), 1279 _VSTD::forward<_A0>(__a0)); 1280 __h.get_deleter().__first_constructed = true; 1281 __h.get_deleter().__second_constructed = true; 1282 return __h; 1283 } 1284 1285 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1286 typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder 1287 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(key_type&& __k) 1288 { 1289 __node_allocator& __na = __table_.__node_alloc(); 1290 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1291 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), _VSTD::move(__k)); 1292 __h.get_deleter().__first_constructed = true; 1293 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); 1294 __h.get_deleter().__second_constructed = true; 1295 return __h; 1296 } 1297 1298 #ifndef _LIBCPP_HAS_NO_VARIADICS 1299 1300 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1301 template <class _A0, class _A1, class ..._Args> 1302 typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder 1303 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0, 1304 _A1&& __a1, 1305 _Args&&... __args) 1306 { 1307 __node_allocator& __na = __table_.__node_alloc(); 1308 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1309 __node_traits::construct(__na, _VSTD::addressof(__h->__value_), 1310 _VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1), 1311 _VSTD::forward<_Args>(__args)...); 1312 __h.get_deleter().__first_constructed = true; 1313 __h.get_deleter().__second_constructed = true; 1314 return __h; 1315 } 1316 1317 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1318 template <class... _Args> 1319 pair<typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator, bool> 1320 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace(_Args&&... __args) 1321 { 1322 __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); 1323 pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get()); 1324 if (__r.second) 1325 __h.release(); 1326 return __r; 1327 } 1328 1329 #endif // _LIBCPP_HAS_NO_VARIADICS 1330 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1331 1332 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1333 typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder 1334 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k) 1335 { 1336 __node_allocator& __na = __table_.__node_alloc(); 1337 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1338 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k); 1339 __h.get_deleter().__first_constructed = true; 1340 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); 1341 __h.get_deleter().__second_constructed = true; 1342 return _VSTD::move(__h); // explicitly moved for C++03 1343 } 1344 1345 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1346 template <class _InputIterator> 1347 inline _LIBCPP_INLINE_VISIBILITY 1348 void 1349 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, 1350 _InputIterator __last) 1351 { 1352 for (; __first != __last; ++__first) 1353 __table_.__insert_unique(*__first); 1354 } 1355 1356 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1357 _Tp& 1358 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k) 1359 { 1360 iterator __i = find(__k); 1361 if (__i != end()) 1362 return __i->second; 1363 __node_holder __h = __construct_node_with_key(__k); 1364 pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get()); 1365 __h.release(); 1366 return __r.first->second; 1367 } 1368 1369 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1370 1371 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1372 _Tp& 1373 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k) 1374 { 1375 iterator __i = find(__k); 1376 if (__i != end()) 1377 return __i->second; 1378 __node_holder __h = __construct_node_with_key(_VSTD::move(__k)); 1379 pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get()); 1380 __h.release(); 1381 return __r.first->second; 1382 } 1383 1384 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1385 1386 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1387 _Tp& 1388 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) 1389 { 1390 iterator __i = find(__k); 1391 #ifndef _LIBCPP_NO_EXCEPTIONS 1392 if (__i == end()) 1393 throw out_of_range("unordered_map::at: key not found"); 1394 #endif // _LIBCPP_NO_EXCEPTIONS 1395 return __i->second; 1396 } 1397 1398 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1399 const _Tp& 1400 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const 1401 { 1402 const_iterator __i = find(__k); 1403 #ifndef _LIBCPP_NO_EXCEPTIONS 1404 if (__i == end()) 1405 throw out_of_range("unordered_map::at: key not found"); 1406 #endif // _LIBCPP_NO_EXCEPTIONS 1407 return __i->second; 1408 } 1409 1410 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1411 inline _LIBCPP_INLINE_VISIBILITY 1412 void 1413 swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 1414 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 1415 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 1416 { 1417 __x.swap(__y); 1418 } 1419 1420 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1421 bool 1422 operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 1423 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 1424 { 1425 if (__x.size() != __y.size()) 1426 return false; 1427 typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator 1428 const_iterator; 1429 for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end(); 1430 __i != __ex; ++__i) 1431 { 1432 const_iterator __j = __y.find(__i->first); 1433 if (__j == __ey || !(*__i == *__j)) 1434 return false; 1435 } 1436 return true; 1437 } 1438 1439 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1440 inline _LIBCPP_INLINE_VISIBILITY 1441 bool 1442 operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 1443 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 1444 { 1445 return !(__x == __y); 1446 } 1447 1448 template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>, 1449 class _Alloc = allocator<pair<const _Key, _Tp> > > 1450 class _LIBCPP_TYPE_VIS_ONLY unordered_multimap 1451 { 1452 public: 1453 // types 1454 typedef _Key key_type; 1455 typedef _Tp mapped_type; 1456 typedef _Hash hasher; 1457 typedef _Pred key_equal; 1458 typedef _Alloc allocator_type; 1459 typedef pair<const key_type, mapped_type> value_type; 1460 typedef pair<key_type, mapped_type> __nc_value_type; 1461 typedef value_type& reference; 1462 typedef const value_type& const_reference; 1463 static_assert((is_same<value_type, typename allocator_type::value_type>::value), 1464 "Invalid allocator::value_type"); 1465 1466 private: 1467 typedef __hash_value_type<key_type, mapped_type> __value_type; 1468 typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher; 1469 typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal; 1470 typedef typename allocator_traits<allocator_type>::template 1471 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 1472 rebind_alloc<__value_type> 1473 #else 1474 rebind_alloc<__value_type>::other 1475 #endif 1476 __allocator_type; 1477 1478 typedef __hash_table<__value_type, __hasher, 1479 __key_equal, __allocator_type> __table; 1480 1481 __table __table_; 1482 1483 typedef typename __table::__node_traits __node_traits; 1484 typedef typename __table::__node_allocator __node_allocator; 1485 typedef typename __table::__node __node; 1486 typedef __hash_map_node_destructor<__node_allocator> _Dp; 1487 typedef unique_ptr<__node, _Dp> __node_holder; 1488 typedef allocator_traits<allocator_type> __alloc_traits; 1489 public: 1490 typedef typename __alloc_traits::pointer pointer; 1491 typedef typename __alloc_traits::const_pointer const_pointer; 1492 typedef typename __alloc_traits::size_type size_type; 1493 typedef typename __alloc_traits::difference_type difference_type; 1494 1495 typedef __hash_map_iterator<typename __table::iterator> iterator; 1496 typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; 1497 typedef __hash_map_iterator<typename __table::local_iterator> local_iterator; 1498 typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator; 1499 1500 _LIBCPP_INLINE_VISIBILITY 1501 unordered_multimap() 1502 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) 1503 { 1504 #if _LIBCPP_DEBUG_LEVEL >= 2 1505 __get_db()->__insert_c(this); 1506 #endif 1507 } 1508 explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(), 1509 const key_equal& __eql = key_equal()); 1510 unordered_multimap(size_type __n, const hasher& __hf, 1511 const key_equal& __eql, 1512 const allocator_type& __a); 1513 template <class _InputIterator> 1514 unordered_multimap(_InputIterator __first, _InputIterator __last); 1515 template <class _InputIterator> 1516 unordered_multimap(_InputIterator __first, _InputIterator __last, 1517 size_type __n, const hasher& __hf = hasher(), 1518 const key_equal& __eql = key_equal()); 1519 template <class _InputIterator> 1520 unordered_multimap(_InputIterator __first, _InputIterator __last, 1521 size_type __n, const hasher& __hf, 1522 const key_equal& __eql, 1523 const allocator_type& __a); 1524 explicit unordered_multimap(const allocator_type& __a); 1525 unordered_multimap(const unordered_multimap& __u); 1526 unordered_multimap(const unordered_multimap& __u, const allocator_type& __a); 1527 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1528 unordered_multimap(unordered_multimap&& __u) 1529 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); 1530 unordered_multimap(unordered_multimap&& __u, const allocator_type& __a); 1531 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1532 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1533 unordered_multimap(initializer_list<value_type> __il); 1534 unordered_multimap(initializer_list<value_type> __il, size_type __n, 1535 const hasher& __hf = hasher(), 1536 const key_equal& __eql = key_equal()); 1537 unordered_multimap(initializer_list<value_type> __il, size_type __n, 1538 const hasher& __hf, const key_equal& __eql, 1539 const allocator_type& __a); 1540 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1541 #if _LIBCPP_STD_VER > 11 1542 _LIBCPP_INLINE_VISIBILITY 1543 unordered_multimap(size_type __n, const allocator_type& __a) 1544 : unordered_multimap(__n, hasher(), key_equal(), __a) {} 1545 _LIBCPP_INLINE_VISIBILITY 1546 unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a) 1547 : unordered_multimap(__n, __hf, key_equal(), __a) {} 1548 template <class _InputIterator> 1549 _LIBCPP_INLINE_VISIBILITY 1550 unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a) 1551 : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {} 1552 template <class _InputIterator> 1553 _LIBCPP_INLINE_VISIBILITY 1554 unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf, 1555 const allocator_type& __a) 1556 : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {} 1557 _LIBCPP_INLINE_VISIBILITY 1558 unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a) 1559 : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {} 1560 _LIBCPP_INLINE_VISIBILITY 1561 unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf, 1562 const allocator_type& __a) 1563 : unordered_multimap(__il, __n, __hf, key_equal(), __a) {} 1564 #endif 1565 // ~unordered_multimap() = default; 1566 _LIBCPP_INLINE_VISIBILITY 1567 unordered_multimap& operator=(const unordered_multimap& __u) 1568 { 1569 #if __cplusplus >= 201103L 1570 __table_ = __u.__table_; 1571 #else 1572 if (this != &__u) { 1573 __table_.clear(); 1574 __table_.hash_function() = __u.__table_.hash_function(); 1575 __table_.key_eq() = __u.__table_.key_eq(); 1576 __table_.max_load_factor() = __u.__table_.max_load_factor(); 1577 __table_.__copy_assign_alloc(__u.__table_); 1578 insert(__u.begin(), __u.end()); 1579 } 1580 #endif 1581 return *this; 1582 } 1583 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1584 unordered_multimap& operator=(unordered_multimap&& __u) 1585 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); 1586 #endif 1587 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1588 unordered_multimap& operator=(initializer_list<value_type> __il); 1589 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1590 1591 _LIBCPP_INLINE_VISIBILITY 1592 allocator_type get_allocator() const _NOEXCEPT 1593 {return allocator_type(__table_.__node_alloc());} 1594 1595 _LIBCPP_INLINE_VISIBILITY 1596 bool empty() const _NOEXCEPT {return __table_.size() == 0;} 1597 _LIBCPP_INLINE_VISIBILITY 1598 size_type size() const _NOEXCEPT {return __table_.size();} 1599 _LIBCPP_INLINE_VISIBILITY 1600 size_type max_size() const _NOEXCEPT {return __table_.max_size();} 1601 1602 _LIBCPP_INLINE_VISIBILITY 1603 iterator begin() _NOEXCEPT {return __table_.begin();} 1604 _LIBCPP_INLINE_VISIBILITY 1605 iterator end() _NOEXCEPT {return __table_.end();} 1606 _LIBCPP_INLINE_VISIBILITY 1607 const_iterator begin() const _NOEXCEPT {return __table_.begin();} 1608 _LIBCPP_INLINE_VISIBILITY 1609 const_iterator end() const _NOEXCEPT {return __table_.end();} 1610 _LIBCPP_INLINE_VISIBILITY 1611 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} 1612 _LIBCPP_INLINE_VISIBILITY 1613 const_iterator cend() const _NOEXCEPT {return __table_.end();} 1614 1615 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1616 #ifndef _LIBCPP_HAS_NO_VARIADICS 1617 1618 template <class... _Args> 1619 iterator emplace(_Args&&... __args); 1620 1621 template <class... _Args> 1622 iterator emplace_hint(const_iterator __p, _Args&&... __args); 1623 #endif // _LIBCPP_HAS_NO_VARIADICS 1624 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1625 _LIBCPP_INLINE_VISIBILITY 1626 iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);} 1627 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1628 template <class _Pp, 1629 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1630 _LIBCPP_INLINE_VISIBILITY 1631 iterator insert(_Pp&& __x) 1632 {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));} 1633 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1634 _LIBCPP_INLINE_VISIBILITY 1635 iterator insert(const_iterator __p, const value_type& __x) 1636 {return __table_.__insert_multi(__p.__i_, __x);} 1637 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1638 template <class _Pp, 1639 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1640 _LIBCPP_INLINE_VISIBILITY 1641 iterator insert(const_iterator __p, _Pp&& __x) 1642 {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));} 1643 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1644 template <class _InputIterator> 1645 void insert(_InputIterator __first, _InputIterator __last); 1646 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1647 _LIBCPP_INLINE_VISIBILITY 1648 void insert(initializer_list<value_type> __il) 1649 {insert(__il.begin(), __il.end());} 1650 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1651 1652 _LIBCPP_INLINE_VISIBILITY 1653 iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);} 1654 _LIBCPP_INLINE_VISIBILITY 1655 size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);} 1656 _LIBCPP_INLINE_VISIBILITY 1657 iterator erase(const_iterator __first, const_iterator __last) 1658 {return __table_.erase(__first.__i_, __last.__i_);} 1659 _LIBCPP_INLINE_VISIBILITY 1660 void clear() _NOEXCEPT {__table_.clear();} 1661 1662 _LIBCPP_INLINE_VISIBILITY 1663 void swap(unordered_multimap& __u) 1664 _NOEXCEPT_(__is_nothrow_swappable<__table>::value) 1665 {__table_.swap(__u.__table_);} 1666 1667 _LIBCPP_INLINE_VISIBILITY 1668 hasher hash_function() const 1669 {return __table_.hash_function().hash_function();} 1670 _LIBCPP_INLINE_VISIBILITY 1671 key_equal key_eq() const 1672 {return __table_.key_eq().key_eq();} 1673 1674 _LIBCPP_INLINE_VISIBILITY 1675 iterator find(const key_type& __k) {return __table_.find(__k);} 1676 _LIBCPP_INLINE_VISIBILITY 1677 const_iterator find(const key_type& __k) const {return __table_.find(__k);} 1678 _LIBCPP_INLINE_VISIBILITY 1679 size_type count(const key_type& __k) const {return __table_.__count_multi(__k);} 1680 _LIBCPP_INLINE_VISIBILITY 1681 pair<iterator, iterator> equal_range(const key_type& __k) 1682 {return __table_.__equal_range_multi(__k);} 1683 _LIBCPP_INLINE_VISIBILITY 1684 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const 1685 {return __table_.__equal_range_multi(__k);} 1686 1687 _LIBCPP_INLINE_VISIBILITY 1688 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} 1689 _LIBCPP_INLINE_VISIBILITY 1690 size_type max_bucket_count() const _NOEXCEPT 1691 {return __table_.max_bucket_count();} 1692 1693 _LIBCPP_INLINE_VISIBILITY 1694 size_type bucket_size(size_type __n) const 1695 {return __table_.bucket_size(__n);} 1696 _LIBCPP_INLINE_VISIBILITY 1697 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} 1698 1699 _LIBCPP_INLINE_VISIBILITY 1700 local_iterator begin(size_type __n) {return __table_.begin(__n);} 1701 _LIBCPP_INLINE_VISIBILITY 1702 local_iterator end(size_type __n) {return __table_.end(__n);} 1703 _LIBCPP_INLINE_VISIBILITY 1704 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} 1705 _LIBCPP_INLINE_VISIBILITY 1706 const_local_iterator end(size_type __n) const {return __table_.cend(__n);} 1707 _LIBCPP_INLINE_VISIBILITY 1708 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} 1709 _LIBCPP_INLINE_VISIBILITY 1710 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} 1711 1712 _LIBCPP_INLINE_VISIBILITY 1713 float load_factor() const _NOEXCEPT {return __table_.load_factor();} 1714 _LIBCPP_INLINE_VISIBILITY 1715 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} 1716 _LIBCPP_INLINE_VISIBILITY 1717 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} 1718 _LIBCPP_INLINE_VISIBILITY 1719 void rehash(size_type __n) {__table_.rehash(__n);} 1720 _LIBCPP_INLINE_VISIBILITY 1721 void reserve(size_type __n) {__table_.reserve(__n);} 1722 1723 #if _LIBCPP_DEBUG_LEVEL >= 2 1724 1725 bool __dereferenceable(const const_iterator* __i) const 1726 {return __table_.__dereferenceable(&__i->__i_);} 1727 bool __decrementable(const const_iterator* __i) const 1728 {return __table_.__decrementable(&__i->__i_);} 1729 bool __addable(const const_iterator* __i, ptrdiff_t __n) const 1730 {return __table_.__addable(&__i->__i_, __n);} 1731 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const 1732 {return __table_.__addable(&__i->__i_, __n);} 1733 1734 #endif // _LIBCPP_DEBUG_LEVEL >= 2 1735 1736 private: 1737 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1738 __node_holder __construct_node(); 1739 template <class _A0> 1740 __node_holder 1741 __construct_node(_A0&& __a0); 1742 #ifndef _LIBCPP_HAS_NO_VARIADICS 1743 template <class _A0, class _A1, class ..._Args> 1744 __node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args); 1745 #endif // _LIBCPP_HAS_NO_VARIADICS 1746 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1747 }; 1748 1749 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1750 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 1751 size_type __n, const hasher& __hf, const key_equal& __eql) 1752 : __table_(__hf, __eql) 1753 { 1754 #if _LIBCPP_DEBUG_LEVEL >= 2 1755 __get_db()->__insert_c(this); 1756 #endif 1757 __table_.rehash(__n); 1758 } 1759 1760 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1761 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 1762 size_type __n, const hasher& __hf, const key_equal& __eql, 1763 const allocator_type& __a) 1764 : __table_(__hf, __eql, __a) 1765 { 1766 #if _LIBCPP_DEBUG_LEVEL >= 2 1767 __get_db()->__insert_c(this); 1768 #endif 1769 __table_.rehash(__n); 1770 } 1771 1772 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1773 template <class _InputIterator> 1774 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 1775 _InputIterator __first, _InputIterator __last) 1776 { 1777 #if _LIBCPP_DEBUG_LEVEL >= 2 1778 __get_db()->__insert_c(this); 1779 #endif 1780 insert(__first, __last); 1781 } 1782 1783 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1784 template <class _InputIterator> 1785 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 1786 _InputIterator __first, _InputIterator __last, size_type __n, 1787 const hasher& __hf, const key_equal& __eql) 1788 : __table_(__hf, __eql) 1789 { 1790 #if _LIBCPP_DEBUG_LEVEL >= 2 1791 __get_db()->__insert_c(this); 1792 #endif 1793 __table_.rehash(__n); 1794 insert(__first, __last); 1795 } 1796 1797 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1798 template <class _InputIterator> 1799 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 1800 _InputIterator __first, _InputIterator __last, size_type __n, 1801 const hasher& __hf, const key_equal& __eql, const allocator_type& __a) 1802 : __table_(__hf, __eql, __a) 1803 { 1804 #if _LIBCPP_DEBUG_LEVEL >= 2 1805 __get_db()->__insert_c(this); 1806 #endif 1807 __table_.rehash(__n); 1808 insert(__first, __last); 1809 } 1810 1811 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1812 inline _LIBCPP_INLINE_VISIBILITY 1813 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 1814 const allocator_type& __a) 1815 : __table_(__a) 1816 { 1817 #if _LIBCPP_DEBUG_LEVEL >= 2 1818 __get_db()->__insert_c(this); 1819 #endif 1820 } 1821 1822 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1823 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 1824 const unordered_multimap& __u) 1825 : __table_(__u.__table_) 1826 { 1827 #if _LIBCPP_DEBUG_LEVEL >= 2 1828 __get_db()->__insert_c(this); 1829 #endif 1830 __table_.rehash(__u.bucket_count()); 1831 insert(__u.begin(), __u.end()); 1832 } 1833 1834 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1835 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 1836 const unordered_multimap& __u, const allocator_type& __a) 1837 : __table_(__u.__table_, __a) 1838 { 1839 #if _LIBCPP_DEBUG_LEVEL >= 2 1840 __get_db()->__insert_c(this); 1841 #endif 1842 __table_.rehash(__u.bucket_count()); 1843 insert(__u.begin(), __u.end()); 1844 } 1845 1846 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1847 1848 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1849 inline _LIBCPP_INLINE_VISIBILITY 1850 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 1851 unordered_multimap&& __u) 1852 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) 1853 : __table_(_VSTD::move(__u.__table_)) 1854 { 1855 #if _LIBCPP_DEBUG_LEVEL >= 2 1856 __get_db()->__insert_c(this); 1857 __get_db()->swap(this, &__u); 1858 #endif 1859 } 1860 1861 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1862 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 1863 unordered_multimap&& __u, const allocator_type& __a) 1864 : __table_(_VSTD::move(__u.__table_), __a) 1865 { 1866 #if _LIBCPP_DEBUG_LEVEL >= 2 1867 __get_db()->__insert_c(this); 1868 #endif 1869 if (__a != __u.get_allocator()) 1870 { 1871 iterator __i = __u.begin(); 1872 while (__u.size() != 0) 1873 { 1874 __table_.__insert_multi( 1875 _VSTD::move(__u.__table_.remove((__i++).__i_)->__value_) 1876 ); 1877 } 1878 } 1879 #if _LIBCPP_DEBUG_LEVEL >= 2 1880 else 1881 __get_db()->swap(this, &__u); 1882 #endif 1883 } 1884 1885 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1886 1887 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1888 1889 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1890 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 1891 initializer_list<value_type> __il) 1892 { 1893 #if _LIBCPP_DEBUG_LEVEL >= 2 1894 __get_db()->__insert_c(this); 1895 #endif 1896 insert(__il.begin(), __il.end()); 1897 } 1898 1899 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1900 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 1901 initializer_list<value_type> __il, size_type __n, const hasher& __hf, 1902 const key_equal& __eql) 1903 : __table_(__hf, __eql) 1904 { 1905 #if _LIBCPP_DEBUG_LEVEL >= 2 1906 __get_db()->__insert_c(this); 1907 #endif 1908 __table_.rehash(__n); 1909 insert(__il.begin(), __il.end()); 1910 } 1911 1912 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1913 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 1914 initializer_list<value_type> __il, size_type __n, const hasher& __hf, 1915 const key_equal& __eql, const allocator_type& __a) 1916 : __table_(__hf, __eql, __a) 1917 { 1918 #if _LIBCPP_DEBUG_LEVEL >= 2 1919 __get_db()->__insert_c(this); 1920 #endif 1921 __table_.rehash(__n); 1922 insert(__il.begin(), __il.end()); 1923 } 1924 1925 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1926 1927 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1928 1929 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1930 inline _LIBCPP_INLINE_VISIBILITY 1931 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& 1932 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u) 1933 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) 1934 { 1935 __table_ = _VSTD::move(__u.__table_); 1936 return *this; 1937 } 1938 1939 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1940 1941 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1942 1943 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1944 inline _LIBCPP_INLINE_VISIBILITY 1945 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& 1946 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=( 1947 initializer_list<value_type> __il) 1948 { 1949 __table_.__assign_multi(__il.begin(), __il.end()); 1950 return *this; 1951 } 1952 1953 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1954 1955 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1956 1957 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1958 typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder 1959 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node() 1960 { 1961 __node_allocator& __na = __table_.__node_alloc(); 1962 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1963 __node_traits::construct(__na, _VSTD::addressof(__h->__value_)); 1964 __h.get_deleter().__first_constructed = true; 1965 __h.get_deleter().__second_constructed = true; 1966 return __h; 1967 } 1968 1969 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1970 template <class _A0> 1971 typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder 1972 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0) 1973 { 1974 __node_allocator& __na = __table_.__node_alloc(); 1975 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1976 __node_traits::construct(__na, _VSTD::addressof(__h->__value_), 1977 _VSTD::forward<_A0>(__a0)); 1978 __h.get_deleter().__first_constructed = true; 1979 __h.get_deleter().__second_constructed = true; 1980 return __h; 1981 } 1982 1983 #ifndef _LIBCPP_HAS_NO_VARIADICS 1984 1985 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1986 template <class _A0, class _A1, class ..._Args> 1987 typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder 1988 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node( 1989 _A0&& __a0, _A1&& __a1, _Args&&... __args) 1990 { 1991 __node_allocator& __na = __table_.__node_alloc(); 1992 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1993 __node_traits::construct(__na, _VSTD::addressof(__h->__value_), 1994 _VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1), 1995 _VSTD::forward<_Args>(__args)...); 1996 __h.get_deleter().__first_constructed = true; 1997 __h.get_deleter().__second_constructed = true; 1998 return __h; 1999 } 2000 2001 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2002 template <class... _Args> 2003 typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator 2004 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace(_Args&&... __args) 2005 { 2006 __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); 2007 iterator __r = __table_.__node_insert_multi(__h.get()); 2008 __h.release(); 2009 return __r; 2010 } 2011 2012 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2013 template <class... _Args> 2014 typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator 2015 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace_hint( 2016 const_iterator __p, _Args&&... __args) 2017 { 2018 __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); 2019 iterator __r = __table_.__node_insert_multi(__p.__i_, __h.get()); 2020 __h.release(); 2021 return __r; 2022 } 2023 2024 #endif // _LIBCPP_HAS_NO_VARIADICS 2025 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 2026 2027 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2028 template <class _InputIterator> 2029 inline _LIBCPP_INLINE_VISIBILITY 2030 void 2031 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, 2032 _InputIterator __last) 2033 { 2034 for (; __first != __last; ++__first) 2035 __table_.__insert_multi(*__first); 2036 } 2037 2038 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2039 inline _LIBCPP_INLINE_VISIBILITY 2040 void 2041 swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 2042 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 2043 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 2044 { 2045 __x.swap(__y); 2046 } 2047 2048 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2049 bool 2050 operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 2051 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 2052 { 2053 if (__x.size() != __y.size()) 2054 return false; 2055 typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator 2056 const_iterator; 2057 typedef pair<const_iterator, const_iterator> _EqRng; 2058 for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;) 2059 { 2060 _EqRng __xeq = __x.equal_range(__i->first); 2061 _EqRng __yeq = __y.equal_range(__i->first); 2062 if (_VSTD::distance(__xeq.first, __xeq.second) != 2063 _VSTD::distance(__yeq.first, __yeq.second) || 2064 !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first)) 2065 return false; 2066 __i = __xeq.second; 2067 } 2068 return true; 2069 } 2070 2071 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2072 inline _LIBCPP_INLINE_VISIBILITY 2073 bool 2074 operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 2075 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 2076 { 2077 return !(__x == __y); 2078 } 2079 2080 _LIBCPP_END_NAMESPACE_STD 2081 2082 #endif // _LIBCPP_UNORDERED_MAP 2083