xref: /llvm-project-15.0.7/libcxx/include/queue (revision f82dba01)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===--------------------------- queue ------------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
103e519524SHoward Hinnant#ifndef _LIBCPP_QUEUE
113e519524SHoward Hinnant#define _LIBCPP_QUEUE
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant    queue synopsis
153e519524SHoward Hinnant
163e519524SHoward Hinnantnamespace std
173e519524SHoward Hinnant{
183e519524SHoward Hinnant
193e519524SHoward Hinnanttemplate <class T, class Container = deque<T>>
203e519524SHoward Hinnantclass queue
213e519524SHoward Hinnant{
223e519524SHoward Hinnantpublic:
233e519524SHoward Hinnant    typedef Container                                container_type;
243e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
253e519524SHoward Hinnant    typedef typename container_type::reference       reference;
263e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
273e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
283e519524SHoward Hinnant
293e519524SHoward Hinnantprotected:
303e519524SHoward Hinnant    container_type c;
313e519524SHoward Hinnant
323e519524SHoward Hinnantpublic:
336971d826SHoward Hinnant    queue() = default;
346971d826SHoward Hinnant    ~queue() = default;
356971d826SHoward Hinnant
366971d826SHoward Hinnant    queue(const queue& q) = default;
376971d826SHoward Hinnant    queue(queue&& q) = default;
386971d826SHoward Hinnant
396971d826SHoward Hinnant    queue& operator=(const queue& q) = default;
406971d826SHoward Hinnant    queue& operator=(queue&& q) = default;
416971d826SHoward Hinnant
423e519524SHoward Hinnant    explicit queue(const container_type& c);
436971d826SHoward Hinnant    explicit queue(container_type&& c)
443e519524SHoward Hinnant    template <class Alloc>
453e519524SHoward Hinnant        explicit queue(const Alloc& a);
463e519524SHoward Hinnant    template <class Alloc>
473e519524SHoward Hinnant        queue(const container_type& c, const Alloc& a);
483e519524SHoward Hinnant    template <class Alloc>
493e519524SHoward Hinnant        queue(container_type&& c, const Alloc& a);
503e519524SHoward Hinnant    template <class Alloc>
516971d826SHoward Hinnant        queue(const queue& q, const Alloc& a);
526971d826SHoward Hinnant    template <class Alloc>
533e519524SHoward Hinnant        queue(queue&& q, const Alloc& a);
543e519524SHoward Hinnant
553e519524SHoward Hinnant    bool      empty() const;
563e519524SHoward Hinnant    size_type size() const;
573e519524SHoward Hinnant
583e519524SHoward Hinnant    reference       front();
593e519524SHoward Hinnant    const_reference front() const;
603e519524SHoward Hinnant    reference       back();
613e519524SHoward Hinnant    const_reference back() const;
623e519524SHoward Hinnant
633e519524SHoward Hinnant    void push(const value_type& v);
643e519524SHoward Hinnant    void push(value_type&& v);
6563b560beSMarshall Clow    template <class... Args> reference emplace(Args&&... args); // reference in C++17
663e519524SHoward Hinnant    void pop();
673e519524SHoward Hinnant
68f07dd8d0SEric Fiselier    void swap(queue& q) noexcept(is_nothrow_swappable_v<Container>)
693e519524SHoward Hinnant};
703e519524SHoward Hinnant
715b8b8b5dSMarshall Clowtemplate<class Container>
725b8b8b5dSMarshall Clow  queue(Container) -> queue<typename Container::value_type, Container>; // C++17
735b8b8b5dSMarshall Clow
745b8b8b5dSMarshall Clowtemplate<class Container, class Allocator>
755b8b8b5dSMarshall Clow  queue(Container, Allocator) -> queue<typename Container::value_type, Container>; // C++17
765b8b8b5dSMarshall Clow
773e519524SHoward Hinnanttemplate <class T, class Container>
783e519524SHoward Hinnant  bool operator==(const queue<T, Container>& x,const queue<T, Container>& y);
793e519524SHoward Hinnant
803e519524SHoward Hinnanttemplate <class T, class Container>
813e519524SHoward Hinnant  bool operator< (const queue<T, Container>& x,const queue<T, Container>& y);
823e519524SHoward Hinnant
833e519524SHoward Hinnanttemplate <class T, class Container>
843e519524SHoward Hinnant  bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y);
853e519524SHoward Hinnant
863e519524SHoward Hinnanttemplate <class T, class Container>
873e519524SHoward Hinnant  bool operator> (const queue<T, Container>& x,const queue<T, Container>& y);
883e519524SHoward Hinnant
893e519524SHoward Hinnanttemplate <class T, class Container>
903e519524SHoward Hinnant  bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y);
913e519524SHoward Hinnant
923e519524SHoward Hinnanttemplate <class T, class Container>
933e519524SHoward Hinnant  bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y);
943e519524SHoward Hinnant
953e519524SHoward Hinnanttemplate <class T, class Container>
966971d826SHoward Hinnant  void swap(queue<T, Container>& x, queue<T, Container>& y)
976971d826SHoward Hinnant  noexcept(noexcept(x.swap(y)));
983e519524SHoward Hinnant
993e519524SHoward Hinnanttemplate <class T, class Container = vector<T>,
1003e519524SHoward Hinnant          class Compare = less<typename Container::value_type>>
1013e519524SHoward Hinnantclass priority_queue
1023e519524SHoward Hinnant{
1033e519524SHoward Hinnantpublic:
1043e519524SHoward Hinnant    typedef Container                                container_type;
1053e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
1063e519524SHoward Hinnant    typedef typename container_type::reference       reference;
1073e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
1083e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
1093e519524SHoward Hinnant
1103e519524SHoward Hinnantprotected:
1113e519524SHoward Hinnant    container_type c;
1123e519524SHoward Hinnant    Compare comp;
1133e519524SHoward Hinnant
1143e519524SHoward Hinnantpublic:
1156971d826SHoward Hinnant    priority_queue() = default;
1166971d826SHoward Hinnant    ~priority_queue() = default;
1176971d826SHoward Hinnant
1186971d826SHoward Hinnant    priority_queue(const priority_queue& q) = default;
1196971d826SHoward Hinnant    priority_queue(priority_queue&& q) = default;
1206971d826SHoward Hinnant
1216971d826SHoward Hinnant    priority_queue& operator=(const priority_queue& q) = default;
1226971d826SHoward Hinnant    priority_queue& operator=(priority_queue&& q) = default;
1236971d826SHoward Hinnant
1246971d826SHoward Hinnant    explicit priority_queue(const Compare& comp);
1253e519524SHoward Hinnant    priority_queue(const Compare& comp, const container_type& c);
1263e519524SHoward Hinnant    explicit priority_queue(const Compare& comp, container_type&& c);
1273e519524SHoward Hinnant    template <class InputIterator>
1283e519524SHoward Hinnant        priority_queue(InputIterator first, InputIterator last,
1293e519524SHoward Hinnant                       const Compare& comp = Compare());
1303e519524SHoward Hinnant    template <class InputIterator>
1313e519524SHoward Hinnant        priority_queue(InputIterator first, InputIterator last,
1323e519524SHoward Hinnant                       const Compare& comp, const container_type& c);
1333e519524SHoward Hinnant    template <class InputIterator>
1343e519524SHoward Hinnant        priority_queue(InputIterator first, InputIterator last,
1353e519524SHoward Hinnant                       const Compare& comp, container_type&& c);
1363e519524SHoward Hinnant    template <class Alloc>
1373e519524SHoward Hinnant        explicit priority_queue(const Alloc& a);
1383e519524SHoward Hinnant    template <class Alloc>
1393e519524SHoward Hinnant        priority_queue(const Compare& comp, const Alloc& a);
1403e519524SHoward Hinnant    template <class Alloc>
1413e519524SHoward Hinnant        priority_queue(const Compare& comp, const container_type& c,
1423e519524SHoward Hinnant                       const Alloc& a);
1433e519524SHoward Hinnant    template <class Alloc>
1443e519524SHoward Hinnant        priority_queue(const Compare& comp, container_type&& c,
1453e519524SHoward Hinnant                       const Alloc& a);
1463e519524SHoward Hinnant    template <class Alloc>
1476971d826SHoward Hinnant        priority_queue(const priority_queue& q, const Alloc& a);
1486971d826SHoward Hinnant    template <class Alloc>
1493e519524SHoward Hinnant        priority_queue(priority_queue&& q, const Alloc& a);
1503e519524SHoward Hinnant
1513e519524SHoward Hinnant    bool            empty() const;
1523e519524SHoward Hinnant    size_type       size() const;
1533e519524SHoward Hinnant    const_reference top() const;
1543e519524SHoward Hinnant
1553e519524SHoward Hinnant    void push(const value_type& v);
1563e519524SHoward Hinnant    void push(value_type&& v);
1573e519524SHoward Hinnant    template <class... Args> void emplace(Args&&... args);
1583e519524SHoward Hinnant    void pop();
1593e519524SHoward Hinnant
1606971d826SHoward Hinnant    void swap(priority_queue& q)
161f07dd8d0SEric Fiselier        noexcept(is_nothrow_swappable_v<Container> &&
162f07dd8d0SEric Fiselier                 is_nothrow_swappable_v<Comp>)
1633e519524SHoward Hinnant};
1643e519524SHoward Hinnant
1655b8b8b5dSMarshall Clowtemplate <class Compare, class Container>
1665b8b8b5dSMarshall Clowpriority_queue(Compare, Container)
1675b8b8b5dSMarshall Clow    -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
1685b8b8b5dSMarshall Clow
1695b8b8b5dSMarshall Clowtemplate<class InputIterator,
1705b8b8b5dSMarshall Clow         class Compare = less<typename iterator_traits<InputIterator>::value_type>,
1715b8b8b5dSMarshall Clow         class Container = vector<typename iterator_traits<InputIterator>::value_type>>
1725b8b8b5dSMarshall Clowpriority_queue(InputIterator, InputIterator, Compare = Compare(), Container = Container())
1735b8b8b5dSMarshall Clow    -> priority_queue<typename iterator_traits<InputIterator>::value_type, Container, Compare>; // C++17
1745b8b8b5dSMarshall Clow
1755b8b8b5dSMarshall Clowtemplate<class Compare, class Container, class Allocator>
1765b8b8b5dSMarshall Clowpriority_queue(Compare, Container, Allocator)
1775b8b8b5dSMarshall Clow    -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
1785b8b8b5dSMarshall Clow
1793e519524SHoward Hinnanttemplate <class T, class Container, class Compare>
1803e519524SHoward Hinnant  void swap(priority_queue<T, Container, Compare>& x,
1816971d826SHoward Hinnant            priority_queue<T, Container, Compare>& y)
1826971d826SHoward Hinnant            noexcept(noexcept(x.swap(y)));
1833e519524SHoward Hinnant
1843e519524SHoward Hinnant}  // std
1853e519524SHoward Hinnant
1863e519524SHoward Hinnant*/
1873e519524SHoward Hinnant
1883e519524SHoward Hinnant#include <__config>
1893e519524SHoward Hinnant#include <deque>
1903e519524SHoward Hinnant#include <vector>
1913e519524SHoward Hinnant#include <functional>
1923e519524SHoward Hinnant#include <algorithm>
1933e519524SHoward Hinnant
194073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1953e519524SHoward Hinnant#pragma GCC system_header
196073458b1SHoward Hinnant#endif
1973e519524SHoward Hinnant
1983e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1993e519524SHoward Hinnant
200e2f2d1edSEric Fiseliertemplate <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS queue;
2013e519524SHoward Hinnant
2023e519524SHoward Hinnanttemplate <class _Tp, class _Container>
203aeb85680SHoward Hinnant_LIBCPP_INLINE_VISIBILITY
2043e519524SHoward Hinnantbool
2053e519524SHoward Hinnantoperator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
2063e519524SHoward Hinnant
2073e519524SHoward Hinnanttemplate <class _Tp, class _Container>
208aeb85680SHoward Hinnant_LIBCPP_INLINE_VISIBILITY
2093e519524SHoward Hinnantbool
2103e519524SHoward Hinnantoperator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
2113e519524SHoward Hinnant
2123afa22a3SMarshall Clowtemplate <class _Tp, class _Container /*= deque<_Tp>*/>
213e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS queue
2143e519524SHoward Hinnant{
2153e519524SHoward Hinnantpublic:
2163e519524SHoward Hinnant    typedef _Container                               container_type;
2173e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
2183e519524SHoward Hinnant    typedef typename container_type::reference       reference;
2193e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
2203e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
221c1fe2c43SMarshall Clow    static_assert((is_same<_Tp, value_type>::value), "" );
2223e519524SHoward Hinnant
2233e519524SHoward Hinnantprotected:
2243e519524SHoward Hinnant    container_type c;
2253e519524SHoward Hinnant
2263e519524SHoward Hinnantpublic:
227392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2286971d826SHoward Hinnant    queue()
2296971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
2306971d826SHoward Hinnant        : c() {}
2316971d826SHoward Hinnant
2326971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2336971d826SHoward Hinnant    queue(const queue& __q) : c(__q.c) {}
2346971d826SHoward Hinnant
235f5427b26SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
236f5427b26SEric Fiselier    queue& operator=(const queue& __q) {c = __q.c; return *this;}
237f5427b26SEric Fiselier
238f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
2396971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2406971d826SHoward Hinnant    queue(queue&& __q)
2416971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
242ce48a113SHoward Hinnant        : c(_VSTD::move(__q.c)) {}
2436971d826SHoward Hinnant
2446971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2456971d826SHoward Hinnant    queue& operator=(queue&& __q)
2466971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
247ce48a113SHoward Hinnant        {c = _VSTD::move(__q.c); return *this;}
248f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
2496971d826SHoward Hinnant
250392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2513e519524SHoward Hinnant    explicit queue(const container_type& __c)  : c(__c) {}
252f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
253392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
254ce48a113SHoward Hinnant    explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {}
255f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
2563e519524SHoward Hinnant    template <class _Alloc>
257392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2583e519524SHoward Hinnant        explicit queue(const _Alloc& __a,
2593e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2603e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
2613e519524SHoward Hinnant            : c(__a) {}
2623e519524SHoward Hinnant    template <class _Alloc>
263392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2643e519524SHoward Hinnant        queue(const queue& __q, const _Alloc& __a,
2653e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2663e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
2673e519524SHoward Hinnant            : c(__q.c, __a) {}
2683e519524SHoward Hinnant    template <class _Alloc>
269392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2703e519524SHoward Hinnant        queue(const container_type& __c, const _Alloc& __a,
2713e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2723e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
2733e519524SHoward Hinnant            : c(__c, __a) {}
274f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
2753e519524SHoward Hinnant    template <class _Alloc>
276392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2773e519524SHoward Hinnant        queue(container_type&& __c, const _Alloc& __a,
2783e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2793e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
280ce48a113SHoward Hinnant            : c(_VSTD::move(__c), __a) {}
2813e519524SHoward Hinnant    template <class _Alloc>
282392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2833e519524SHoward Hinnant        queue(queue&& __q, const _Alloc& __a,
2843e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
2853e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
286ce48a113SHoward Hinnant            : c(_VSTD::move(__q.c), __a) {}
2873e519524SHoward Hinnant
288f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
2893e519524SHoward Hinnant
29072c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
2913e519524SHoward Hinnant    bool      empty() const {return c.empty();}
292392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2933e519524SHoward Hinnant    size_type size() const  {return c.size();}
2943e519524SHoward Hinnant
295392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2963e519524SHoward Hinnant    reference       front()       {return c.front();}
297392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2983e519524SHoward Hinnant    const_reference front() const {return c.front();}
299392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3003e519524SHoward Hinnant    reference       back()        {return c.back();}
301392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3023e519524SHoward Hinnant    const_reference back() const  {return c.back();}
3033e519524SHoward Hinnant
304392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3053e519524SHoward Hinnant    void push(const value_type& __v) {c.push_back(__v);}
306f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
307392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
308ce48a113SHoward Hinnant    void push(value_type&& __v)      {c.push_back(_VSTD::move(__v));}
3093e519524SHoward Hinnant    template <class... _Args>
310392183f9SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
31163b560beSMarshall Clow#if _LIBCPP_STD_VER > 14
312e34f5ffeSMarshall Clow        decltype(auto) emplace(_Args&&... __args)
3130e411641SEric Fiselier            { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
31463b560beSMarshall Clow#else
31563b560beSMarshall Clow        void     emplace(_Args&&... __args)
31663b560beSMarshall Clow            {        c.emplace_back(_VSTD::forward<_Args>(__args)...);}
31763b560beSMarshall Clow#endif
318f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
319392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3203e519524SHoward Hinnant    void pop() {c.pop_front();}
3213e519524SHoward Hinnant
322392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3233e519524SHoward Hinnant    void swap(queue& __q)
3246971d826SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
3253e519524SHoward Hinnant    {
326ce48a113SHoward Hinnant        using _VSTD::swap;
3273e519524SHoward Hinnant        swap(c, __q.c);
3283e519524SHoward Hinnant    }
3293e519524SHoward Hinnant
3303e519524SHoward Hinnant    template <class _T1, class _C1>
3313e519524SHoward Hinnant    friend
332392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3333e519524SHoward Hinnant    bool
3343e519524SHoward Hinnant    operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
3353e519524SHoward Hinnant
3363e519524SHoward Hinnant    template <class _T1, class _C1>
3373e519524SHoward Hinnant    friend
338392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3393e519524SHoward Hinnant    bool
3403e519524SHoward Hinnant    operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
3413e519524SHoward Hinnant};
3423e519524SHoward Hinnant
3435b8b8b5dSMarshall Clow#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
3445b8b8b5dSMarshall Clowtemplate<class _Container,
3455b8b8b5dSMarshall Clow         class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type
3465b8b8b5dSMarshall Clow>
3475b8b8b5dSMarshall Clowqueue(_Container)
3485b8b8b5dSMarshall Clow    -> queue<typename _Container::value_type, _Container>;
3495b8b8b5dSMarshall Clow
3505b8b8b5dSMarshall Clowtemplate<class _Container,
3515b8b8b5dSMarshall Clow         class _Alloc,
3525b8b8b5dSMarshall Clow         class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type,
3535b8b8b5dSMarshall Clow         class = typename enable_if< __is_allocator<_Alloc>::value, nullptr_t>::type
3545b8b8b5dSMarshall Clow>
3555b8b8b5dSMarshall Clowqueue(_Container, _Alloc)
3565b8b8b5dSMarshall Clow    -> queue<typename _Container::value_type, _Container>;
3575b8b8b5dSMarshall Clow#endif
3585b8b8b5dSMarshall Clow
3593e519524SHoward Hinnanttemplate <class _Tp, class _Container>
360392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3613e519524SHoward Hinnantbool
3623e519524SHoward Hinnantoperator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3633e519524SHoward Hinnant{
3643e519524SHoward Hinnant    return __x.c == __y.c;
3653e519524SHoward Hinnant}
3663e519524SHoward Hinnant
3673e519524SHoward Hinnanttemplate <class _Tp, class _Container>
368392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3693e519524SHoward Hinnantbool
3703e519524SHoward Hinnantoperator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3713e519524SHoward Hinnant{
3723e519524SHoward Hinnant    return __x.c < __y.c;
3733e519524SHoward Hinnant}
3743e519524SHoward Hinnant
3753e519524SHoward Hinnanttemplate <class _Tp, class _Container>
376392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3773e519524SHoward Hinnantbool
3783e519524SHoward Hinnantoperator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3793e519524SHoward Hinnant{
3803e519524SHoward Hinnant    return !(__x == __y);
3813e519524SHoward Hinnant}
3823e519524SHoward Hinnant
3833e519524SHoward Hinnanttemplate <class _Tp, class _Container>
384392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3853e519524SHoward Hinnantbool
3863e519524SHoward Hinnantoperator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3873e519524SHoward Hinnant{
3883e519524SHoward Hinnant    return __y < __x;
3893e519524SHoward Hinnant}
3903e519524SHoward Hinnant
3913e519524SHoward Hinnanttemplate <class _Tp, class _Container>
392392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3933e519524SHoward Hinnantbool
3943e519524SHoward Hinnantoperator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
3953e519524SHoward Hinnant{
3963e519524SHoward Hinnant    return !(__x < __y);
3973e519524SHoward Hinnant}
3983e519524SHoward Hinnant
3993e519524SHoward Hinnanttemplate <class _Tp, class _Container>
400392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4013e519524SHoward Hinnantbool
4023e519524SHoward Hinnantoperator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
4033e519524SHoward Hinnant{
4043e519524SHoward Hinnant    return !(__y < __x);
4053e519524SHoward Hinnant}
4063e519524SHoward Hinnant
4073e519524SHoward Hinnanttemplate <class _Tp, class _Container>
408392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
409f07dd8d0SEric Fiseliertypename enable_if<
410f07dd8d0SEric Fiselier    __is_swappable<_Container>::value,
4113e519524SHoward Hinnant    void
412f07dd8d0SEric Fiselier>::type
4133e519524SHoward Hinnantswap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
4146971d826SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
4153e519524SHoward Hinnant{
4163e519524SHoward Hinnant    __x.swap(__y);
4173e519524SHoward Hinnant}
4183e519524SHoward Hinnant
4193e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Alloc>
420e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS uses_allocator<queue<_Tp, _Container>, _Alloc>
4213e519524SHoward Hinnant    : public uses_allocator<_Container, _Alloc>
4223e519524SHoward Hinnant{
4233e519524SHoward Hinnant};
4243e519524SHoward Hinnant
4253e519524SHoward Hinnanttemplate <class _Tp, class _Container = vector<_Tp>,
4263e519524SHoward Hinnant          class _Compare = less<typename _Container::value_type> >
427e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS priority_queue
4283e519524SHoward Hinnant{
4293e519524SHoward Hinnantpublic:
4303e519524SHoward Hinnant    typedef _Container                               container_type;
4313e519524SHoward Hinnant    typedef _Compare                                 value_compare;
4323e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
4333e519524SHoward Hinnant    typedef typename container_type::reference       reference;
4343e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
4353e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
436c1fe2c43SMarshall Clow    static_assert((is_same<_Tp, value_type>::value), "" );
4373e519524SHoward Hinnant
4383e519524SHoward Hinnantprotected:
4393e519524SHoward Hinnant    container_type c;
4403e519524SHoward Hinnant    value_compare comp;
4413e519524SHoward Hinnant
4423e519524SHoward Hinnantpublic:
443392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4446971d826SHoward Hinnant    priority_queue()
4456971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value &&
4466971d826SHoward Hinnant                   is_nothrow_default_constructible<value_compare>::value)
4476971d826SHoward Hinnant        : c(), comp() {}
4486971d826SHoward Hinnant
4496971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4506971d826SHoward Hinnant    priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
4516971d826SHoward Hinnant
452f5427b26SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
453f5427b26SEric Fiselier    priority_queue& operator=(const priority_queue& __q)
454f5427b26SEric Fiselier        {c = __q.c; comp = __q.comp; return *this;}
455f5427b26SEric Fiselier
456f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
4576971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4586971d826SHoward Hinnant    priority_queue(priority_queue&& __q)
4596971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value &&
4606971d826SHoward Hinnant                   is_nothrow_move_constructible<value_compare>::value)
461ce48a113SHoward Hinnant        : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {}
4626971d826SHoward Hinnant
4636971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4646971d826SHoward Hinnant    priority_queue& operator=(priority_queue&& __q)
4656971d826SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value &&
4666971d826SHoward Hinnant                   is_nothrow_move_assignable<value_compare>::value)
467ce48a113SHoward Hinnant        {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
468f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
4696971d826SHoward Hinnant
4706971d826SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4716971d826SHoward Hinnant    explicit priority_queue(const value_compare& __comp)
4723e519524SHoward Hinnant        : c(), comp(__comp) {}
473cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
4743e519524SHoward Hinnant    priority_queue(const value_compare& __comp, const container_type& __c);
475f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
476cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
4773e519524SHoward Hinnant    explicit priority_queue(const value_compare& __comp, container_type&& __c);
4783e519524SHoward Hinnant#endif
4793e519524SHoward Hinnant    template <class _InputIter>
480cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4813e519524SHoward Hinnant        priority_queue(_InputIter __f, _InputIter __l,
4823e519524SHoward Hinnant                       const value_compare& __comp = value_compare());
4833e519524SHoward Hinnant    template <class _InputIter>
484cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4853e519524SHoward Hinnant        priority_queue(_InputIter __f, _InputIter __l,
4863e519524SHoward Hinnant                       const value_compare& __comp, const container_type& __c);
487f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
4883e519524SHoward Hinnant    template <class _InputIter>
489cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4903e519524SHoward Hinnant        priority_queue(_InputIter __f, _InputIter __l,
4913e519524SHoward Hinnant                       const value_compare& __comp, container_type&& __c);
492f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
4933e519524SHoward Hinnant    template <class _Alloc>
494cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
4953e519524SHoward Hinnant        explicit priority_queue(const _Alloc& __a,
4963e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
4973e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
4983e519524SHoward Hinnant    template <class _Alloc>
499cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
5003e519524SHoward Hinnant        priority_queue(const value_compare& __comp, const _Alloc& __a,
5013e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5023e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
5033e519524SHoward Hinnant    template <class _Alloc>
504cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
5053e519524SHoward Hinnant        priority_queue(const value_compare& __comp, const container_type& __c,
5063e519524SHoward Hinnant                       const _Alloc& __a,
5073e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5083e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
5093e519524SHoward Hinnant    template <class _Alloc>
510cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
5113e519524SHoward Hinnant        priority_queue(const priority_queue& __q, const _Alloc& __a,
5123e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5133e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
514f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
5153e519524SHoward Hinnant    template <class _Alloc>
516cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
5173e519524SHoward Hinnant        priority_queue(const value_compare& __comp, container_type&& __c,
5183e519524SHoward Hinnant                       const _Alloc& __a,
5193e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5203e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
5213e519524SHoward Hinnant    template <class _Alloc>
522cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
5233e519524SHoward Hinnant        priority_queue(priority_queue&& __q, const _Alloc& __a,
5243e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
5253e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
526f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
5273e519524SHoward Hinnant
52872c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
5293e519524SHoward Hinnant    bool            empty() const {return c.empty();}
530392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5313e519524SHoward Hinnant    size_type       size() const  {return c.size();}
532392183f9SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5333e519524SHoward Hinnant    const_reference top() const   {return c.front();}
5343e519524SHoward Hinnant
535cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
5363e519524SHoward Hinnant    void push(const value_type& __v);
537f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
538cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
5393e519524SHoward Hinnant    void push(value_type&& __v);
540f5427b26SEric Fiselier    template <class... _Args>
541f5427b26SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
542f5427b26SEric Fiselier    void emplace(_Args&&... __args);
543f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
544cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
5453e519524SHoward Hinnant    void pop();
5463e519524SHoward Hinnant
547cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
5486971d826SHoward Hinnant    void swap(priority_queue& __q)
5496971d826SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
5506971d826SHoward Hinnant                   __is_nothrow_swappable<value_compare>::value);
5513e519524SHoward Hinnant};
5523e519524SHoward Hinnant
5535b8b8b5dSMarshall Clow#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
5545b8b8b5dSMarshall Clowtemplate <class _Compare,
5555b8b8b5dSMarshall Clow          class _Container,
5565b8b8b5dSMarshall Clow          class = typename enable_if<!__is_allocator<_Compare>::value, nullptr_t>::type,
5575b8b8b5dSMarshall Clow          class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type
5585b8b8b5dSMarshall Clow>
5595b8b8b5dSMarshall Clowpriority_queue(_Compare, _Container)
5605b8b8b5dSMarshall Clow    -> priority_queue<typename _Container::value_type, _Container, _Compare>;
5615b8b8b5dSMarshall Clow
5625b8b8b5dSMarshall Clowtemplate<class _InputIterator,
5635b8b8b5dSMarshall Clow         class _Compare   = less<typename iterator_traits<_InputIterator>::value_type>,
5645b8b8b5dSMarshall Clow         class _Container = vector<typename iterator_traits<_InputIterator>::value_type>,
565*f82dba01SEric Fiselier         class = typename enable_if< __is_cpp17_input_iterator<_InputIterator>::value, nullptr_t>::type,
5665b8b8b5dSMarshall Clow         class = typename enable_if<!__is_allocator<_Compare>::value, nullptr_t>::type,
5675b8b8b5dSMarshall Clow         class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type
5685b8b8b5dSMarshall Clow>
5695b8b8b5dSMarshall Clowpriority_queue(_InputIterator, _InputIterator, _Compare = _Compare(), _Container = _Container())
5705b8b8b5dSMarshall Clow    -> priority_queue<typename iterator_traits<_InputIterator>::value_type, _Container, _Compare>;
5715b8b8b5dSMarshall Clow
5725b8b8b5dSMarshall Clowtemplate<class _Compare,
5735b8b8b5dSMarshall Clow         class _Container,
5745b8b8b5dSMarshall Clow         class _Alloc,
5755b8b8b5dSMarshall Clow         class = typename enable_if<!__is_allocator<_Compare>::value, nullptr_t>::type,
5765b8b8b5dSMarshall Clow         class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type,
5775b8b8b5dSMarshall Clow         class = typename enable_if< __is_allocator<_Alloc>::value, nullptr_t>::type
5785b8b8b5dSMarshall Clow>
5795b8b8b5dSMarshall Clowpriority_queue(_Compare, _Container, _Alloc)
5805b8b8b5dSMarshall Clow    -> priority_queue<typename _Container::value_type, _Container, _Compare>;
5815b8b8b5dSMarshall Clow#endif
5825b8b8b5dSMarshall Clow
5833e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
584cd31b434SEvgeniy Stepanovinline
5853e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
5863e519524SHoward Hinnant                                                          const container_type& __c)
5873e519524SHoward Hinnant    : c(__c),
5883e519524SHoward Hinnant      comp(__comp)
5893e519524SHoward Hinnant{
590ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
5913e519524SHoward Hinnant}
5923e519524SHoward Hinnant
593f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
5943e519524SHoward Hinnant
5953e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
596cd31b434SEvgeniy Stepanovinline
5973e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
5983e519524SHoward Hinnant                                                          container_type&& __c)
599ce48a113SHoward Hinnant    : c(_VSTD::move(__c)),
6003e519524SHoward Hinnant      comp(__comp)
6013e519524SHoward Hinnant{
602ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6033e519524SHoward Hinnant}
6043e519524SHoward Hinnant
605f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
6063e519524SHoward Hinnant
6073e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6083e519524SHoward Hinnanttemplate <class _InputIter>
609cd31b434SEvgeniy Stepanovinline
6103e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
6113e519524SHoward Hinnant                                                          const value_compare& __comp)
6123e519524SHoward Hinnant    : c(__f, __l),
6133e519524SHoward Hinnant      comp(__comp)
6143e519524SHoward Hinnant{
615ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6163e519524SHoward Hinnant}
6173e519524SHoward Hinnant
6183e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6193e519524SHoward Hinnanttemplate <class _InputIter>
620cd31b434SEvgeniy Stepanovinline
6213e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
6223e519524SHoward Hinnant                                                          const value_compare& __comp,
6233e519524SHoward Hinnant                                                          const container_type& __c)
6243e519524SHoward Hinnant    : c(__c),
6253e519524SHoward Hinnant      comp(__comp)
6263e519524SHoward Hinnant{
6273e519524SHoward Hinnant    c.insert(c.end(), __f, __l);
628ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6293e519524SHoward Hinnant}
6303e519524SHoward Hinnant
631f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
6323e519524SHoward Hinnant
6333e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6343e519524SHoward Hinnanttemplate <class _InputIter>
635cd31b434SEvgeniy Stepanovinline
6363e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
6373e519524SHoward Hinnant                                                          const value_compare& __comp,
6383e519524SHoward Hinnant                                                          container_type&& __c)
639ce48a113SHoward Hinnant    : c(_VSTD::move(__c)),
6403e519524SHoward Hinnant      comp(__comp)
6413e519524SHoward Hinnant{
6423e519524SHoward Hinnant    c.insert(c.end(), __f, __l);
643ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6443e519524SHoward Hinnant}
6453e519524SHoward Hinnant
646f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
6473e519524SHoward Hinnant
6483e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6493e519524SHoward Hinnanttemplate <class _Alloc>
650cd31b434SEvgeniy Stepanovinline
6513e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
6523e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
6533e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
6543e519524SHoward Hinnant    : c(__a)
6553e519524SHoward Hinnant{
6563e519524SHoward Hinnant}
6573e519524SHoward Hinnant
6583e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6593e519524SHoward Hinnanttemplate <class _Alloc>
660cd31b434SEvgeniy Stepanovinline
6613e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
6623e519524SHoward Hinnant                                                          const _Alloc& __a,
6633e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
6643e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
6653e519524SHoward Hinnant    : c(__a),
6663e519524SHoward Hinnant      comp(__comp)
6673e519524SHoward Hinnant{
6683e519524SHoward Hinnant}
6693e519524SHoward Hinnant
6703e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6713e519524SHoward Hinnanttemplate <class _Alloc>
672cd31b434SEvgeniy Stepanovinline
6733e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
6743e519524SHoward Hinnant                                                          const container_type& __c,
6753e519524SHoward Hinnant                                                          const _Alloc& __a,
6763e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
6773e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
6783e519524SHoward Hinnant    : c(__c, __a),
6793e519524SHoward Hinnant      comp(__comp)
6803e519524SHoward Hinnant{
681ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6823e519524SHoward Hinnant}
6833e519524SHoward Hinnant
6843e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
6853e519524SHoward Hinnanttemplate <class _Alloc>
686cd31b434SEvgeniy Stepanovinline
6873e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
6883e519524SHoward Hinnant                                                          const _Alloc& __a,
6893e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
6903e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
6913e519524SHoward Hinnant    : c(__q.c, __a),
6923e519524SHoward Hinnant      comp(__q.comp)
6933e519524SHoward Hinnant{
694ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
6953e519524SHoward Hinnant}
6963e519524SHoward Hinnant
697f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
6983e519524SHoward Hinnant
6993e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
7003e519524SHoward Hinnanttemplate <class _Alloc>
701cd31b434SEvgeniy Stepanovinline
7023e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
7033e519524SHoward Hinnant                                                          container_type&& __c,
7043e519524SHoward Hinnant                                                          const _Alloc& __a,
7053e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
7063e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
707ce48a113SHoward Hinnant    : c(_VSTD::move(__c), __a),
7083e519524SHoward Hinnant      comp(__comp)
7093e519524SHoward Hinnant{
710ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
7113e519524SHoward Hinnant}
7123e519524SHoward Hinnant
7133e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
7143e519524SHoward Hinnanttemplate <class _Alloc>
715cd31b434SEvgeniy Stepanovinline
7163e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
7173e519524SHoward Hinnant                                                          const _Alloc& __a,
7183e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
7193e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
720ce48a113SHoward Hinnant    : c(_VSTD::move(__q.c), __a),
721ce48a113SHoward Hinnant      comp(_VSTD::move(__q.comp))
7223e519524SHoward Hinnant{
723ce48a113SHoward Hinnant    _VSTD::make_heap(c.begin(), c.end(), comp);
7243e519524SHoward Hinnant}
7253e519524SHoward Hinnant
726f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
7273e519524SHoward Hinnant
7283e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
729cd31b434SEvgeniy Stepanovinline
7303e519524SHoward Hinnantvoid
7313e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
7323e519524SHoward Hinnant{
7333e519524SHoward Hinnant    c.push_back(__v);
734ce48a113SHoward Hinnant    _VSTD::push_heap(c.begin(), c.end(), comp);
7353e519524SHoward Hinnant}
7363e519524SHoward Hinnant
737f5427b26SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
7383e519524SHoward Hinnant
7393e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
740cd31b434SEvgeniy Stepanovinline
7413e519524SHoward Hinnantvoid
7423e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
7433e519524SHoward Hinnant{
744ce48a113SHoward Hinnant    c.push_back(_VSTD::move(__v));
745ce48a113SHoward Hinnant    _VSTD::push_heap(c.begin(), c.end(), comp);
7463e519524SHoward Hinnant}
7473e519524SHoward Hinnant
7483e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
7493e519524SHoward Hinnanttemplate <class... _Args>
750cd31b434SEvgeniy Stepanovinline
7513e519524SHoward Hinnantvoid
7523e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
7533e519524SHoward Hinnant{
754ce48a113SHoward Hinnant    c.emplace_back(_VSTD::forward<_Args>(__args)...);
755ce48a113SHoward Hinnant    _VSTD::push_heap(c.begin(), c.end(), comp);
7563e519524SHoward Hinnant}
7573e519524SHoward Hinnant
758f5427b26SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
7593e519524SHoward Hinnant
7603e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
761cd31b434SEvgeniy Stepanovinline
7623e519524SHoward Hinnantvoid
7633e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::pop()
7643e519524SHoward Hinnant{
765ce48a113SHoward Hinnant    _VSTD::pop_heap(c.begin(), c.end(), comp);
7663e519524SHoward Hinnant    c.pop_back();
7673e519524SHoward Hinnant}
7683e519524SHoward Hinnant
7693e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
770cd31b434SEvgeniy Stepanovinline
7713e519524SHoward Hinnantvoid
7723e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
7736971d826SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
7746971d826SHoward Hinnant                   __is_nothrow_swappable<value_compare>::value)
7753e519524SHoward Hinnant{
776ce48a113SHoward Hinnant    using _VSTD::swap;
7773e519524SHoward Hinnant    swap(c, __q.c);
7783e519524SHoward Hinnant    swap(comp, __q.comp);
7793e519524SHoward Hinnant}
7803e519524SHoward Hinnant
7813e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
782392183f9SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
783f07dd8d0SEric Fiseliertypename enable_if<
784f07dd8d0SEric Fiselier    __is_swappable<_Container>::value
785f07dd8d0SEric Fiselier    && __is_swappable<_Compare>::value,
7863e519524SHoward Hinnant    void
787f07dd8d0SEric Fiselier>::type
7883e519524SHoward Hinnantswap(priority_queue<_Tp, _Container, _Compare>& __x,
7893e519524SHoward Hinnant     priority_queue<_Tp, _Container, _Compare>& __y)
7906971d826SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
7913e519524SHoward Hinnant{
7923e519524SHoward Hinnant    __x.swap(__y);
7933e519524SHoward Hinnant}
7943e519524SHoward Hinnant
7953e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare, class _Alloc>
796e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
7973e519524SHoward Hinnant    : public uses_allocator<_Container, _Alloc>
7983e519524SHoward Hinnant{
7993e519524SHoward Hinnant};
8003e519524SHoward Hinnant
8013e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
8023e519524SHoward Hinnant
8033e519524SHoward Hinnant#endif  // _LIBCPP_QUEUE
804