xref: /llvm-project-15.0.7/libcxx/include/queue (revision 5b8b8b5d)
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);
6663b560beSMarshall Clow    template <class... Args> reference emplace(Args&&... args); // reference in C++17
673e519524SHoward Hinnant    void pop();
683e519524SHoward Hinnant
69f07dd8d0SEric Fiselier    void swap(queue& q) noexcept(is_nothrow_swappable_v<Container>)
703e519524SHoward Hinnant};
713e519524SHoward Hinnant
72*5b8b8b5dSMarshall Clowtemplate<class Container>
73*5b8b8b5dSMarshall Clow  queue(Container) -> queue<typename Container::value_type, Container>; // C++17
74*5b8b8b5dSMarshall Clow
75*5b8b8b5dSMarshall Clowtemplate<class Container, class Allocator>
76*5b8b8b5dSMarshall Clow  queue(Container, Allocator) -> queue<typename Container::value_type, Container>; // C++17
77*5b8b8b5dSMarshall Clow
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>
913e519524SHoward Hinnant  bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y);
923e519524SHoward Hinnant
933e519524SHoward Hinnanttemplate <class T, class Container>
943e519524SHoward Hinnant  bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y);
953e519524SHoward Hinnant
963e519524SHoward Hinnanttemplate <class T, class Container>
976971d826SHoward Hinnant  void swap(queue<T, Container>& x, queue<T, Container>& y)
986971d826SHoward Hinnant  noexcept(noexcept(x.swap(y)));
993e519524SHoward Hinnant
1003e519524SHoward Hinnanttemplate <class T, class Container = vector<T>,
1013e519524SHoward Hinnant          class Compare = less<typename Container::value_type>>
1023e519524SHoward Hinnantclass priority_queue
1033e519524SHoward Hinnant{
1043e519524SHoward Hinnantpublic:
1053e519524SHoward Hinnant    typedef Container                                container_type;
1063e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
1073e519524SHoward Hinnant    typedef typename container_type::reference       reference;
1083e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
1093e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
1103e519524SHoward Hinnant
1113e519524SHoward Hinnantprotected:
1123e519524SHoward Hinnant    container_type c;
1133e519524SHoward Hinnant    Compare comp;
1143e519524SHoward Hinnant
1153e519524SHoward Hinnantpublic:
1166971d826SHoward Hinnant    priority_queue() = default;
1176971d826SHoward Hinnant    ~priority_queue() = default;
1186971d826SHoward Hinnant
1196971d826SHoward Hinnant    priority_queue(const priority_queue& q) = default;
1206971d826SHoward Hinnant    priority_queue(priority_queue&& q) = default;
1216971d826SHoward Hinnant
1226971d826SHoward Hinnant    priority_queue& operator=(const priority_queue& q) = default;
1236971d826SHoward Hinnant    priority_queue& operator=(priority_queue&& q) = default;
1246971d826SHoward Hinnant
1256971d826SHoward Hinnant    explicit priority_queue(const Compare& comp);
1263e519524SHoward Hinnant    priority_queue(const Compare& comp, const container_type& c);
1273e519524SHoward Hinnant    explicit priority_queue(const Compare& comp, container_type&& c);
1283e519524SHoward Hinnant    template <class InputIterator>
1293e519524SHoward Hinnant        priority_queue(InputIterator first, InputIterator last,
1303e519524SHoward Hinnant                       const Compare& comp = Compare());
1313e519524SHoward Hinnant    template <class InputIterator>
1323e519524SHoward Hinnant        priority_queue(InputIterator first, InputIterator last,
1333e519524SHoward Hinnant                       const Compare& comp, const container_type& c);
1343e519524SHoward Hinnant    template <class InputIterator>
1353e519524SHoward Hinnant        priority_queue(InputIterator first, InputIterator last,
1363e519524SHoward Hinnant                       const Compare& comp, container_type&& c);
1373e519524SHoward Hinnant    template <class Alloc>
1383e519524SHoward Hinnant        explicit priority_queue(const Alloc& a);
1393e519524SHoward Hinnant    template <class Alloc>
1403e519524SHoward Hinnant        priority_queue(const Compare& comp, const Alloc& a);
1413e519524SHoward Hinnant    template <class Alloc>
1423e519524SHoward Hinnant        priority_queue(const Compare& comp, const container_type& c,
1433e519524SHoward Hinnant                       const Alloc& a);
1443e519524SHoward Hinnant    template <class Alloc>
1453e519524SHoward Hinnant        priority_queue(const Compare& comp, container_type&& c,
1463e519524SHoward Hinnant                       const Alloc& a);
1473e519524SHoward Hinnant    template <class Alloc>
1486971d826SHoward Hinnant        priority_queue(const priority_queue& q, const Alloc& a);
1496971d826SHoward Hinnant    template <class Alloc>
1503e519524SHoward Hinnant        priority_queue(priority_queue&& q, const Alloc& a);
1513e519524SHoward Hinnant
1523e519524SHoward Hinnant    bool            empty() const;
1533e519524SHoward Hinnant    size_type       size() const;
1543e519524SHoward Hinnant    const_reference top() const;
1553e519524SHoward Hinnant
1563e519524SHoward Hinnant    void push(const value_type& v);
1573e519524SHoward Hinnant    void push(value_type&& v);
1583e519524SHoward Hinnant    template <class... Args> void emplace(Args&&... args);
1593e519524SHoward Hinnant    void pop();
1603e519524SHoward Hinnant
1616971d826SHoward Hinnant    void swap(priority_queue& q)
162f07dd8d0SEric Fiselier        noexcept(is_nothrow_swappable_v<Container> &&
163f07dd8d0SEric Fiselier                 is_nothrow_swappable_v<Comp>)
1643e519524SHoward Hinnant};
1653e519524SHoward Hinnant
166*5b8b8b5dSMarshall Clowtemplate <class Compare, class Container>
167*5b8b8b5dSMarshall Clowpriority_queue(Compare, Container)
168*5b8b8b5dSMarshall Clow    -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
169*5b8b8b5dSMarshall Clow
170*5b8b8b5dSMarshall Clowtemplate<class InputIterator,
171*5b8b8b5dSMarshall Clow         class Compare = less<typename iterator_traits<InputIterator>::value_type>,
172*5b8b8b5dSMarshall Clow         class Container = vector<typename iterator_traits<InputIterator>::value_type>>
173*5b8b8b5dSMarshall Clowpriority_queue(InputIterator, InputIterator, Compare = Compare(), Container = Container())
174*5b8b8b5dSMarshall Clow    -> priority_queue<typename iterator_traits<InputIterator>::value_type, Container, Compare>; // C++17
175*5b8b8b5dSMarshall Clow
176*5b8b8b5dSMarshall Clowtemplate<class Compare, class Container, class Allocator>
177*5b8b8b5dSMarshall Clowpriority_queue(Compare, Container, Allocator)
178*5b8b8b5dSMarshall Clow    -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
179*5b8b8b5dSMarshall Clow
1803e519524SHoward Hinnanttemplate <class T, class Container, class Compare>
1813e519524SHoward Hinnant  void swap(priority_queue<T, Container, Compare>& x,
1826971d826SHoward Hinnant            priority_queue<T, Container, Compare>& y)
1836971d826SHoward Hinnant            noexcept(noexcept(x.swap(y)));
1843e519524SHoward Hinnant
1853e519524SHoward Hinnant}  // std
1863e519524SHoward Hinnant
1873e519524SHoward Hinnant*/
1883e519524SHoward Hinnant
1893e519524SHoward Hinnant#include <__config>
1903e519524SHoward Hinnant#include <deque>
1913e519524SHoward Hinnant#include <vector>
1923e519524SHoward Hinnant#include <functional>
1933e519524SHoward Hinnant#include <algorithm>
1943e519524SHoward Hinnant
195073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1963e519524SHoward Hinnant#pragma GCC system_header
197073458b1SHoward Hinnant#endif
1983e519524SHoward Hinnant
1993e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
2003e519524SHoward Hinnant
201e2f2d1edSEric Fiseliertemplate <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS queue;
2023e519524SHoward Hinnant
2033e519524SHoward Hinnanttemplate <class _Tp, class _Container>
204aeb85680SHoward Hinnant_LIBCPP_INLINE_VISIBILITY
2053e519524SHoward Hinnantbool
2063e519524SHoward Hinnantoperator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
2073e519524SHoward Hinnant
2083e519524SHoward Hinnanttemplate <class _Tp, class _Container>
209aeb85680SHoward Hinnant_LIBCPP_INLINE_VISIBILITY
2103e519524SHoward Hinnantbool
2113e519524SHoward Hinnantoperator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
2123e519524SHoward Hinnant
2133afa22a3SMarshall Clowtemplate <class _Tp, class _Container /*= deque<_Tp>*/>
214e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS queue
2153e519524SHoward Hinnant{
2163e519524SHoward Hinnantpublic:
2173e519524SHoward Hinnant    typedef _Container                               container_type;
2183e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
2193e519524SHoward Hinnant    typedef typename container_type::reference       reference;
2203e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
2213e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
222c1fe2c43SMarshall Clow    static_assert((is_same<_Tp, value_type>::value), "" );
2233e519524SHoward Hinnant
2243e519524SHoward Hinnantprotected:
2253e519524SHoward Hinnant    container_type c;
2263e519524SHoward Hinnant
2273e519524SHoward Hinnantpublic:
228392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2296971d826SHoward Hinnant    queue()
2306971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
2316971d826SHoward Hinnant        : c() {}
2326971d826SHoward Hinnant
2336971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2346971d826SHoward Hinnant    queue(const queue& __q) : c(__q.c) {}
2356971d826SHoward Hinnant
236f5427b26SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
237f5427b26SEric Fiselier    queue& operator=(const queue& __q) {c = __q.c; return *this;}
238f5427b26SEric Fiselier
239f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
2406971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2416971d826SHoward Hinnant    queue(queue&& __q)
2426971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
243ce48a113SHoward Hinnant        : c(_VSTD::move(__q.c)) {}
2446971d826SHoward Hinnant
2456971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2466971d826SHoward Hinnant    queue& operator=(queue&& __q)
2476971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
248ce48a113SHoward Hinnant        {c = _VSTD::move(__q.c); return *this;}
249f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
2506971d826SHoward Hinnant
251392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2523e519524SHoward Hinnant    explicit queue(const container_type& __c)  : c(__c) {}
253f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
254392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
255ce48a113SHoward Hinnant    explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {}
256f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
2573e519524SHoward Hinnant    template <class _Alloc>
258392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2593e519524SHoward Hinnant        explicit queue(const _Alloc& __a,
2603e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2613e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
2623e519524SHoward Hinnant            : c(__a) {}
2633e519524SHoward Hinnant    template <class _Alloc>
264392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2653e519524SHoward Hinnant        queue(const queue& __q, const _Alloc& __a,
2663e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2673e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
2683e519524SHoward Hinnant            : c(__q.c, __a) {}
2693e519524SHoward Hinnant    template <class _Alloc>
270392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2713e519524SHoward Hinnant        queue(const container_type& __c, const _Alloc& __a,
2723e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2733e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
2743e519524SHoward Hinnant            : c(__c, __a) {}
275f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
2763e519524SHoward Hinnant    template <class _Alloc>
277392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2783e519524SHoward Hinnant        queue(container_type&& __c, const _Alloc& __a,
2793e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2803e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
281ce48a113SHoward Hinnant            : c(_VSTD::move(__c), __a) {}
2823e519524SHoward Hinnant    template <class _Alloc>
283392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2843e519524SHoward Hinnant        queue(queue&& __q, const _Alloc& __a,
2853e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2863e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
287ce48a113SHoward Hinnant            : c(_VSTD::move(__q.c), __a) {}
2883e519524SHoward Hinnant
289f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
2903e519524SHoward Hinnant
29172c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
2923e519524SHoward Hinnant    bool      empty() const {return c.empty();}
293392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2943e519524SHoward Hinnant    size_type size() const  {return c.size();}
2953e519524SHoward Hinnant
296392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2973e519524SHoward Hinnant    reference       front()       {return c.front();}
298392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2993e519524SHoward Hinnant    const_reference front() const {return c.front();}
300392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3013e519524SHoward Hinnant    reference       back()        {return c.back();}
302392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3033e519524SHoward Hinnant    const_reference back() const  {return c.back();}
3043e519524SHoward Hinnant
305392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3063e519524SHoward Hinnant    void push(const value_type& __v) {c.push_back(__v);}
307f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
308392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
309ce48a113SHoward Hinnant    void push(value_type&& __v)      {c.push_back(_VSTD::move(__v));}
3103e519524SHoward Hinnant    template <class... _Args>
311392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
31263b560beSMarshall Clow#if _LIBCPP_STD_VER > 14
313e34f5ffeSMarshall Clow        decltype(auto) emplace(_Args&&... __args)
3140e411641SEric Fiselier            { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
31563b560beSMarshall Clow#else
31663b560beSMarshall Clow        void     emplace(_Args&&... __args)
31763b560beSMarshall Clow            {        c.emplace_back(_VSTD::forward<_Args>(__args)...);}
31863b560beSMarshall Clow#endif
319f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
320392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3213e519524SHoward Hinnant    void pop() {c.pop_front();}
3223e519524SHoward Hinnant
323392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3243e519524SHoward Hinnant    void swap(queue& __q)
3256971d826SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
3263e519524SHoward Hinnant    {
327ce48a113SHoward Hinnant        using _VSTD::swap;
3283e519524SHoward Hinnant        swap(c, __q.c);
3293e519524SHoward Hinnant    }
3303e519524SHoward Hinnant
3313e519524SHoward Hinnant    template <class _T1, class _C1>
3323e519524SHoward Hinnant    friend
333392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3343e519524SHoward Hinnant    bool
3353e519524SHoward Hinnant    operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
3363e519524SHoward Hinnant
3373e519524SHoward Hinnant    template <class _T1, class _C1>
3383e519524SHoward Hinnant    friend
339392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3403e519524SHoward Hinnant    bool
3413e519524SHoward Hinnant    operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
3423e519524SHoward Hinnant};
3433e519524SHoward Hinnant
344*5b8b8b5dSMarshall Clow#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
345*5b8b8b5dSMarshall Clowtemplate<class _Container,
346*5b8b8b5dSMarshall Clow         class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type
347*5b8b8b5dSMarshall Clow>
348*5b8b8b5dSMarshall Clowqueue(_Container)
349*5b8b8b5dSMarshall Clow    -> queue<typename _Container::value_type, _Container>;
350*5b8b8b5dSMarshall Clow
351*5b8b8b5dSMarshall Clowtemplate<class _Container,
352*5b8b8b5dSMarshall Clow         class _Alloc,
353*5b8b8b5dSMarshall Clow         class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type,
354*5b8b8b5dSMarshall Clow         class = typename enable_if< __is_allocator<_Alloc>::value, nullptr_t>::type
355*5b8b8b5dSMarshall Clow>
356*5b8b8b5dSMarshall Clowqueue(_Container, _Alloc)
357*5b8b8b5dSMarshall Clow    -> queue<typename _Container::value_type, _Container>;
358*5b8b8b5dSMarshall Clow#endif
359*5b8b8b5dSMarshall Clow
3603e519524SHoward Hinnanttemplate <class _Tp, class _Container>
361392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3623e519524SHoward Hinnantbool
3633e519524SHoward Hinnantoperator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3643e519524SHoward Hinnant{
3653e519524SHoward Hinnant    return __x.c == __y.c;
3663e519524SHoward Hinnant}
3673e519524SHoward Hinnant
3683e519524SHoward Hinnanttemplate <class _Tp, class _Container>
369392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3703e519524SHoward Hinnantbool
3713e519524SHoward Hinnantoperator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3723e519524SHoward Hinnant{
3733e519524SHoward Hinnant    return __x.c < __y.c;
3743e519524SHoward Hinnant}
3753e519524SHoward Hinnant
3763e519524SHoward Hinnanttemplate <class _Tp, class _Container>
377392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3783e519524SHoward Hinnantbool
3793e519524SHoward Hinnantoperator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3803e519524SHoward Hinnant{
3813e519524SHoward Hinnant    return !(__x == __y);
3823e519524SHoward Hinnant}
3833e519524SHoward Hinnant
3843e519524SHoward Hinnanttemplate <class _Tp, class _Container>
385392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3863e519524SHoward Hinnantbool
3873e519524SHoward Hinnantoperator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3883e519524SHoward Hinnant{
3893e519524SHoward Hinnant    return __y < __x;
3903e519524SHoward Hinnant}
3913e519524SHoward Hinnant
3923e519524SHoward Hinnanttemplate <class _Tp, class _Container>
393392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3943e519524SHoward Hinnantbool
3953e519524SHoward Hinnantoperator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3963e519524SHoward Hinnant{
3973e519524SHoward Hinnant    return !(__x < __y);
3983e519524SHoward Hinnant}
3993e519524SHoward Hinnant
4003e519524SHoward Hinnanttemplate <class _Tp, class _Container>
401392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4023e519524SHoward Hinnantbool
4033e519524SHoward Hinnantoperator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
4043e519524SHoward Hinnant{
4053e519524SHoward Hinnant    return !(__y < __x);
4063e519524SHoward Hinnant}
4073e519524SHoward Hinnant
4083e519524SHoward Hinnanttemplate <class _Tp, class _Container>
409392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
410f07dd8d0SEric Fiseliertypename enable_if<
411f07dd8d0SEric Fiselier    __is_swappable<_Container>::value,
4123e519524SHoward Hinnant    void
413f07dd8d0SEric Fiselier>::type
4143e519524SHoward Hinnantswap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
4156971d826SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
4163e519524SHoward Hinnant{
4173e519524SHoward Hinnant    __x.swap(__y);
4183e519524SHoward Hinnant}
4193e519524SHoward Hinnant
4203e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Alloc>
421e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS uses_allocator<queue<_Tp, _Container>, _Alloc>
4223e519524SHoward Hinnant    : public uses_allocator<_Container, _Alloc>
4233e519524SHoward Hinnant{
4243e519524SHoward Hinnant};
4253e519524SHoward Hinnant
4263e519524SHoward Hinnanttemplate <class _Tp, class _Container = vector<_Tp>,
4273e519524SHoward Hinnant          class _Compare = less<typename _Container::value_type> >
428e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS priority_queue
4293e519524SHoward Hinnant{
4303e519524SHoward Hinnantpublic:
4313e519524SHoward Hinnant    typedef _Container                               container_type;
4323e519524SHoward Hinnant    typedef _Compare                                 value_compare;
4333e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
4343e519524SHoward Hinnant    typedef typename container_type::reference       reference;
4353e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
4363e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
437c1fe2c43SMarshall Clow    static_assert((is_same<_Tp, value_type>::value), "" );
4383e519524SHoward Hinnant
4393e519524SHoward Hinnantprotected:
4403e519524SHoward Hinnant    container_type c;
4413e519524SHoward Hinnant    value_compare comp;
4423e519524SHoward Hinnant
4433e519524SHoward Hinnantpublic:
444392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4456971d826SHoward Hinnant    priority_queue()
4466971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value &&
4476971d826SHoward Hinnant                   is_nothrow_default_constructible<value_compare>::value)
4486971d826SHoward Hinnant        : c(), comp() {}
4496971d826SHoward Hinnant
4506971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4516971d826SHoward Hinnant    priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
4526971d826SHoward Hinnant
453f5427b26SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
454f5427b26SEric Fiselier    priority_queue& operator=(const priority_queue& __q)
455f5427b26SEric Fiselier        {c = __q.c; comp = __q.comp; return *this;}
456f5427b26SEric Fiselier
457f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
4586971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4596971d826SHoward Hinnant    priority_queue(priority_queue&& __q)
4606971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value &&
4616971d826SHoward Hinnant                   is_nothrow_move_constructible<value_compare>::value)
462ce48a113SHoward Hinnant        : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {}
4636971d826SHoward Hinnant
4646971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4656971d826SHoward Hinnant    priority_queue& operator=(priority_queue&& __q)
4666971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value &&
4676971d826SHoward Hinnant                   is_nothrow_move_assignable<value_compare>::value)
468ce48a113SHoward Hinnant        {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
469f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
4706971d826SHoward Hinnant
4716971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4726971d826SHoward Hinnant    explicit priority_queue(const value_compare& __comp)
4733e519524SHoward Hinnant        : c(), comp(__comp) {}
474cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
4753e519524SHoward Hinnant    priority_queue(const value_compare& __comp, const container_type& __c);
476f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
477cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
4783e519524SHoward Hinnant    explicit priority_queue(const value_compare& __comp, container_type&& __c);
4793e519524SHoward Hinnant#endif
4803e519524SHoward Hinnant    template <class _InputIter>
481cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4823e519524SHoward Hinnant        priority_queue(_InputIter __f, _InputIter __l,
4833e519524SHoward Hinnant                       const value_compare& __comp = value_compare());
4843e519524SHoward Hinnant    template <class _InputIter>
485cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4863e519524SHoward Hinnant        priority_queue(_InputIter __f, _InputIter __l,
4873e519524SHoward Hinnant                       const value_compare& __comp, const container_type& __c);
488f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
4893e519524SHoward Hinnant    template <class _InputIter>
490cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4913e519524SHoward Hinnant        priority_queue(_InputIter __f, _InputIter __l,
4923e519524SHoward Hinnant                       const value_compare& __comp, container_type&& __c);
493f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
4943e519524SHoward Hinnant    template <class _Alloc>
495cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4963e519524SHoward Hinnant        explicit priority_queue(const _Alloc& __a,
4973e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
4983e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
4993e519524SHoward Hinnant    template <class _Alloc>
500cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
5013e519524SHoward Hinnant        priority_queue(const value_compare& __comp, const _Alloc& __a,
5023e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5033e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
5043e519524SHoward Hinnant    template <class _Alloc>
505cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
5063e519524SHoward Hinnant        priority_queue(const value_compare& __comp, const container_type& __c,
5073e519524SHoward Hinnant                       const _Alloc& __a,
5083e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5093e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
5103e519524SHoward Hinnant    template <class _Alloc>
511cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
5123e519524SHoward Hinnant        priority_queue(const priority_queue& __q, const _Alloc& __a,
5133e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5143e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
515f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
5163e519524SHoward Hinnant    template <class _Alloc>
517cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
5183e519524SHoward Hinnant        priority_queue(const value_compare& __comp, container_type&& __c,
5193e519524SHoward Hinnant                       const _Alloc& __a,
5203e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5213e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
5223e519524SHoward Hinnant    template <class _Alloc>
523cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
5243e519524SHoward Hinnant        priority_queue(priority_queue&& __q, const _Alloc& __a,
5253e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5263e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
527f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
5283e519524SHoward Hinnant
52972c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
5303e519524SHoward Hinnant    bool            empty() const {return c.empty();}
531392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5323e519524SHoward Hinnant    size_type       size() const  {return c.size();}
533392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5343e519524SHoward Hinnant    const_reference top() const   {return c.front();}
5353e519524SHoward Hinnant
536cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
5373e519524SHoward Hinnant    void push(const value_type& __v);
538f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
539cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
5403e519524SHoward Hinnant    void push(value_type&& __v);
541f5427b26SEric Fiselier    template <class... _Args>
542f5427b26SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
543f5427b26SEric Fiselier    void emplace(_Args&&... __args);
544f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
545cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
5463e519524SHoward Hinnant    void pop();
5473e519524SHoward Hinnant
548cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
5496971d826SHoward Hinnant    void swap(priority_queue& __q)
5506971d826SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
5516971d826SHoward Hinnant                   __is_nothrow_swappable<value_compare>::value);
5523e519524SHoward Hinnant};
5533e519524SHoward Hinnant
554*5b8b8b5dSMarshall Clow#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
555*5b8b8b5dSMarshall Clowtemplate <class _Compare,
556*5b8b8b5dSMarshall Clow          class _Container,
557*5b8b8b5dSMarshall Clow          class = typename enable_if<!__is_allocator<_Compare>::value, nullptr_t>::type,
558*5b8b8b5dSMarshall Clow          class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type
559*5b8b8b5dSMarshall Clow>
560*5b8b8b5dSMarshall Clowpriority_queue(_Compare, _Container)
561*5b8b8b5dSMarshall Clow    -> priority_queue<typename _Container::value_type, _Container, _Compare>;
562*5b8b8b5dSMarshall Clow
563*5b8b8b5dSMarshall Clowtemplate<class _InputIterator,
564*5b8b8b5dSMarshall Clow         class _Compare   = less<typename iterator_traits<_InputIterator>::value_type>,
565*5b8b8b5dSMarshall Clow         class _Container = vector<typename iterator_traits<_InputIterator>::value_type>,
566*5b8b8b5dSMarshall Clow         class = typename enable_if< __is_input_iterator<_InputIterator>::value, nullptr_t>::type,
567*5b8b8b5dSMarshall Clow         class = typename enable_if<!__is_allocator<_Compare>::value, nullptr_t>::type,
568*5b8b8b5dSMarshall Clow         class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type
569*5b8b8b5dSMarshall Clow>
570*5b8b8b5dSMarshall Clowpriority_queue(_InputIterator, _InputIterator, _Compare = _Compare(), _Container = _Container())
571*5b8b8b5dSMarshall Clow    -> priority_queue<typename iterator_traits<_InputIterator>::value_type, _Container, _Compare>;
572*5b8b8b5dSMarshall Clow
573*5b8b8b5dSMarshall Clowtemplate<class _Compare,
574*5b8b8b5dSMarshall Clow         class _Container,
575*5b8b8b5dSMarshall Clow         class _Alloc,
576*5b8b8b5dSMarshall Clow         class = typename enable_if<!__is_allocator<_Compare>::value, nullptr_t>::type,
577*5b8b8b5dSMarshall Clow         class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type,
578*5b8b8b5dSMarshall Clow         class = typename enable_if< __is_allocator<_Alloc>::value, nullptr_t>::type
579*5b8b8b5dSMarshall Clow>
580*5b8b8b5dSMarshall Clowpriority_queue(_Compare, _Container, _Alloc)
581*5b8b8b5dSMarshall Clow    -> priority_queue<typename _Container::value_type, _Container, _Compare>;
582*5b8b8b5dSMarshall Clow#endif
583*5b8b8b5dSMarshall Clow
5843e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
585cd31b434SEvgeniy Stepanovinline
5863e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
5873e519524SHoward Hinnant                                                          const container_type& __c)
5883e519524SHoward Hinnant    : c(__c),
5893e519524SHoward Hinnant      comp(__comp)
5903e519524SHoward Hinnant{
591ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
5923e519524SHoward Hinnant}
5933e519524SHoward Hinnant
594f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
5953e519524SHoward Hinnant
5963e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
597cd31b434SEvgeniy Stepanovinline
5983e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
5993e519524SHoward Hinnant                                                          container_type&& __c)
600ce48a113SHoward Hinnant    : c(_VSTD::move(__c)),
6013e519524SHoward Hinnant      comp(__comp)
6023e519524SHoward Hinnant{
603ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6043e519524SHoward Hinnant}
6053e519524SHoward Hinnant
606f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
6073e519524SHoward Hinnant
6083e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6093e519524SHoward Hinnanttemplate <class _InputIter>
610cd31b434SEvgeniy Stepanovinline
6113e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
6123e519524SHoward Hinnant                                                          const value_compare& __comp)
6133e519524SHoward Hinnant    : c(__f, __l),
6143e519524SHoward Hinnant      comp(__comp)
6153e519524SHoward Hinnant{
616ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6173e519524SHoward Hinnant}
6183e519524SHoward Hinnant
6193e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6203e519524SHoward Hinnanttemplate <class _InputIter>
621cd31b434SEvgeniy Stepanovinline
6223e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
6233e519524SHoward Hinnant                                                          const value_compare& __comp,
6243e519524SHoward Hinnant                                                          const container_type& __c)
6253e519524SHoward Hinnant    : c(__c),
6263e519524SHoward Hinnant      comp(__comp)
6273e519524SHoward Hinnant{
6283e519524SHoward Hinnant    c.insert(c.end(), __f, __l);
629ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6303e519524SHoward Hinnant}
6313e519524SHoward Hinnant
632f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
6333e519524SHoward Hinnant
6343e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6353e519524SHoward Hinnanttemplate <class _InputIter>
636cd31b434SEvgeniy Stepanovinline
6373e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
6383e519524SHoward Hinnant                                                          const value_compare& __comp,
6393e519524SHoward Hinnant                                                          container_type&& __c)
640ce48a113SHoward Hinnant    : c(_VSTD::move(__c)),
6413e519524SHoward Hinnant      comp(__comp)
6423e519524SHoward Hinnant{
6433e519524SHoward Hinnant    c.insert(c.end(), __f, __l);
644ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6453e519524SHoward Hinnant}
6463e519524SHoward Hinnant
647f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
6483e519524SHoward Hinnant
6493e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6503e519524SHoward Hinnanttemplate <class _Alloc>
651cd31b434SEvgeniy Stepanovinline
6523e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
6533e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
6543e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
6553e519524SHoward Hinnant    : c(__a)
6563e519524SHoward Hinnant{
6573e519524SHoward Hinnant}
6583e519524SHoward Hinnant
6593e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6603e519524SHoward Hinnanttemplate <class _Alloc>
661cd31b434SEvgeniy Stepanovinline
6623e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
6633e519524SHoward Hinnant                                                          const _Alloc& __a,
6643e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
6653e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
6663e519524SHoward Hinnant    : c(__a),
6673e519524SHoward Hinnant      comp(__comp)
6683e519524SHoward Hinnant{
6693e519524SHoward Hinnant}
6703e519524SHoward Hinnant
6713e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6723e519524SHoward Hinnanttemplate <class _Alloc>
673cd31b434SEvgeniy Stepanovinline
6743e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
6753e519524SHoward Hinnant                                                          const container_type& __c,
6763e519524SHoward Hinnant                                                          const _Alloc& __a,
6773e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
6783e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
6793e519524SHoward Hinnant    : c(__c, __a),
6803e519524SHoward Hinnant      comp(__comp)
6813e519524SHoward Hinnant{
682ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6833e519524SHoward Hinnant}
6843e519524SHoward Hinnant
6853e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6863e519524SHoward Hinnanttemplate <class _Alloc>
687cd31b434SEvgeniy Stepanovinline
6883e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
6893e519524SHoward Hinnant                                                          const _Alloc& __a,
6903e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
6913e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
6923e519524SHoward Hinnant    : c(__q.c, __a),
6933e519524SHoward Hinnant      comp(__q.comp)
6943e519524SHoward Hinnant{
695ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6963e519524SHoward Hinnant}
6973e519524SHoward Hinnant
698f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
6993e519524SHoward Hinnant
7003e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
7013e519524SHoward Hinnanttemplate <class _Alloc>
702cd31b434SEvgeniy Stepanovinline
7033e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
7043e519524SHoward Hinnant                                                          container_type&& __c,
7053e519524SHoward Hinnant                                                          const _Alloc& __a,
7063e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
7073e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
708ce48a113SHoward Hinnant    : c(_VSTD::move(__c), __a),
7093e519524SHoward Hinnant      comp(__comp)
7103e519524SHoward Hinnant{
711ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
7123e519524SHoward Hinnant}
7133e519524SHoward Hinnant
7143e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
7153e519524SHoward Hinnanttemplate <class _Alloc>
716cd31b434SEvgeniy Stepanovinline
7173e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
7183e519524SHoward Hinnant                                                          const _Alloc& __a,
7193e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
7203e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
721ce48a113SHoward Hinnant    : c(_VSTD::move(__q.c), __a),
722ce48a113SHoward Hinnant      comp(_VSTD::move(__q.comp))
7233e519524SHoward Hinnant{
724ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
7253e519524SHoward Hinnant}
7263e519524SHoward Hinnant
727f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
7283e519524SHoward Hinnant
7293e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
730cd31b434SEvgeniy Stepanovinline
7313e519524SHoward Hinnantvoid
7323e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
7333e519524SHoward Hinnant{
7343e519524SHoward Hinnant    c.push_back(__v);
735ce48a113SHoward Hinnant    _VSTD::push_heap(c.begin(), c.end(), comp);
7363e519524SHoward Hinnant}
7373e519524SHoward Hinnant
738f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
7393e519524SHoward Hinnant
7403e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
741cd31b434SEvgeniy Stepanovinline
7423e519524SHoward Hinnantvoid
7433e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
7443e519524SHoward Hinnant{
745ce48a113SHoward Hinnant    c.push_back(_VSTD::move(__v));
746ce48a113SHoward Hinnant    _VSTD::push_heap(c.begin(), c.end(), comp);
7473e519524SHoward Hinnant}
7483e519524SHoward Hinnant
7493e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
7503e519524SHoward Hinnanttemplate <class... _Args>
751cd31b434SEvgeniy Stepanovinline
7523e519524SHoward Hinnantvoid
7533e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
7543e519524SHoward Hinnant{
755ce48a113SHoward Hinnant    c.emplace_back(_VSTD::forward<_Args>(__args)...);
756ce48a113SHoward Hinnant    _VSTD::push_heap(c.begin(), c.end(), comp);
7573e519524SHoward Hinnant}
7583e519524SHoward Hinnant
759f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
7603e519524SHoward Hinnant
7613e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
762cd31b434SEvgeniy Stepanovinline
7633e519524SHoward Hinnantvoid
7643e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::pop()
7653e519524SHoward Hinnant{
766ce48a113SHoward Hinnant    _VSTD::pop_heap(c.begin(), c.end(), comp);
7673e519524SHoward Hinnant    c.pop_back();
7683e519524SHoward Hinnant}
7693e519524SHoward Hinnant
7703e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
771cd31b434SEvgeniy Stepanovinline
7723e519524SHoward Hinnantvoid
7733e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
7746971d826SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
7756971d826SHoward Hinnant                   __is_nothrow_swappable<value_compare>::value)
7763e519524SHoward Hinnant{
777ce48a113SHoward Hinnant    using _VSTD::swap;
7783e519524SHoward Hinnant    swap(c, __q.c);
7793e519524SHoward Hinnant    swap(comp, __q.comp);
7803e519524SHoward Hinnant}
7813e519524SHoward Hinnant
7823e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
783392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
784f07dd8d0SEric Fiseliertypename enable_if<
785f07dd8d0SEric Fiselier    __is_swappable<_Container>::value
786f07dd8d0SEric Fiselier    && __is_swappable<_Compare>::value,
7873e519524SHoward Hinnant    void
788f07dd8d0SEric Fiselier>::type
7893e519524SHoward Hinnantswap(priority_queue<_Tp, _Container, _Compare>& __x,
7903e519524SHoward Hinnant     priority_queue<_Tp, _Container, _Compare>& __y)
7916971d826SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
7923e519524SHoward Hinnant{
7933e519524SHoward Hinnant    __x.swap(__y);
7943e519524SHoward Hinnant}
7953e519524SHoward Hinnant
7963e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare, class _Alloc>
797e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
7983e519524SHoward Hinnant    : public uses_allocator<_Container, _Alloc>
7993e519524SHoward Hinnant{
8003e519524SHoward Hinnant};
8013e519524SHoward Hinnant
8023e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
8033e519524SHoward Hinnant
8043e519524SHoward Hinnant#endif  // _LIBCPP_QUEUE
805