xref: /llvm-project-15.0.7/libcxx/include/queue (revision e2f2d1ed)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===--------------------------- queue ------------------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7412dbebeSHoward 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:
346971d826SHoward Hinnant    queue() = default;
356971d826SHoward Hinnant    ~queue() = default;
366971d826SHoward Hinnant
376971d826SHoward Hinnant    queue(const queue& q) = default;
386971d826SHoward Hinnant    queue(queue&& q) = default;
396971d826SHoward Hinnant
406971d826SHoward Hinnant    queue& operator=(const queue& q) = default;
416971d826SHoward Hinnant    queue& operator=(queue&& q) = default;
426971d826SHoward Hinnant
433e519524SHoward Hinnant    explicit queue(const container_type& c);
446971d826SHoward Hinnant    explicit queue(container_type&& c)
453e519524SHoward Hinnant    template <class Alloc>
463e519524SHoward Hinnant        explicit queue(const Alloc& a);
473e519524SHoward Hinnant    template <class Alloc>
483e519524SHoward Hinnant        queue(const container_type& c, const Alloc& a);
493e519524SHoward Hinnant    template <class Alloc>
503e519524SHoward Hinnant        queue(container_type&& c, const Alloc& a);
513e519524SHoward Hinnant    template <class Alloc>
526971d826SHoward Hinnant        queue(const queue& q, const Alloc& a);
536971d826SHoward Hinnant    template <class Alloc>
543e519524SHoward Hinnant        queue(queue&& q, const Alloc& a);
553e519524SHoward Hinnant
563e519524SHoward Hinnant    bool      empty() const;
573e519524SHoward Hinnant    size_type size() const;
583e519524SHoward Hinnant
593e519524SHoward Hinnant    reference       front();
603e519524SHoward Hinnant    const_reference front() const;
613e519524SHoward Hinnant    reference       back();
623e519524SHoward Hinnant    const_reference back() const;
633e519524SHoward Hinnant
643e519524SHoward Hinnant    void push(const value_type& v);
653e519524SHoward Hinnant    void push(value_type&& v);
660e411641SEric Fiselier    template <class... Args> reference emplace(Args&&... args);
673e519524SHoward Hinnant    void pop();
683e519524SHoward Hinnant
69f07dd8d0SEric Fiselier    void swap(queue& q) noexcept(is_nothrow_swappable_v<Container>)
703e519524SHoward Hinnant};
713e519524SHoward Hinnant
723e519524SHoward Hinnanttemplate <class T, class Container>
733e519524SHoward Hinnant  bool operator==(const queue<T, Container>& x,const queue<T, Container>& y);
743e519524SHoward Hinnant
753e519524SHoward Hinnanttemplate <class T, class Container>
763e519524SHoward Hinnant  bool operator< (const queue<T, Container>& x,const queue<T, Container>& y);
773e519524SHoward Hinnant
783e519524SHoward Hinnanttemplate <class T, class Container>
793e519524SHoward Hinnant  bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y);
803e519524SHoward Hinnant
813e519524SHoward Hinnanttemplate <class T, class Container>
823e519524SHoward Hinnant  bool operator> (const queue<T, Container>& x,const queue<T, Container>& y);
833e519524SHoward Hinnant
843e519524SHoward Hinnanttemplate <class T, class Container>
853e519524SHoward Hinnant  bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y);
863e519524SHoward Hinnant
873e519524SHoward Hinnanttemplate <class T, class Container>
883e519524SHoward Hinnant  bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y);
893e519524SHoward Hinnant
903e519524SHoward Hinnanttemplate <class T, class Container>
916971d826SHoward Hinnant  void swap(queue<T, Container>& x, queue<T, Container>& y)
926971d826SHoward Hinnant  noexcept(noexcept(x.swap(y)));
933e519524SHoward Hinnant
943e519524SHoward Hinnanttemplate <class T, class Container = vector<T>,
953e519524SHoward Hinnant          class Compare = less<typename Container::value_type>>
963e519524SHoward Hinnantclass priority_queue
973e519524SHoward Hinnant{
983e519524SHoward Hinnantpublic:
993e519524SHoward Hinnant    typedef Container                                container_type;
1003e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
1013e519524SHoward Hinnant    typedef typename container_type::reference       reference;
1023e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
1033e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
1043e519524SHoward Hinnant
1053e519524SHoward Hinnantprotected:
1063e519524SHoward Hinnant    container_type c;
1073e519524SHoward Hinnant    Compare comp;
1083e519524SHoward Hinnant
1093e519524SHoward Hinnantpublic:
1106971d826SHoward Hinnant    priority_queue() = default;
1116971d826SHoward Hinnant    ~priority_queue() = default;
1126971d826SHoward Hinnant
1136971d826SHoward Hinnant    priority_queue(const priority_queue& q) = default;
1146971d826SHoward Hinnant    priority_queue(priority_queue&& q) = default;
1156971d826SHoward Hinnant
1166971d826SHoward Hinnant    priority_queue& operator=(const priority_queue& q) = default;
1176971d826SHoward Hinnant    priority_queue& operator=(priority_queue&& q) = default;
1186971d826SHoward Hinnant
1196971d826SHoward Hinnant    explicit priority_queue(const Compare& comp);
1203e519524SHoward Hinnant    priority_queue(const Compare& comp, const container_type& c);
1213e519524SHoward Hinnant    explicit priority_queue(const Compare& comp, container_type&& c);
1223e519524SHoward Hinnant    template <class InputIterator>
1233e519524SHoward Hinnant        priority_queue(InputIterator first, InputIterator last,
1243e519524SHoward Hinnant                       const Compare& comp = Compare());
1253e519524SHoward Hinnant    template <class InputIterator>
1263e519524SHoward Hinnant        priority_queue(InputIterator first, InputIterator last,
1273e519524SHoward Hinnant                       const Compare& comp, const container_type& c);
1283e519524SHoward Hinnant    template <class InputIterator>
1293e519524SHoward Hinnant        priority_queue(InputIterator first, InputIterator last,
1303e519524SHoward Hinnant                       const Compare& comp, container_type&& c);
1313e519524SHoward Hinnant    template <class Alloc>
1323e519524SHoward Hinnant        explicit priority_queue(const Alloc& a);
1333e519524SHoward Hinnant    template <class Alloc>
1343e519524SHoward Hinnant        priority_queue(const Compare& comp, const Alloc& a);
1353e519524SHoward Hinnant    template <class Alloc>
1363e519524SHoward Hinnant        priority_queue(const Compare& comp, const container_type& c,
1373e519524SHoward Hinnant                       const Alloc& a);
1383e519524SHoward Hinnant    template <class Alloc>
1393e519524SHoward Hinnant        priority_queue(const Compare& comp, container_type&& c,
1403e519524SHoward Hinnant                       const Alloc& a);
1413e519524SHoward Hinnant    template <class Alloc>
1426971d826SHoward Hinnant        priority_queue(const priority_queue& q, const Alloc& a);
1436971d826SHoward Hinnant    template <class Alloc>
1443e519524SHoward Hinnant        priority_queue(priority_queue&& q, const Alloc& a);
1453e519524SHoward Hinnant
1463e519524SHoward Hinnant    bool            empty() const;
1473e519524SHoward Hinnant    size_type       size() const;
1483e519524SHoward Hinnant    const_reference top() const;
1493e519524SHoward Hinnant
1503e519524SHoward Hinnant    void push(const value_type& v);
1513e519524SHoward Hinnant    void push(value_type&& v);
1523e519524SHoward Hinnant    template <class... Args> void emplace(Args&&... args);
1533e519524SHoward Hinnant    void pop();
1543e519524SHoward Hinnant
1556971d826SHoward Hinnant    void swap(priority_queue& q)
156f07dd8d0SEric Fiselier        noexcept(is_nothrow_swappable_v<Container> &&
157f07dd8d0SEric Fiselier                 is_nothrow_swappable_v<Comp>)
1583e519524SHoward Hinnant};
1593e519524SHoward Hinnant
1603e519524SHoward Hinnanttemplate <class T, class Container, class Compare>
1613e519524SHoward Hinnant  void swap(priority_queue<T, Container, Compare>& x,
1626971d826SHoward Hinnant            priority_queue<T, Container, Compare>& y)
1636971d826SHoward Hinnant            noexcept(noexcept(x.swap(y)));
1643e519524SHoward Hinnant
1653e519524SHoward Hinnant}  // std
1663e519524SHoward Hinnant
1673e519524SHoward Hinnant*/
1683e519524SHoward Hinnant
1693e519524SHoward Hinnant#include <__config>
1703e519524SHoward Hinnant#include <deque>
1713e519524SHoward Hinnant#include <vector>
1723e519524SHoward Hinnant#include <functional>
1733e519524SHoward Hinnant#include <algorithm>
1743e519524SHoward Hinnant
175073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1763e519524SHoward Hinnant#pragma GCC system_header
177073458b1SHoward Hinnant#endif
1783e519524SHoward Hinnant
1793e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1803e519524SHoward Hinnant
181*e2f2d1edSEric Fiseliertemplate <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS queue;
1823e519524SHoward Hinnant
1833e519524SHoward Hinnanttemplate <class _Tp, class _Container>
184aeb85680SHoward Hinnant_LIBCPP_INLINE_VISIBILITY
1853e519524SHoward Hinnantbool
1863e519524SHoward Hinnantoperator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
1873e519524SHoward Hinnant
1883e519524SHoward Hinnanttemplate <class _Tp, class _Container>
189aeb85680SHoward Hinnant_LIBCPP_INLINE_VISIBILITY
1903e519524SHoward Hinnantbool
1913e519524SHoward Hinnantoperator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
1923e519524SHoward Hinnant
1933afa22a3SMarshall Clowtemplate <class _Tp, class _Container /*= deque<_Tp>*/>
194*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS queue
1953e519524SHoward Hinnant{
1963e519524SHoward Hinnantpublic:
1973e519524SHoward Hinnant    typedef _Container                               container_type;
1983e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
1993e519524SHoward Hinnant    typedef typename container_type::reference       reference;
2003e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
2013e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
202c1fe2c43SMarshall Clow    static_assert((is_same<_Tp, value_type>::value), "" );
2033e519524SHoward Hinnant
2043e519524SHoward Hinnantprotected:
2053e519524SHoward Hinnant    container_type c;
2063e519524SHoward Hinnant
2073e519524SHoward Hinnantpublic:
208392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2096971d826SHoward Hinnant    queue()
2106971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
2116971d826SHoward Hinnant        : c() {}
2126971d826SHoward Hinnant
2136971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2146971d826SHoward Hinnant    queue(const queue& __q) : c(__q.c) {}
2156971d826SHoward Hinnant
2166971d826SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2176971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2186971d826SHoward Hinnant    queue(queue&& __q)
2196971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
220ce48a113SHoward Hinnant        : c(_VSTD::move(__q.c)) {}
2216971d826SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2226971d826SHoward Hinnant
2236971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2246971d826SHoward Hinnant    queue& operator=(const queue& __q) {c = __q.c; return *this;}
2256971d826SHoward Hinnant
2266971d826SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2276971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2286971d826SHoward Hinnant    queue& operator=(queue&& __q)
2296971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
230ce48a113SHoward Hinnant        {c = _VSTD::move(__q.c); return *this;}
2316971d826SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2326971d826SHoward Hinnant
233392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2343e519524SHoward Hinnant    explicit queue(const container_type& __c)  : c(__c) {}
2357609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
236392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
237ce48a113SHoward Hinnant    explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {}
2387609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2393e519524SHoward Hinnant    template <class _Alloc>
240392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2413e519524SHoward Hinnant        explicit queue(const _Alloc& __a,
2423e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2433e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
2443e519524SHoward Hinnant            : c(__a) {}
2453e519524SHoward Hinnant    template <class _Alloc>
246392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2473e519524SHoward Hinnant        queue(const queue& __q, const _Alloc& __a,
2483e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2493e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
2503e519524SHoward Hinnant            : c(__q.c, __a) {}
2513e519524SHoward Hinnant    template <class _Alloc>
252392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2533e519524SHoward Hinnant        queue(const container_type& __c, const _Alloc& __a,
2543e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2553e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
2563e519524SHoward Hinnant            : c(__c, __a) {}
2577609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2583e519524SHoward Hinnant    template <class _Alloc>
259392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2603e519524SHoward Hinnant        queue(container_type&& __c, const _Alloc& __a,
2613e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2623e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
263ce48a113SHoward Hinnant            : c(_VSTD::move(__c), __a) {}
2643e519524SHoward Hinnant    template <class _Alloc>
265392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2663e519524SHoward Hinnant        queue(queue&& __q, const _Alloc& __a,
2673e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2683e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
269ce48a113SHoward Hinnant            : c(_VSTD::move(__q.c), __a) {}
2703e519524SHoward Hinnant
2717609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2723e519524SHoward Hinnant
273392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2743e519524SHoward Hinnant    bool      empty() const {return c.empty();}
275392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2763e519524SHoward Hinnant    size_type size() const  {return c.size();}
2773e519524SHoward Hinnant
278392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2793e519524SHoward Hinnant    reference       front()       {return c.front();}
280392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2813e519524SHoward Hinnant    const_reference front() const {return c.front();}
282392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2833e519524SHoward Hinnant    reference       back()        {return c.back();}
284392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2853e519524SHoward Hinnant    const_reference back() const  {return c.back();}
2863e519524SHoward Hinnant
287392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2883e519524SHoward Hinnant    void push(const value_type& __v) {c.push_back(__v);}
2897609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
290392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
291ce48a113SHoward Hinnant    void push(value_type&& __v)      {c.push_back(_VSTD::move(__v));}
2927609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
2933e519524SHoward Hinnant    template <class... _Args>
294392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2950e411641SEric Fiselier        reference emplace(_Args&&... __args)
2960e411641SEric Fiselier            { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
2977609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
2987609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
299392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3003e519524SHoward Hinnant    void pop() {c.pop_front();}
3013e519524SHoward Hinnant
302392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3033e519524SHoward Hinnant    void swap(queue& __q)
3046971d826SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
3053e519524SHoward Hinnant    {
306ce48a113SHoward Hinnant        using _VSTD::swap;
3073e519524SHoward Hinnant        swap(c, __q.c);
3083e519524SHoward Hinnant    }
3093e519524SHoward Hinnant
3103e519524SHoward Hinnant    template <class _T1, class _C1>
3113e519524SHoward Hinnant    friend
312392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3133e519524SHoward Hinnant    bool
3143e519524SHoward Hinnant    operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
3153e519524SHoward Hinnant
3163e519524SHoward Hinnant    template <class _T1, class _C1>
3173e519524SHoward Hinnant    friend
318392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3193e519524SHoward Hinnant    bool
3203e519524SHoward Hinnant    operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
3213e519524SHoward Hinnant};
3223e519524SHoward Hinnant
3233e519524SHoward Hinnanttemplate <class _Tp, class _Container>
324392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3253e519524SHoward Hinnantbool
3263e519524SHoward Hinnantoperator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3273e519524SHoward Hinnant{
3283e519524SHoward Hinnant    return __x.c == __y.c;
3293e519524SHoward Hinnant}
3303e519524SHoward Hinnant
3313e519524SHoward Hinnanttemplate <class _Tp, class _Container>
332392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3333e519524SHoward Hinnantbool
3343e519524SHoward Hinnantoperator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3353e519524SHoward Hinnant{
3363e519524SHoward Hinnant    return __x.c < __y.c;
3373e519524SHoward Hinnant}
3383e519524SHoward Hinnant
3393e519524SHoward Hinnanttemplate <class _Tp, class _Container>
340392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3413e519524SHoward Hinnantbool
3423e519524SHoward Hinnantoperator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3433e519524SHoward Hinnant{
3443e519524SHoward Hinnant    return !(__x == __y);
3453e519524SHoward Hinnant}
3463e519524SHoward Hinnant
3473e519524SHoward Hinnanttemplate <class _Tp, class _Container>
348392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3493e519524SHoward Hinnantbool
3503e519524SHoward Hinnantoperator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3513e519524SHoward Hinnant{
3523e519524SHoward Hinnant    return __y < __x;
3533e519524SHoward Hinnant}
3543e519524SHoward Hinnant
3553e519524SHoward Hinnanttemplate <class _Tp, class _Container>
356392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3573e519524SHoward Hinnantbool
3583e519524SHoward Hinnantoperator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3593e519524SHoward Hinnant{
3603e519524SHoward Hinnant    return !(__x < __y);
3613e519524SHoward Hinnant}
3623e519524SHoward Hinnant
3633e519524SHoward Hinnanttemplate <class _Tp, class _Container>
364392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3653e519524SHoward Hinnantbool
3663e519524SHoward Hinnantoperator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3673e519524SHoward Hinnant{
3683e519524SHoward Hinnant    return !(__y < __x);
3693e519524SHoward Hinnant}
3703e519524SHoward Hinnant
3713e519524SHoward Hinnanttemplate <class _Tp, class _Container>
372392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
373f07dd8d0SEric Fiseliertypename enable_if<
374f07dd8d0SEric Fiselier    __is_swappable<_Container>::value,
3753e519524SHoward Hinnant    void
376f07dd8d0SEric Fiselier>::type
3773e519524SHoward Hinnantswap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
3786971d826SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
3793e519524SHoward Hinnant{
3803e519524SHoward Hinnant    __x.swap(__y);
3813e519524SHoward Hinnant}
3823e519524SHoward Hinnant
3833e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Alloc>
384*e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS uses_allocator<queue<_Tp, _Container>, _Alloc>
3853e519524SHoward Hinnant    : public uses_allocator<_Container, _Alloc>
3863e519524SHoward Hinnant{
3873e519524SHoward Hinnant};
3883e519524SHoward Hinnant
3893e519524SHoward Hinnanttemplate <class _Tp, class _Container = vector<_Tp>,
3903e519524SHoward Hinnant          class _Compare = less<typename _Container::value_type> >
391*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS priority_queue
3923e519524SHoward Hinnant{
3933e519524SHoward Hinnantpublic:
3943e519524SHoward Hinnant    typedef _Container                               container_type;
3953e519524SHoward Hinnant    typedef _Compare                                 value_compare;
3963e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
3973e519524SHoward Hinnant    typedef typename container_type::reference       reference;
3983e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
3993e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
400c1fe2c43SMarshall Clow    static_assert((is_same<_Tp, value_type>::value), "" );
4013e519524SHoward Hinnant
4023e519524SHoward Hinnantprotected:
4033e519524SHoward Hinnant    container_type c;
4043e519524SHoward Hinnant    value_compare comp;
4053e519524SHoward Hinnant
4063e519524SHoward Hinnantpublic:
407392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4086971d826SHoward Hinnant    priority_queue()
4096971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value &&
4106971d826SHoward Hinnant                   is_nothrow_default_constructible<value_compare>::value)
4116971d826SHoward Hinnant        : c(), comp() {}
4126971d826SHoward Hinnant
4136971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4146971d826SHoward Hinnant    priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
4156971d826SHoward Hinnant
4166971d826SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
4176971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4186971d826SHoward Hinnant    priority_queue(priority_queue&& __q)
4196971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value &&
4206971d826SHoward Hinnant                   is_nothrow_move_constructible<value_compare>::value)
421ce48a113SHoward Hinnant        : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {}
4226971d826SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
4236971d826SHoward Hinnant
4246971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4256971d826SHoward Hinnant    priority_queue& operator=(const priority_queue& __q)
4266971d826SHoward Hinnant        {c = __q.c; comp = __q.comp; return *this;}
4276971d826SHoward Hinnant
4286971d826SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
4296971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4306971d826SHoward Hinnant    priority_queue& operator=(priority_queue&& __q)
4316971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value &&
4326971d826SHoward Hinnant                   is_nothrow_move_assignable<value_compare>::value)
433ce48a113SHoward Hinnant        {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
4346971d826SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
4356971d826SHoward Hinnant
4366971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4376971d826SHoward Hinnant    explicit priority_queue(const value_compare& __comp)
4383e519524SHoward Hinnant        : c(), comp(__comp) {}
439cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
4403e519524SHoward Hinnant    priority_queue(const value_compare& __comp, const container_type& __c);
4417609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
442cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
4433e519524SHoward Hinnant    explicit priority_queue(const value_compare& __comp, container_type&& __c);
4443e519524SHoward Hinnant#endif
4453e519524SHoward Hinnant    template <class _InputIter>
446cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4473e519524SHoward Hinnant        priority_queue(_InputIter __f, _InputIter __l,
4483e519524SHoward Hinnant                       const value_compare& __comp = value_compare());
4493e519524SHoward Hinnant    template <class _InputIter>
450cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4513e519524SHoward Hinnant        priority_queue(_InputIter __f, _InputIter __l,
4523e519524SHoward Hinnant                       const value_compare& __comp, const container_type& __c);
4537609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
4543e519524SHoward Hinnant    template <class _InputIter>
455cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4563e519524SHoward Hinnant        priority_queue(_InputIter __f, _InputIter __l,
4573e519524SHoward Hinnant                       const value_compare& __comp, container_type&& __c);
4587609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
4593e519524SHoward Hinnant    template <class _Alloc>
460cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4613e519524SHoward Hinnant        explicit priority_queue(const _Alloc& __a,
4623e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
4633e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
4643e519524SHoward Hinnant    template <class _Alloc>
465cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4663e519524SHoward Hinnant        priority_queue(const value_compare& __comp, const _Alloc& __a,
4673e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
4683e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
4693e519524SHoward Hinnant    template <class _Alloc>
470cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4713e519524SHoward Hinnant        priority_queue(const value_compare& __comp, const container_type& __c,
4723e519524SHoward Hinnant                       const _Alloc& __a,
4733e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
4743e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
4753e519524SHoward Hinnant    template <class _Alloc>
476cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4773e519524SHoward Hinnant        priority_queue(const priority_queue& __q, const _Alloc& __a,
4783e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
4793e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
4807609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
4813e519524SHoward Hinnant    template <class _Alloc>
482cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4833e519524SHoward Hinnant        priority_queue(const value_compare& __comp, container_type&& __c,
4843e519524SHoward Hinnant                       const _Alloc& __a,
4853e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
4863e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
4873e519524SHoward Hinnant    template <class _Alloc>
488cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4893e519524SHoward Hinnant        priority_queue(priority_queue&& __q, const _Alloc& __a,
4903e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
4913e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
4927609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
4933e519524SHoward Hinnant
494392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4953e519524SHoward Hinnant    bool            empty() const {return c.empty();}
496392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4973e519524SHoward Hinnant    size_type       size() const  {return c.size();}
498392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4993e519524SHoward Hinnant    const_reference top() const   {return c.front();}
5003e519524SHoward Hinnant
501cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
5023e519524SHoward Hinnant    void push(const value_type& __v);
5037609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
504cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
5053e519524SHoward Hinnant    void push(value_type&& __v);
5067609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
507cd31b434SEvgeniy Stepanov    template <class... _Args> _LIBCPP_INLINE_VISIBILITY void emplace(_Args&&... __args);
5087609c9b6SHoward Hinnant#endif
5097609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
510cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
5113e519524SHoward Hinnant    void pop();
5123e519524SHoward Hinnant
513cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
5146971d826SHoward Hinnant    void swap(priority_queue& __q)
5156971d826SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
5166971d826SHoward Hinnant                   __is_nothrow_swappable<value_compare>::value);
5173e519524SHoward Hinnant};
5183e519524SHoward Hinnant
5193e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
520cd31b434SEvgeniy Stepanovinline
5213e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
5223e519524SHoward Hinnant                                                          const container_type& __c)
5233e519524SHoward Hinnant    : c(__c),
5243e519524SHoward Hinnant      comp(__comp)
5253e519524SHoward Hinnant{
526ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
5273e519524SHoward Hinnant}
5283e519524SHoward Hinnant
5297609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
5303e519524SHoward Hinnant
5313e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
532cd31b434SEvgeniy Stepanovinline
5333e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
5343e519524SHoward Hinnant                                                          container_type&& __c)
535ce48a113SHoward Hinnant    : c(_VSTD::move(__c)),
5363e519524SHoward Hinnant      comp(__comp)
5373e519524SHoward Hinnant{
538ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
5393e519524SHoward Hinnant}
5403e519524SHoward Hinnant
5417609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
5423e519524SHoward Hinnant
5433e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
5443e519524SHoward Hinnanttemplate <class _InputIter>
545cd31b434SEvgeniy Stepanovinline
5463e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
5473e519524SHoward Hinnant                                                          const value_compare& __comp)
5483e519524SHoward Hinnant    : c(__f, __l),
5493e519524SHoward Hinnant      comp(__comp)
5503e519524SHoward Hinnant{
551ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
5523e519524SHoward Hinnant}
5533e519524SHoward Hinnant
5543e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
5553e519524SHoward Hinnanttemplate <class _InputIter>
556cd31b434SEvgeniy Stepanovinline
5573e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
5583e519524SHoward Hinnant                                                          const value_compare& __comp,
5593e519524SHoward Hinnant                                                          const container_type& __c)
5603e519524SHoward Hinnant    : c(__c),
5613e519524SHoward Hinnant      comp(__comp)
5623e519524SHoward Hinnant{
5633e519524SHoward Hinnant    c.insert(c.end(), __f, __l);
564ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
5653e519524SHoward Hinnant}
5663e519524SHoward Hinnant
5677609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
5683e519524SHoward Hinnant
5693e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
5703e519524SHoward Hinnanttemplate <class _InputIter>
571cd31b434SEvgeniy Stepanovinline
5723e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
5733e519524SHoward Hinnant                                                          const value_compare& __comp,
5743e519524SHoward Hinnant                                                          container_type&& __c)
575ce48a113SHoward Hinnant    : c(_VSTD::move(__c)),
5763e519524SHoward Hinnant      comp(__comp)
5773e519524SHoward Hinnant{
5783e519524SHoward Hinnant    c.insert(c.end(), __f, __l);
579ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
5803e519524SHoward Hinnant}
5813e519524SHoward Hinnant
5827609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
5833e519524SHoward Hinnant
5843e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
5853e519524SHoward Hinnanttemplate <class _Alloc>
586cd31b434SEvgeniy Stepanovinline
5873e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
5883e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5893e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
5903e519524SHoward Hinnant    : c(__a)
5913e519524SHoward Hinnant{
5923e519524SHoward Hinnant}
5933e519524SHoward Hinnant
5943e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
5953e519524SHoward Hinnanttemplate <class _Alloc>
596cd31b434SEvgeniy Stepanovinline
5973e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
5983e519524SHoward Hinnant                                                          const _Alloc& __a,
5993e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
6003e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
6013e519524SHoward Hinnant    : c(__a),
6023e519524SHoward Hinnant      comp(__comp)
6033e519524SHoward Hinnant{
6043e519524SHoward Hinnant}
6053e519524SHoward Hinnant
6063e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6073e519524SHoward Hinnanttemplate <class _Alloc>
608cd31b434SEvgeniy Stepanovinline
6093e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
6103e519524SHoward Hinnant                                                          const container_type& __c,
6113e519524SHoward Hinnant                                                          const _Alloc& __a,
6123e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
6133e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
6143e519524SHoward Hinnant    : c(__c, __a),
6153e519524SHoward Hinnant      comp(__comp)
6163e519524SHoward Hinnant{
617ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6183e519524SHoward Hinnant}
6193e519524SHoward Hinnant
6203e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6213e519524SHoward Hinnanttemplate <class _Alloc>
622cd31b434SEvgeniy Stepanovinline
6233e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
6243e519524SHoward Hinnant                                                          const _Alloc& __a,
6253e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
6263e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
6273e519524SHoward Hinnant    : c(__q.c, __a),
6283e519524SHoward Hinnant      comp(__q.comp)
6293e519524SHoward Hinnant{
630ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6313e519524SHoward Hinnant}
6323e519524SHoward Hinnant
6337609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
6343e519524SHoward Hinnant
6353e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6363e519524SHoward Hinnanttemplate <class _Alloc>
637cd31b434SEvgeniy Stepanovinline
6383e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
6393e519524SHoward Hinnant                                                          container_type&& __c,
6403e519524SHoward Hinnant                                                          const _Alloc& __a,
6413e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
6423e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
643ce48a113SHoward Hinnant    : c(_VSTD::move(__c), __a),
6443e519524SHoward Hinnant      comp(__comp)
6453e519524SHoward Hinnant{
646ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6473e519524SHoward Hinnant}
6483e519524SHoward Hinnant
6493e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6503e519524SHoward Hinnanttemplate <class _Alloc>
651cd31b434SEvgeniy Stepanovinline
6523e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
6533e519524SHoward Hinnant                                                          const _Alloc& __a,
6543e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
6553e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
656ce48a113SHoward Hinnant    : c(_VSTD::move(__q.c), __a),
657ce48a113SHoward Hinnant      comp(_VSTD::move(__q.comp))
6583e519524SHoward Hinnant{
659ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6603e519524SHoward Hinnant}
6613e519524SHoward Hinnant
6627609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
6633e519524SHoward Hinnant
6643e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
665cd31b434SEvgeniy Stepanovinline
6663e519524SHoward Hinnantvoid
6673e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
6683e519524SHoward Hinnant{
6693e519524SHoward Hinnant    c.push_back(__v);
670ce48a113SHoward Hinnant    _VSTD::push_heap(c.begin(), c.end(), comp);
6713e519524SHoward Hinnant}
6723e519524SHoward Hinnant
6737609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
6743e519524SHoward Hinnant
6753e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
676cd31b434SEvgeniy Stepanovinline
6773e519524SHoward Hinnantvoid
6783e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
6793e519524SHoward Hinnant{
680ce48a113SHoward Hinnant    c.push_back(_VSTD::move(__v));
681ce48a113SHoward Hinnant    _VSTD::push_heap(c.begin(), c.end(), comp);
6823e519524SHoward Hinnant}
6833e519524SHoward Hinnant
6847609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
6857609c9b6SHoward Hinnant
6863e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6873e519524SHoward Hinnanttemplate <class... _Args>
688cd31b434SEvgeniy Stepanovinline
6893e519524SHoward Hinnantvoid
6903e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
6913e519524SHoward Hinnant{
692ce48a113SHoward Hinnant    c.emplace_back(_VSTD::forward<_Args>(__args)...);
693ce48a113SHoward Hinnant    _VSTD::push_heap(c.begin(), c.end(), comp);
6943e519524SHoward Hinnant}
6953e519524SHoward Hinnant
6967609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
6977609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
6983e519524SHoward Hinnant
6993e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
700cd31b434SEvgeniy Stepanovinline
7013e519524SHoward Hinnantvoid
7023e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::pop()
7033e519524SHoward Hinnant{
704ce48a113SHoward Hinnant    _VSTD::pop_heap(c.begin(), c.end(), comp);
7053e519524SHoward Hinnant    c.pop_back();
7063e519524SHoward Hinnant}
7073e519524SHoward Hinnant
7083e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
709cd31b434SEvgeniy Stepanovinline
7103e519524SHoward Hinnantvoid
7113e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
7126971d826SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
7136971d826SHoward Hinnant                   __is_nothrow_swappable<value_compare>::value)
7143e519524SHoward Hinnant{
715ce48a113SHoward Hinnant    using _VSTD::swap;
7163e519524SHoward Hinnant    swap(c, __q.c);
7173e519524SHoward Hinnant    swap(comp, __q.comp);
7183e519524SHoward Hinnant}
7193e519524SHoward Hinnant
7203e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
721392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
722f07dd8d0SEric Fiseliertypename enable_if<
723f07dd8d0SEric Fiselier    __is_swappable<_Container>::value
724f07dd8d0SEric Fiselier    && __is_swappable<_Compare>::value,
7253e519524SHoward Hinnant    void
726f07dd8d0SEric Fiselier>::type
7273e519524SHoward Hinnantswap(priority_queue<_Tp, _Container, _Compare>& __x,
7283e519524SHoward Hinnant     priority_queue<_Tp, _Container, _Compare>& __y)
7296971d826SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
7303e519524SHoward Hinnant{
7313e519524SHoward Hinnant    __x.swap(__y);
7323e519524SHoward Hinnant}
7333e519524SHoward Hinnant
7343e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare, class _Alloc>
735*e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
7363e519524SHoward Hinnant    : public uses_allocator<_Container, _Alloc>
7373e519524SHoward Hinnant{
7383e519524SHoward Hinnant};
7393e519524SHoward Hinnant
7403e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
7413e519524SHoward Hinnant
7423e519524SHoward Hinnant#endif  // _LIBCPP_QUEUE
743