xref: /llvm-project-15.0.7/libcxx/include/queue (revision 3e519524)
1*3e519524SHoward Hinnant// -*- C++ -*-
2*3e519524SHoward Hinnant//===--------------------------- queue ------------------------------------===//
3*3e519524SHoward Hinnant//
4*3e519524SHoward Hinnant// ��������������������The LLVM Compiler Infrastructure
5*3e519524SHoward Hinnant//
6*3e519524SHoward Hinnant// This file is distributed under the University of Illinois Open Source
7*3e519524SHoward Hinnant// License. See LICENSE.TXT for details.
8*3e519524SHoward Hinnant//
9*3e519524SHoward Hinnant//===----------------------------------------------------------------------===//
10*3e519524SHoward Hinnant
11*3e519524SHoward Hinnant#ifndef _LIBCPP_QUEUE
12*3e519524SHoward Hinnant#define _LIBCPP_QUEUE
13*3e519524SHoward Hinnant
14*3e519524SHoward Hinnant/*
15*3e519524SHoward Hinnant    queue synopsis
16*3e519524SHoward Hinnant
17*3e519524SHoward Hinnantnamespace std
18*3e519524SHoward Hinnant{
19*3e519524SHoward Hinnant
20*3e519524SHoward Hinnanttemplate <class T, class Container = deque<T>>
21*3e519524SHoward Hinnantclass queue
22*3e519524SHoward Hinnant{
23*3e519524SHoward Hinnantpublic:
24*3e519524SHoward Hinnant    typedef Container                                container_type;
25*3e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
26*3e519524SHoward Hinnant    typedef typename container_type::reference       reference;
27*3e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
28*3e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
29*3e519524SHoward Hinnant
30*3e519524SHoward Hinnantprotected:
31*3e519524SHoward Hinnant    container_type c;
32*3e519524SHoward Hinnant
33*3e519524SHoward Hinnantpublic:
34*3e519524SHoward Hinnant    queue();
35*3e519524SHoward Hinnant    explicit queue(const container_type& c);
36*3e519524SHoward Hinnant    explicit queue(container_type&& c);
37*3e519524SHoward Hinnant    queue(queue&& q);
38*3e519524SHoward Hinnant    template <class Alloc>
39*3e519524SHoward Hinnant        explicit queue(const Alloc& a);
40*3e519524SHoward Hinnant    template <class Alloc>
41*3e519524SHoward Hinnant        queue(const container_type& c, const Alloc& a);
42*3e519524SHoward Hinnant    template <class Alloc>
43*3e519524SHoward Hinnant        queue(container_type&& c, const Alloc& a);
44*3e519524SHoward Hinnant    template <class Alloc>
45*3e519524SHoward Hinnant        queue(queue&& q, const Alloc& a);
46*3e519524SHoward Hinnant
47*3e519524SHoward Hinnant    queue& operator=(queue&& q);
48*3e519524SHoward Hinnant
49*3e519524SHoward Hinnant    bool      empty() const;
50*3e519524SHoward Hinnant    size_type size() const;
51*3e519524SHoward Hinnant
52*3e519524SHoward Hinnant    reference       front();
53*3e519524SHoward Hinnant    const_reference front() const;
54*3e519524SHoward Hinnant    reference       back();
55*3e519524SHoward Hinnant    const_reference back() const;
56*3e519524SHoward Hinnant
57*3e519524SHoward Hinnant    void push(const value_type& v);
58*3e519524SHoward Hinnant    void push(value_type&& v);
59*3e519524SHoward Hinnant    template <class... Args> void emplace(Args&&... args);
60*3e519524SHoward Hinnant    void pop();
61*3e519524SHoward Hinnant
62*3e519524SHoward Hinnant    void swap(queue& q);
63*3e519524SHoward Hinnant};
64*3e519524SHoward Hinnant
65*3e519524SHoward Hinnanttemplate <class T, class Container>
66*3e519524SHoward Hinnant  bool operator==(const queue<T, Container>& x,const queue<T, Container>& y);
67*3e519524SHoward Hinnant
68*3e519524SHoward Hinnanttemplate <class T, class Container>
69*3e519524SHoward Hinnant  bool operator< (const queue<T, Container>& x,const queue<T, Container>& y);
70*3e519524SHoward Hinnant
71*3e519524SHoward Hinnanttemplate <class T, class Container>
72*3e519524SHoward Hinnant  bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y);
73*3e519524SHoward Hinnant
74*3e519524SHoward Hinnanttemplate <class T, class Container>
75*3e519524SHoward Hinnant  bool operator> (const queue<T, Container>& x,const queue<T, Container>& y);
76*3e519524SHoward Hinnant
77*3e519524SHoward Hinnanttemplate <class T, class Container>
78*3e519524SHoward Hinnant  bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y);
79*3e519524SHoward Hinnant
80*3e519524SHoward Hinnanttemplate <class T, class Container>
81*3e519524SHoward Hinnant  bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y);
82*3e519524SHoward Hinnant
83*3e519524SHoward Hinnanttemplate <class T, class Container>
84*3e519524SHoward Hinnant  void swap(queue<T, Container>& x, queue<T, Container>& y);
85*3e519524SHoward Hinnant
86*3e519524SHoward Hinnanttemplate <class T, class Container = vector<T>,
87*3e519524SHoward Hinnant          class Compare = less<typename Container::value_type>>
88*3e519524SHoward Hinnantclass priority_queue
89*3e519524SHoward Hinnant{
90*3e519524SHoward Hinnantpublic:
91*3e519524SHoward Hinnant    typedef Container                                container_type;
92*3e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
93*3e519524SHoward Hinnant    typedef typename container_type::reference       reference;
94*3e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
95*3e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
96*3e519524SHoward Hinnant
97*3e519524SHoward Hinnantprotected:
98*3e519524SHoward Hinnant    container_type c;
99*3e519524SHoward Hinnant    Compare comp;
100*3e519524SHoward Hinnant
101*3e519524SHoward Hinnantpublic:
102*3e519524SHoward Hinnant    explicit priority_queue(const Compare& comp = Compare());
103*3e519524SHoward Hinnant    priority_queue(const Compare& comp, const container_type& c);
104*3e519524SHoward Hinnant    explicit priority_queue(const Compare& comp, container_type&& c);
105*3e519524SHoward Hinnant    template <class InputIterator>
106*3e519524SHoward Hinnant        priority_queue(InputIterator first, InputIterator last,
107*3e519524SHoward Hinnant                       const Compare& comp = Compare());
108*3e519524SHoward Hinnant    template <class InputIterator>
109*3e519524SHoward Hinnant        priority_queue(InputIterator first, InputIterator last,
110*3e519524SHoward Hinnant                       const Compare& comp, const container_type& c);
111*3e519524SHoward Hinnant    template <class InputIterator>
112*3e519524SHoward Hinnant        priority_queue(InputIterator first, InputIterator last,
113*3e519524SHoward Hinnant                       const Compare& comp, container_type&& c);
114*3e519524SHoward Hinnant    priority_queue(priority_queue&& q);
115*3e519524SHoward Hinnant    priority_queue& operator=(priority_queue&& q);
116*3e519524SHoward Hinnant    template <class Alloc>
117*3e519524SHoward Hinnant        explicit priority_queue(const Alloc& a);
118*3e519524SHoward Hinnant    template <class Alloc>
119*3e519524SHoward Hinnant        priority_queue(const Compare& comp, const Alloc& a);
120*3e519524SHoward Hinnant    template <class Alloc>
121*3e519524SHoward Hinnant        priority_queue(const Compare& comp, const container_type& c,
122*3e519524SHoward Hinnant                       const Alloc& a);
123*3e519524SHoward Hinnant    template <class Alloc>
124*3e519524SHoward Hinnant        priority_queue(const Compare& comp, container_type&& c,
125*3e519524SHoward Hinnant                       const Alloc& a);
126*3e519524SHoward Hinnant    template <class Alloc>
127*3e519524SHoward Hinnant        priority_queue(priority_queue&& q, const Alloc& a);
128*3e519524SHoward Hinnant
129*3e519524SHoward Hinnant    bool            empty() const;
130*3e519524SHoward Hinnant    size_type       size() const;
131*3e519524SHoward Hinnant    const_reference top() const;
132*3e519524SHoward Hinnant
133*3e519524SHoward Hinnant    void push(const value_type& v);
134*3e519524SHoward Hinnant    void push(value_type&& v);
135*3e519524SHoward Hinnant    template <class... Args> void emplace(Args&&... args);
136*3e519524SHoward Hinnant    void pop();
137*3e519524SHoward Hinnant
138*3e519524SHoward Hinnant    void swap(priority_queue& q);
139*3e519524SHoward Hinnant};
140*3e519524SHoward Hinnant
141*3e519524SHoward Hinnanttemplate <class T, class Container, class Compare>
142*3e519524SHoward Hinnant  void swap(priority_queue<T, Container, Compare>& x,
143*3e519524SHoward Hinnant            priority_queue<T, Container, Compare>& y);
144*3e519524SHoward Hinnant
145*3e519524SHoward Hinnant}  // std
146*3e519524SHoward Hinnant
147*3e519524SHoward Hinnant*/
148*3e519524SHoward Hinnant
149*3e519524SHoward Hinnant#include <__config>
150*3e519524SHoward Hinnant#include <deque>
151*3e519524SHoward Hinnant#include <vector>
152*3e519524SHoward Hinnant#include <functional>
153*3e519524SHoward Hinnant#include <algorithm>
154*3e519524SHoward Hinnant
155*3e519524SHoward Hinnant#pragma GCC system_header
156*3e519524SHoward Hinnant
157*3e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
158*3e519524SHoward Hinnant
159*3e519524SHoward Hinnanttemplate <class _Tp, class _Container> class queue;
160*3e519524SHoward Hinnant
161*3e519524SHoward Hinnanttemplate <class _Tp, class _Container>
162*3e519524SHoward Hinnantbool
163*3e519524SHoward Hinnantoperator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
164*3e519524SHoward Hinnant
165*3e519524SHoward Hinnanttemplate <class _Tp, class _Container>
166*3e519524SHoward Hinnantbool
167*3e519524SHoward Hinnantoperator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
168*3e519524SHoward Hinnant
169*3e519524SHoward Hinnanttemplate <class _Tp, class _Container = deque<_Tp> >
170*3e519524SHoward Hinnantclass queue
171*3e519524SHoward Hinnant{
172*3e519524SHoward Hinnantpublic:
173*3e519524SHoward Hinnant    typedef _Container                               container_type;
174*3e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
175*3e519524SHoward Hinnant    typedef typename container_type::reference       reference;
176*3e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
177*3e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
178*3e519524SHoward Hinnant
179*3e519524SHoward Hinnantprotected:
180*3e519524SHoward Hinnant    container_type c;
181*3e519524SHoward Hinnant
182*3e519524SHoward Hinnantpublic:
183*3e519524SHoward Hinnant    queue() : c() {}
184*3e519524SHoward Hinnant    explicit queue(const container_type& __c)  : c(__c) {}
185*3e519524SHoward Hinnant#ifdef _LIBCPP_MOVE
186*3e519524SHoward Hinnant    explicit queue(container_type&& __c) : c(_STD::move(__c)) {}
187*3e519524SHoward Hinnant    queue(queue&& __q) : c(_STD::move(__q.c)) {}
188*3e519524SHoward Hinnant#endif
189*3e519524SHoward Hinnant    template <class _Alloc>
190*3e519524SHoward Hinnant        explicit queue(const _Alloc& __a,
191*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
192*3e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
193*3e519524SHoward Hinnant            : c(__a) {}
194*3e519524SHoward Hinnant    template <class _Alloc>
195*3e519524SHoward Hinnant        queue(const queue& __q, const _Alloc& __a,
196*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
197*3e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
198*3e519524SHoward Hinnant            : c(__q.c, __a) {}
199*3e519524SHoward Hinnant    template <class _Alloc>
200*3e519524SHoward Hinnant        queue(const container_type& __c, const _Alloc& __a,
201*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
202*3e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
203*3e519524SHoward Hinnant            : c(__c, __a) {}
204*3e519524SHoward Hinnant#ifdef _LIBCPP_MOVE
205*3e519524SHoward Hinnant    template <class _Alloc>
206*3e519524SHoward Hinnant        queue(container_type&& __c, const _Alloc& __a,
207*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
208*3e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
209*3e519524SHoward Hinnant            : c(_STD::move(__c), __a) {}
210*3e519524SHoward Hinnant    template <class _Alloc>
211*3e519524SHoward Hinnant        queue(queue&& __q, const _Alloc& __a,
212*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
213*3e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0)
214*3e519524SHoward Hinnant            : c(_STD::move(__q.c), __a) {}
215*3e519524SHoward Hinnant
216*3e519524SHoward Hinnant    queue& operator=(queue&& __q)
217*3e519524SHoward Hinnant    {
218*3e519524SHoward Hinnant        c = _STD::move(__q.c);
219*3e519524SHoward Hinnant        return *this;
220*3e519524SHoward Hinnant    }
221*3e519524SHoward Hinnant#endif
222*3e519524SHoward Hinnant
223*3e519524SHoward Hinnant    bool      empty() const {return c.empty();}
224*3e519524SHoward Hinnant    size_type size() const  {return c.size();}
225*3e519524SHoward Hinnant
226*3e519524SHoward Hinnant    reference       front()       {return c.front();}
227*3e519524SHoward Hinnant    const_reference front() const {return c.front();}
228*3e519524SHoward Hinnant    reference       back()        {return c.back();}
229*3e519524SHoward Hinnant    const_reference back() const  {return c.back();}
230*3e519524SHoward Hinnant
231*3e519524SHoward Hinnant    void push(const value_type& __v) {c.push_back(__v);}
232*3e519524SHoward Hinnant#ifdef _LIBCPP_MOVE
233*3e519524SHoward Hinnant    void push(value_type&& __v)      {c.push_back(_STD::move(__v));}
234*3e519524SHoward Hinnant    template <class... _Args>
235*3e519524SHoward Hinnant        void emplace(_Args&&... __args)
236*3e519524SHoward Hinnant            {c.emplace_back(_STD::forward<_Args>(__args)...);}
237*3e519524SHoward Hinnant#endif
238*3e519524SHoward Hinnant    void pop() {c.pop_front();}
239*3e519524SHoward Hinnant
240*3e519524SHoward Hinnant    void swap(queue& __q)
241*3e519524SHoward Hinnant    {
242*3e519524SHoward Hinnant        using _STD::swap;
243*3e519524SHoward Hinnant        swap(c, __q.c);
244*3e519524SHoward Hinnant    }
245*3e519524SHoward Hinnant
246*3e519524SHoward Hinnant    template <class _T1, class _C1>
247*3e519524SHoward Hinnant    friend
248*3e519524SHoward Hinnant    bool
249*3e519524SHoward Hinnant    operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
250*3e519524SHoward Hinnant
251*3e519524SHoward Hinnant    template <class _T1, class _C1>
252*3e519524SHoward Hinnant    friend
253*3e519524SHoward Hinnant    bool
254*3e519524SHoward Hinnant    operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
255*3e519524SHoward Hinnant};
256*3e519524SHoward Hinnant
257*3e519524SHoward Hinnanttemplate <class _Tp, class _Container>
258*3e519524SHoward Hinnantinline
259*3e519524SHoward Hinnantbool
260*3e519524SHoward Hinnantoperator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
261*3e519524SHoward Hinnant{
262*3e519524SHoward Hinnant    return __x.c == __y.c;
263*3e519524SHoward Hinnant}
264*3e519524SHoward Hinnant
265*3e519524SHoward Hinnanttemplate <class _Tp, class _Container>
266*3e519524SHoward Hinnantinline
267*3e519524SHoward Hinnantbool
268*3e519524SHoward Hinnantoperator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
269*3e519524SHoward Hinnant{
270*3e519524SHoward Hinnant    return __x.c < __y.c;
271*3e519524SHoward Hinnant}
272*3e519524SHoward Hinnant
273*3e519524SHoward Hinnanttemplate <class _Tp, class _Container>
274*3e519524SHoward Hinnantinline
275*3e519524SHoward Hinnantbool
276*3e519524SHoward Hinnantoperator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
277*3e519524SHoward Hinnant{
278*3e519524SHoward Hinnant    return !(__x == __y);
279*3e519524SHoward Hinnant}
280*3e519524SHoward Hinnant
281*3e519524SHoward Hinnanttemplate <class _Tp, class _Container>
282*3e519524SHoward Hinnantinline
283*3e519524SHoward Hinnantbool
284*3e519524SHoward Hinnantoperator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
285*3e519524SHoward Hinnant{
286*3e519524SHoward Hinnant    return __y < __x;
287*3e519524SHoward Hinnant}
288*3e519524SHoward Hinnant
289*3e519524SHoward Hinnanttemplate <class _Tp, class _Container>
290*3e519524SHoward Hinnantinline
291*3e519524SHoward Hinnantbool
292*3e519524SHoward Hinnantoperator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
293*3e519524SHoward Hinnant{
294*3e519524SHoward Hinnant    return !(__x < __y);
295*3e519524SHoward Hinnant}
296*3e519524SHoward Hinnant
297*3e519524SHoward Hinnanttemplate <class _Tp, class _Container>
298*3e519524SHoward Hinnantinline
299*3e519524SHoward Hinnantbool
300*3e519524SHoward Hinnantoperator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
301*3e519524SHoward Hinnant{
302*3e519524SHoward Hinnant    return !(__y < __x);
303*3e519524SHoward Hinnant}
304*3e519524SHoward Hinnant
305*3e519524SHoward Hinnanttemplate <class _Tp, class _Container>
306*3e519524SHoward Hinnantinline
307*3e519524SHoward Hinnantvoid
308*3e519524SHoward Hinnantswap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
309*3e519524SHoward Hinnant{
310*3e519524SHoward Hinnant    __x.swap(__y);
311*3e519524SHoward Hinnant}
312*3e519524SHoward Hinnant
313*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Alloc>
314*3e519524SHoward Hinnantstruct uses_allocator<queue<_Tp, _Container>, _Alloc>
315*3e519524SHoward Hinnant    : public uses_allocator<_Container, _Alloc>
316*3e519524SHoward Hinnant{
317*3e519524SHoward Hinnant};
318*3e519524SHoward Hinnant
319*3e519524SHoward Hinnanttemplate <class _Tp, class _Container = vector<_Tp>,
320*3e519524SHoward Hinnant          class _Compare = less<typename _Container::value_type> >
321*3e519524SHoward Hinnantclass priority_queue
322*3e519524SHoward Hinnant{
323*3e519524SHoward Hinnantpublic:
324*3e519524SHoward Hinnant    typedef _Container                               container_type;
325*3e519524SHoward Hinnant    typedef _Compare                                 value_compare;
326*3e519524SHoward Hinnant    typedef typename container_type::value_type      value_type;
327*3e519524SHoward Hinnant    typedef typename container_type::reference       reference;
328*3e519524SHoward Hinnant    typedef typename container_type::const_reference const_reference;
329*3e519524SHoward Hinnant    typedef typename container_type::size_type       size_type;
330*3e519524SHoward Hinnant
331*3e519524SHoward Hinnantprotected:
332*3e519524SHoward Hinnant    container_type c;
333*3e519524SHoward Hinnant    value_compare comp;
334*3e519524SHoward Hinnant
335*3e519524SHoward Hinnantpublic:
336*3e519524SHoward Hinnant    explicit priority_queue(const value_compare& __comp = value_compare())
337*3e519524SHoward Hinnant        : c(), comp(__comp) {}
338*3e519524SHoward Hinnant    priority_queue(const value_compare& __comp, const container_type& __c);
339*3e519524SHoward Hinnant#ifdef _LIBCPP_MOVE
340*3e519524SHoward Hinnant    explicit priority_queue(const value_compare& __comp, container_type&& __c);
341*3e519524SHoward Hinnant#endif
342*3e519524SHoward Hinnant    template <class _InputIter>
343*3e519524SHoward Hinnant        priority_queue(_InputIter __f, _InputIter __l,
344*3e519524SHoward Hinnant                       const value_compare& __comp = value_compare());
345*3e519524SHoward Hinnant    template <class _InputIter>
346*3e519524SHoward Hinnant        priority_queue(_InputIter __f, _InputIter __l,
347*3e519524SHoward Hinnant                       const value_compare& __comp, const container_type& __c);
348*3e519524SHoward Hinnant#ifdef _LIBCPP_MOVE
349*3e519524SHoward Hinnant    template <class _InputIter>
350*3e519524SHoward Hinnant        priority_queue(_InputIter __f, _InputIter __l,
351*3e519524SHoward Hinnant                       const value_compare& __comp, container_type&& __c);
352*3e519524SHoward Hinnant    priority_queue(priority_queue&& __q);
353*3e519524SHoward Hinnant    priority_queue& operator=(priority_queue&& __q);
354*3e519524SHoward Hinnant#endif
355*3e519524SHoward Hinnant    template <class _Alloc>
356*3e519524SHoward Hinnant        explicit priority_queue(const _Alloc& __a,
357*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
358*3e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
359*3e519524SHoward Hinnant    template <class _Alloc>
360*3e519524SHoward Hinnant        priority_queue(const value_compare& __comp, const _Alloc& __a,
361*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
362*3e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
363*3e519524SHoward Hinnant    template <class _Alloc>
364*3e519524SHoward Hinnant        priority_queue(const value_compare& __comp, const container_type& __c,
365*3e519524SHoward Hinnant                       const _Alloc& __a,
366*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
367*3e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
368*3e519524SHoward Hinnant    template <class _Alloc>
369*3e519524SHoward Hinnant        priority_queue(const priority_queue& __q, const _Alloc& __a,
370*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
371*3e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
372*3e519524SHoward Hinnant#ifdef _LIBCPP_MOVE
373*3e519524SHoward Hinnant    template <class _Alloc>
374*3e519524SHoward Hinnant        priority_queue(const value_compare& __comp, container_type&& __c,
375*3e519524SHoward Hinnant                       const _Alloc& __a,
376*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
377*3e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
378*3e519524SHoward Hinnant    template <class _Alloc>
379*3e519524SHoward Hinnant        priority_queue(priority_queue&& __q, const _Alloc& __a,
380*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
381*3e519524SHoward Hinnant                                                         _Alloc>::value>::type* = 0);
382*3e519524SHoward Hinnant#endif
383*3e519524SHoward Hinnant
384*3e519524SHoward Hinnant    bool            empty() const {return c.empty();}
385*3e519524SHoward Hinnant    size_type       size() const  {return c.size();}
386*3e519524SHoward Hinnant    const_reference top() const   {return c.front();}
387*3e519524SHoward Hinnant
388*3e519524SHoward Hinnant    void push(const value_type& __v);
389*3e519524SHoward Hinnant#ifdef _LIBCPP_MOVE
390*3e519524SHoward Hinnant    void push(value_type&& __v);
391*3e519524SHoward Hinnant    template <class... _Args> void emplace(_Args&&... __args);
392*3e519524SHoward Hinnant#endif
393*3e519524SHoward Hinnant    void pop();
394*3e519524SHoward Hinnant
395*3e519524SHoward Hinnant    void swap(priority_queue& __q);
396*3e519524SHoward Hinnant};
397*3e519524SHoward Hinnant
398*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
399*3e519524SHoward Hinnantinline
400*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
401*3e519524SHoward Hinnant                                                          const container_type& __c)
402*3e519524SHoward Hinnant    : c(__c),
403*3e519524SHoward Hinnant      comp(__comp)
404*3e519524SHoward Hinnant{
405*3e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
406*3e519524SHoward Hinnant}
407*3e519524SHoward Hinnant
408*3e519524SHoward Hinnant#ifdef _LIBCPP_MOVE
409*3e519524SHoward Hinnant
410*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
411*3e519524SHoward Hinnantinline
412*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
413*3e519524SHoward Hinnant                                                          container_type&& __c)
414*3e519524SHoward Hinnant    : c(_STD::move(__c)),
415*3e519524SHoward Hinnant      comp(__comp)
416*3e519524SHoward Hinnant{
417*3e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
418*3e519524SHoward Hinnant}
419*3e519524SHoward Hinnant
420*3e519524SHoward Hinnant#endif
421*3e519524SHoward Hinnant
422*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
423*3e519524SHoward Hinnanttemplate <class _InputIter>
424*3e519524SHoward Hinnantinline
425*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
426*3e519524SHoward Hinnant                                                          const value_compare& __comp)
427*3e519524SHoward Hinnant    : c(__f, __l),
428*3e519524SHoward Hinnant      comp(__comp)
429*3e519524SHoward Hinnant{
430*3e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
431*3e519524SHoward Hinnant}
432*3e519524SHoward Hinnant
433*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
434*3e519524SHoward Hinnanttemplate <class _InputIter>
435*3e519524SHoward Hinnantinline
436*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
437*3e519524SHoward Hinnant                                                          const value_compare& __comp,
438*3e519524SHoward Hinnant                                                          const container_type& __c)
439*3e519524SHoward Hinnant    : c(__c),
440*3e519524SHoward Hinnant      comp(__comp)
441*3e519524SHoward Hinnant{
442*3e519524SHoward Hinnant    c.insert(c.end(), __f, __l);
443*3e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
444*3e519524SHoward Hinnant}
445*3e519524SHoward Hinnant
446*3e519524SHoward Hinnant#ifdef _LIBCPP_MOVE
447*3e519524SHoward Hinnant
448*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
449*3e519524SHoward Hinnanttemplate <class _InputIter>
450*3e519524SHoward Hinnantinline
451*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
452*3e519524SHoward Hinnant                                                          const value_compare& __comp,
453*3e519524SHoward Hinnant                                                          container_type&& __c)
454*3e519524SHoward Hinnant    : c(_STD::move(__c)),
455*3e519524SHoward Hinnant      comp(__comp)
456*3e519524SHoward Hinnant{
457*3e519524SHoward Hinnant    c.insert(c.end(), __f, __l);
458*3e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
459*3e519524SHoward Hinnant}
460*3e519524SHoward Hinnant
461*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
462*3e519524SHoward Hinnantinline
463*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q)
464*3e519524SHoward Hinnant    : c(_STD::move(__q.c)),
465*3e519524SHoward Hinnant      comp(_STD::move(__q.comp))
466*3e519524SHoward Hinnant{
467*3e519524SHoward Hinnant}
468*3e519524SHoward Hinnant
469*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
470*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>&
471*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::operator=(priority_queue&& __q)
472*3e519524SHoward Hinnant{
473*3e519524SHoward Hinnant    c = _STD::move(__q.c);
474*3e519524SHoward Hinnant    comp = _STD::move(__q.comp);
475*3e519524SHoward Hinnant    return *this;
476*3e519524SHoward Hinnant}
477*3e519524SHoward Hinnant
478*3e519524SHoward Hinnant#endif
479*3e519524SHoward Hinnant
480*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
481*3e519524SHoward Hinnanttemplate <class _Alloc>
482*3e519524SHoward Hinnantinline
483*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
484*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
485*3e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
486*3e519524SHoward Hinnant    : c(__a)
487*3e519524SHoward Hinnant{
488*3e519524SHoward Hinnant}
489*3e519524SHoward Hinnant
490*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
491*3e519524SHoward Hinnanttemplate <class _Alloc>
492*3e519524SHoward Hinnantinline
493*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
494*3e519524SHoward Hinnant                                                          const _Alloc& __a,
495*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
496*3e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
497*3e519524SHoward Hinnant    : c(__a),
498*3e519524SHoward Hinnant      comp(__comp)
499*3e519524SHoward Hinnant{
500*3e519524SHoward Hinnant}
501*3e519524SHoward Hinnant
502*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
503*3e519524SHoward Hinnanttemplate <class _Alloc>
504*3e519524SHoward Hinnantinline
505*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
506*3e519524SHoward Hinnant                                                          const container_type& __c,
507*3e519524SHoward Hinnant                                                          const _Alloc& __a,
508*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
509*3e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
510*3e519524SHoward Hinnant    : c(__c, __a),
511*3e519524SHoward Hinnant      comp(__comp)
512*3e519524SHoward Hinnant{
513*3e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
514*3e519524SHoward Hinnant}
515*3e519524SHoward Hinnant
516*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
517*3e519524SHoward Hinnanttemplate <class _Alloc>
518*3e519524SHoward Hinnantinline
519*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
520*3e519524SHoward Hinnant                                                          const _Alloc& __a,
521*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
522*3e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
523*3e519524SHoward Hinnant    : c(__q.c, __a),
524*3e519524SHoward Hinnant      comp(__q.comp)
525*3e519524SHoward Hinnant{
526*3e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
527*3e519524SHoward Hinnant}
528*3e519524SHoward Hinnant
529*3e519524SHoward Hinnant#ifdef _LIBCPP_MOVE
530*3e519524SHoward Hinnant
531*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
532*3e519524SHoward Hinnanttemplate <class _Alloc>
533*3e519524SHoward Hinnantinline
534*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
535*3e519524SHoward Hinnant                                                          container_type&& __c,
536*3e519524SHoward Hinnant                                                          const _Alloc& __a,
537*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
538*3e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
539*3e519524SHoward Hinnant    : c(_STD::move(__c), __a),
540*3e519524SHoward Hinnant      comp(__comp)
541*3e519524SHoward Hinnant{
542*3e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
543*3e519524SHoward Hinnant}
544*3e519524SHoward Hinnant
545*3e519524SHoward Hinnant
546*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
547*3e519524SHoward Hinnanttemplate <class _Alloc>
548*3e519524SHoward Hinnantinline
549*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
550*3e519524SHoward Hinnant                                                          const _Alloc& __a,
551*3e519524SHoward Hinnant                       typename enable_if<uses_allocator<container_type,
552*3e519524SHoward Hinnant                                                         _Alloc>::value>::type*)
553*3e519524SHoward Hinnant    : c(_STD::move(__q.c), __a),
554*3e519524SHoward Hinnant      comp(_STD::move(__q.comp))
555*3e519524SHoward Hinnant{
556*3e519524SHoward Hinnant    _STD::make_heap(c.begin(), c.end(), comp);
557*3e519524SHoward Hinnant}
558*3e519524SHoward Hinnant
559*3e519524SHoward Hinnant#endif
560*3e519524SHoward Hinnant
561*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
562*3e519524SHoward Hinnantinline
563*3e519524SHoward Hinnantvoid
564*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
565*3e519524SHoward Hinnant{
566*3e519524SHoward Hinnant    c.push_back(__v);
567*3e519524SHoward Hinnant    _STD::push_heap(c.begin(), c.end(), comp);
568*3e519524SHoward Hinnant}
569*3e519524SHoward Hinnant
570*3e519524SHoward Hinnant#ifdef _LIBCPP_MOVE
571*3e519524SHoward Hinnant
572*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
573*3e519524SHoward Hinnantinline
574*3e519524SHoward Hinnantvoid
575*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
576*3e519524SHoward Hinnant{
577*3e519524SHoward Hinnant    c.push_back(_STD::move(__v));
578*3e519524SHoward Hinnant    _STD::push_heap(c.begin(), c.end(), comp);
579*3e519524SHoward Hinnant}
580*3e519524SHoward Hinnant
581*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
582*3e519524SHoward Hinnanttemplate <class... _Args>
583*3e519524SHoward Hinnantinline
584*3e519524SHoward Hinnantvoid
585*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
586*3e519524SHoward Hinnant{
587*3e519524SHoward Hinnant    c.emplace_back(_STD::forward<_Args>(__args)...);
588*3e519524SHoward Hinnant    _STD::push_heap(c.begin(), c.end(), comp);
589*3e519524SHoward Hinnant}
590*3e519524SHoward Hinnant
591*3e519524SHoward Hinnant#endif
592*3e519524SHoward Hinnant
593*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
594*3e519524SHoward Hinnantinline
595*3e519524SHoward Hinnantvoid
596*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::pop()
597*3e519524SHoward Hinnant{
598*3e519524SHoward Hinnant    _STD::pop_heap(c.begin(), c.end(), comp);
599*3e519524SHoward Hinnant    c.pop_back();
600*3e519524SHoward Hinnant}
601*3e519524SHoward Hinnant
602*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
603*3e519524SHoward Hinnantinline
604*3e519524SHoward Hinnantvoid
605*3e519524SHoward Hinnantpriority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
606*3e519524SHoward Hinnant{
607*3e519524SHoward Hinnant    using _STD::swap;
608*3e519524SHoward Hinnant    swap(c, __q.c);
609*3e519524SHoward Hinnant    swap(comp, __q.comp);
610*3e519524SHoward Hinnant}
611*3e519524SHoward Hinnant
612*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare>
613*3e519524SHoward Hinnantinline
614*3e519524SHoward Hinnantvoid
615*3e519524SHoward Hinnantswap(priority_queue<_Tp, _Container, _Compare>& __x,
616*3e519524SHoward Hinnant     priority_queue<_Tp, _Container, _Compare>& __y)
617*3e519524SHoward Hinnant{
618*3e519524SHoward Hinnant    __x.swap(__y);
619*3e519524SHoward Hinnant}
620*3e519524SHoward Hinnant
621*3e519524SHoward Hinnanttemplate <class _Tp, class _Container, class _Compare, class _Alloc>
622*3e519524SHoward Hinnantstruct uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
623*3e519524SHoward Hinnant    : public uses_allocator<_Container, _Alloc>
624*3e519524SHoward Hinnant{
625*3e519524SHoward Hinnant};
626*3e519524SHoward Hinnant
627*3e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
628*3e519524SHoward Hinnant
629*3e519524SHoward Hinnant#endif  // _LIBCPP_QUEUE
630