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