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