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> 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