xref: /llvm-project-15.0.7/libcxx/include/queue (revision 412dbebe)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===--------------------------- queue ------------------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
6*412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7*412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
83e519524SHoward Hinnant//
93e519524SHoward Hinnant//===----------------------------------------------------------------------===//
103e519524SHoward Hinnant
113e519524SHoward Hinnant#ifndef _LIBCPP_QUEUE
123e519524SHoward Hinnant#define _LIBCPP_QUEUE
133e519524SHoward Hinnant
143e519524SHoward Hinnant/*
153e519524SHoward Hinnant    queue synopsis
163e519524SHoward Hinnant
173e519524SHoward Hinnantnamespace std
183e519524SHoward Hinnant{
193e519524SHoward Hinnant
203e519524SHoward Hinnanttemplate <class T, class Container = deque<T>>
213e519524SHoward Hinnantclass queue
223e519524SHoward Hinnant{
233e519524SHoward Hinnantpublic:
243e519524SHoward Hinnant    typedef Container                                container_type;
253e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
263e519524SHoward Hinnant    typedef typename container_type::reference       reference;
273e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
283e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
293e519524SHoward Hinnant
303e519524SHoward Hinnantprotected:
313e519524SHoward Hinnant    container_type c;
323e519524SHoward Hinnant
333e519524SHoward Hinnantpublic:
343e519524SHoward Hinnant    queue();
353e519524SHoward Hinnant    explicit queue(const container_type& c);
363e519524SHoward Hinnant    explicit queue(container_type&& c);
373e519524SHoward Hinnant    queue(queue&& q);
383e519524SHoward Hinnant    template <class Alloc>
393e519524SHoward Hinnant        explicit queue(const Alloc& a);
403e519524SHoward Hinnant    template <class Alloc>
413e519524SHoward Hinnant        queue(const container_type& c, const Alloc& a);
423e519524SHoward Hinnant    template <class Alloc>
433e519524SHoward Hinnant        queue(container_type&& c, const Alloc& a);
443e519524SHoward Hinnant    template <class Alloc>
453e519524SHoward Hinnant        queue(queue&& q, const Alloc& a);
463e519524SHoward Hinnant
473e519524SHoward Hinnant    queue& operator=(queue&& q);
483e519524SHoward Hinnant
493e519524SHoward Hinnant    bool      empty() const;
503e519524SHoward Hinnant    size_type size() const;
513e519524SHoward Hinnant
523e519524SHoward Hinnant    reference       front();
533e519524SHoward Hinnant    const_reference front() const;
543e519524SHoward Hinnant    reference       back();
553e519524SHoward Hinnant    const_reference back() const;
563e519524SHoward Hinnant
573e519524SHoward Hinnant    void push(const value_type& v);
583e519524SHoward Hinnant    void push(value_type&& v);
593e519524SHoward Hinnant    template <class... Args> void emplace(Args&&... args);
603e519524SHoward Hinnant    void pop();
613e519524SHoward Hinnant
623e519524SHoward Hinnant    void swap(queue& q);
633e519524SHoward Hinnant};
643e519524SHoward Hinnant
653e519524SHoward Hinnanttemplate <class T, class Container>
663e519524SHoward Hinnant  bool operator==(const queue<T, Container>& x,const queue<T, Container>& y);
673e519524SHoward Hinnant
683e519524SHoward Hinnanttemplate <class T, class Container>
693e519524SHoward Hinnant  bool operator< (const queue<T, Container>& x,const queue<T, Container>& y);
703e519524SHoward Hinnant
713e519524SHoward Hinnanttemplate <class T, class Container>
723e519524SHoward Hinnant  bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y);
733e519524SHoward Hinnant
743e519524SHoward Hinnanttemplate <class T, class Container>
753e519524SHoward Hinnant  bool operator> (const queue<T, Container>& x,const queue<T, Container>& y);
763e519524SHoward Hinnant
773e519524SHoward Hinnanttemplate <class T, class Container>
783e519524SHoward Hinnant  bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y);
793e519524SHoward Hinnant
803e519524SHoward Hinnanttemplate <class T, class Container>
813e519524SHoward Hinnant  bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y);
823e519524SHoward Hinnant
833e519524SHoward Hinnanttemplate <class T, class Container>
843e519524SHoward Hinnant  void swap(queue<T, Container>& x, queue<T, Container>& y);
853e519524SHoward Hinnant
863e519524SHoward Hinnanttemplate <class T, class Container = vector<T>,
873e519524SHoward Hinnant          class Compare = less<typename Container::value_type>>
883e519524SHoward Hinnantclass priority_queue
893e519524SHoward Hinnant{
903e519524SHoward Hinnantpublic:
913e519524SHoward Hinnant    typedef Container                                container_type;
923e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
933e519524SHoward Hinnant    typedef typename container_type::reference       reference;
943e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
953e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
963e519524SHoward Hinnant
973e519524SHoward Hinnantprotected:
983e519524SHoward Hinnant    container_type c;
993e519524SHoward Hinnant    Compare comp;
1003e519524SHoward Hinnant
1013e519524SHoward Hinnantpublic:
1023e519524SHoward Hinnant    explicit priority_queue(const Compare& comp = Compare());
1033e519524SHoward Hinnant    priority_queue(const Compare& comp, const container_type& c);
1043e519524SHoward Hinnant    explicit priority_queue(const Compare& comp, container_type&& c);
1053e519524SHoward Hinnant    template <class InputIterator>
1063e519524SHoward Hinnant        priority_queue(InputIterator first, InputIterator last,
1073e519524SHoward Hinnant                       const Compare& comp = Compare());
1083e519524SHoward Hinnant    template <class InputIterator>
1093e519524SHoward Hinnant        priority_queue(InputIterator first, InputIterator last,
1103e519524SHoward Hinnant                       const Compare& comp, const container_type& c);
1113e519524SHoward Hinnant    template <class InputIterator>
1123e519524SHoward Hinnant        priority_queue(InputIterator first, InputIterator last,
1133e519524SHoward Hinnant                       const Compare& comp, container_type&& c);
1143e519524SHoward Hinnant    priority_queue(priority_queue&& q);
1153e519524SHoward Hinnant    priority_queue& operator=(priority_queue&& q);
1163e519524SHoward Hinnant    template <class Alloc>
1173e519524SHoward Hinnant        explicit priority_queue(const Alloc& a);
1183e519524SHoward Hinnant    template <class Alloc>
1193e519524SHoward Hinnant        priority_queue(const Compare& comp, const Alloc& a);
1203e519524SHoward Hinnant    template <class Alloc>
1213e519524SHoward Hinnant        priority_queue(const Compare& comp, const container_type& c,
1223e519524SHoward Hinnant                       const Alloc& a);
1233e519524SHoward Hinnant    template <class Alloc>
1243e519524SHoward Hinnant        priority_queue(const Compare& comp, container_type&& c,
1253e519524SHoward Hinnant                       const Alloc& a);
1263e519524SHoward Hinnant    template <class Alloc>
1273e519524SHoward Hinnant        priority_queue(priority_queue&& q, const Alloc& a);
1283e519524SHoward Hinnant
1293e519524SHoward Hinnant    bool            empty() const;
1303e519524SHoward Hinnant    size_type       size() const;
1313e519524SHoward Hinnant    const_reference top() const;
1323e519524SHoward Hinnant
1333e519524SHoward Hinnant    void push(const value_type& v);
1343e519524SHoward Hinnant    void push(value_type&& v);
1353e519524SHoward Hinnant    template <class... Args> void emplace(Args&&... args);
1363e519524SHoward Hinnant    void pop();
1373e519524SHoward Hinnant
1383e519524SHoward Hinnant    void swap(priority_queue& q);
1393e519524SHoward Hinnant};
1403e519524SHoward Hinnant
1413e519524SHoward Hinnanttemplate <class T, class Container, class Compare>
1423e519524SHoward Hinnant  void swap(priority_queue<T, Container, Compare>& x,
1433e519524SHoward Hinnant            priority_queue<T, Container, Compare>& y);
1443e519524SHoward Hinnant
1453e519524SHoward Hinnant}  // std
1463e519524SHoward Hinnant
1473e519524SHoward Hinnant*/
1483e519524SHoward Hinnant
1493e519524SHoward Hinnant#include <__config>
1503e519524SHoward Hinnant#include <deque>
1513e519524SHoward Hinnant#include <vector>
1523e519524SHoward Hinnant#include <functional>
1533e519524SHoward Hinnant#include <algorithm>
1543e519524SHoward Hinnant
1553e519524SHoward Hinnant#pragma GCC system_header
1563e519524SHoward Hinnant
1573e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1583e519524SHoward Hinnant
1593e519524SHoward Hinnanttemplate <class _Tp, class _Container> class queue;
1603e519524SHoward Hinnant
1613e519524SHoward Hinnanttemplate <class _Tp, class _Container>
1623e519524SHoward Hinnantbool
1633e519524SHoward Hinnantoperator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
1643e519524SHoward Hinnant
1653e519524SHoward Hinnanttemplate <class _Tp, class _Container>
1663e519524SHoward Hinnantbool
1673e519524SHoward Hinnantoperator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
1683e519524SHoward Hinnant
1693e519524SHoward Hinnanttemplate <class _Tp, class _Container = deque<_Tp> >
170392183f9SHoward Hinnantclass _LIBCPP_VISIBLE queue
1713e519524SHoward Hinnant{
1723e519524SHoward Hinnantpublic:
1733e519524SHoward Hinnant    typedef _Container                               container_type;
1743e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
1753e519524SHoward Hinnant    typedef typename container_type::reference       reference;
1763e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
1773e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
1783e519524SHoward Hinnant
1793e519524SHoward Hinnantprotected:
1803e519524SHoward Hinnant    container_type c;
1813e519524SHoward Hinnant
1823e519524SHoward Hinnantpublic:
183392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1843e519524SHoward Hinnant    queue() : c() {}
185392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1863e519524SHoward Hinnant    explicit queue(const container_type& __c)  : c(__c) {}
1877609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
188392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1893e519524SHoward Hinnant    explicit queue(container_type&& __c) : c(_STD::move(__c)) {}
190392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1913e519524SHoward Hinnant    queue(queue&& __q) : c(_STD::move(__q.c)) {}
1927609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1933e519524SHoward Hinnant    template <class _Alloc>
194392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1953e519524SHoward Hinnant        explicit queue(const _Alloc& __a,
1963e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
1973e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
1983e519524SHoward Hinnant            : c(__a) {}
1993e519524SHoward Hinnant    template <class _Alloc>
200392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2013e519524SHoward Hinnant        queue(const queue& __q, const _Alloc& __a,
2023e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2033e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
2043e519524SHoward Hinnant            : c(__q.c, __a) {}
2053e519524SHoward Hinnant    template <class _Alloc>
206392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2073e519524SHoward Hinnant        queue(const container_type& __c, const _Alloc& __a,
2083e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2093e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
2103e519524SHoward Hinnant            : c(__c, __a) {}
2117609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2123e519524SHoward Hinnant    template <class _Alloc>
213392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2143e519524SHoward Hinnant        queue(container_type&& __c, const _Alloc& __a,
2153e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2163e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
2173e519524SHoward Hinnant            : c(_STD::move(__c), __a) {}
2183e519524SHoward Hinnant    template <class _Alloc>
219392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2203e519524SHoward Hinnant        queue(queue&& __q, const _Alloc& __a,
2213e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2223e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
2233e519524SHoward Hinnant            : c(_STD::move(__q.c), __a) {}
2243e519524SHoward Hinnant
225392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2263e519524SHoward Hinnant    queue& operator=(queue&& __q)
2273e519524SHoward Hinnant    {
2283e519524SHoward Hinnant        c = _STD::move(__q.c);
2293e519524SHoward Hinnant        return *this;
2303e519524SHoward Hinnant    }
2317609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2323e519524SHoward Hinnant
233392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2343e519524SHoward Hinnant    bool      empty() const {return c.empty();}
235392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2363e519524SHoward Hinnant    size_type size() const  {return c.size();}
2373e519524SHoward Hinnant
238392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2393e519524SHoward Hinnant    reference       front()       {return c.front();}
240392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2413e519524SHoward Hinnant    const_reference front() const {return c.front();}
242392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2433e519524SHoward Hinnant    reference       back()        {return c.back();}
244392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2453e519524SHoward Hinnant    const_reference back() const  {return c.back();}
2463e519524SHoward Hinnant
247392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2483e519524SHoward Hinnant    void push(const value_type& __v) {c.push_back(__v);}
2497609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
250392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2513e519524SHoward Hinnant    void push(value_type&& __v)      {c.push_back(_STD::move(__v));}
2527609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
2533e519524SHoward Hinnant    template <class... _Args>
254392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2553e519524SHoward Hinnant        void emplace(_Args&&... __args)
2563e519524SHoward Hinnant            {c.emplace_back(_STD::forward<_Args>(__args)...);}
2577609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
2587609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
259392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2603e519524SHoward Hinnant    void pop() {c.pop_front();}
2613e519524SHoward Hinnant
262392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2633e519524SHoward Hinnant    void swap(queue& __q)
2643e519524SHoward Hinnant    {
2653e519524SHoward Hinnant        using _STD::swap;
2663e519524SHoward Hinnant        swap(c, __q.c);
2673e519524SHoward Hinnant    }
2683e519524SHoward Hinnant
2693e519524SHoward Hinnant    template <class _T1, class _C1>
2703e519524SHoward Hinnant    friend
271392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2723e519524SHoward Hinnant    bool
2733e519524SHoward Hinnant    operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
2743e519524SHoward Hinnant
2753e519524SHoward Hinnant    template <class _T1, class _C1>
2763e519524SHoward Hinnant    friend
277392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2783e519524SHoward Hinnant    bool
2793e519524SHoward Hinnant    operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
2803e519524SHoward Hinnant};
2813e519524SHoward Hinnant
2823e519524SHoward Hinnanttemplate <class _Tp, class _Container>
283392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2843e519524SHoward Hinnantbool
2853e519524SHoward Hinnantoperator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
2863e519524SHoward Hinnant{
2873e519524SHoward Hinnant    return __x.c == __y.c;
2883e519524SHoward Hinnant}
2893e519524SHoward Hinnant
2903e519524SHoward Hinnanttemplate <class _Tp, class _Container>
291392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2923e519524SHoward Hinnantbool
2933e519524SHoward Hinnantoperator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
2943e519524SHoward Hinnant{
2953e519524SHoward Hinnant    return __x.c < __y.c;
2963e519524SHoward Hinnant}
2973e519524SHoward Hinnant
2983e519524SHoward Hinnanttemplate <class _Tp, class _Container>
299392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3003e519524SHoward Hinnantbool
3013e519524SHoward Hinnantoperator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3023e519524SHoward Hinnant{
3033e519524SHoward Hinnant    return !(__x == __y);
3043e519524SHoward Hinnant}
3053e519524SHoward Hinnant
3063e519524SHoward Hinnanttemplate <class _Tp, class _Container>
307392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3083e519524SHoward Hinnantbool
3093e519524SHoward Hinnantoperator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3103e519524SHoward Hinnant{
3113e519524SHoward Hinnant    return __y < __x;
3123e519524SHoward Hinnant}
3133e519524SHoward Hinnant
3143e519524SHoward Hinnanttemplate <class _Tp, class _Container>
315392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3163e519524SHoward Hinnantbool
3173e519524SHoward Hinnantoperator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3183e519524SHoward Hinnant{
3193e519524SHoward Hinnant    return !(__x < __y);
3203e519524SHoward Hinnant}
3213e519524SHoward Hinnant
3223e519524SHoward Hinnanttemplate <class _Tp, class _Container>
323392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3243e519524SHoward Hinnantbool
3253e519524SHoward Hinnantoperator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3263e519524SHoward Hinnant{
3273e519524SHoward Hinnant    return !(__y < __x);
3283e519524SHoward Hinnant}
3293e519524SHoward Hinnant
3303e519524SHoward Hinnanttemplate <class _Tp, class _Container>
331392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3323e519524SHoward Hinnantvoid
3333e519524SHoward Hinnantswap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
3343e519524SHoward Hinnant{
3353e519524SHoward Hinnant    __x.swap(__y);
3363e519524SHoward Hinnant}
3373e519524SHoward Hinnant
3383e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Alloc>
339392183f9SHoward Hinnantstruct _LIBCPP_VISIBLE uses_allocator<queue<_Tp, _Container>, _Alloc>
3403e519524SHoward Hinnant    : public uses_allocator<_Container, _Alloc>
3413e519524SHoward Hinnant{
3423e519524SHoward Hinnant};
3433e519524SHoward Hinnant
3443e519524SHoward Hinnanttemplate <class _Tp, class _Container = vector<_Tp>,
3453e519524SHoward Hinnant          class _Compare = less<typename _Container::value_type> >
346392183f9SHoward Hinnantclass _LIBCPP_VISIBLE priority_queue
3473e519524SHoward Hinnant{
3483e519524SHoward Hinnantpublic:
3493e519524SHoward Hinnant    typedef _Container                               container_type;
3503e519524SHoward Hinnant    typedef _Compare                                 value_compare;
3513e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
3523e519524SHoward Hinnant    typedef typename container_type::reference       reference;
3533e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
3543e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
3553e519524SHoward Hinnant
3563e519524SHoward Hinnantprotected:
3573e519524SHoward Hinnant    container_type c;
3583e519524SHoward Hinnant    value_compare comp;
3593e519524SHoward Hinnant
3603e519524SHoward Hinnantpublic:
361392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3623e519524SHoward Hinnant    explicit priority_queue(const value_compare& __comp = value_compare())
3633e519524SHoward Hinnant        : c(), comp(__comp) {}
3643e519524SHoward Hinnant    priority_queue(const value_compare& __comp, const container_type& __c);
3657609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
3663e519524SHoward Hinnant    explicit priority_queue(const value_compare& __comp, container_type&& __c);
3673e519524SHoward Hinnant#endif
3683e519524SHoward Hinnant    template <class _InputIter>
3693e519524SHoward Hinnant        priority_queue(_InputIter __f, _InputIter __l,
3703e519524SHoward Hinnant                       const value_compare& __comp = value_compare());
3713e519524SHoward Hinnant    template <class _InputIter>
3723e519524SHoward Hinnant        priority_queue(_InputIter __f, _InputIter __l,
3733e519524SHoward Hinnant                       const value_compare& __comp, const container_type& __c);
3747609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
3753e519524SHoward Hinnant    template <class _InputIter>
3763e519524SHoward Hinnant        priority_queue(_InputIter __f, _InputIter __l,
3773e519524SHoward Hinnant                       const value_compare& __comp, container_type&& __c);
3783e519524SHoward Hinnant    priority_queue(priority_queue&& __q);
3793e519524SHoward Hinnant    priority_queue& operator=(priority_queue&& __q);
3807609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
3813e519524SHoward Hinnant    template <class _Alloc>
3823e519524SHoward Hinnant        explicit priority_queue(const _Alloc& __a,
3833e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
3843e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
3853e519524SHoward Hinnant    template <class _Alloc>
3863e519524SHoward Hinnant        priority_queue(const value_compare& __comp, const _Alloc& __a,
3873e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
3883e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
3893e519524SHoward Hinnant    template <class _Alloc>
3903e519524SHoward Hinnant        priority_queue(const value_compare& __comp, const container_type& __c,
3913e519524SHoward Hinnant                       const _Alloc& __a,
3923e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
3933e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
3943e519524SHoward Hinnant    template <class _Alloc>
3953e519524SHoward Hinnant        priority_queue(const priority_queue& __q, const _Alloc& __a,
3963e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
3973e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
3987609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
3993e519524SHoward Hinnant    template <class _Alloc>
4003e519524SHoward Hinnant        priority_queue(const value_compare& __comp, container_type&& __c,
4013e519524SHoward Hinnant                       const _Alloc& __a,
4023e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
4033e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
4043e519524SHoward Hinnant    template <class _Alloc>
4053e519524SHoward Hinnant        priority_queue(priority_queue&& __q, const _Alloc& __a,
4063e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
4073e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
4087609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
4093e519524SHoward Hinnant
410392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4113e519524SHoward Hinnant    bool            empty() const {return c.empty();}
412392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4133e519524SHoward Hinnant    size_type       size() const  {return c.size();}
414392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4153e519524SHoward Hinnant    const_reference top() const   {return c.front();}
4163e519524SHoward Hinnant
4173e519524SHoward Hinnant    void push(const value_type& __v);
4187609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
4193e519524SHoward Hinnant    void push(value_type&& __v);
4207609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
4213e519524SHoward Hinnant    template <class... _Args> void emplace(_Args&&... __args);
4227609c9b6SHoward Hinnant#endif
4237609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
4243e519524SHoward Hinnant    void pop();
4253e519524SHoward Hinnant
4263e519524SHoward Hinnant    void swap(priority_queue& __q);
4273e519524SHoward Hinnant};
4283e519524SHoward Hinnant
4293e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
430392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4313e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
4323e519524SHoward Hinnant                                                          const container_type& __c)
4333e519524SHoward Hinnant    : c(__c),
4343e519524SHoward Hinnant      comp(__comp)
4353e519524SHoward Hinnant{
4363e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
4373e519524SHoward Hinnant}
4383e519524SHoward Hinnant
4397609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
4403e519524SHoward Hinnant
4413e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
442392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4433e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
4443e519524SHoward Hinnant                                                          container_type&& __c)
4453e519524SHoward Hinnant    : c(_STD::move(__c)),
4463e519524SHoward Hinnant      comp(__comp)
4473e519524SHoward Hinnant{
4483e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
4493e519524SHoward Hinnant}
4503e519524SHoward Hinnant
4517609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
4523e519524SHoward Hinnant
4533e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
4543e519524SHoward Hinnanttemplate <class _InputIter>
455392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4563e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
4573e519524SHoward Hinnant                                                          const value_compare& __comp)
4583e519524SHoward Hinnant    : c(__f, __l),
4593e519524SHoward Hinnant      comp(__comp)
4603e519524SHoward Hinnant{
4613e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
4623e519524SHoward Hinnant}
4633e519524SHoward Hinnant
4643e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
4653e519524SHoward Hinnanttemplate <class _InputIter>
466392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4673e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
4683e519524SHoward Hinnant                                                          const value_compare& __comp,
4693e519524SHoward Hinnant                                                          const container_type& __c)
4703e519524SHoward Hinnant    : c(__c),
4713e519524SHoward Hinnant      comp(__comp)
4723e519524SHoward Hinnant{
4733e519524SHoward Hinnant    c.insert(c.end(), __f, __l);
4743e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
4753e519524SHoward Hinnant}
4763e519524SHoward Hinnant
4777609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
4783e519524SHoward Hinnant
4793e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
4803e519524SHoward Hinnanttemplate <class _InputIter>
481392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4823e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
4833e519524SHoward Hinnant                                                          const value_compare& __comp,
4843e519524SHoward Hinnant                                                          container_type&& __c)
4853e519524SHoward Hinnant    : c(_STD::move(__c)),
4863e519524SHoward Hinnant      comp(__comp)
4873e519524SHoward Hinnant{
4883e519524SHoward Hinnant    c.insert(c.end(), __f, __l);
4893e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
4903e519524SHoward Hinnant}
4913e519524SHoward Hinnant
4923e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
493392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4943e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q)
4953e519524SHoward Hinnant    : c(_STD::move(__q.c)),
4963e519524SHoward Hinnant      comp(_STD::move(__q.comp))
4973e519524SHoward Hinnant{
4983e519524SHoward Hinnant}
4993e519524SHoward Hinnant
5003e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
5013e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>&
5023e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::operator=(priority_queue&& __q)
5033e519524SHoward Hinnant{
5043e519524SHoward Hinnant    c = _STD::move(__q.c);
5053e519524SHoward Hinnant    comp = _STD::move(__q.comp);
5063e519524SHoward Hinnant    return *this;
5073e519524SHoward Hinnant}
5083e519524SHoward Hinnant
5097609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
5103e519524SHoward Hinnant
5113e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
5123e519524SHoward Hinnanttemplate <class _Alloc>
513392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5143e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
5153e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5163e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
5173e519524SHoward Hinnant    : c(__a)
5183e519524SHoward Hinnant{
5193e519524SHoward Hinnant}
5203e519524SHoward Hinnant
5213e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
5223e519524SHoward Hinnanttemplate <class _Alloc>
523392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5243e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
5253e519524SHoward Hinnant                                                          const _Alloc& __a,
5263e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5273e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
5283e519524SHoward Hinnant    : c(__a),
5293e519524SHoward Hinnant      comp(__comp)
5303e519524SHoward Hinnant{
5313e519524SHoward Hinnant}
5323e519524SHoward Hinnant
5333e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
5343e519524SHoward Hinnanttemplate <class _Alloc>
535392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5363e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
5373e519524SHoward Hinnant                                                          const container_type& __c,
5383e519524SHoward Hinnant                                                          const _Alloc& __a,
5393e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5403e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
5413e519524SHoward Hinnant    : c(__c, __a),
5423e519524SHoward Hinnant      comp(__comp)
5433e519524SHoward Hinnant{
5443e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
5453e519524SHoward Hinnant}
5463e519524SHoward Hinnant
5473e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
5483e519524SHoward Hinnanttemplate <class _Alloc>
549392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5503e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
5513e519524SHoward Hinnant                                                          const _Alloc& __a,
5523e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5533e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
5543e519524SHoward Hinnant    : c(__q.c, __a),
5553e519524SHoward Hinnant      comp(__q.comp)
5563e519524SHoward Hinnant{
5573e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
5583e519524SHoward Hinnant}
5593e519524SHoward Hinnant
5607609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
5613e519524SHoward Hinnant
5623e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
5633e519524SHoward Hinnanttemplate <class _Alloc>
564392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5653e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
5663e519524SHoward Hinnant                                                          container_type&& __c,
5673e519524SHoward Hinnant                                                          const _Alloc& __a,
5683e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5693e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
5703e519524SHoward Hinnant    : c(_STD::move(__c), __a),
5713e519524SHoward Hinnant      comp(__comp)
5723e519524SHoward Hinnant{
5733e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
5743e519524SHoward Hinnant}
5753e519524SHoward Hinnant
5763e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
5773e519524SHoward Hinnanttemplate <class _Alloc>
578392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5793e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
5803e519524SHoward Hinnant                                                          const _Alloc& __a,
5813e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5823e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
5833e519524SHoward Hinnant    : c(_STD::move(__q.c), __a),
5843e519524SHoward Hinnant      comp(_STD::move(__q.comp))
5853e519524SHoward Hinnant{
5863e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
5873e519524SHoward Hinnant}
5883e519524SHoward Hinnant
5897609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
5903e519524SHoward Hinnant
5913e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
592392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5933e519524SHoward Hinnantvoid
5943e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
5953e519524SHoward Hinnant{
5963e519524SHoward Hinnant    c.push_back(__v);
5973e519524SHoward Hinnant    _STD::push_heap(c.begin(), c.end(), comp);
5983e519524SHoward Hinnant}
5993e519524SHoward Hinnant
6007609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
6013e519524SHoward Hinnant
6023e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
603392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6043e519524SHoward Hinnantvoid
6053e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
6063e519524SHoward Hinnant{
6073e519524SHoward Hinnant    c.push_back(_STD::move(__v));
6083e519524SHoward Hinnant    _STD::push_heap(c.begin(), c.end(), comp);
6093e519524SHoward Hinnant}
6103e519524SHoward Hinnant
6117609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
6127609c9b6SHoward Hinnant
6133e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6143e519524SHoward Hinnanttemplate <class... _Args>
615392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6163e519524SHoward Hinnantvoid
6173e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
6183e519524SHoward Hinnant{
6193e519524SHoward Hinnant    c.emplace_back(_STD::forward<_Args>(__args)...);
6203e519524SHoward Hinnant    _STD::push_heap(c.begin(), c.end(), comp);
6213e519524SHoward Hinnant}
6223e519524SHoward Hinnant
6237609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
6247609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
6253e519524SHoward Hinnant
6263e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
627392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6283e519524SHoward Hinnantvoid
6293e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::pop()
6303e519524SHoward Hinnant{
6313e519524SHoward Hinnant    _STD::pop_heap(c.begin(), c.end(), comp);
6323e519524SHoward Hinnant    c.pop_back();
6333e519524SHoward Hinnant}
6343e519524SHoward Hinnant
6353e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
636392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6373e519524SHoward Hinnantvoid
6383e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
6393e519524SHoward Hinnant{
6403e519524SHoward Hinnant    using _STD::swap;
6413e519524SHoward Hinnant    swap(c, __q.c);
6423e519524SHoward Hinnant    swap(comp, __q.comp);
6433e519524SHoward Hinnant}
6443e519524SHoward Hinnant
6453e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
646392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6473e519524SHoward Hinnantvoid
6483e519524SHoward Hinnantswap(priority_queue<_Tp, _Container, _Compare>& __x,
6493e519524SHoward Hinnant     priority_queue<_Tp, _Container, _Compare>& __y)
6503e519524SHoward Hinnant{
6513e519524SHoward Hinnant    __x.swap(__y);
6523e519524SHoward Hinnant}
6533e519524SHoward Hinnant
6543e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare, class _Alloc>
655392183f9SHoward Hinnantstruct _LIBCPP_VISIBLE uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
6563e519524SHoward Hinnant    : public uses_allocator<_Container, _Alloc>
6573e519524SHoward Hinnant{
6583e519524SHoward Hinnant};
6593e519524SHoward Hinnant
6603e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
6613e519524SHoward Hinnant
6623e519524SHoward Hinnant#endif  // _LIBCPP_QUEUE
663