1 // -*- C++ -*- 2 //===---------------------------- set -------------------------------------===// 3 // 4 // The LLVM Compiler Infrastructure 5 // 6 // This file is dual licensed under the MIT and the University of Illinois Open 7 // Source Licenses. See LICENSE.TXT for details. 8 // 9 //===----------------------------------------------------------------------===// 10 11 #ifndef _LIBCPP_SET 12 #define _LIBCPP_SET 13 14 /* 15 16 set synopsis 17 18 namespace std 19 { 20 21 template <class Key, class Compare = less<Key>, 22 class Allocator = allocator<Key>> 23 class set 24 { 25 public: 26 // types: 27 typedef Key key_type; 28 typedef key_type value_type; 29 typedef Compare key_compare; 30 typedef key_compare value_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::size_type size_type; 35 typedef typename allocator_type::difference_type difference_type; 36 typedef typename allocator_type::pointer pointer; 37 typedef typename allocator_type::const_pointer const_pointer; 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 // construct/copy/destroy: 45 set() 46 noexcept( 47 is_nothrow_default_constructible<allocator_type>::value && 48 is_nothrow_default_constructible<key_compare>::value && 49 is_nothrow_copy_constructible<key_compare>::value); 50 explicit set(const value_compare& comp); 51 set(const value_compare& comp, const allocator_type& a); 52 template <class InputIterator> 53 set(InputIterator first, InputIterator last, 54 const value_compare& comp = value_compare()); 55 template <class InputIterator> 56 set(InputIterator first, InputIterator last, const value_compare& comp, 57 const allocator_type& a); 58 set(const set& s); 59 set(set&& s) 60 noexcept( 61 is_nothrow_move_constructible<allocator_type>::value && 62 is_nothrow_move_constructible<key_compare>::value); 63 explicit set(const allocator_type& a); 64 set(const set& s, const allocator_type& a); 65 set(set&& s, const allocator_type& a); 66 set(initializer_list<value_type> il, const value_compare& comp = value_compare()); 67 set(initializer_list<value_type> il, const value_compare& comp, 68 const allocator_type& a); 69 template <class InputIterator> 70 set(InputIterator first, InputIterator last, const allocator_type& a) 71 : set(first, last, Compare(), a) {} // C++14 72 set(initializer_list<value_type> il, const allocator_type& a) 73 : set(il, Compare(), a) {} // C++14 74 ~set(); 75 76 set& operator=(const set& s); 77 set& operator=(set&& s) 78 noexcept( 79 allocator_type::propagate_on_container_move_assignment::value && 80 is_nothrow_move_assignable<allocator_type>::value && 81 is_nothrow_move_assignable<key_compare>::value); 82 set& operator=(initializer_list<value_type> il); 83 84 // iterators: 85 iterator begin() noexcept; 86 const_iterator begin() const noexcept; 87 iterator end() noexcept; 88 const_iterator end() const noexcept; 89 90 reverse_iterator rbegin() noexcept; 91 const_reverse_iterator rbegin() const noexcept; 92 reverse_iterator rend() noexcept; 93 const_reverse_iterator rend() const noexcept; 94 95 const_iterator cbegin() const noexcept; 96 const_iterator cend() const noexcept; 97 const_reverse_iterator crbegin() const noexcept; 98 const_reverse_iterator crend() const noexcept; 99 100 // capacity: 101 bool empty() const noexcept; 102 size_type size() const noexcept; 103 size_type max_size() const noexcept; 104 105 // modifiers: 106 template <class... Args> 107 pair<iterator, bool> emplace(Args&&... args); 108 template <class... Args> 109 iterator emplace_hint(const_iterator position, Args&&... args); 110 pair<iterator,bool> insert(const value_type& v); 111 pair<iterator,bool> insert(value_type&& v); 112 iterator insert(const_iterator position, const value_type& v); 113 iterator insert(const_iterator position, value_type&& v); 114 template <class InputIterator> 115 void insert(InputIterator first, InputIterator last); 116 void insert(initializer_list<value_type> il); 117 118 iterator erase(const_iterator position); 119 size_type erase(const key_type& k); 120 iterator erase(const_iterator first, const_iterator last); 121 void clear() noexcept; 122 123 void swap(set& s) 124 noexcept( 125 __is_nothrow_swappable<key_compare>::value && 126 (!allocator_type::propagate_on_container_swap::value || 127 __is_nothrow_swappable<allocator_type>::value)); 128 129 // observers: 130 allocator_type get_allocator() const noexcept; 131 key_compare key_comp() const; 132 value_compare value_comp() const; 133 134 // set operations: 135 iterator find(const key_type& k); 136 const_iterator find(const key_type& k) const; 137 template<typename K> 138 iterator find(const K& x); 139 template<typename K> 140 const_iterator find(const K& x) const; // C++14 141 template<typename K> 142 size_type count(const K& x) const; // C++14 143 144 size_type count(const key_type& k) const; 145 iterator lower_bound(const key_type& k); 146 const_iterator lower_bound(const key_type& k) const; 147 template<typename K> 148 iterator lower_bound(const K& x); // C++14 149 template<typename K> 150 const_iterator lower_bound(const K& x) const; // C++14 151 152 iterator upper_bound(const key_type& k); 153 const_iterator upper_bound(const key_type& k) const; 154 template<typename K> 155 iterator upper_bound(const K& x); // C++14 156 template<typename K> 157 const_iterator upper_bound(const K& x) const; // C++14 158 pair<iterator,iterator> equal_range(const key_type& k); 159 pair<const_iterator,const_iterator> equal_range(const key_type& k) const; 160 template<typename K> 161 pair<iterator,iterator> equal_range(const K& x); // C++14 162 template<typename K> 163 pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14 164 }; 165 166 template <class Key, class Compare, class Allocator> 167 bool 168 operator==(const set<Key, Compare, Allocator>& x, 169 const set<Key, Compare, Allocator>& y); 170 171 template <class Key, class Compare, class Allocator> 172 bool 173 operator< (const set<Key, Compare, Allocator>& x, 174 const set<Key, Compare, Allocator>& y); 175 176 template <class Key, class Compare, class Allocator> 177 bool 178 operator!=(const set<Key, Compare, Allocator>& x, 179 const set<Key, Compare, Allocator>& y); 180 181 template <class Key, class Compare, class Allocator> 182 bool 183 operator> (const set<Key, Compare, Allocator>& x, 184 const set<Key, Compare, Allocator>& y); 185 186 template <class Key, class Compare, class Allocator> 187 bool 188 operator>=(const set<Key, Compare, Allocator>& x, 189 const set<Key, Compare, Allocator>& y); 190 191 template <class Key, class Compare, class Allocator> 192 bool 193 operator<=(const set<Key, Compare, Allocator>& x, 194 const set<Key, Compare, Allocator>& y); 195 196 // specialized algorithms: 197 template <class Key, class Compare, class Allocator> 198 void 199 swap(set<Key, Compare, Allocator>& x, set<Key, Compare, Allocator>& y) 200 noexcept(noexcept(x.swap(y))); 201 202 template <class Key, class Compare = less<Key>, 203 class Allocator = allocator<Key>> 204 class multiset 205 { 206 public: 207 // types: 208 typedef Key key_type; 209 typedef key_type value_type; 210 typedef Compare key_compare; 211 typedef key_compare value_compare; 212 typedef Allocator allocator_type; 213 typedef typename allocator_type::reference reference; 214 typedef typename allocator_type::const_reference const_reference; 215 typedef typename allocator_type::size_type size_type; 216 typedef typename allocator_type::difference_type difference_type; 217 typedef typename allocator_type::pointer pointer; 218 typedef typename allocator_type::const_pointer const_pointer; 219 220 typedef implementation-defined iterator; 221 typedef implementation-defined const_iterator; 222 typedef std::reverse_iterator<iterator> reverse_iterator; 223 typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 224 225 // construct/copy/destroy: 226 multiset() 227 noexcept( 228 is_nothrow_default_constructible<allocator_type>::value && 229 is_nothrow_default_constructible<key_compare>::value && 230 is_nothrow_copy_constructible<key_compare>::value); 231 explicit multiset(const value_compare& comp); 232 multiset(const value_compare& comp, const allocator_type& a); 233 template <class InputIterator> 234 multiset(InputIterator first, InputIterator last, 235 const value_compare& comp = value_compare()); 236 template <class InputIterator> 237 multiset(InputIterator first, InputIterator last, 238 const value_compare& comp, const allocator_type& a); 239 multiset(const multiset& s); 240 multiset(multiset&& s) 241 noexcept( 242 is_nothrow_move_constructible<allocator_type>::value && 243 is_nothrow_move_constructible<key_compare>::value); 244 explicit multiset(const allocator_type& a); 245 multiset(const multiset& s, const allocator_type& a); 246 multiset(multiset&& s, const allocator_type& a); 247 multiset(initializer_list<value_type> il, const value_compare& comp = value_compare()); 248 multiset(initializer_list<value_type> il, const value_compare& comp, 249 const allocator_type& a); 250 template <class InputIterator> 251 multiset(InputIterator first, InputIterator last, const allocator_type& a) 252 : set(first, last, Compare(), a) {} // C++14 253 multiset(initializer_list<value_type> il, const allocator_type& a) 254 : set(il, Compare(), a) {} // C++14 255 ~multiset(); 256 257 multiset& operator=(const multiset& s); 258 multiset& operator=(multiset&& s) 259 noexcept( 260 allocator_type::propagate_on_container_move_assignment::value && 261 is_nothrow_move_assignable<allocator_type>::value && 262 is_nothrow_move_assignable<key_compare>::value); 263 multiset& operator=(initializer_list<value_type> il); 264 265 // iterators: 266 iterator begin() noexcept; 267 const_iterator begin() const noexcept; 268 iterator end() noexcept; 269 const_iterator end() const noexcept; 270 271 reverse_iterator rbegin() noexcept; 272 const_reverse_iterator rbegin() const noexcept; 273 reverse_iterator rend() noexcept; 274 const_reverse_iterator rend() const noexcept; 275 276 const_iterator cbegin() const noexcept; 277 const_iterator cend() const noexcept; 278 const_reverse_iterator crbegin() const noexcept; 279 const_reverse_iterator crend() const noexcept; 280 281 // capacity: 282 bool empty() const noexcept; 283 size_type size() const noexcept; 284 size_type max_size() const noexcept; 285 286 // modifiers: 287 template <class... Args> 288 iterator emplace(Args&&... args); 289 template <class... Args> 290 iterator emplace_hint(const_iterator position, Args&&... args); 291 iterator insert(const value_type& v); 292 iterator insert(value_type&& v); 293 iterator insert(const_iterator position, const value_type& v); 294 iterator insert(const_iterator position, value_type&& v); 295 template <class InputIterator> 296 void insert(InputIterator first, InputIterator last); 297 void insert(initializer_list<value_type> il); 298 299 iterator erase(const_iterator position); 300 size_type erase(const key_type& k); 301 iterator erase(const_iterator first, const_iterator last); 302 void clear() noexcept; 303 304 void swap(multiset& s) 305 noexcept( 306 __is_nothrow_swappable<key_compare>::value && 307 (!allocator_type::propagate_on_container_swap::value || 308 __is_nothrow_swappable<allocator_type>::value)); 309 310 // observers: 311 allocator_type get_allocator() const noexcept; 312 key_compare key_comp() const; 313 value_compare value_comp() const; 314 315 // set operations: 316 iterator find(const key_type& k); 317 const_iterator find(const key_type& k) const; 318 template<typename K> 319 iterator find(const K& x); 320 template<typename K> 321 const_iterator find(const K& x) const; // C++14 322 323 size_type count(const key_type& k) const; 324 iterator lower_bound(const key_type& k); 325 const_iterator lower_bound(const key_type& k) const; 326 template<typename K> 327 iterator lower_bound(const K& x); // C++14 328 template<typename K> 329 const_iterator lower_bound(const K& x) const; // C++14 330 331 iterator upper_bound(const key_type& k); 332 const_iterator upper_bound(const key_type& k) const; 333 template<typename K> 334 iterator upper_bound(const K& x); // C++14 335 template<typename K> 336 const_iterator upper_bound(const K& x) const; // C++14 337 338 pair<iterator,iterator> equal_range(const key_type& k); 339 pair<const_iterator,const_iterator> equal_range(const key_type& k) const; 340 template<typename K> 341 pair<iterator,iterator> equal_range(const K& x); // C++14 342 template<typename K> 343 pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14 344 }; 345 346 template <class Key, class Compare, class Allocator> 347 bool 348 operator==(const multiset<Key, Compare, Allocator>& x, 349 const multiset<Key, Compare, Allocator>& y); 350 351 template <class Key, class Compare, class Allocator> 352 bool 353 operator< (const multiset<Key, Compare, Allocator>& x, 354 const multiset<Key, Compare, Allocator>& y); 355 356 template <class Key, class Compare, class Allocator> 357 bool 358 operator!=(const multiset<Key, Compare, Allocator>& x, 359 const multiset<Key, Compare, Allocator>& y); 360 361 template <class Key, class Compare, class Allocator> 362 bool 363 operator> (const multiset<Key, Compare, Allocator>& x, 364 const multiset<Key, Compare, Allocator>& y); 365 366 template <class Key, class Compare, class Allocator> 367 bool 368 operator>=(const multiset<Key, Compare, Allocator>& x, 369 const multiset<Key, Compare, Allocator>& y); 370 371 template <class Key, class Compare, class Allocator> 372 bool 373 operator<=(const multiset<Key, Compare, Allocator>& x, 374 const multiset<Key, Compare, Allocator>& y); 375 376 // specialized algorithms: 377 template <class Key, class Compare, class Allocator> 378 void 379 swap(multiset<Key, Compare, Allocator>& x, multiset<Key, Compare, Allocator>& y) 380 noexcept(noexcept(x.swap(y))); 381 382 } // std 383 384 */ 385 386 #include <__config> 387 #include <__tree> 388 #include <functional> 389 390 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 391 #pragma GCC system_header 392 #endif 393 394 _LIBCPP_BEGIN_NAMESPACE_STD 395 396 template <class _Key, class _Compare = less<_Key>, 397 class _Allocator = allocator<_Key> > 398 class _LIBCPP_TYPE_VIS_ONLY set 399 { 400 public: 401 // types: 402 typedef _Key key_type; 403 typedef key_type value_type; 404 typedef _Compare key_compare; 405 typedef key_compare value_compare; 406 typedef _Allocator allocator_type; 407 typedef value_type& reference; 408 typedef const value_type& const_reference; 409 410 private: 411 typedef __tree<value_type, value_compare, allocator_type> __base; 412 typedef allocator_traits<allocator_type> __alloc_traits; 413 typedef typename __base::__node_holder __node_holder; 414 415 __base __tree_; 416 417 public: 418 typedef typename __base::pointer pointer; 419 typedef typename __base::const_pointer const_pointer; 420 typedef typename __base::size_type size_type; 421 typedef typename __base::difference_type difference_type; 422 typedef typename __base::const_iterator iterator; 423 typedef typename __base::const_iterator const_iterator; 424 typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 425 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 426 427 _LIBCPP_INLINE_VISIBILITY 428 set() 429 _NOEXCEPT_( 430 is_nothrow_default_constructible<allocator_type>::value && 431 is_nothrow_default_constructible<key_compare>::value && 432 is_nothrow_copy_constructible<key_compare>::value) 433 : __tree_(value_compare()) {} 434 435 _LIBCPP_INLINE_VISIBILITY 436 explicit set(const value_compare& __comp) 437 _NOEXCEPT_( 438 is_nothrow_default_constructible<allocator_type>::value && 439 is_nothrow_default_constructible<key_compare>::value && 440 is_nothrow_copy_constructible<key_compare>::value) 441 : __tree_(__comp) {} 442 443 _LIBCPP_INLINE_VISIBILITY 444 explicit set(const value_compare& __comp, const allocator_type& __a) 445 : __tree_(__comp, __a) {} 446 template <class _InputIterator> 447 _LIBCPP_INLINE_VISIBILITY 448 set(_InputIterator __f, _InputIterator __l, 449 const value_compare& __comp = value_compare()) 450 : __tree_(__comp) 451 { 452 insert(__f, __l); 453 } 454 455 template <class _InputIterator> 456 _LIBCPP_INLINE_VISIBILITY 457 set(_InputIterator __f, _InputIterator __l, const value_compare& __comp, 458 const allocator_type& __a) 459 : __tree_(__comp, __a) 460 { 461 insert(__f, __l); 462 } 463 464 #if _LIBCPP_STD_VER > 11 465 template <class _InputIterator> 466 _LIBCPP_INLINE_VISIBILITY 467 set(_InputIterator __f, _InputIterator __l, const allocator_type& __a) 468 : set(__f, __l, key_compare(), __a) {} 469 #endif 470 471 _LIBCPP_INLINE_VISIBILITY 472 set(const set& __s) 473 : __tree_(__s.__tree_) 474 { 475 insert(__s.begin(), __s.end()); 476 } 477 478 _LIBCPP_INLINE_VISIBILITY 479 set& operator=(const set& __s) 480 { 481 __tree_ = __s.__tree_; 482 return *this; 483 } 484 485 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 486 _LIBCPP_INLINE_VISIBILITY 487 set(set&& __s) 488 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) 489 : __tree_(_VSTD::move(__s.__tree_)) {} 490 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 491 492 _LIBCPP_INLINE_VISIBILITY 493 explicit set(const allocator_type& __a) 494 : __tree_(__a) {} 495 496 _LIBCPP_INLINE_VISIBILITY 497 set(const set& __s, const allocator_type& __a) 498 : __tree_(__s.__tree_.value_comp(), __a) 499 { 500 insert(__s.begin(), __s.end()); 501 } 502 503 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 504 set(set&& __s, const allocator_type& __a); 505 #endif 506 507 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 508 _LIBCPP_INLINE_VISIBILITY 509 set(initializer_list<value_type> __il, const value_compare& __comp = value_compare()) 510 : __tree_(__comp) 511 { 512 insert(__il.begin(), __il.end()); 513 } 514 515 _LIBCPP_INLINE_VISIBILITY 516 set(initializer_list<value_type> __il, const value_compare& __comp, 517 const allocator_type& __a) 518 : __tree_(__comp, __a) 519 { 520 insert(__il.begin(), __il.end()); 521 } 522 523 #if _LIBCPP_STD_VER > 11 524 _LIBCPP_INLINE_VISIBILITY 525 set(initializer_list<value_type> __il, const allocator_type& __a) 526 : set(__il, key_compare(), __a) {} 527 #endif 528 529 _LIBCPP_INLINE_VISIBILITY 530 set& operator=(initializer_list<value_type> __il) 531 { 532 __tree_.__assign_unique(__il.begin(), __il.end()); 533 return *this; 534 } 535 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 536 537 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 538 _LIBCPP_INLINE_VISIBILITY 539 set& operator=(set&& __s) 540 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) 541 { 542 __tree_ = _VSTD::move(__s.__tree_); 543 return *this; 544 } 545 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 546 547 _LIBCPP_INLINE_VISIBILITY 548 iterator begin() _NOEXCEPT {return __tree_.begin();} 549 _LIBCPP_INLINE_VISIBILITY 550 const_iterator begin() const _NOEXCEPT {return __tree_.begin();} 551 _LIBCPP_INLINE_VISIBILITY 552 iterator end() _NOEXCEPT {return __tree_.end();} 553 _LIBCPP_INLINE_VISIBILITY 554 const_iterator end() const _NOEXCEPT {return __tree_.end();} 555 556 _LIBCPP_INLINE_VISIBILITY 557 reverse_iterator rbegin() _NOEXCEPT 558 {return reverse_iterator(end());} 559 _LIBCPP_INLINE_VISIBILITY 560 const_reverse_iterator rbegin() const _NOEXCEPT 561 {return const_reverse_iterator(end());} 562 _LIBCPP_INLINE_VISIBILITY 563 reverse_iterator rend() _NOEXCEPT 564 {return reverse_iterator(begin());} 565 _LIBCPP_INLINE_VISIBILITY 566 const_reverse_iterator rend() const _NOEXCEPT 567 {return const_reverse_iterator(begin());} 568 569 _LIBCPP_INLINE_VISIBILITY 570 const_iterator cbegin() const _NOEXCEPT {return begin();} 571 _LIBCPP_INLINE_VISIBILITY 572 const_iterator cend() const _NOEXCEPT {return end();} 573 _LIBCPP_INLINE_VISIBILITY 574 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 575 _LIBCPP_INLINE_VISIBILITY 576 const_reverse_iterator crend() const _NOEXCEPT {return rend();} 577 578 _LIBCPP_INLINE_VISIBILITY 579 bool empty() const _NOEXCEPT {return __tree_.size() == 0;} 580 _LIBCPP_INLINE_VISIBILITY 581 size_type size() const _NOEXCEPT {return __tree_.size();} 582 _LIBCPP_INLINE_VISIBILITY 583 size_type max_size() const _NOEXCEPT {return __tree_.max_size();} 584 585 // modifiers: 586 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 587 template <class... _Args> 588 _LIBCPP_INLINE_VISIBILITY 589 pair<iterator, bool> emplace(_Args&&... __args) 590 {return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);} 591 template <class... _Args> 592 _LIBCPP_INLINE_VISIBILITY 593 iterator emplace_hint(const_iterator __p, _Args&&... __args) 594 {return __tree_.__emplace_hint_unique(__p, _VSTD::forward<_Args>(__args)...);} 595 #endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 596 _LIBCPP_INLINE_VISIBILITY 597 pair<iterator,bool> insert(const value_type& __v) 598 {return __tree_.__insert_unique(__v);} 599 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 600 _LIBCPP_INLINE_VISIBILITY 601 pair<iterator,bool> insert(value_type&& __v) 602 {return __tree_.__insert_unique(_VSTD::move(__v));} 603 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 604 _LIBCPP_INLINE_VISIBILITY 605 iterator insert(const_iterator __p, const value_type& __v) 606 {return __tree_.__insert_unique(__p, __v);} 607 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 608 _LIBCPP_INLINE_VISIBILITY 609 iterator insert(const_iterator __p, value_type&& __v) 610 {return __tree_.__insert_unique(__p, _VSTD::move(__v));} 611 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 612 template <class _InputIterator> 613 _LIBCPP_INLINE_VISIBILITY 614 void insert(_InputIterator __f, _InputIterator __l) 615 { 616 for (const_iterator __e = cend(); __f != __l; ++__f) 617 __tree_.__insert_unique(__e, *__f); 618 } 619 620 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 621 _LIBCPP_INLINE_VISIBILITY 622 void insert(initializer_list<value_type> __il) 623 {insert(__il.begin(), __il.end());} 624 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 625 626 _LIBCPP_INLINE_VISIBILITY 627 iterator erase(const_iterator __p) {return __tree_.erase(__p);} 628 _LIBCPP_INLINE_VISIBILITY 629 size_type erase(const key_type& __k) 630 {return __tree_.__erase_unique(__k);} 631 _LIBCPP_INLINE_VISIBILITY 632 iterator erase(const_iterator __f, const_iterator __l) 633 {return __tree_.erase(__f, __l);} 634 _LIBCPP_INLINE_VISIBILITY 635 void clear() _NOEXCEPT {__tree_.clear();} 636 637 _LIBCPP_INLINE_VISIBILITY 638 void swap(set& __s) _NOEXCEPT_(__is_nothrow_swappable<__base>::value) 639 {__tree_.swap(__s.__tree_);} 640 641 _LIBCPP_INLINE_VISIBILITY 642 allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();} 643 _LIBCPP_INLINE_VISIBILITY 644 key_compare key_comp() const {return __tree_.value_comp();} 645 _LIBCPP_INLINE_VISIBILITY 646 value_compare value_comp() const {return __tree_.value_comp();} 647 648 // set operations: 649 _LIBCPP_INLINE_VISIBILITY 650 iterator find(const key_type& __k) {return __tree_.find(__k);} 651 _LIBCPP_INLINE_VISIBILITY 652 const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 653 #if _LIBCPP_STD_VER > 11 654 template <typename _K2> 655 _LIBCPP_INLINE_VISIBILITY 656 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 657 find(const _K2& __k) {return __tree_.find(__k);} 658 template <typename _K2> 659 _LIBCPP_INLINE_VISIBILITY 660 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 661 find(const _K2& __k) const {return __tree_.find(__k);} 662 #endif 663 664 _LIBCPP_INLINE_VISIBILITY 665 size_type count(const key_type& __k) const 666 {return __tree_.__count_unique(__k);} 667 _LIBCPP_INLINE_VISIBILITY 668 iterator lower_bound(const key_type& __k) 669 {return __tree_.lower_bound(__k);} 670 _LIBCPP_INLINE_VISIBILITY 671 const_iterator lower_bound(const key_type& __k) const 672 {return __tree_.lower_bound(__k);} 673 #if _LIBCPP_STD_VER > 11 674 template <typename _K2> 675 _LIBCPP_INLINE_VISIBILITY 676 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 677 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} 678 679 template <typename _K2> 680 _LIBCPP_INLINE_VISIBILITY 681 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 682 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} 683 #endif 684 685 _LIBCPP_INLINE_VISIBILITY 686 iterator upper_bound(const key_type& __k) 687 {return __tree_.upper_bound(__k);} 688 _LIBCPP_INLINE_VISIBILITY 689 const_iterator upper_bound(const key_type& __k) const 690 {return __tree_.upper_bound(__k);} 691 #if _LIBCPP_STD_VER > 11 692 template <typename _K2> 693 _LIBCPP_INLINE_VISIBILITY 694 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 695 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} 696 template <typename _K2> 697 _LIBCPP_INLINE_VISIBILITY 698 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 699 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} 700 #endif 701 702 _LIBCPP_INLINE_VISIBILITY 703 pair<iterator,iterator> equal_range(const key_type& __k) 704 {return __tree_.__equal_range_unique(__k);} 705 _LIBCPP_INLINE_VISIBILITY 706 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 707 {return __tree_.__equal_range_unique(__k);} 708 #if _LIBCPP_STD_VER > 11 709 template <typename _K2> 710 _LIBCPP_INLINE_VISIBILITY 711 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type 712 equal_range(const _K2& __k) {return __tree_.__equal_range_unique(__k);} 713 template <typename _K2> 714 _LIBCPP_INLINE_VISIBILITY 715 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type 716 equal_range(const _K2& __k) const {return __tree_.__equal_range_unique(__k);} 717 #endif 718 }; 719 720 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 721 722 template <class _Key, class _Compare, class _Allocator> 723 set<_Key, _Compare, _Allocator>::set(set&& __s, const allocator_type& __a) 724 : __tree_(_VSTD::move(__s.__tree_), __a) 725 { 726 if (__a != __s.get_allocator()) 727 { 728 const_iterator __e = cend(); 729 while (!__s.empty()) 730 insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_)); 731 } 732 } 733 734 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 735 736 template <class _Key, class _Compare, class _Allocator> 737 inline _LIBCPP_INLINE_VISIBILITY 738 bool 739 operator==(const set<_Key, _Compare, _Allocator>& __x, 740 const set<_Key, _Compare, _Allocator>& __y) 741 { 742 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 743 } 744 745 template <class _Key, class _Compare, class _Allocator> 746 inline _LIBCPP_INLINE_VISIBILITY 747 bool 748 operator< (const set<_Key, _Compare, _Allocator>& __x, 749 const set<_Key, _Compare, _Allocator>& __y) 750 { 751 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 752 } 753 754 template <class _Key, class _Compare, class _Allocator> 755 inline _LIBCPP_INLINE_VISIBILITY 756 bool 757 operator!=(const set<_Key, _Compare, _Allocator>& __x, 758 const set<_Key, _Compare, _Allocator>& __y) 759 { 760 return !(__x == __y); 761 } 762 763 template <class _Key, class _Compare, class _Allocator> 764 inline _LIBCPP_INLINE_VISIBILITY 765 bool 766 operator> (const set<_Key, _Compare, _Allocator>& __x, 767 const set<_Key, _Compare, _Allocator>& __y) 768 { 769 return __y < __x; 770 } 771 772 template <class _Key, class _Compare, class _Allocator> 773 inline _LIBCPP_INLINE_VISIBILITY 774 bool 775 operator>=(const set<_Key, _Compare, _Allocator>& __x, 776 const set<_Key, _Compare, _Allocator>& __y) 777 { 778 return !(__x < __y); 779 } 780 781 template <class _Key, class _Compare, class _Allocator> 782 inline _LIBCPP_INLINE_VISIBILITY 783 bool 784 operator<=(const set<_Key, _Compare, _Allocator>& __x, 785 const set<_Key, _Compare, _Allocator>& __y) 786 { 787 return !(__y < __x); 788 } 789 790 // specialized algorithms: 791 template <class _Key, class _Compare, class _Allocator> 792 inline _LIBCPP_INLINE_VISIBILITY 793 void 794 swap(set<_Key, _Compare, _Allocator>& __x, 795 set<_Key, _Compare, _Allocator>& __y) 796 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 797 { 798 __x.swap(__y); 799 } 800 801 template <class _Key, class _Compare = less<_Key>, 802 class _Allocator = allocator<_Key> > 803 class _LIBCPP_TYPE_VIS_ONLY multiset 804 { 805 public: 806 // types: 807 typedef _Key key_type; 808 typedef key_type value_type; 809 typedef _Compare key_compare; 810 typedef key_compare value_compare; 811 typedef _Allocator allocator_type; 812 typedef value_type& reference; 813 typedef const value_type& const_reference; 814 815 private: 816 typedef __tree<value_type, value_compare, allocator_type> __base; 817 typedef allocator_traits<allocator_type> __alloc_traits; 818 typedef typename __base::__node_holder __node_holder; 819 820 __base __tree_; 821 822 public: 823 typedef typename __base::pointer pointer; 824 typedef typename __base::const_pointer const_pointer; 825 typedef typename __base::size_type size_type; 826 typedef typename __base::difference_type difference_type; 827 typedef typename __base::const_iterator iterator; 828 typedef typename __base::const_iterator const_iterator; 829 typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 830 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 831 832 // construct/copy/destroy: 833 _LIBCPP_INLINE_VISIBILITY 834 multiset() 835 _NOEXCEPT_( 836 is_nothrow_default_constructible<allocator_type>::value && 837 is_nothrow_default_constructible<key_compare>::value && 838 is_nothrow_copy_constructible<key_compare>::value) 839 : __tree_(value_compare()) {} 840 841 _LIBCPP_INLINE_VISIBILITY 842 explicit multiset(const value_compare& __comp) 843 _NOEXCEPT_( 844 is_nothrow_default_constructible<allocator_type>::value && 845 is_nothrow_default_constructible<key_compare>::value && 846 is_nothrow_copy_constructible<key_compare>::value) 847 : __tree_(__comp) {} 848 849 _LIBCPP_INLINE_VISIBILITY 850 explicit multiset(const value_compare& __comp, const allocator_type& __a) 851 : __tree_(__comp, __a) {} 852 template <class _InputIterator> 853 _LIBCPP_INLINE_VISIBILITY 854 multiset(_InputIterator __f, _InputIterator __l, 855 const value_compare& __comp = value_compare()) 856 : __tree_(__comp) 857 { 858 insert(__f, __l); 859 } 860 861 #if _LIBCPP_STD_VER > 11 862 template <class _InputIterator> 863 _LIBCPP_INLINE_VISIBILITY 864 multiset(_InputIterator __f, _InputIterator __l, const allocator_type& __a) 865 : multiset(__f, __l, key_compare(), __a) {} 866 #endif 867 868 template <class _InputIterator> 869 _LIBCPP_INLINE_VISIBILITY 870 multiset(_InputIterator __f, _InputIterator __l, 871 const value_compare& __comp, const allocator_type& __a) 872 : __tree_(__comp, __a) 873 { 874 insert(__f, __l); 875 } 876 877 _LIBCPP_INLINE_VISIBILITY 878 multiset(const multiset& __s) 879 : __tree_(__s.__tree_.value_comp(), 880 __alloc_traits::select_on_container_copy_construction(__s.__tree_.__alloc())) 881 { 882 insert(__s.begin(), __s.end()); 883 } 884 885 _LIBCPP_INLINE_VISIBILITY 886 multiset& operator=(const multiset& __s) 887 { 888 __tree_ = __s.__tree_; 889 return *this; 890 } 891 892 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 893 _LIBCPP_INLINE_VISIBILITY 894 multiset(multiset&& __s) 895 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) 896 : __tree_(_VSTD::move(__s.__tree_)) {} 897 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 898 _LIBCPP_INLINE_VISIBILITY 899 explicit multiset(const allocator_type& __a) 900 : __tree_(__a) {} 901 _LIBCPP_INLINE_VISIBILITY 902 multiset(const multiset& __s, const allocator_type& __a) 903 : __tree_(__s.__tree_.value_comp(), __a) 904 { 905 insert(__s.begin(), __s.end()); 906 } 907 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 908 multiset(multiset&& __s, const allocator_type& __a); 909 #endif 910 911 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 912 _LIBCPP_INLINE_VISIBILITY 913 multiset(initializer_list<value_type> __il, const value_compare& __comp = value_compare()) 914 : __tree_(__comp) 915 { 916 insert(__il.begin(), __il.end()); 917 } 918 919 _LIBCPP_INLINE_VISIBILITY 920 multiset(initializer_list<value_type> __il, const value_compare& __comp, 921 const allocator_type& __a) 922 : __tree_(__comp, __a) 923 { 924 insert(__il.begin(), __il.end()); 925 } 926 927 #if _LIBCPP_STD_VER > 11 928 _LIBCPP_INLINE_VISIBILITY 929 multiset(initializer_list<value_type> __il, const allocator_type& __a) 930 : multiset(__il, key_compare(), __a) {} 931 #endif 932 933 _LIBCPP_INLINE_VISIBILITY 934 multiset& operator=(initializer_list<value_type> __il) 935 { 936 __tree_.__assign_multi(__il.begin(), __il.end()); 937 return *this; 938 } 939 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 940 941 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 942 _LIBCPP_INLINE_VISIBILITY 943 multiset& operator=(multiset&& __s) 944 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) 945 { 946 __tree_ = _VSTD::move(__s.__tree_); 947 return *this; 948 } 949 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 950 951 _LIBCPP_INLINE_VISIBILITY 952 iterator begin() _NOEXCEPT {return __tree_.begin();} 953 _LIBCPP_INLINE_VISIBILITY 954 const_iterator begin() const _NOEXCEPT {return __tree_.begin();} 955 _LIBCPP_INLINE_VISIBILITY 956 iterator end() _NOEXCEPT {return __tree_.end();} 957 _LIBCPP_INLINE_VISIBILITY 958 const_iterator end() const _NOEXCEPT {return __tree_.end();} 959 960 _LIBCPP_INLINE_VISIBILITY 961 reverse_iterator rbegin() _NOEXCEPT 962 {return reverse_iterator(end());} 963 _LIBCPP_INLINE_VISIBILITY 964 const_reverse_iterator rbegin() const _NOEXCEPT 965 {return const_reverse_iterator(end());} 966 _LIBCPP_INLINE_VISIBILITY 967 reverse_iterator rend() _NOEXCEPT 968 {return reverse_iterator(begin());} 969 _LIBCPP_INLINE_VISIBILITY 970 const_reverse_iterator rend() const _NOEXCEPT 971 {return const_reverse_iterator(begin());} 972 973 _LIBCPP_INLINE_VISIBILITY 974 const_iterator cbegin() const _NOEXCEPT {return begin();} 975 _LIBCPP_INLINE_VISIBILITY 976 const_iterator cend() const _NOEXCEPT {return end();} 977 _LIBCPP_INLINE_VISIBILITY 978 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 979 _LIBCPP_INLINE_VISIBILITY 980 const_reverse_iterator crend() const _NOEXCEPT {return rend();} 981 982 _LIBCPP_INLINE_VISIBILITY 983 bool empty() const _NOEXCEPT {return __tree_.size() == 0;} 984 _LIBCPP_INLINE_VISIBILITY 985 size_type size() const _NOEXCEPT {return __tree_.size();} 986 _LIBCPP_INLINE_VISIBILITY 987 size_type max_size() const _NOEXCEPT {return __tree_.max_size();} 988 989 // modifiers: 990 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 991 template <class... _Args> 992 _LIBCPP_INLINE_VISIBILITY 993 iterator emplace(_Args&&... __args) 994 {return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);} 995 template <class... _Args> 996 _LIBCPP_INLINE_VISIBILITY 997 iterator emplace_hint(const_iterator __p, _Args&&... __args) 998 {return __tree_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);} 999 #endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 1000 _LIBCPP_INLINE_VISIBILITY 1001 iterator insert(const value_type& __v) 1002 {return __tree_.__insert_multi(__v);} 1003 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1004 _LIBCPP_INLINE_VISIBILITY 1005 iterator insert(value_type&& __v) 1006 {return __tree_.__insert_multi(_VSTD::move(__v));} 1007 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1008 _LIBCPP_INLINE_VISIBILITY 1009 iterator insert(const_iterator __p, const value_type& __v) 1010 {return __tree_.__insert_multi(__p, __v);} 1011 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1012 _LIBCPP_INLINE_VISIBILITY 1013 iterator insert(const_iterator __p, value_type&& __v) 1014 {return __tree_.__insert_multi(_VSTD::move(__v));} 1015 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1016 template <class _InputIterator> 1017 _LIBCPP_INLINE_VISIBILITY 1018 void insert(_InputIterator __f, _InputIterator __l) 1019 { 1020 for (const_iterator __e = cend(); __f != __l; ++__f) 1021 __tree_.__insert_multi(__e, *__f); 1022 } 1023 1024 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1025 _LIBCPP_INLINE_VISIBILITY 1026 void insert(initializer_list<value_type> __il) 1027 {insert(__il.begin(), __il.end());} 1028 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1029 1030 _LIBCPP_INLINE_VISIBILITY 1031 iterator erase(const_iterator __p) {return __tree_.erase(__p);} 1032 _LIBCPP_INLINE_VISIBILITY 1033 size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);} 1034 _LIBCPP_INLINE_VISIBILITY 1035 iterator erase(const_iterator __f, const_iterator __l) 1036 {return __tree_.erase(__f, __l);} 1037 _LIBCPP_INLINE_VISIBILITY 1038 void clear() _NOEXCEPT {__tree_.clear();} 1039 1040 _LIBCPP_INLINE_VISIBILITY 1041 void swap(multiset& __s) 1042 _NOEXCEPT_(__is_nothrow_swappable<__base>::value) 1043 {__tree_.swap(__s.__tree_);} 1044 1045 _LIBCPP_INLINE_VISIBILITY 1046 allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();} 1047 _LIBCPP_INLINE_VISIBILITY 1048 key_compare key_comp() const {return __tree_.value_comp();} 1049 _LIBCPP_INLINE_VISIBILITY 1050 value_compare value_comp() const {return __tree_.value_comp();} 1051 1052 // set operations: 1053 _LIBCPP_INLINE_VISIBILITY 1054 iterator find(const key_type& __k) {return __tree_.find(__k);} 1055 _LIBCPP_INLINE_VISIBILITY 1056 const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 1057 #if _LIBCPP_STD_VER > 11 1058 template <typename _K2> 1059 _LIBCPP_INLINE_VISIBILITY 1060 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type 1061 find(const _K2& __k) {return __tree_.find(__k);} 1062 template <typename _K2> 1063 _LIBCPP_INLINE_VISIBILITY 1064 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type 1065 find(const _K2& __k) const {return __tree_.find(__k);} 1066 #endif 1067 1068 _LIBCPP_INLINE_VISIBILITY 1069 size_type count(const key_type& __k) const 1070 {return __tree_.__count_multi(__k);} 1071 1072 _LIBCPP_INLINE_VISIBILITY 1073 iterator lower_bound(const key_type& __k) 1074 {return __tree_.lower_bound(__k);} 1075 _LIBCPP_INLINE_VISIBILITY 1076 const_iterator lower_bound(const key_type& __k) const 1077 {return __tree_.lower_bound(__k);} 1078 #if _LIBCPP_STD_VER > 11 1079 template <typename _K2> 1080 _LIBCPP_INLINE_VISIBILITY 1081 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type 1082 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} 1083 1084 template <typename _K2> 1085 _LIBCPP_INLINE_VISIBILITY 1086 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type 1087 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} 1088 #endif 1089 1090 _LIBCPP_INLINE_VISIBILITY 1091 iterator upper_bound(const key_type& __k) 1092 {return __tree_.upper_bound(__k);} 1093 _LIBCPP_INLINE_VISIBILITY 1094 const_iterator upper_bound(const key_type& __k) const 1095 {return __tree_.upper_bound(__k);} 1096 #if _LIBCPP_STD_VER > 11 1097 template <typename _K2> 1098 _LIBCPP_INLINE_VISIBILITY 1099 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type 1100 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} 1101 template <typename _K2> 1102 _LIBCPP_INLINE_VISIBILITY 1103 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type 1104 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} 1105 #endif 1106 1107 _LIBCPP_INLINE_VISIBILITY 1108 pair<iterator,iterator> equal_range(const key_type& __k) 1109 {return __tree_.__equal_range_multi(__k);} 1110 _LIBCPP_INLINE_VISIBILITY 1111 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 1112 {return __tree_.__equal_range_multi(__k);} 1113 #if _LIBCPP_STD_VER > 11 1114 template <typename _K2> 1115 _LIBCPP_INLINE_VISIBILITY 1116 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type 1117 equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);} 1118 template <typename _K2> 1119 _LIBCPP_INLINE_VISIBILITY 1120 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type 1121 equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);} 1122 #endif 1123 }; 1124 1125 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1126 1127 template <class _Key, class _Compare, class _Allocator> 1128 multiset<_Key, _Compare, _Allocator>::multiset(multiset&& __s, const allocator_type& __a) 1129 : __tree_(_VSTD::move(__s.__tree_), __a) 1130 { 1131 if (__a != __s.get_allocator()) 1132 { 1133 const_iterator __e = cend(); 1134 while (!__s.empty()) 1135 insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_)); 1136 } 1137 } 1138 1139 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1140 1141 template <class _Key, class _Compare, class _Allocator> 1142 inline _LIBCPP_INLINE_VISIBILITY 1143 bool 1144 operator==(const multiset<_Key, _Compare, _Allocator>& __x, 1145 const multiset<_Key, _Compare, _Allocator>& __y) 1146 { 1147 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 1148 } 1149 1150 template <class _Key, class _Compare, class _Allocator> 1151 inline _LIBCPP_INLINE_VISIBILITY 1152 bool 1153 operator< (const multiset<_Key, _Compare, _Allocator>& __x, 1154 const multiset<_Key, _Compare, _Allocator>& __y) 1155 { 1156 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 1157 } 1158 1159 template <class _Key, class _Compare, class _Allocator> 1160 inline _LIBCPP_INLINE_VISIBILITY 1161 bool 1162 operator!=(const multiset<_Key, _Compare, _Allocator>& __x, 1163 const multiset<_Key, _Compare, _Allocator>& __y) 1164 { 1165 return !(__x == __y); 1166 } 1167 1168 template <class _Key, class _Compare, class _Allocator> 1169 inline _LIBCPP_INLINE_VISIBILITY 1170 bool 1171 operator> (const multiset<_Key, _Compare, _Allocator>& __x, 1172 const multiset<_Key, _Compare, _Allocator>& __y) 1173 { 1174 return __y < __x; 1175 } 1176 1177 template <class _Key, class _Compare, class _Allocator> 1178 inline _LIBCPP_INLINE_VISIBILITY 1179 bool 1180 operator>=(const multiset<_Key, _Compare, _Allocator>& __x, 1181 const multiset<_Key, _Compare, _Allocator>& __y) 1182 { 1183 return !(__x < __y); 1184 } 1185 1186 template <class _Key, class _Compare, class _Allocator> 1187 inline _LIBCPP_INLINE_VISIBILITY 1188 bool 1189 operator<=(const multiset<_Key, _Compare, _Allocator>& __x, 1190 const multiset<_Key, _Compare, _Allocator>& __y) 1191 { 1192 return !(__y < __x); 1193 } 1194 1195 template <class _Key, class _Compare, class _Allocator> 1196 inline _LIBCPP_INLINE_VISIBILITY 1197 void 1198 swap(multiset<_Key, _Compare, _Allocator>& __x, 1199 multiset<_Key, _Compare, _Allocator>& __y) 1200 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 1201 { 1202 __x.swap(__y); 1203 } 1204 1205 _LIBCPP_END_NAMESPACE_STD 1206 1207 #endif // _LIBCPP_SET 1208