xref: /openbsd-src/gnu/llvm/libcxx/include/queue (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
146035553Spatrick// -*- C++ -*-
2*4bdff4beSrobert//===----------------------------------------------------------------------===//
346035553Spatrick//
446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
546035553Spatrick// See https://llvm.org/LICENSE.txt for license information.
646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
746035553Spatrick//
846035553Spatrick//===----------------------------------------------------------------------===//
946035553Spatrick
1046035553Spatrick#ifndef _LIBCPP_QUEUE
1146035553Spatrick#define _LIBCPP_QUEUE
1246035553Spatrick
1346035553Spatrick/*
1446035553Spatrick    queue synopsis
1546035553Spatrick
1646035553Spatricknamespace std
1746035553Spatrick{
1846035553Spatrick
1946035553Spatricktemplate <class T, class Container = deque<T>>
2046035553Spatrickclass queue
2146035553Spatrick{
2246035553Spatrickpublic:
2346035553Spatrick    typedef Container                                container_type;
2446035553Spatrick    typedef typename container_type::value_type      value_type;
2546035553Spatrick    typedef typename container_type::reference       reference;
2646035553Spatrick    typedef typename container_type::const_reference const_reference;
2746035553Spatrick    typedef typename container_type::size_type       size_type;
2846035553Spatrick
2946035553Spatrickprotected:
3046035553Spatrick    container_type c;
3146035553Spatrick
3246035553Spatrickpublic:
3346035553Spatrick    queue() = default;
3446035553Spatrick    ~queue() = default;
3546035553Spatrick
3646035553Spatrick    queue(const queue& q) = default;
3746035553Spatrick    queue(queue&& q) = default;
3846035553Spatrick
3946035553Spatrick    queue& operator=(const queue& q) = default;
4046035553Spatrick    queue& operator=(queue&& q) = default;
4146035553Spatrick
4246035553Spatrick    explicit queue(const container_type& c);
4346035553Spatrick    explicit queue(container_type&& c)
44*4bdff4beSrobert    template<class InputIterator>
45*4bdff4beSrobert        queue(InputIterator first, InputIterator last); // since C++23
4646035553Spatrick    template <class Alloc>
4746035553Spatrick        explicit queue(const Alloc& a);
4846035553Spatrick    template <class Alloc>
4946035553Spatrick        queue(const container_type& c, const Alloc& a);
5046035553Spatrick    template <class Alloc>
5146035553Spatrick        queue(container_type&& c, const Alloc& a);
5246035553Spatrick    template <class Alloc>
5346035553Spatrick        queue(const queue& q, const Alloc& a);
5446035553Spatrick    template <class Alloc>
5546035553Spatrick        queue(queue&& q, const Alloc& a);
56*4bdff4beSrobert    template <class InputIterator, class Alloc>
57*4bdff4beSrobert        queue(InputIterator first, InputIterator last, const Alloc&); // since C++23
5846035553Spatrick
5946035553Spatrick    bool      empty() const;
6046035553Spatrick    size_type size() const;
6146035553Spatrick
6246035553Spatrick    reference       front();
6346035553Spatrick    const_reference front() const;
6446035553Spatrick    reference       back();
6546035553Spatrick    const_reference back() const;
6646035553Spatrick
6746035553Spatrick    void push(const value_type& v);
6846035553Spatrick    void push(value_type&& v);
6946035553Spatrick    template <class... Args> reference emplace(Args&&... args); // reference in C++17
7046035553Spatrick    void pop();
7146035553Spatrick
7246035553Spatrick    void swap(queue& q) noexcept(is_nothrow_swappable_v<Container>)
7346035553Spatrick};
7446035553Spatrick
7546035553Spatricktemplate<class Container>
7646035553Spatrick  queue(Container) -> queue<typename Container::value_type, Container>; // C++17
7746035553Spatrick
78*4bdff4beSroberttemplate<class InputIterator>
79*4bdff4beSrobert  queue(InputIterator, InputIterator) -> queue<iter-value-type<InputIterator>>; // since C++23
80*4bdff4beSrobert
8146035553Spatricktemplate<class Container, class Allocator>
8246035553Spatrick  queue(Container, Allocator) -> queue<typename Container::value_type, Container>; // C++17
8346035553Spatrick
84*4bdff4beSroberttemplate<class InputIterator, class Allocator>
85*4bdff4beSrobert  queue(InputIterator, InputIterator, Allocator)
86*4bdff4beSrobert  -> queue<iter-value-type<InputIterator>,
87*4bdff4beSrobert           deque<iter-value-type<InputIterator>, Allocator>>; // since C++23
88*4bdff4beSrobert
8946035553Spatricktemplate <class T, class Container>
9046035553Spatrick  bool operator==(const queue<T, Container>& x,const queue<T, Container>& y);
9146035553Spatrick
9246035553Spatricktemplate <class T, class Container>
9346035553Spatrick  bool operator< (const queue<T, Container>& x,const queue<T, Container>& y);
9446035553Spatrick
9546035553Spatricktemplate <class T, class Container>
9646035553Spatrick  bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y);
9746035553Spatrick
9846035553Spatricktemplate <class T, class Container>
9946035553Spatrick  bool operator> (const queue<T, Container>& x,const queue<T, Container>& y);
10046035553Spatrick
10146035553Spatricktemplate <class T, class Container>
10246035553Spatrick  bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y);
10346035553Spatrick
10446035553Spatricktemplate <class T, class Container>
10546035553Spatrick  bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y);
10646035553Spatrick
10746035553Spatricktemplate <class T, class Container>
10846035553Spatrick  void swap(queue<T, Container>& x, queue<T, Container>& y)
10946035553Spatrick  noexcept(noexcept(x.swap(y)));
11046035553Spatrick
11146035553Spatricktemplate <class T, class Container = vector<T>,
11246035553Spatrick          class Compare = less<typename Container::value_type>>
11346035553Spatrickclass priority_queue
11446035553Spatrick{
11546035553Spatrickpublic:
11646035553Spatrick    typedef Container                                container_type;
11746035553Spatrick    typedef typename container_type::value_type      value_type;
11846035553Spatrick    typedef typename container_type::reference       reference;
11946035553Spatrick    typedef typename container_type::const_reference const_reference;
12046035553Spatrick    typedef typename container_type::size_type       size_type;
12146035553Spatrick
12246035553Spatrickprotected:
12346035553Spatrick    container_type c;
12446035553Spatrick    Compare comp;
12546035553Spatrick
12646035553Spatrickpublic:
12776d0caaeSpatrick    priority_queue() : priority_queue(Compare()) {} // C++20
12876d0caaeSpatrick    explicit priority_queue(const Compare& x) : priority_queue(x, Container()) {}
12976d0caaeSpatrick    priority_queue(const Compare& x, const Container&);
13076d0caaeSpatrick    explicit priority_queue(const Compare& x = Compare(), Container&& = Container()); // before C++20
13176d0caaeSpatrick    priority_queue(const Compare& x, Container&&); // C++20
13246035553Spatrick    template <class InputIterator>
13346035553Spatrick        priority_queue(InputIterator first, InputIterator last,
13446035553Spatrick                       const Compare& comp = Compare());
13546035553Spatrick    template <class InputIterator>
13646035553Spatrick        priority_queue(InputIterator first, InputIterator last,
137*4bdff4beSrobert                       const Compare& comp, const Container& c);
13846035553Spatrick    template <class InputIterator>
13946035553Spatrick        priority_queue(InputIterator first, InputIterator last,
140*4bdff4beSrobert                       const Compare& comp, Container&& c);
14146035553Spatrick    template <class Alloc>
14246035553Spatrick        explicit priority_queue(const Alloc& a);
14346035553Spatrick    template <class Alloc>
14446035553Spatrick        priority_queue(const Compare& comp, const Alloc& a);
14546035553Spatrick    template <class Alloc>
146*4bdff4beSrobert        priority_queue(const Compare& comp, const Container& c,
14746035553Spatrick                       const Alloc& a);
14846035553Spatrick    template <class Alloc>
149*4bdff4beSrobert        priority_queue(const Compare& comp, Container&& c,
15046035553Spatrick                       const Alloc& a);
151*4bdff4beSrobert    template <class InputIterator>
152*4bdff4beSrobert        priority_queue(InputIterator first, InputIterator last,
153*4bdff4beSrobert                       const Alloc& a);
154*4bdff4beSrobert    template <class InputIterator>
155*4bdff4beSrobert        priority_queue(InputIterator first, InputIterator last,
156*4bdff4beSrobert                       const Compare& comp, const Alloc& a);
157*4bdff4beSrobert    template <class InputIterator>
158*4bdff4beSrobert        priority_queue(InputIterator first, InputIterator last,
159*4bdff4beSrobert                       const Compare& comp, const Container& c, const Alloc& a);
160*4bdff4beSrobert    template <class InputIterator>
161*4bdff4beSrobert        priority_queue(InputIterator first, InputIterator last,
162*4bdff4beSrobert                       const Compare& comp, Container&& c, const Alloc& a);
16346035553Spatrick    template <class Alloc>
16446035553Spatrick        priority_queue(const priority_queue& q, const Alloc& a);
16546035553Spatrick    template <class Alloc>
16646035553Spatrick        priority_queue(priority_queue&& q, const Alloc& a);
16746035553Spatrick
16846035553Spatrick    bool            empty() const;
16946035553Spatrick    size_type       size() const;
17046035553Spatrick    const_reference top() const;
17146035553Spatrick
17246035553Spatrick    void push(const value_type& v);
17346035553Spatrick    void push(value_type&& v);
17446035553Spatrick    template <class... Args> void emplace(Args&&... args);
17546035553Spatrick    void pop();
17646035553Spatrick
17746035553Spatrick    void swap(priority_queue& q)
17846035553Spatrick        noexcept(is_nothrow_swappable_v<Container> &&
17946035553Spatrick                 is_nothrow_swappable_v<Comp>)
18046035553Spatrick};
18146035553Spatrick
18246035553Spatricktemplate <class Compare, class Container>
18346035553Spatrickpriority_queue(Compare, Container)
18446035553Spatrick    -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
18546035553Spatrick
18646035553Spatricktemplate<class InputIterator,
187*4bdff4beSrobert         class Compare = less<iter-value-type<InputIterator>>,
188*4bdff4beSrobert         class Container = vector<iter-value-type<InputIterator>>>
18946035553Spatrickpriority_queue(InputIterator, InputIterator, Compare = Compare(), Container = Container())
190*4bdff4beSrobert    -> priority_queue<iter-value-type<InputIterator>, Container, Compare>; // C++17
19146035553Spatrick
19246035553Spatricktemplate<class Compare, class Container, class Allocator>
19346035553Spatrickpriority_queue(Compare, Container, Allocator)
19446035553Spatrick    -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
19546035553Spatrick
196*4bdff4beSroberttemplate<class InputIterator, class Allocator>
197*4bdff4beSrobertpriority_queue(InputIterator, InputIterator, Allocator)
198*4bdff4beSrobert    -> priority_queue<iter-value-type<InputIterator>,
199*4bdff4beSrobert                      vector<iter-value-type<InputIterator>, Allocator>,
200*4bdff4beSrobert                      less<iter-value-type<InputIterator>>>; // C++17
201*4bdff4beSrobert
202*4bdff4beSroberttemplate<class InputIterator, class Compare, class Allocator>
203*4bdff4beSrobertpriority_queue(InputIterator, InputIterator, Compare, Allocator)
204*4bdff4beSrobert    -> priority_queue<iter-value-type<InputIterator>,
205*4bdff4beSrobert                      vector<iter-value-type<InputIterator>, Allocator>, Compare>; // C++17
206*4bdff4beSrobert
207*4bdff4beSroberttemplate<class InputIterator, class Compare, class Container, class Allocator>
208*4bdff4beSrobertpriority_queue(InputIterator, InputIterator, Compare, Container, Allocator)
209*4bdff4beSrobert    -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
210*4bdff4beSrobert
21146035553Spatricktemplate <class T, class Container, class Compare>
21246035553Spatrick  void swap(priority_queue<T, Container, Compare>& x,
21346035553Spatrick            priority_queue<T, Container, Compare>& y)
21446035553Spatrick            noexcept(noexcept(x.swap(y)));
21546035553Spatrick
21646035553Spatrick}  // std
21746035553Spatrick
21846035553Spatrick*/
21946035553Spatrick
220*4bdff4beSrobert#include <__algorithm/make_heap.h>
221*4bdff4beSrobert#include <__algorithm/pop_heap.h>
222*4bdff4beSrobert#include <__algorithm/push_heap.h>
223*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler
22446035553Spatrick#include <__config>
225*4bdff4beSrobert#include <__functional/operations.h>
226*4bdff4beSrobert#include <__iterator/iterator_traits.h>
22776d0caaeSpatrick#include <__memory/uses_allocator.h>
22876d0caaeSpatrick#include <__utility/forward.h>
22976d0caaeSpatrick#include <deque>
230*4bdff4beSrobert#include <type_traits>
23176d0caaeSpatrick#include <vector>
232*4bdff4beSrobert#include <version>
233*4bdff4beSrobert
234*4bdff4beSrobert// standard-mandated includes
235*4bdff4beSrobert
236*4bdff4beSrobert// [queue.syn]
237*4bdff4beSrobert#include <compare>
238*4bdff4beSrobert#include <initializer_list>
23946035553Spatrick
24046035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
24146035553Spatrick#  pragma GCC system_header
24246035553Spatrick#endif
24346035553Spatrick
24446035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD
24546035553Spatrick
24646035553Spatricktemplate <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS queue;
24746035553Spatrick
24846035553Spatricktemplate <class _Tp, class _Container>
24946035553Spatrick_LIBCPP_INLINE_VISIBILITY
25046035553Spatrickbool
25146035553Spatrickoperator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
25246035553Spatrick
25346035553Spatricktemplate <class _Tp, class _Container>
25446035553Spatrick_LIBCPP_INLINE_VISIBILITY
25546035553Spatrickbool
25646035553Spatrickoperator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
25746035553Spatrick
25846035553Spatricktemplate <class _Tp, class _Container /*= deque<_Tp>*/>
25946035553Spatrickclass _LIBCPP_TEMPLATE_VIS queue
26046035553Spatrick{
26146035553Spatrickpublic:
26246035553Spatrick    typedef _Container                               container_type;
26346035553Spatrick    typedef typename container_type::value_type      value_type;
26446035553Spatrick    typedef typename container_type::reference       reference;
26546035553Spatrick    typedef typename container_type::const_reference const_reference;
26646035553Spatrick    typedef typename container_type::size_type       size_type;
26746035553Spatrick    static_assert((is_same<_Tp, value_type>::value), "" );
26846035553Spatrick
26946035553Spatrickprotected:
27046035553Spatrick    container_type c;
27146035553Spatrick
27246035553Spatrickpublic:
27346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
27446035553Spatrick    queue()
27546035553Spatrick        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
27646035553Spatrick        : c() {}
27746035553Spatrick
27846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
27946035553Spatrick    queue(const queue& __q) : c(__q.c) {}
28046035553Spatrick
281*4bdff4beSrobert#if _LIBCPP_STD_VER > 20
282*4bdff4beSrobert    template <class _InputIterator,
283*4bdff4beSrobert              class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>>
284*4bdff4beSrobert    _LIBCPP_HIDE_FROM_ABI
285*4bdff4beSrobert    queue(_InputIterator __first, _InputIterator __last) : c(__first, __last) {}
286*4bdff4beSrobert
287*4bdff4beSrobert    template <class _InputIterator,
288*4bdff4beSrobert              class _Alloc,
289*4bdff4beSrobert              class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
290*4bdff4beSrobert              class = __enable_if_t<uses_allocator<container_type, _Alloc>::value>>
291*4bdff4beSrobert    _LIBCPP_HIDE_FROM_ABI
292*4bdff4beSrobert    queue(_InputIterator __first, _InputIterator __second, const _Alloc& __alloc) : c(__first, __second, __alloc) {}
293*4bdff4beSrobert#endif
294*4bdff4beSrobert
29546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
29646035553Spatrick    queue& operator=(const queue& __q) {c = __q.c; return *this;}
29746035553Spatrick
29846035553Spatrick#ifndef _LIBCPP_CXX03_LANG
29946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
30046035553Spatrick    queue(queue&& __q)
30146035553Spatrick        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
30246035553Spatrick        : c(_VSTD::move(__q.c)) {}
30346035553Spatrick
30446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
30546035553Spatrick    queue& operator=(queue&& __q)
30646035553Spatrick        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
30746035553Spatrick        {c = _VSTD::move(__q.c); return *this;}
30846035553Spatrick#endif // _LIBCPP_CXX03_LANG
30946035553Spatrick
31046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
31146035553Spatrick    explicit queue(const container_type& __c)  : c(__c) {}
31246035553Spatrick#ifndef _LIBCPP_CXX03_LANG
31346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
31446035553Spatrick    explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {}
31546035553Spatrick#endif // _LIBCPP_CXX03_LANG
31646035553Spatrick    template <class _Alloc>
31746035553Spatrick        _LIBCPP_INLINE_VISIBILITY
31846035553Spatrick        explicit queue(const _Alloc& __a,
319*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
32046035553Spatrick            : c(__a) {}
32146035553Spatrick    template <class _Alloc>
32246035553Spatrick        _LIBCPP_INLINE_VISIBILITY
32346035553Spatrick        queue(const queue& __q, const _Alloc& __a,
324*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
32546035553Spatrick            : c(__q.c, __a) {}
32646035553Spatrick    template <class _Alloc>
32746035553Spatrick        _LIBCPP_INLINE_VISIBILITY
32846035553Spatrick        queue(const container_type& __c, const _Alloc& __a,
329*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
33046035553Spatrick            : c(__c, __a) {}
33146035553Spatrick#ifndef _LIBCPP_CXX03_LANG
33246035553Spatrick    template <class _Alloc>
33346035553Spatrick        _LIBCPP_INLINE_VISIBILITY
33446035553Spatrick        queue(container_type&& __c, const _Alloc& __a,
335*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
33646035553Spatrick            : c(_VSTD::move(__c), __a) {}
33746035553Spatrick    template <class _Alloc>
33846035553Spatrick        _LIBCPP_INLINE_VISIBILITY
33946035553Spatrick        queue(queue&& __q, const _Alloc& __a,
340*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
34146035553Spatrick            : c(_VSTD::move(__q.c), __a) {}
34246035553Spatrick
34346035553Spatrick#endif // _LIBCPP_CXX03_LANG
34446035553Spatrick
34546035553Spatrick    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
34646035553Spatrick    bool      empty() const {return c.empty();}
34746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
34846035553Spatrick    size_type size() const  {return c.size();}
34946035553Spatrick
35046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
35146035553Spatrick    reference       front()       {return c.front();}
35246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
35346035553Spatrick    const_reference front() const {return c.front();}
35446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
35546035553Spatrick    reference       back()        {return c.back();}
35646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
35746035553Spatrick    const_reference back() const  {return c.back();}
35846035553Spatrick
35946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
36046035553Spatrick    void push(const value_type& __v) {c.push_back(__v);}
36146035553Spatrick#ifndef _LIBCPP_CXX03_LANG
36246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
36346035553Spatrick    void push(value_type&& __v)      {c.push_back(_VSTD::move(__v));}
36446035553Spatrick    template <class... _Args>
36546035553Spatrick        _LIBCPP_INLINE_VISIBILITY
36646035553Spatrick#if _LIBCPP_STD_VER > 14
36746035553Spatrick        decltype(auto) emplace(_Args&&... __args)
36846035553Spatrick            { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
36946035553Spatrick#else
37046035553Spatrick        void     emplace(_Args&&... __args)
37146035553Spatrick            {        c.emplace_back(_VSTD::forward<_Args>(__args)...);}
37246035553Spatrick#endif
37346035553Spatrick#endif // _LIBCPP_CXX03_LANG
37446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
37546035553Spatrick    void pop() {c.pop_front();}
37646035553Spatrick
37746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
37846035553Spatrick    void swap(queue& __q)
37946035553Spatrick        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
38046035553Spatrick    {
38146035553Spatrick        using _VSTD::swap;
38246035553Spatrick        swap(c, __q.c);
38346035553Spatrick    }
38446035553Spatrick
385*4bdff4beSrobert    _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI const _Container& __get_container() const { return c; }
386*4bdff4beSrobert
38746035553Spatrick    template <class _T1, class _C1>
38846035553Spatrick    friend
38946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
39046035553Spatrick    bool
39146035553Spatrick    operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
39246035553Spatrick
39346035553Spatrick    template <class _T1, class _C1>
39446035553Spatrick    friend
39546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
39646035553Spatrick    bool
39746035553Spatrick    operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
39846035553Spatrick};
39946035553Spatrick
400*4bdff4beSrobert#if _LIBCPP_STD_VER > 14
40146035553Spatricktemplate<class _Container,
402*4bdff4beSrobert         class = enable_if_t<!__is_allocator<_Container>::value>
40346035553Spatrick>
40446035553Spatrickqueue(_Container)
40546035553Spatrick    -> queue<typename _Container::value_type, _Container>;
40646035553Spatrick
40746035553Spatricktemplate<class _Container,
40846035553Spatrick         class _Alloc,
409*4bdff4beSrobert         class = enable_if_t<!__is_allocator<_Container>::value>,
410*4bdff4beSrobert         class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
41146035553Spatrick>
41246035553Spatrickqueue(_Container, _Alloc)
41346035553Spatrick    -> queue<typename _Container::value_type, _Container>;
41446035553Spatrick#endif
41546035553Spatrick
416*4bdff4beSrobert#if _LIBCPP_STD_VER > 20
417*4bdff4beSroberttemplate <class _InputIterator,
418*4bdff4beSrobert          class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>>
419*4bdff4beSrobertqueue(_InputIterator, _InputIterator)
420*4bdff4beSrobert    -> queue<__iter_value_type<_InputIterator>>;
421*4bdff4beSrobert
422*4bdff4beSroberttemplate <class _InputIterator,
423*4bdff4beSrobert          class _Alloc,
424*4bdff4beSrobert          class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
425*4bdff4beSrobert          class = __enable_if_t<__is_allocator<_Alloc>::value>>
426*4bdff4beSrobertqueue(_InputIterator, _InputIterator, _Alloc)
427*4bdff4beSrobert    -> queue<__iter_value_type<_InputIterator>, deque<__iter_value_type<_InputIterator>, _Alloc>>;
428*4bdff4beSrobert#endif
429*4bdff4beSrobert
43046035553Spatricktemplate <class _Tp, class _Container>
43146035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
43246035553Spatrickbool
43346035553Spatrickoperator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
43446035553Spatrick{
43546035553Spatrick    return __x.c == __y.c;
43646035553Spatrick}
43746035553Spatrick
43846035553Spatricktemplate <class _Tp, class _Container>
43946035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
44046035553Spatrickbool
44146035553Spatrickoperator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
44246035553Spatrick{
44346035553Spatrick    return __x.c < __y.c;
44446035553Spatrick}
44546035553Spatrick
44646035553Spatricktemplate <class _Tp, class _Container>
44746035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
44846035553Spatrickbool
44946035553Spatrickoperator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
45046035553Spatrick{
45146035553Spatrick    return !(__x == __y);
45246035553Spatrick}
45346035553Spatrick
45446035553Spatricktemplate <class _Tp, class _Container>
45546035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
45646035553Spatrickbool
45746035553Spatrickoperator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
45846035553Spatrick{
45946035553Spatrick    return __y < __x;
46046035553Spatrick}
46146035553Spatrick
46246035553Spatricktemplate <class _Tp, class _Container>
46346035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
46446035553Spatrickbool
46546035553Spatrickoperator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
46646035553Spatrick{
46746035553Spatrick    return !(__x < __y);
46846035553Spatrick}
46946035553Spatrick
47046035553Spatricktemplate <class _Tp, class _Container>
47146035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
47246035553Spatrickbool
47346035553Spatrickoperator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
47446035553Spatrick{
47546035553Spatrick    return !(__y < __x);
47646035553Spatrick}
47746035553Spatrick
47846035553Spatricktemplate <class _Tp, class _Container>
47946035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
480*4bdff4beSrobert__enable_if_t<__is_swappable<_Container>::value, void>
48146035553Spatrickswap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
48246035553Spatrick    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
48346035553Spatrick{
48446035553Spatrick    __x.swap(__y);
48546035553Spatrick}
48646035553Spatrick
48746035553Spatricktemplate <class _Tp, class _Container, class _Alloc>
48846035553Spatrickstruct _LIBCPP_TEMPLATE_VIS uses_allocator<queue<_Tp, _Container>, _Alloc>
48946035553Spatrick    : public uses_allocator<_Container, _Alloc>
49046035553Spatrick{
49146035553Spatrick};
49246035553Spatrick
49346035553Spatricktemplate <class _Tp, class _Container = vector<_Tp>,
49446035553Spatrick          class _Compare = less<typename _Container::value_type> >
49546035553Spatrickclass _LIBCPP_TEMPLATE_VIS priority_queue
49646035553Spatrick{
49746035553Spatrickpublic:
49846035553Spatrick    typedef _Container                               container_type;
49946035553Spatrick    typedef _Compare                                 value_compare;
50046035553Spatrick    typedef typename container_type::value_type      value_type;
50146035553Spatrick    typedef typename container_type::reference       reference;
50246035553Spatrick    typedef typename container_type::const_reference const_reference;
50346035553Spatrick    typedef typename container_type::size_type       size_type;
50446035553Spatrick    static_assert((is_same<_Tp, value_type>::value), "" );
50546035553Spatrick
50646035553Spatrickprotected:
50746035553Spatrick    container_type c;
50846035553Spatrick    value_compare comp;
50946035553Spatrick
51046035553Spatrickpublic:
51146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
51246035553Spatrick    priority_queue()
51346035553Spatrick        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value &&
51446035553Spatrick                   is_nothrow_default_constructible<value_compare>::value)
51546035553Spatrick        : c(), comp() {}
51646035553Spatrick
51746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
51846035553Spatrick    priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
51946035553Spatrick
52046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
52146035553Spatrick    priority_queue& operator=(const priority_queue& __q)
52246035553Spatrick        {c = __q.c; comp = __q.comp; return *this;}
52346035553Spatrick
52446035553Spatrick#ifndef _LIBCPP_CXX03_LANG
52546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
52646035553Spatrick    priority_queue(priority_queue&& __q)
52746035553Spatrick        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value &&
52846035553Spatrick                   is_nothrow_move_constructible<value_compare>::value)
52946035553Spatrick        : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {}
53046035553Spatrick
53146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
53246035553Spatrick    priority_queue& operator=(priority_queue&& __q)
53346035553Spatrick        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value &&
53446035553Spatrick                   is_nothrow_move_assignable<value_compare>::value)
53546035553Spatrick        {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
53646035553Spatrick#endif // _LIBCPP_CXX03_LANG
53746035553Spatrick
53846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
53946035553Spatrick    explicit priority_queue(const value_compare& __comp)
54046035553Spatrick        : c(), comp(__comp) {}
54146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
54246035553Spatrick    priority_queue(const value_compare& __comp, const container_type& __c);
54346035553Spatrick#ifndef _LIBCPP_CXX03_LANG
54446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
54576d0caaeSpatrick    priority_queue(const value_compare& __comp, container_type&& __c);
54646035553Spatrick#endif
547*4bdff4beSrobert    template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
54846035553Spatrick        _LIBCPP_INLINE_VISIBILITY
54946035553Spatrick        priority_queue(_InputIter __f, _InputIter __l,
55046035553Spatrick                       const value_compare& __comp = value_compare());
551*4bdff4beSrobert    template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
55246035553Spatrick        _LIBCPP_INLINE_VISIBILITY
55346035553Spatrick        priority_queue(_InputIter __f, _InputIter __l,
55446035553Spatrick                       const value_compare& __comp, const container_type& __c);
55546035553Spatrick#ifndef _LIBCPP_CXX03_LANG
556*4bdff4beSrobert    template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
55746035553Spatrick        _LIBCPP_INLINE_VISIBILITY
55846035553Spatrick        priority_queue(_InputIter __f, _InputIter __l,
55946035553Spatrick                       const value_compare& __comp, container_type&& __c);
56046035553Spatrick#endif // _LIBCPP_CXX03_LANG
56146035553Spatrick    template <class _Alloc>
56246035553Spatrick        _LIBCPP_INLINE_VISIBILITY
56346035553Spatrick        explicit priority_queue(const _Alloc& __a,
564*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
56546035553Spatrick    template <class _Alloc>
56646035553Spatrick        _LIBCPP_INLINE_VISIBILITY
56746035553Spatrick        priority_queue(const value_compare& __comp, const _Alloc& __a,
568*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
56946035553Spatrick    template <class _Alloc>
57046035553Spatrick        _LIBCPP_INLINE_VISIBILITY
57146035553Spatrick        priority_queue(const value_compare& __comp, const container_type& __c,
57246035553Spatrick                       const _Alloc& __a,
573*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
57446035553Spatrick    template <class _Alloc>
57546035553Spatrick        _LIBCPP_INLINE_VISIBILITY
57646035553Spatrick        priority_queue(const priority_queue& __q, const _Alloc& __a,
577*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
57846035553Spatrick#ifndef _LIBCPP_CXX03_LANG
57946035553Spatrick    template <class _Alloc>
58046035553Spatrick        _LIBCPP_INLINE_VISIBILITY
58146035553Spatrick        priority_queue(const value_compare& __comp, container_type&& __c,
58246035553Spatrick                       const _Alloc& __a,
583*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
58446035553Spatrick    template <class _Alloc>
58546035553Spatrick        _LIBCPP_INLINE_VISIBILITY
58646035553Spatrick        priority_queue(priority_queue&& __q, const _Alloc& __a,
587*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
588*4bdff4beSrobert#endif // _LIBCPP_CXX03_LANG
589*4bdff4beSrobert
590*4bdff4beSrobert    template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
591*4bdff4beSrobert        _LIBCPP_INLINE_VISIBILITY
592*4bdff4beSrobert        priority_queue(_InputIter __f, _InputIter __l, const _Alloc& __a,
593*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
594*4bdff4beSrobert
595*4bdff4beSrobert    template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
596*4bdff4beSrobert        _LIBCPP_INLINE_VISIBILITY
597*4bdff4beSrobert        priority_queue(_InputIter __f, _InputIter __l,
598*4bdff4beSrobert                       const value_compare& __comp, const _Alloc& __a,
599*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
600*4bdff4beSrobert
601*4bdff4beSrobert    template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
602*4bdff4beSrobert        _LIBCPP_INLINE_VISIBILITY
603*4bdff4beSrobert        priority_queue(_InputIter __f, _InputIter __l,
604*4bdff4beSrobert                       const value_compare& __comp, const container_type& __c, const _Alloc& __a,
605*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
606*4bdff4beSrobert
607*4bdff4beSrobert#ifndef _LIBCPP_CXX03_LANG
608*4bdff4beSrobert    template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
609*4bdff4beSrobert        _LIBCPP_INLINE_VISIBILITY
610*4bdff4beSrobert        priority_queue(_InputIter __f, _InputIter __l,
611*4bdff4beSrobert                       const value_compare& __comp, container_type&& __c, const _Alloc& __a,
612*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
61346035553Spatrick#endif  // _LIBCPP_CXX03_LANG
61446035553Spatrick
61546035553Spatrick    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
61646035553Spatrick    bool            empty() const {return c.empty();}
61746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
61846035553Spatrick    size_type       size() const  {return c.size();}
61946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
62046035553Spatrick    const_reference top() const   {return c.front();}
62146035553Spatrick
62246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
62346035553Spatrick    void push(const value_type& __v);
62446035553Spatrick#ifndef _LIBCPP_CXX03_LANG
62546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
62646035553Spatrick    void push(value_type&& __v);
62746035553Spatrick    template <class... _Args>
62846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
62946035553Spatrick    void emplace(_Args&&... __args);
63046035553Spatrick#endif // _LIBCPP_CXX03_LANG
63146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
63246035553Spatrick    void pop();
63346035553Spatrick
63446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
63546035553Spatrick    void swap(priority_queue& __q)
63646035553Spatrick        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
63746035553Spatrick                   __is_nothrow_swappable<value_compare>::value);
638*4bdff4beSrobert
639*4bdff4beSrobert    _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI const _Container& __get_container() const { return c; }
64046035553Spatrick};
64146035553Spatrick
642*4bdff4beSrobert#if _LIBCPP_STD_VER >= 17
64346035553Spatricktemplate <class _Compare,
64446035553Spatrick          class _Container,
645*4bdff4beSrobert          class = enable_if_t<!__is_allocator<_Compare>::value>,
646*4bdff4beSrobert          class = enable_if_t<!__is_allocator<_Container>::value>
64746035553Spatrick>
64846035553Spatrickpriority_queue(_Compare, _Container)
64946035553Spatrick    -> priority_queue<typename _Container::value_type, _Container, _Compare>;
65046035553Spatrick
65146035553Spatricktemplate<class _InputIterator,
65276d0caaeSpatrick         class _Compare = less<__iter_value_type<_InputIterator>>,
65376d0caaeSpatrick         class _Container = vector<__iter_value_type<_InputIterator>>,
654*4bdff4beSrobert         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
655*4bdff4beSrobert         class = enable_if_t<!__is_allocator<_Compare>::value>,
656*4bdff4beSrobert         class = enable_if_t<!__is_allocator<_Container>::value>
65746035553Spatrick>
65846035553Spatrickpriority_queue(_InputIterator, _InputIterator, _Compare = _Compare(), _Container = _Container())
65976d0caaeSpatrick    -> priority_queue<__iter_value_type<_InputIterator>, _Container, _Compare>;
66046035553Spatrick
66146035553Spatricktemplate<class _Compare,
66246035553Spatrick         class _Container,
66346035553Spatrick         class _Alloc,
664*4bdff4beSrobert         class = enable_if_t<!__is_allocator<_Compare>::value>,
665*4bdff4beSrobert         class = enable_if_t<!__is_allocator<_Container>::value>,
666*4bdff4beSrobert         class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
66746035553Spatrick>
66846035553Spatrickpriority_queue(_Compare, _Container, _Alloc)
66946035553Spatrick    -> priority_queue<typename _Container::value_type, _Container, _Compare>;
670*4bdff4beSrobert
671*4bdff4beSroberttemplate<class _InputIterator, class _Allocator,
672*4bdff4beSrobert         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
673*4bdff4beSrobert         class = enable_if_t<__is_allocator<_Allocator>::value>
674*4bdff4beSrobert>
675*4bdff4beSrobertpriority_queue(_InputIterator, _InputIterator, _Allocator)
676*4bdff4beSrobert    -> priority_queue<__iter_value_type<_InputIterator>,
677*4bdff4beSrobert                      vector<__iter_value_type<_InputIterator>, _Allocator>,
678*4bdff4beSrobert                      less<__iter_value_type<_InputIterator>>>;
679*4bdff4beSrobert
680*4bdff4beSroberttemplate<class _InputIterator, class _Compare, class _Allocator,
681*4bdff4beSrobert         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
682*4bdff4beSrobert         class = enable_if_t<!__is_allocator<_Compare>::value>,
683*4bdff4beSrobert         class = enable_if_t<__is_allocator<_Allocator>::value>
684*4bdff4beSrobert>
685*4bdff4beSrobertpriority_queue(_InputIterator, _InputIterator, _Compare, _Allocator)
686*4bdff4beSrobert    -> priority_queue<__iter_value_type<_InputIterator>,
687*4bdff4beSrobert                      vector<__iter_value_type<_InputIterator>, _Allocator>, _Compare>;
688*4bdff4beSrobert
689*4bdff4beSroberttemplate<class _InputIterator, class _Compare, class _Container, class _Alloc,
690*4bdff4beSrobert         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
691*4bdff4beSrobert         class = enable_if_t<!__is_allocator<_Compare>::value>,
692*4bdff4beSrobert         class = enable_if_t<!__is_allocator<_Container>::value>,
693*4bdff4beSrobert         class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
694*4bdff4beSrobert>
695*4bdff4beSrobertpriority_queue(_InputIterator, _InputIterator, _Compare, _Container, _Alloc)
696*4bdff4beSrobert    -> priority_queue<typename _Container::value_type, _Container, _Compare>;
69746035553Spatrick#endif
69846035553Spatrick
69946035553Spatricktemplate <class _Tp, class _Container, class _Compare>
70046035553Spatrickinline
70146035553Spatrickpriority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
70246035553Spatrick                                                          const container_type& __c)
70346035553Spatrick    : c(__c),
70446035553Spatrick      comp(__comp)
70546035553Spatrick{
70646035553Spatrick    _VSTD::make_heap(c.begin(), c.end(), comp);
70746035553Spatrick}
70846035553Spatrick
70946035553Spatrick#ifndef _LIBCPP_CXX03_LANG
71046035553Spatrick
71146035553Spatricktemplate <class _Tp, class _Container, class _Compare>
71246035553Spatrickinline
71346035553Spatrickpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
71446035553Spatrick                                                          container_type&& __c)
71546035553Spatrick    : c(_VSTD::move(__c)),
71646035553Spatrick      comp(__comp)
71746035553Spatrick{
71846035553Spatrick    _VSTD::make_heap(c.begin(), c.end(), comp);
71946035553Spatrick}
72046035553Spatrick
72146035553Spatrick#endif // _LIBCPP_CXX03_LANG
72246035553Spatrick
72346035553Spatricktemplate <class _Tp, class _Container, class _Compare>
724*4bdff4beSroberttemplate <class _InputIter, class>
72546035553Spatrickinline
72646035553Spatrickpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
72746035553Spatrick                                                          const value_compare& __comp)
72846035553Spatrick    : c(__f, __l),
72946035553Spatrick      comp(__comp)
73046035553Spatrick{
73146035553Spatrick    _VSTD::make_heap(c.begin(), c.end(), comp);
73246035553Spatrick}
73346035553Spatrick
73446035553Spatricktemplate <class _Tp, class _Container, class _Compare>
735*4bdff4beSroberttemplate <class _InputIter, class>
73646035553Spatrickinline
73746035553Spatrickpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
73846035553Spatrick                                                          const value_compare& __comp,
73946035553Spatrick                                                          const container_type& __c)
74046035553Spatrick    : c(__c),
74146035553Spatrick      comp(__comp)
74246035553Spatrick{
74346035553Spatrick    c.insert(c.end(), __f, __l);
74446035553Spatrick    _VSTD::make_heap(c.begin(), c.end(), comp);
74546035553Spatrick}
74646035553Spatrick
74746035553Spatrick#ifndef _LIBCPP_CXX03_LANG
74846035553Spatrick
74946035553Spatricktemplate <class _Tp, class _Container, class _Compare>
750*4bdff4beSroberttemplate <class _InputIter, class>
75146035553Spatrickinline
75246035553Spatrickpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
75346035553Spatrick                                                          const value_compare& __comp,
75446035553Spatrick                                                          container_type&& __c)
75546035553Spatrick    : c(_VSTD::move(__c)),
75646035553Spatrick      comp(__comp)
75746035553Spatrick{
75846035553Spatrick    c.insert(c.end(), __f, __l);
75946035553Spatrick    _VSTD::make_heap(c.begin(), c.end(), comp);
76046035553Spatrick}
76146035553Spatrick
76246035553Spatrick#endif // _LIBCPP_CXX03_LANG
76346035553Spatrick
76446035553Spatricktemplate <class _Tp, class _Container, class _Compare>
76546035553Spatricktemplate <class _Alloc>
76646035553Spatrickinline
76746035553Spatrickpriority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
768*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
76946035553Spatrick    : c(__a)
77046035553Spatrick{
77146035553Spatrick}
77246035553Spatrick
77346035553Spatricktemplate <class _Tp, class _Container, class _Compare>
77446035553Spatricktemplate <class _Alloc>
77546035553Spatrickinline
77646035553Spatrickpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
77746035553Spatrick                                                          const _Alloc& __a,
778*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
77946035553Spatrick    : c(__a),
78046035553Spatrick      comp(__comp)
78146035553Spatrick{
78246035553Spatrick}
78346035553Spatrick
78446035553Spatricktemplate <class _Tp, class _Container, class _Compare>
78546035553Spatricktemplate <class _Alloc>
78646035553Spatrickinline
78746035553Spatrickpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
78846035553Spatrick                                                          const container_type& __c,
78946035553Spatrick                                                          const _Alloc& __a,
790*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
79146035553Spatrick    : c(__c, __a),
79246035553Spatrick      comp(__comp)
79346035553Spatrick{
79446035553Spatrick    _VSTD::make_heap(c.begin(), c.end(), comp);
79546035553Spatrick}
79646035553Spatrick
79746035553Spatricktemplate <class _Tp, class _Container, class _Compare>
79846035553Spatricktemplate <class _Alloc>
79946035553Spatrickinline
80046035553Spatrickpriority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
80146035553Spatrick                                                          const _Alloc& __a,
802*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
80346035553Spatrick    : c(__q.c, __a),
80446035553Spatrick      comp(__q.comp)
80546035553Spatrick{
80646035553Spatrick}
80746035553Spatrick
80846035553Spatrick#ifndef _LIBCPP_CXX03_LANG
80946035553Spatrick
81046035553Spatricktemplate <class _Tp, class _Container, class _Compare>
81146035553Spatricktemplate <class _Alloc>
81246035553Spatrickinline
81346035553Spatrickpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
81446035553Spatrick                                                          container_type&& __c,
81546035553Spatrick                                                          const _Alloc& __a,
816*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
81746035553Spatrick    : c(_VSTD::move(__c), __a),
81846035553Spatrick      comp(__comp)
81946035553Spatrick{
82046035553Spatrick    _VSTD::make_heap(c.begin(), c.end(), comp);
82146035553Spatrick}
82246035553Spatrick
82346035553Spatricktemplate <class _Tp, class _Container, class _Compare>
82446035553Spatricktemplate <class _Alloc>
82546035553Spatrickinline
82646035553Spatrickpriority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
82746035553Spatrick                                                          const _Alloc& __a,
828*4bdff4beSrobert                       __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
82946035553Spatrick    : c(_VSTD::move(__q.c), __a),
83046035553Spatrick      comp(_VSTD::move(__q.comp))
83146035553Spatrick{
832*4bdff4beSrobert}
833*4bdff4beSrobert
834*4bdff4beSrobert#endif  // _LIBCPP_CXX03_LANG
835*4bdff4beSrobert
836*4bdff4beSroberttemplate <class _Tp, class _Container, class _Compare>
837*4bdff4beSroberttemplate <class _InputIter, class _Alloc, class>
838*4bdff4beSrobertinline
839*4bdff4beSrobertpriority_queue<_Tp, _Container, _Compare>::priority_queue(
840*4bdff4beSrobert        _InputIter __f, _InputIter __l, const _Alloc& __a,
841*4bdff4beSrobert        __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
842*4bdff4beSrobert    : c(__f, __l, __a),
843*4bdff4beSrobert      comp()
844*4bdff4beSrobert{
84546035553Spatrick    _VSTD::make_heap(c.begin(), c.end(), comp);
84646035553Spatrick}
84746035553Spatrick
848*4bdff4beSroberttemplate <class _Tp, class _Container, class _Compare>
849*4bdff4beSroberttemplate <class _InputIter, class _Alloc, class>
850*4bdff4beSrobertinline
851*4bdff4beSrobertpriority_queue<_Tp, _Container, _Compare>::priority_queue(
852*4bdff4beSrobert        _InputIter __f, _InputIter __l,
853*4bdff4beSrobert        const value_compare& __comp, const _Alloc& __a,
854*4bdff4beSrobert        __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
855*4bdff4beSrobert    : c(__f, __l, __a),
856*4bdff4beSrobert      comp(__comp)
857*4bdff4beSrobert{
858*4bdff4beSrobert    _VSTD::make_heap(c.begin(), c.end(), comp);
859*4bdff4beSrobert}
860*4bdff4beSrobert
861*4bdff4beSroberttemplate <class _Tp, class _Container, class _Compare>
862*4bdff4beSroberttemplate <class _InputIter, class _Alloc, class>
863*4bdff4beSrobertinline
864*4bdff4beSrobertpriority_queue<_Tp, _Container, _Compare>::priority_queue(
865*4bdff4beSrobert        _InputIter __f, _InputIter __l,
866*4bdff4beSrobert        const value_compare& __comp, const container_type& __c, const _Alloc& __a,
867*4bdff4beSrobert        __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
868*4bdff4beSrobert    : c(__c, __a),
869*4bdff4beSrobert      comp(__comp)
870*4bdff4beSrobert{
871*4bdff4beSrobert    c.insert(c.end(), __f, __l);
872*4bdff4beSrobert    _VSTD::make_heap(c.begin(), c.end(), comp);
873*4bdff4beSrobert}
874*4bdff4beSrobert
875*4bdff4beSrobert#ifndef _LIBCPP_CXX03_LANG
876*4bdff4beSroberttemplate <class _Tp, class _Container, class _Compare>
877*4bdff4beSroberttemplate <class _InputIter, class _Alloc, class>
878*4bdff4beSrobertinline
879*4bdff4beSrobertpriority_queue<_Tp, _Container, _Compare>::priority_queue(
880*4bdff4beSrobert        _InputIter __f, _InputIter __l, const value_compare& __comp,
881*4bdff4beSrobert        container_type&& __c, const _Alloc& __a,
882*4bdff4beSrobert        __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
883*4bdff4beSrobert    : c(_VSTD::move(__c), __a),
884*4bdff4beSrobert      comp(__comp)
885*4bdff4beSrobert{
886*4bdff4beSrobert    c.insert(c.end(), __f, __l);
887*4bdff4beSrobert    _VSTD::make_heap(c.begin(), c.end(), comp);
888*4bdff4beSrobert}
88946035553Spatrick#endif  // _LIBCPP_CXX03_LANG
89046035553Spatrick
89146035553Spatricktemplate <class _Tp, class _Container, class _Compare>
89246035553Spatrickinline
89346035553Spatrickvoid
89446035553Spatrickpriority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
89546035553Spatrick{
89646035553Spatrick    c.push_back(__v);
89746035553Spatrick    _VSTD::push_heap(c.begin(), c.end(), comp);
89846035553Spatrick}
89946035553Spatrick
90046035553Spatrick#ifndef _LIBCPP_CXX03_LANG
90146035553Spatrick
90246035553Spatricktemplate <class _Tp, class _Container, class _Compare>
90346035553Spatrickinline
90446035553Spatrickvoid
90546035553Spatrickpriority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
90646035553Spatrick{
90746035553Spatrick    c.push_back(_VSTD::move(__v));
90846035553Spatrick    _VSTD::push_heap(c.begin(), c.end(), comp);
90946035553Spatrick}
91046035553Spatrick
91146035553Spatricktemplate <class _Tp, class _Container, class _Compare>
91246035553Spatricktemplate <class... _Args>
91346035553Spatrickinline
91446035553Spatrickvoid
91546035553Spatrickpriority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
91646035553Spatrick{
91746035553Spatrick    c.emplace_back(_VSTD::forward<_Args>(__args)...);
91846035553Spatrick    _VSTD::push_heap(c.begin(), c.end(), comp);
91946035553Spatrick}
92046035553Spatrick
92146035553Spatrick#endif // _LIBCPP_CXX03_LANG
92246035553Spatrick
92346035553Spatricktemplate <class _Tp, class _Container, class _Compare>
92446035553Spatrickinline
92546035553Spatrickvoid
92646035553Spatrickpriority_queue<_Tp, _Container, _Compare>::pop()
92746035553Spatrick{
92846035553Spatrick    _VSTD::pop_heap(c.begin(), c.end(), comp);
92946035553Spatrick    c.pop_back();
93046035553Spatrick}
93146035553Spatrick
93246035553Spatricktemplate <class _Tp, class _Container, class _Compare>
93346035553Spatrickinline
93446035553Spatrickvoid
93546035553Spatrickpriority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
93646035553Spatrick        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
93746035553Spatrick                   __is_nothrow_swappable<value_compare>::value)
93846035553Spatrick{
93946035553Spatrick    using _VSTD::swap;
94046035553Spatrick    swap(c, __q.c);
94146035553Spatrick    swap(comp, __q.comp);
94246035553Spatrick}
94346035553Spatrick
94446035553Spatricktemplate <class _Tp, class _Container, class _Compare>
94546035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
946*4bdff4beSrobert__enable_if_t<
94776d0caaeSpatrick    __is_swappable<_Container>::value && __is_swappable<_Compare>::value,
94846035553Spatrick    void
94976d0caaeSpatrick>
95046035553Spatrickswap(priority_queue<_Tp, _Container, _Compare>& __x,
95146035553Spatrick     priority_queue<_Tp, _Container, _Compare>& __y)
95246035553Spatrick    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
95346035553Spatrick{
95446035553Spatrick    __x.swap(__y);
95546035553Spatrick}
95646035553Spatrick
95746035553Spatricktemplate <class _Tp, class _Container, class _Compare, class _Alloc>
95846035553Spatrickstruct _LIBCPP_TEMPLATE_VIS uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
95946035553Spatrick    : public uses_allocator<_Container, _Alloc>
96046035553Spatrick{
96146035553Spatrick};
96246035553Spatrick
96346035553Spatrick_LIBCPP_END_NAMESPACE_STD
96446035553Spatrick
965*4bdff4beSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
966*4bdff4beSrobert#  include <concepts>
967*4bdff4beSrobert#  include <functional>
968*4bdff4beSrobert#endif
969*4bdff4beSrobert
97046035553Spatrick#endif // _LIBCPP_QUEUE
971