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 17 namespace std 18 { 19 20 template <class T, class Container = deque<T>> 21 class queue 22 { 23 public: 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 30 protected: 31 container_type c; 32 33 public: 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 72 template <class T, class Container> 73 bool operator==(const queue<T, Container>& x,const queue<T, Container>& y); 74 75 template <class T, class Container> 76 bool operator< (const queue<T, Container>& x,const queue<T, Container>& y); 77 78 template <class T, class Container> 79 bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y); 80 81 template <class T, class Container> 82 bool operator> (const queue<T, Container>& x,const queue<T, Container>& y); 83 84 template <class T, class Container> 85 bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y); 86 87 template <class T, class Container> 88 bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y); 89 90 template <class T, class Container> 91 void swap(queue<T, Container>& x, queue<T, Container>& y) 92 noexcept(noexcept(x.swap(y))); 93 94 template <class T, class Container = vector<T>, 95 class Compare = less<typename Container::value_type>> 96 class priority_queue 97 { 98 public: 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 105 protected: 106 container_type c; 107 Compare comp; 108 109 public: 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 159 template <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 180 template <class _Tp, class _Container> class _LIBCPP_TYPE_VIS_ONLY queue; 181 182 template <class _Tp, class _Container> 183 _LIBCPP_INLINE_VISIBILITY 184 bool 185 operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y); 186 187 template <class _Tp, class _Container> 188 _LIBCPP_INLINE_VISIBILITY 189 bool 190 operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y); 191 192 template <class _Tp, class _Container = deque<_Tp> > 193 class _LIBCPP_TYPE_VIS_ONLY queue 194 { 195 public: 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 202 protected: 203 container_type c; 204 205 public: 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 321 template <class _Tp, class _Container> 322 inline _LIBCPP_INLINE_VISIBILITY 323 bool 324 operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) 325 { 326 return __x.c == __y.c; 327 } 328 329 template <class _Tp, class _Container> 330 inline _LIBCPP_INLINE_VISIBILITY 331 bool 332 operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) 333 { 334 return __x.c < __y.c; 335 } 336 337 template <class _Tp, class _Container> 338 inline _LIBCPP_INLINE_VISIBILITY 339 bool 340 operator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) 341 { 342 return !(__x == __y); 343 } 344 345 template <class _Tp, class _Container> 346 inline _LIBCPP_INLINE_VISIBILITY 347 bool 348 operator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) 349 { 350 return __y < __x; 351 } 352 353 template <class _Tp, class _Container> 354 inline _LIBCPP_INLINE_VISIBILITY 355 bool 356 operator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) 357 { 358 return !(__x < __y); 359 } 360 361 template <class _Tp, class _Container> 362 inline _LIBCPP_INLINE_VISIBILITY 363 bool 364 operator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) 365 { 366 return !(__y < __x); 367 } 368 369 template <class _Tp, class _Container> 370 inline _LIBCPP_INLINE_VISIBILITY 371 void 372 swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y) 373 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 374 { 375 __x.swap(__y); 376 } 377 378 template <class _Tp, class _Container, class _Alloc> 379 struct _LIBCPP_TYPE_VIS_ONLY uses_allocator<queue<_Tp, _Container>, _Alloc> 380 : public uses_allocator<_Container, _Alloc> 381 { 382 }; 383 384 template <class _Tp, class _Container = vector<_Tp>, 385 class _Compare = less<typename _Container::value_type> > 386 class _LIBCPP_TYPE_VIS_ONLY priority_queue 387 { 388 public: 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 396 protected: 397 container_type c; 398 value_compare comp; 399 400 public: 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 498 template <class _Tp, class _Container, class _Compare> 499 inline _LIBCPP_INLINE_VISIBILITY 500 priority_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 510 template <class _Tp, class _Container, class _Compare> 511 inline _LIBCPP_INLINE_VISIBILITY 512 priority_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 522 template <class _Tp, class _Container, class _Compare> 523 template <class _InputIter> 524 inline _LIBCPP_INLINE_VISIBILITY 525 priority_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 533 template <class _Tp, class _Container, class _Compare> 534 template <class _InputIter> 535 inline _LIBCPP_INLINE_VISIBILITY 536 priority_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 548 template <class _Tp, class _Container, class _Compare> 549 template <class _InputIter> 550 inline _LIBCPP_INLINE_VISIBILITY 551 priority_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 563 template <class _Tp, class _Container, class _Compare> 564 template <class _Alloc> 565 inline _LIBCPP_INLINE_VISIBILITY 566 priority_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 573 template <class _Tp, class _Container, class _Compare> 574 template <class _Alloc> 575 inline _LIBCPP_INLINE_VISIBILITY 576 priority_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 585 template <class _Tp, class _Container, class _Compare> 586 template <class _Alloc> 587 inline _LIBCPP_INLINE_VISIBILITY 588 priority_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 599 template <class _Tp, class _Container, class _Compare> 600 template <class _Alloc> 601 inline _LIBCPP_INLINE_VISIBILITY 602 priority_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 614 template <class _Tp, class _Container, class _Compare> 615 template <class _Alloc> 616 inline _LIBCPP_INLINE_VISIBILITY 617 priority_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 628 template <class _Tp, class _Container, class _Compare> 629 template <class _Alloc> 630 inline _LIBCPP_INLINE_VISIBILITY 631 priority_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 643 template <class _Tp, class _Container, class _Compare> 644 inline _LIBCPP_INLINE_VISIBILITY 645 void 646 priority_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 654 template <class _Tp, class _Container, class _Compare> 655 inline _LIBCPP_INLINE_VISIBILITY 656 void 657 priority_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 665 template <class _Tp, class _Container, class _Compare> 666 template <class... _Args> 667 inline _LIBCPP_INLINE_VISIBILITY 668 void 669 priority_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 678 template <class _Tp, class _Container, class _Compare> 679 inline _LIBCPP_INLINE_VISIBILITY 680 void 681 priority_queue<_Tp, _Container, _Compare>::pop() 682 { 683 _VSTD::pop_heap(c.begin(), c.end(), comp); 684 c.pop_back(); 685 } 686 687 template <class _Tp, class _Container, class _Compare> 688 inline _LIBCPP_INLINE_VISIBILITY 689 void 690 priority_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 699 template <class _Tp, class _Container, class _Compare> 700 inline _LIBCPP_INLINE_VISIBILITY 701 void 702 swap(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 709 template <class _Tp, class _Container, class _Compare, class _Alloc> 710 struct _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