Home | History | Annotate | Download | only in include
      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> reference emplace(Args&&... args); // reference in C++17
     67     void pop();
     68 
     69     void swap(queue& q) noexcept(is_nothrow_swappable_v<Container>)
     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(is_nothrow_swappable_v<Container> &&
    157                  is_nothrow_swappable_v<Comp>)
    158 };
    159 
    160 template <class T, class Container, class Compare>
    161   void swap(priority_queue<T, Container, Compare>& x,
    162             priority_queue<T, Container, Compare>& y)
    163             noexcept(noexcept(x.swap(y)));
    164 
    165 }  // std
    166 
    167 */
    168 
    169 #include <__config>
    170 #include <deque>
    171 #include <vector>
    172 #include <functional>
    173 #include <algorithm>
    174 
    175 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
    176 #pragma GCC system_header
    177 #endif
    178 
    179 _LIBCPP_BEGIN_NAMESPACE_STD
    180 
    181 template <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS queue;
    182 
    183 template <class _Tp, class _Container>
    184 _LIBCPP_INLINE_VISIBILITY
    185 bool
    186 operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
    187 
    188 template <class _Tp, class _Container>
    189 _LIBCPP_INLINE_VISIBILITY
    190 bool
    191 operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
    192 
    193 template <class _Tp, class _Container /*= deque<_Tp>*/>
    194 class _LIBCPP_TEMPLATE_VIS queue
    195 {
    196 public:
    197     typedef _Container                               container_type;
    198     typedef typename container_type::value_type      value_type;
    199     typedef typename container_type::reference       reference;
    200     typedef typename container_type::const_reference const_reference;
    201     typedef typename container_type::size_type       size_type;
    202     static_assert((is_same<_Tp, value_type>::value), "" );
    203 
    204 protected:
    205     container_type c;
    206 
    207 public:
    208     _LIBCPP_INLINE_VISIBILITY
    209     queue()
    210         _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
    211         : c() {}
    212 
    213     _LIBCPP_INLINE_VISIBILITY
    214     queue(const queue& __q) : c(__q.c) {}
    215 
    216     _LIBCPP_INLINE_VISIBILITY
    217     queue& operator=(const queue& __q) {c = __q.c; return *this;}
    218 
    219 #ifndef _LIBCPP_CXX03_LANG
    220     _LIBCPP_INLINE_VISIBILITY
    221     queue(queue&& __q)
    222         _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
    223         : c(_VSTD::move(__q.c)) {}
    224 
    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_CXX03_LANG
    230 
    231     _LIBCPP_INLINE_VISIBILITY
    232     explicit queue(const container_type& __c)  : c(__c) {}
    233 #ifndef _LIBCPP_CXX03_LANG
    234     _LIBCPP_INLINE_VISIBILITY
    235     explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {}
    236 #endif  // _LIBCPP_CXX03_LANG
    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_CXX03_LANG
    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_CXX03_LANG
    270 
    271     _LIBCPP_NODISCARD_AFTER_CXX17 _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_CXX03_LANG
    288     _LIBCPP_INLINE_VISIBILITY
    289     void push(value_type&& __v)      {c.push_back(_VSTD::move(__v));}
    290     template <class... _Args>
    291         _LIBCPP_INLINE_VISIBILITY
    292 #if _LIBCPP_STD_VER > 14
    293         decltype(auto) emplace(_Args&&... __args)
    294             { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
    295 #else
    296         void     emplace(_Args&&... __args)
    297             {        c.emplace_back(_VSTD::forward<_Args>(__args)...);}
    298 #endif
    299 #endif  // _LIBCPP_CXX03_LANG
    300     _LIBCPP_INLINE_VISIBILITY
    301     void pop() {c.pop_front();}
    302 
    303     _LIBCPP_INLINE_VISIBILITY
    304     void swap(queue& __q)
    305         _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
    306     {
    307         using _VSTD::swap;
    308         swap(c, __q.c);
    309     }
    310 
    311     template <class _T1, class _C1>
    312     friend
    313     _LIBCPP_INLINE_VISIBILITY
    314     bool
    315     operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
    316 
    317     template <class _T1, class _C1>
    318     friend
    319     _LIBCPP_INLINE_VISIBILITY
    320     bool
    321     operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
    322 };
    323 
    324 template <class _Tp, class _Container>
    325 inline _LIBCPP_INLINE_VISIBILITY
    326 bool
    327 operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
    328 {
    329     return __x.c == __y.c;
    330 }
    331 
    332 template <class _Tp, class _Container>
    333 inline _LIBCPP_INLINE_VISIBILITY
    334 bool
    335 operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
    336 {
    337     return __x.c < __y.c;
    338 }
    339 
    340 template <class _Tp, class _Container>
    341 inline _LIBCPP_INLINE_VISIBILITY
    342 bool
    343 operator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
    344 {
    345     return !(__x == __y);
    346 }
    347 
    348 template <class _Tp, class _Container>
    349 inline _LIBCPP_INLINE_VISIBILITY
    350 bool
    351 operator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
    352 {
    353     return __y < __x;
    354 }
    355 
    356 template <class _Tp, class _Container>
    357 inline _LIBCPP_INLINE_VISIBILITY
    358 bool
    359 operator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
    360 {
    361     return !(__x < __y);
    362 }
    363 
    364 template <class _Tp, class _Container>
    365 inline _LIBCPP_INLINE_VISIBILITY
    366 bool
    367 operator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
    368 {
    369     return !(__y < __x);
    370 }
    371 
    372 template <class _Tp, class _Container>
    373 inline _LIBCPP_INLINE_VISIBILITY
    374 typename enable_if<
    375     __is_swappable<_Container>::value,
    376     void
    377 >::type
    378 swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
    379     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
    380 {
    381     __x.swap(__y);
    382 }
    383 
    384 template <class _Tp, class _Container, class _Alloc>
    385 struct _LIBCPP_TEMPLATE_VIS uses_allocator<queue<_Tp, _Container>, _Alloc>
    386     : public uses_allocator<_Container, _Alloc>
    387 {
    388 };
    389 
    390 template <class _Tp, class _Container = vector<_Tp>,
    391           class _Compare = less<typename _Container::value_type> >
    392 class _LIBCPP_TEMPLATE_VIS priority_queue
    393 {
    394 public:
    395     typedef _Container                               container_type;
    396     typedef _Compare                                 value_compare;
    397     typedef typename container_type::value_type      value_type;
    398     typedef typename container_type::reference       reference;
    399     typedef typename container_type::const_reference const_reference;
    400     typedef typename container_type::size_type       size_type;
    401     static_assert((is_same<_Tp, value_type>::value), "" );
    402 
    403 protected:
    404     container_type c;
    405     value_compare comp;
    406 
    407 public:
    408     _LIBCPP_INLINE_VISIBILITY
    409     priority_queue()
    410         _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value &&
    411                    is_nothrow_default_constructible<value_compare>::value)
    412         : c(), comp() {}
    413 
    414     _LIBCPP_INLINE_VISIBILITY
    415     priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
    416 
    417     _LIBCPP_INLINE_VISIBILITY
    418     priority_queue& operator=(const priority_queue& __q)
    419         {c = __q.c; comp = __q.comp; return *this;}
    420 
    421 #ifndef _LIBCPP_CXX03_LANG
    422     _LIBCPP_INLINE_VISIBILITY
    423     priority_queue(priority_queue&& __q)
    424         _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value &&
    425                    is_nothrow_move_constructible<value_compare>::value)
    426         : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {}
    427 
    428     _LIBCPP_INLINE_VISIBILITY
    429     priority_queue& operator=(priority_queue&& __q)
    430         _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value &&
    431                    is_nothrow_move_assignable<value_compare>::value)
    432         {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
    433 #endif  // _LIBCPP_CXX03_LANG
    434 
    435     _LIBCPP_INLINE_VISIBILITY
    436     explicit priority_queue(const value_compare& __comp)
    437         : c(), comp(__comp) {}
    438     _LIBCPP_INLINE_VISIBILITY
    439     priority_queue(const value_compare& __comp, const container_type& __c);
    440 #ifndef _LIBCPP_CXX03_LANG
    441     _LIBCPP_INLINE_VISIBILITY
    442     explicit priority_queue(const value_compare& __comp, container_type&& __c);
    443 #endif
    444     template <class _InputIter>
    445         _LIBCPP_INLINE_VISIBILITY
    446         priority_queue(_InputIter __f, _InputIter __l,
    447                        const value_compare& __comp = value_compare());
    448     template <class _InputIter>
    449         _LIBCPP_INLINE_VISIBILITY
    450         priority_queue(_InputIter __f, _InputIter __l,
    451                        const value_compare& __comp, const container_type& __c);
    452 #ifndef _LIBCPP_CXX03_LANG
    453     template <class _InputIter>
    454         _LIBCPP_INLINE_VISIBILITY
    455         priority_queue(_InputIter __f, _InputIter __l,
    456                        const value_compare& __comp, container_type&& __c);
    457 #endif  // _LIBCPP_CXX03_LANG
    458     template <class _Alloc>
    459         _LIBCPP_INLINE_VISIBILITY
    460         explicit priority_queue(const _Alloc& __a,
    461                        typename enable_if<uses_allocator<container_type,
    462                                                          _Alloc>::value>::type* = 0);
    463     template <class _Alloc>
    464         _LIBCPP_INLINE_VISIBILITY
    465         priority_queue(const value_compare& __comp, const _Alloc& __a,
    466                        typename enable_if<uses_allocator<container_type,
    467                                                          _Alloc>::value>::type* = 0);
    468     template <class _Alloc>
    469         _LIBCPP_INLINE_VISIBILITY
    470         priority_queue(const value_compare& __comp, const container_type& __c,
    471                        const _Alloc& __a,
    472                        typename enable_if<uses_allocator<container_type,
    473                                                          _Alloc>::value>::type* = 0);
    474     template <class _Alloc>
    475         _LIBCPP_INLINE_VISIBILITY
    476         priority_queue(const priority_queue& __q, const _Alloc& __a,
    477                        typename enable_if<uses_allocator<container_type,
    478                                                          _Alloc>::value>::type* = 0);
    479 #ifndef _LIBCPP_CXX03_LANG
    480     template <class _Alloc>
    481         _LIBCPP_INLINE_VISIBILITY
    482         priority_queue(const value_compare& __comp, container_type&& __c,
    483                        const _Alloc& __a,
    484                        typename enable_if<uses_allocator<container_type,
    485                                                          _Alloc>::value>::type* = 0);
    486     template <class _Alloc>
    487         _LIBCPP_INLINE_VISIBILITY
    488         priority_queue(priority_queue&& __q, const _Alloc& __a,
    489                        typename enable_if<uses_allocator<container_type,
    490                                                          _Alloc>::value>::type* = 0);
    491 #endif  // _LIBCPP_CXX03_LANG
    492 
    493     _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
    494     bool            empty() const {return c.empty();}
    495     _LIBCPP_INLINE_VISIBILITY
    496     size_type       size() const  {return c.size();}
    497     _LIBCPP_INLINE_VISIBILITY
    498     const_reference top() const   {return c.front();}
    499 
    500     _LIBCPP_INLINE_VISIBILITY
    501     void push(const value_type& __v);
    502 #ifndef _LIBCPP_CXX03_LANG
    503     _LIBCPP_INLINE_VISIBILITY
    504     void push(value_type&& __v);
    505     template <class... _Args>
    506     _LIBCPP_INLINE_VISIBILITY
    507     void emplace(_Args&&... __args);
    508 #endif  // _LIBCPP_CXX03_LANG
    509     _LIBCPP_INLINE_VISIBILITY
    510     void pop();
    511 
    512     _LIBCPP_INLINE_VISIBILITY
    513     void swap(priority_queue& __q)
    514         _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
    515                    __is_nothrow_swappable<value_compare>::value);
    516 };
    517 
    518 template <class _Tp, class _Container, class _Compare>
    519 inline
    520 priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
    521                                                           const container_type& __c)
    522     : c(__c),
    523       comp(__comp)
    524 {
    525     _VSTD::make_heap(c.begin(), c.end(), comp);
    526 }
    527 
    528 #ifndef _LIBCPP_CXX03_LANG
    529 
    530 template <class _Tp, class _Container, class _Compare>
    531 inline
    532 priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
    533                                                           container_type&& __c)
    534     : c(_VSTD::move(__c)),
    535       comp(__comp)
    536 {
    537     _VSTD::make_heap(c.begin(), c.end(), comp);
    538 }
    539 
    540 #endif  // _LIBCPP_CXX03_LANG
    541 
    542 template <class _Tp, class _Container, class _Compare>
    543 template <class _InputIter>
    544 inline
    545 priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
    546                                                           const value_compare& __comp)
    547     : c(__f, __l),
    548       comp(__comp)
    549 {
    550     _VSTD::make_heap(c.begin(), c.end(), comp);
    551 }
    552 
    553 template <class _Tp, class _Container, class _Compare>
    554 template <class _InputIter>
    555 inline
    556 priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
    557                                                           const value_compare& __comp,
    558                                                           const container_type& __c)
    559     : c(__c),
    560       comp(__comp)
    561 {
    562     c.insert(c.end(), __f, __l);
    563     _VSTD::make_heap(c.begin(), c.end(), comp);
    564 }
    565 
    566 #ifndef _LIBCPP_CXX03_LANG
    567 
    568 template <class _Tp, class _Container, class _Compare>
    569 template <class _InputIter>
    570 inline
    571 priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
    572                                                           const value_compare& __comp,
    573                                                           container_type&& __c)
    574     : c(_VSTD::move(__c)),
    575       comp(__comp)
    576 {
    577     c.insert(c.end(), __f, __l);
    578     _VSTD::make_heap(c.begin(), c.end(), comp);
    579 }
    580 
    581 #endif  // _LIBCPP_CXX03_LANG
    582 
    583 template <class _Tp, class _Container, class _Compare>
    584 template <class _Alloc>
    585 inline
    586 priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
    587                        typename enable_if<uses_allocator<container_type,
    588                                                          _Alloc>::value>::type*)
    589     : c(__a)
    590 {
    591 }
    592 
    593 template <class _Tp, class _Container, class _Compare>
    594 template <class _Alloc>
    595 inline
    596 priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
    597                                                           const _Alloc& __a,
    598                        typename enable_if<uses_allocator<container_type,
    599                                                          _Alloc>::value>::type*)
    600     : c(__a),
    601       comp(__comp)
    602 {
    603 }
    604 
    605 template <class _Tp, class _Container, class _Compare>
    606 template <class _Alloc>
    607 inline
    608 priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
    609                                                           const container_type& __c,
    610                                                           const _Alloc& __a,
    611                        typename enable_if<uses_allocator<container_type,
    612                                                          _Alloc>::value>::type*)
    613     : c(__c, __a),
    614       comp(__comp)
    615 {
    616     _VSTD::make_heap(c.begin(), c.end(), comp);
    617 }
    618 
    619 template <class _Tp, class _Container, class _Compare>
    620 template <class _Alloc>
    621 inline
    622 priority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
    623                                                           const _Alloc& __a,
    624                        typename enable_if<uses_allocator<container_type,
    625                                                          _Alloc>::value>::type*)
    626     : c(__q.c, __a),
    627       comp(__q.comp)
    628 {
    629     _VSTD::make_heap(c.begin(), c.end(), comp);
    630 }
    631 
    632 #ifndef _LIBCPP_CXX03_LANG
    633 
    634 template <class _Tp, class _Container, class _Compare>
    635 template <class _Alloc>
    636 inline
    637 priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
    638                                                           container_type&& __c,
    639                                                           const _Alloc& __a,
    640                        typename enable_if<uses_allocator<container_type,
    641                                                          _Alloc>::value>::type*)
    642     : c(_VSTD::move(__c), __a),
    643       comp(__comp)
    644 {
    645     _VSTD::make_heap(c.begin(), c.end(), comp);
    646 }
    647 
    648 template <class _Tp, class _Container, class _Compare>
    649 template <class _Alloc>
    650 inline
    651 priority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
    652                                                           const _Alloc& __a,
    653                        typename enable_if<uses_allocator<container_type,
    654                                                          _Alloc>::value>::type*)
    655     : c(_VSTD::move(__q.c), __a),
    656       comp(_VSTD::move(__q.comp))
    657 {
    658     _VSTD::make_heap(c.begin(), c.end(), comp);
    659 }
    660 
    661 #endif  // _LIBCPP_CXX03_LANG
    662 
    663 template <class _Tp, class _Container, class _Compare>
    664 inline
    665 void
    666 priority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
    667 {
    668     c.push_back(__v);
    669     _VSTD::push_heap(c.begin(), c.end(), comp);
    670 }
    671 
    672 #ifndef _LIBCPP_CXX03_LANG
    673 
    674 template <class _Tp, class _Container, class _Compare>
    675 inline
    676 void
    677 priority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
    678 {
    679     c.push_back(_VSTD::move(__v));
    680     _VSTD::push_heap(c.begin(), c.end(), comp);
    681 }
    682 
    683 template <class _Tp, class _Container, class _Compare>
    684 template <class... _Args>
    685 inline
    686 void
    687 priority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
    688 {
    689     c.emplace_back(_VSTD::forward<_Args>(__args)...);
    690     _VSTD::push_heap(c.begin(), c.end(), comp);
    691 }
    692 
    693 #endif  // _LIBCPP_CXX03_LANG
    694 
    695 template <class _Tp, class _Container, class _Compare>
    696 inline
    697 void
    698 priority_queue<_Tp, _Container, _Compare>::pop()
    699 {
    700     _VSTD::pop_heap(c.begin(), c.end(), comp);
    701     c.pop_back();
    702 }
    703 
    704 template <class _Tp, class _Container, class _Compare>
    705 inline
    706 void
    707 priority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
    708         _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
    709                    __is_nothrow_swappable<value_compare>::value)
    710 {
    711     using _VSTD::swap;
    712     swap(c, __q.c);
    713     swap(comp, __q.comp);
    714 }
    715 
    716 template <class _Tp, class _Container, class _Compare>
    717 inline _LIBCPP_INLINE_VISIBILITY
    718 typename enable_if<
    719     __is_swappable<_Container>::value
    720     && __is_swappable<_Compare>::value,
    721     void
    722 >::type
    723 swap(priority_queue<_Tp, _Container, _Compare>& __x,
    724      priority_queue<_Tp, _Container, _Compare>& __y)
    725     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
    726 {
    727     __x.swap(__y);
    728 }
    729 
    730 template <class _Tp, class _Container, class _Compare, class _Alloc>
    731 struct _LIBCPP_TEMPLATE_VIS uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
    732     : public uses_allocator<_Container, _Alloc>
    733 {
    734 };
    735 
    736 _LIBCPP_END_NAMESPACE_STD
    737 
    738 #endif  // _LIBCPP_QUEUE
    739