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