1// -*- C++ -*- 2//===--------------------------- queue ------------------------------------===// 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_QUEUE 12#define _LIBCPP_QUEUE 13 14/* 15 queue synopsis 16 17namespace std 18{ 19 20template <class T, class Container = deque<T>> 21class queue 22{ 23public: 24 typedef Container container_type; 25 typedef typename container_type::value_type value_type; 26 typedef typename container_type::reference reference; 27 typedef typename container_type::const_reference const_reference; 28 typedef typename container_type::size_type size_type; 29 30protected: 31 container_type c; 32 33public: 34 queue() = default; 35 ~queue() = default; 36 37 queue(const queue& q) = default; 38 queue(queue&& q) = default; 39 40 queue& operator=(const queue& q) = default; 41 queue& operator=(queue&& q) = default; 42 43 explicit queue(const container_type& c); 44 explicit queue(container_type&& c) 45 template <class Alloc> 46 explicit queue(const Alloc& a); 47 template <class Alloc> 48 queue(const container_type& c, const Alloc& a); 49 template <class Alloc> 50 queue(container_type&& c, const Alloc& a); 51 template <class Alloc> 52 queue(const queue& q, const Alloc& a); 53 template <class Alloc> 54 queue(queue&& q, const Alloc& a); 55 56 bool empty() const; 57 size_type size() const; 58 59 reference front(); 60 const_reference front() const; 61 reference back(); 62 const_reference back() const; 63 64 void push(const value_type& v); 65 void push(value_type&& v); 66 template <class... Args> void emplace(Args&&... args); 67 void pop(); 68 69 void swap(queue& q) noexcept(noexcept(swap(c, q.c))); 70}; 71 72template <class T, class Container> 73 bool operator==(const queue<T, Container>& x,const queue<T, Container>& y); 74 75template <class T, class Container> 76 bool operator< (const queue<T, Container>& x,const queue<T, Container>& y); 77 78template <class T, class Container> 79 bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y); 80 81template <class T, class Container> 82 bool operator> (const queue<T, Container>& x,const queue<T, Container>& y); 83 84template <class T, class Container> 85 bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y); 86 87template <class T, class Container> 88 bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y); 89 90template <class T, class Container> 91 void swap(queue<T, Container>& x, queue<T, Container>& y) 92 noexcept(noexcept(x.swap(y))); 93 94template <class T, class Container = vector<T>, 95 class Compare = less<typename Container::value_type>> 96class priority_queue 97{ 98public: 99 typedef Container container_type; 100 typedef typename container_type::value_type value_type; 101 typedef typename container_type::reference reference; 102 typedef typename container_type::const_reference const_reference; 103 typedef typename container_type::size_type size_type; 104 105protected: 106 container_type c; 107 Compare comp; 108 109public: 110 priority_queue() = default; 111 ~priority_queue() = default; 112 113 priority_queue(const priority_queue& q) = default; 114 priority_queue(priority_queue&& q) = default; 115 116 priority_queue& operator=(const priority_queue& q) = default; 117 priority_queue& operator=(priority_queue&& q) = default; 118 119 explicit priority_queue(const Compare& comp); 120 priority_queue(const Compare& comp, const container_type& c); 121 explicit priority_queue(const Compare& comp, container_type&& c); 122 template <class InputIterator> 123 priority_queue(InputIterator first, InputIterator last, 124 const Compare& comp = Compare()); 125 template <class InputIterator> 126 priority_queue(InputIterator first, InputIterator last, 127 const Compare& comp, const container_type& c); 128 template <class InputIterator> 129 priority_queue(InputIterator first, InputIterator last, 130 const Compare& comp, container_type&& c); 131 template <class Alloc> 132 explicit priority_queue(const Alloc& a); 133 template <class Alloc> 134 priority_queue(const Compare& comp, const Alloc& a); 135 template <class Alloc> 136 priority_queue(const Compare& comp, const container_type& c, 137 const Alloc& a); 138 template <class Alloc> 139 priority_queue(const Compare& comp, container_type&& c, 140 const Alloc& a); 141 template <class Alloc> 142 priority_queue(const priority_queue& q, const Alloc& a); 143 template <class Alloc> 144 priority_queue(priority_queue&& q, const Alloc& a); 145 146 bool empty() const; 147 size_type size() const; 148 const_reference top() const; 149 150 void push(const value_type& v); 151 void push(value_type&& v); 152 template <class... Args> void emplace(Args&&... args); 153 void pop(); 154 155 void swap(priority_queue& q) 156 noexcept(noexcept(swap(c, q.c)) && noexcept(swap(comp.q.comp))); 157}; 158 159template <class T, class Container, class Compare> 160 void swap(priority_queue<T, Container, Compare>& x, 161 priority_queue<T, Container, Compare>& y) 162 noexcept(noexcept(x.swap(y))); 163 164} // std 165 166*/ 167 168#include <__config> 169#include <deque> 170#include <vector> 171#include <functional> 172#include <algorithm> 173 174#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 175#pragma GCC system_header 176#endif 177 178_LIBCPP_BEGIN_NAMESPACE_STD 179 180template <class _Tp, class _Container> class _LIBCPP_TYPE_VIS_ONLY queue; 181 182template <class _Tp, class _Container> 183_LIBCPP_INLINE_VISIBILITY 184bool 185operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y); 186 187template <class _Tp, class _Container> 188_LIBCPP_INLINE_VISIBILITY 189bool 190operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y); 191 192template <class _Tp, class _Container = deque<_Tp> > 193class _LIBCPP_TYPE_VIS_ONLY queue 194{ 195public: 196 typedef _Container container_type; 197 typedef typename container_type::value_type value_type; 198 typedef typename container_type::reference reference; 199 typedef typename container_type::const_reference const_reference; 200 typedef typename container_type::size_type size_type; 201 202protected: 203 container_type c; 204 205public: 206 _LIBCPP_INLINE_VISIBILITY 207 queue() 208 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value) 209 : c() {} 210 211 _LIBCPP_INLINE_VISIBILITY 212 queue(const queue& __q) : c(__q.c) {} 213 214#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 215 _LIBCPP_INLINE_VISIBILITY 216 queue(queue&& __q) 217 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value) 218 : c(_VSTD::move(__q.c)) {} 219#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 220 221 _LIBCPP_INLINE_VISIBILITY 222 queue& operator=(const queue& __q) {c = __q.c; return *this;} 223 224#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 225 _LIBCPP_INLINE_VISIBILITY 226 queue& operator=(queue&& __q) 227 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value) 228 {c = _VSTD::move(__q.c); return *this;} 229#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 230 231 _LIBCPP_INLINE_VISIBILITY 232 explicit queue(const container_type& __c) : c(__c) {} 233#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 234 _LIBCPP_INLINE_VISIBILITY 235 explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {} 236#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 237 template <class _Alloc> 238 _LIBCPP_INLINE_VISIBILITY 239 explicit queue(const _Alloc& __a, 240 typename enable_if<uses_allocator<container_type, 241 _Alloc>::value>::type* = 0) 242 : c(__a) {} 243 template <class _Alloc> 244 _LIBCPP_INLINE_VISIBILITY 245 queue(const queue& __q, const _Alloc& __a, 246 typename enable_if<uses_allocator<container_type, 247 _Alloc>::value>::type* = 0) 248 : c(__q.c, __a) {} 249 template <class _Alloc> 250 _LIBCPP_INLINE_VISIBILITY 251 queue(const container_type& __c, const _Alloc& __a, 252 typename enable_if<uses_allocator<container_type, 253 _Alloc>::value>::type* = 0) 254 : c(__c, __a) {} 255#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 256 template <class _Alloc> 257 _LIBCPP_INLINE_VISIBILITY 258 queue(container_type&& __c, const _Alloc& __a, 259 typename enable_if<uses_allocator<container_type, 260 _Alloc>::value>::type* = 0) 261 : c(_VSTD::move(__c), __a) {} 262 template <class _Alloc> 263 _LIBCPP_INLINE_VISIBILITY 264 queue(queue&& __q, const _Alloc& __a, 265 typename enable_if<uses_allocator<container_type, 266 _Alloc>::value>::type* = 0) 267 : c(_VSTD::move(__q.c), __a) {} 268 269#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 270 271 _LIBCPP_INLINE_VISIBILITY 272 bool empty() const {return c.empty();} 273 _LIBCPP_INLINE_VISIBILITY 274 size_type size() const {return c.size();} 275 276 _LIBCPP_INLINE_VISIBILITY 277 reference front() {return c.front();} 278 _LIBCPP_INLINE_VISIBILITY 279 const_reference front() const {return c.front();} 280 _LIBCPP_INLINE_VISIBILITY 281 reference back() {return c.back();} 282 _LIBCPP_INLINE_VISIBILITY 283 const_reference back() const {return c.back();} 284 285 _LIBCPP_INLINE_VISIBILITY 286 void push(const value_type& __v) {c.push_back(__v);} 287#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 288 _LIBCPP_INLINE_VISIBILITY 289 void push(value_type&& __v) {c.push_back(_VSTD::move(__v));} 290#ifndef _LIBCPP_HAS_NO_VARIADICS 291 template <class... _Args> 292 _LIBCPP_INLINE_VISIBILITY 293 void emplace(_Args&&... __args) 294 {c.emplace_back(_VSTD::forward<_Args>(__args)...);} 295#endif // _LIBCPP_HAS_NO_VARIADICS 296#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 297 _LIBCPP_INLINE_VISIBILITY 298 void pop() {c.pop_front();} 299 300 _LIBCPP_INLINE_VISIBILITY 301 void swap(queue& __q) 302 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value) 303 { 304 using _VSTD::swap; 305 swap(c, __q.c); 306 } 307 308 template <class _T1, class _C1> 309 friend 310 _LIBCPP_INLINE_VISIBILITY 311 bool 312 operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y); 313 314 template <class _T1, class _C1> 315 friend 316 _LIBCPP_INLINE_VISIBILITY 317 bool 318 operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y); 319}; 320 321template <class _Tp, class _Container> 322inline _LIBCPP_INLINE_VISIBILITY 323bool 324operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) 325{ 326 return __x.c == __y.c; 327} 328 329template <class _Tp, class _Container> 330inline _LIBCPP_INLINE_VISIBILITY 331bool 332operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) 333{ 334 return __x.c < __y.c; 335} 336 337template <class _Tp, class _Container> 338inline _LIBCPP_INLINE_VISIBILITY 339bool 340operator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) 341{ 342 return !(__x == __y); 343} 344 345template <class _Tp, class _Container> 346inline _LIBCPP_INLINE_VISIBILITY 347bool 348operator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) 349{ 350 return __y < __x; 351} 352 353template <class _Tp, class _Container> 354inline _LIBCPP_INLINE_VISIBILITY 355bool 356operator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) 357{ 358 return !(__x < __y); 359} 360 361template <class _Tp, class _Container> 362inline _LIBCPP_INLINE_VISIBILITY 363bool 364operator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) 365{ 366 return !(__y < __x); 367} 368 369template <class _Tp, class _Container> 370inline _LIBCPP_INLINE_VISIBILITY 371void 372swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y) 373 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 374{ 375 __x.swap(__y); 376} 377 378template <class _Tp, class _Container, class _Alloc> 379struct _LIBCPP_TYPE_VIS_ONLY uses_allocator<queue<_Tp, _Container>, _Alloc> 380 : public uses_allocator<_Container, _Alloc> 381{ 382}; 383 384template <class _Tp, class _Container = vector<_Tp>, 385 class _Compare = less<typename _Container::value_type> > 386class _LIBCPP_TYPE_VIS_ONLY priority_queue 387{ 388public: 389 typedef _Container container_type; 390 typedef _Compare value_compare; 391 typedef typename container_type::value_type value_type; 392 typedef typename container_type::reference reference; 393 typedef typename container_type::const_reference const_reference; 394 typedef typename container_type::size_type size_type; 395 396protected: 397 container_type c; 398 value_compare comp; 399 400public: 401 _LIBCPP_INLINE_VISIBILITY 402 priority_queue() 403 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value && 404 is_nothrow_default_constructible<value_compare>::value) 405 : c(), comp() {} 406 407 _LIBCPP_INLINE_VISIBILITY 408 priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {} 409 410#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 411 _LIBCPP_INLINE_VISIBILITY 412 priority_queue(priority_queue&& __q) 413 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value && 414 is_nothrow_move_constructible<value_compare>::value) 415 : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {} 416#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 417 418 _LIBCPP_INLINE_VISIBILITY 419 priority_queue& operator=(const priority_queue& __q) 420 {c = __q.c; comp = __q.comp; return *this;} 421 422#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 423 _LIBCPP_INLINE_VISIBILITY 424 priority_queue& operator=(priority_queue&& __q) 425 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value && 426 is_nothrow_move_assignable<value_compare>::value) 427 {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;} 428#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 429 430 _LIBCPP_INLINE_VISIBILITY 431 explicit priority_queue(const value_compare& __comp) 432 : c(), comp(__comp) {} 433 priority_queue(const value_compare& __comp, const container_type& __c); 434#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 435 explicit priority_queue(const value_compare& __comp, container_type&& __c); 436#endif 437 template <class _InputIter> 438 priority_queue(_InputIter __f, _InputIter __l, 439 const value_compare& __comp = value_compare()); 440 template <class _InputIter> 441 priority_queue(_InputIter __f, _InputIter __l, 442 const value_compare& __comp, const container_type& __c); 443#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 444 template <class _InputIter> 445 priority_queue(_InputIter __f, _InputIter __l, 446 const value_compare& __comp, container_type&& __c); 447#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 448 template <class _Alloc> 449 explicit priority_queue(const _Alloc& __a, 450 typename enable_if<uses_allocator<container_type, 451 _Alloc>::value>::type* = 0); 452 template <class _Alloc> 453 priority_queue(const value_compare& __comp, const _Alloc& __a, 454 typename enable_if<uses_allocator<container_type, 455 _Alloc>::value>::type* = 0); 456 template <class _Alloc> 457 priority_queue(const value_compare& __comp, const container_type& __c, 458 const _Alloc& __a, 459 typename enable_if<uses_allocator<container_type, 460 _Alloc>::value>::type* = 0); 461 template <class _Alloc> 462 priority_queue(const priority_queue& __q, const _Alloc& __a, 463 typename enable_if<uses_allocator<container_type, 464 _Alloc>::value>::type* = 0); 465#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 466 template <class _Alloc> 467 priority_queue(const value_compare& __comp, container_type&& __c, 468 const _Alloc& __a, 469 typename enable_if<uses_allocator<container_type, 470 _Alloc>::value>::type* = 0); 471 template <class _Alloc> 472 priority_queue(priority_queue&& __q, const _Alloc& __a, 473 typename enable_if<uses_allocator<container_type, 474 _Alloc>::value>::type* = 0); 475#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 476 477 _LIBCPP_INLINE_VISIBILITY 478 bool empty() const {return c.empty();} 479 _LIBCPP_INLINE_VISIBILITY 480 size_type size() const {return c.size();} 481 _LIBCPP_INLINE_VISIBILITY 482 const_reference top() const {return c.front();} 483 484 void push(const value_type& __v); 485#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 486 void push(value_type&& __v); 487#ifndef _LIBCPP_HAS_NO_VARIADICS 488 template <class... _Args> void emplace(_Args&&... __args); 489#endif 490#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 491 void pop(); 492 493 void swap(priority_queue& __q) 494 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value && 495 __is_nothrow_swappable<value_compare>::value); 496}; 497 498template <class _Tp, class _Container, class _Compare> 499inline _LIBCPP_INLINE_VISIBILITY 500priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp, 501 const container_type& __c) 502 : c(__c), 503 comp(__comp) 504{ 505 _VSTD::make_heap(c.begin(), c.end(), comp); 506} 507 508#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 509 510template <class _Tp, class _Container, class _Compare> 511inline _LIBCPP_INLINE_VISIBILITY 512priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp, 513 container_type&& __c) 514 : c(_VSTD::move(__c)), 515 comp(__comp) 516{ 517 _VSTD::make_heap(c.begin(), c.end(), comp); 518} 519 520#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 521 522template <class _Tp, class _Container, class _Compare> 523template <class _InputIter> 524inline _LIBCPP_INLINE_VISIBILITY 525priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l, 526 const value_compare& __comp) 527 : c(__f, __l), 528 comp(__comp) 529{ 530 _VSTD::make_heap(c.begin(), c.end(), comp); 531} 532 533template <class _Tp, class _Container, class _Compare> 534template <class _InputIter> 535inline _LIBCPP_INLINE_VISIBILITY 536priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l, 537 const value_compare& __comp, 538 const container_type& __c) 539 : c(__c), 540 comp(__comp) 541{ 542 c.insert(c.end(), __f, __l); 543 _VSTD::make_heap(c.begin(), c.end(), comp); 544} 545 546#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 547 548template <class _Tp, class _Container, class _Compare> 549template <class _InputIter> 550inline _LIBCPP_INLINE_VISIBILITY 551priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l, 552 const value_compare& __comp, 553 container_type&& __c) 554 : c(_VSTD::move(__c)), 555 comp(__comp) 556{ 557 c.insert(c.end(), __f, __l); 558 _VSTD::make_heap(c.begin(), c.end(), comp); 559} 560 561#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 562 563template <class _Tp, class _Container, class _Compare> 564template <class _Alloc> 565inline _LIBCPP_INLINE_VISIBILITY 566priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a, 567 typename enable_if<uses_allocator<container_type, 568 _Alloc>::value>::type*) 569 : c(__a) 570{ 571} 572 573template <class _Tp, class _Container, class _Compare> 574template <class _Alloc> 575inline _LIBCPP_INLINE_VISIBILITY 576priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp, 577 const _Alloc& __a, 578 typename enable_if<uses_allocator<container_type, 579 _Alloc>::value>::type*) 580 : c(__a), 581 comp(__comp) 582{ 583} 584 585template <class _Tp, class _Container, class _Compare> 586template <class _Alloc> 587inline _LIBCPP_INLINE_VISIBILITY 588priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp, 589 const container_type& __c, 590 const _Alloc& __a, 591 typename enable_if<uses_allocator<container_type, 592 _Alloc>::value>::type*) 593 : c(__c, __a), 594 comp(__comp) 595{ 596 _VSTD::make_heap(c.begin(), c.end(), comp); 597} 598 599template <class _Tp, class _Container, class _Compare> 600template <class _Alloc> 601inline _LIBCPP_INLINE_VISIBILITY 602priority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q, 603 const _Alloc& __a, 604 typename enable_if<uses_allocator<container_type, 605 _Alloc>::value>::type*) 606 : c(__q.c, __a), 607 comp(__q.comp) 608{ 609 _VSTD::make_heap(c.begin(), c.end(), comp); 610} 611 612#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 613 614template <class _Tp, class _Container, class _Compare> 615template <class _Alloc> 616inline _LIBCPP_INLINE_VISIBILITY 617priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp, 618 container_type&& __c, 619 const _Alloc& __a, 620 typename enable_if<uses_allocator<container_type, 621 _Alloc>::value>::type*) 622 : c(_VSTD::move(__c), __a), 623 comp(__comp) 624{ 625 _VSTD::make_heap(c.begin(), c.end(), comp); 626} 627 628template <class _Tp, class _Container, class _Compare> 629template <class _Alloc> 630inline _LIBCPP_INLINE_VISIBILITY 631priority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q, 632 const _Alloc& __a, 633 typename enable_if<uses_allocator<container_type, 634 _Alloc>::value>::type*) 635 : c(_VSTD::move(__q.c), __a), 636 comp(_VSTD::move(__q.comp)) 637{ 638 _VSTD::make_heap(c.begin(), c.end(), comp); 639} 640 641#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 642 643template <class _Tp, class _Container, class _Compare> 644inline _LIBCPP_INLINE_VISIBILITY 645void 646priority_queue<_Tp, _Container, _Compare>::push(const value_type& __v) 647{ 648 c.push_back(__v); 649 _VSTD::push_heap(c.begin(), c.end(), comp); 650} 651 652#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 653 654template <class _Tp, class _Container, class _Compare> 655inline _LIBCPP_INLINE_VISIBILITY 656void 657priority_queue<_Tp, _Container, _Compare>::push(value_type&& __v) 658{ 659 c.push_back(_VSTD::move(__v)); 660 _VSTD::push_heap(c.begin(), c.end(), comp); 661} 662 663#ifndef _LIBCPP_HAS_NO_VARIADICS 664 665template <class _Tp, class _Container, class _Compare> 666template <class... _Args> 667inline _LIBCPP_INLINE_VISIBILITY 668void 669priority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args) 670{ 671 c.emplace_back(_VSTD::forward<_Args>(__args)...); 672 _VSTD::push_heap(c.begin(), c.end(), comp); 673} 674 675#endif // _LIBCPP_HAS_NO_VARIADICS 676#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 677 678template <class _Tp, class _Container, class _Compare> 679inline _LIBCPP_INLINE_VISIBILITY 680void 681priority_queue<_Tp, _Container, _Compare>::pop() 682{ 683 _VSTD::pop_heap(c.begin(), c.end(), comp); 684 c.pop_back(); 685} 686 687template <class _Tp, class _Container, class _Compare> 688inline _LIBCPP_INLINE_VISIBILITY 689void 690priority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q) 691 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value && 692 __is_nothrow_swappable<value_compare>::value) 693{ 694 using _VSTD::swap; 695 swap(c, __q.c); 696 swap(comp, __q.comp); 697} 698 699template <class _Tp, class _Container, class _Compare> 700inline _LIBCPP_INLINE_VISIBILITY 701void 702swap(priority_queue<_Tp, _Container, _Compare>& __x, 703 priority_queue<_Tp, _Container, _Compare>& __y) 704 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 705{ 706 __x.swap(__y); 707} 708 709template <class _Tp, class _Container, class _Compare, class _Alloc> 710struct _LIBCPP_TYPE_VIS_ONLY uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc> 711 : public uses_allocator<_Container, _Alloc> 712{ 713}; 714 715_LIBCPP_END_NAMESPACE_STD 716 717#endif // _LIBCPP_QUEUE 718