blob: 57d420c7406c95e29d9553d90cb8403432eeb5b3 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===--------------------------- queue ------------------------------------===//
3//
Howard Hinnantc566dc32010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantc51e1022010-05-11 19:42:16 +00005//
Howard Hinnantee11c312010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantc51e1022010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_QUEUE
12#define _LIBCPP_QUEUE
13
14/*
15 queue synopsis
16
17namespace std
18{
19
20template <class T, class Container = deque<T>>
21class queue
22{
23public:
24 typedef Container container_type;
25 typedef typename container_type::value_type value_type;
26 typedef typename container_type::reference reference;
27 typedef typename container_type::const_reference const_reference;
28 typedef typename container_type::size_type size_type;
29
30protected:
31 container_type c;
32
33public:
Howard Hinnantbf438282011-06-04 21:32:33 +000034 queue() = default;
35 ~queue() = default;
36
37 queue(const queue& q) = default;
38 queue(queue&& q) = default;
39
40 queue& operator=(const queue& q) = default;
41 queue& operator=(queue&& q) = default;
42
Howard Hinnantc51e1022010-05-11 19:42:16 +000043 explicit queue(const container_type& c);
Howard Hinnantbf438282011-06-04 21:32:33 +000044 explicit queue(container_type&& c)
Howard Hinnantc51e1022010-05-11 19:42:16 +000045 template <class Alloc>
46 explicit queue(const Alloc& a);
47 template <class Alloc>
48 queue(const container_type& c, const Alloc& a);
49 template <class Alloc>
50 queue(container_type&& c, const Alloc& a);
51 template <class Alloc>
Howard Hinnantbf438282011-06-04 21:32:33 +000052 queue(const queue& q, const Alloc& a);
53 template <class Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +000054 queue(queue&& q, const Alloc& a);
55
Howard Hinnantc51e1022010-05-11 19:42:16 +000056 bool empty() const;
57 size_type size() const;
58
59 reference front();
60 const_reference front() const;
61 reference back();
62 const_reference back() const;
63
64 void push(const value_type& v);
65 void push(value_type&& v);
Marshall Clowea52cc42017-01-24 23:09:12 +000066 template <class... Args> reference emplace(Args&&... args); // reference in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +000067 void pop();
68
Eric Fiselier6bfed252016-04-21 23:38:59 +000069 void swap(queue& q) noexcept(is_nothrow_swappable_v<Container>)
Howard Hinnantc51e1022010-05-11 19:42:16 +000070};
71
72template <class T, class Container>
73 bool operator==(const queue<T, Container>& x,const queue<T, Container>& y);
74
75template <class T, class Container>
76 bool operator< (const queue<T, Container>& x,const queue<T, Container>& y);
77
78template <class T, class Container>
79 bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y);
80
81template <class T, class Container>
82 bool operator> (const queue<T, Container>& x,const queue<T, Container>& y);
83
84template <class T, class Container>
85 bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y);
86
87template <class T, class Container>
88 bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y);
89
90template <class T, class Container>
Howard Hinnantbf438282011-06-04 21:32:33 +000091 void swap(queue<T, Container>& x, queue<T, Container>& y)
92 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +000093
94template <class T, class Container = vector<T>,
95 class Compare = less<typename Container::value_type>>
96class priority_queue
97{
98public:
99 typedef Container container_type;
100 typedef typename container_type::value_type value_type;
101 typedef typename container_type::reference reference;
102 typedef typename container_type::const_reference const_reference;
103 typedef typename container_type::size_type size_type;
104
105protected:
106 container_type c;
107 Compare comp;
108
109public:
Howard Hinnantbf438282011-06-04 21:32:33 +0000110 priority_queue() = default;
111 ~priority_queue() = default;
112
113 priority_queue(const priority_queue& q) = default;
114 priority_queue(priority_queue&& q) = default;
115
116 priority_queue& operator=(const priority_queue& q) = default;
117 priority_queue& operator=(priority_queue&& q) = default;
118
119 explicit priority_queue(const Compare& comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000120 priority_queue(const Compare& comp, const container_type& c);
121 explicit priority_queue(const Compare& comp, container_type&& c);
122 template <class InputIterator>
123 priority_queue(InputIterator first, InputIterator last,
124 const Compare& comp = Compare());
125 template <class InputIterator>
126 priority_queue(InputIterator first, InputIterator last,
127 const Compare& comp, const container_type& c);
128 template <class InputIterator>
129 priority_queue(InputIterator first, InputIterator last,
130 const Compare& comp, container_type&& c);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000131 template <class Alloc>
132 explicit priority_queue(const Alloc& a);
133 template <class Alloc>
134 priority_queue(const Compare& comp, const Alloc& a);
135 template <class Alloc>
136 priority_queue(const Compare& comp, const container_type& c,
137 const Alloc& a);
138 template <class Alloc>
139 priority_queue(const Compare& comp, container_type&& c,
140 const Alloc& a);
141 template <class Alloc>
Howard Hinnantbf438282011-06-04 21:32:33 +0000142 priority_queue(const priority_queue& q, const Alloc& a);
143 template <class Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000144 priority_queue(priority_queue&& q, const Alloc& a);
145
146 bool empty() const;
147 size_type size() const;
148 const_reference top() const;
149
150 void push(const value_type& v);
151 void push(value_type&& v);
152 template <class... Args> void emplace(Args&&... args);
153 void pop();
154
Howard Hinnantbf438282011-06-04 21:32:33 +0000155 void swap(priority_queue& q)
Eric Fiselier6bfed252016-04-21 23:38:59 +0000156 noexcept(is_nothrow_swappable_v<Container> &&
157 is_nothrow_swappable_v<Comp>)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000158};
159
160template <class T, class Container, class Compare>
161 void swap(priority_queue<T, Container, Compare>& x,
Howard Hinnantbf438282011-06-04 21:32:33 +0000162 priority_queue<T, Container, Compare>& y)
163 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000164
165} // std
166
167*/
168
169#include <__config>
170#include <deque>
171#include <vector>
172#include <functional>
173#include <algorithm>
174
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000175#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000176#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000177#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000178
179_LIBCPP_BEGIN_NAMESPACE_STD
180
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000181template <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS queue;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000182
183template <class _Tp, class _Container>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000184_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000185bool
186operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
187
188template <class _Tp, class _Container>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000189_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000190bool
191operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
192
Marshall Clow9e1b8452015-02-18 17:51:56 +0000193template <class _Tp, class _Container /*= deque<_Tp>*/>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000194class _LIBCPP_TEMPLATE_VIS queue
Howard Hinnantc51e1022010-05-11 19:42:16 +0000195{
196public:
197 typedef _Container container_type;
198 typedef typename container_type::value_type value_type;
199 typedef typename container_type::reference reference;
200 typedef typename container_type::const_reference const_reference;
201 typedef typename container_type::size_type size_type;
Marshall Clowb8825f02016-03-14 17:58:11 +0000202 static_assert((is_same<_Tp, value_type>::value), "" );
Howard Hinnantc51e1022010-05-11 19:42:16 +0000203
204protected:
205 container_type c;
206
207public:
Howard Hinnantf5f99992010-09-22 18:02:38 +0000208 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000209 queue()
210 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
211 : c() {}
212
213 _LIBCPP_INLINE_VISIBILITY
214 queue(const queue& __q) : c(__q.c) {}
215
216#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
217 _LIBCPP_INLINE_VISIBILITY
218 queue(queue&& __q)
219 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000220 : c(_VSTD::move(__q.c)) {}
Howard Hinnantbf438282011-06-04 21:32:33 +0000221#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
222
223 _LIBCPP_INLINE_VISIBILITY
224 queue& operator=(const queue& __q) {c = __q.c; return *this;}
225
226#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
227 _LIBCPP_INLINE_VISIBILITY
228 queue& operator=(queue&& __q)
229 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000230 {c = _VSTD::move(__q.c); return *this;}
Howard Hinnantbf438282011-06-04 21:32:33 +0000231#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
232
Howard Hinnantf5f99992010-09-22 18:02:38 +0000233 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000234 explicit queue(const container_type& __c) : c(__c) {}
Howard Hinnant74279a52010-09-04 23:28:19 +0000235#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantf5f99992010-09-22 18:02:38 +0000236 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000237 explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {}
Howard Hinnant74279a52010-09-04 23:28:19 +0000238#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000239 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000240 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000241 explicit queue(const _Alloc& __a,
242 typename enable_if<uses_allocator<container_type,
243 _Alloc>::value>::type* = 0)
244 : c(__a) {}
245 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000246 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000247 queue(const queue& __q, const _Alloc& __a,
248 typename enable_if<uses_allocator<container_type,
249 _Alloc>::value>::type* = 0)
250 : c(__q.c, __a) {}
251 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000252 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000253 queue(const container_type& __c, const _Alloc& __a,
254 typename enable_if<uses_allocator<container_type,
255 _Alloc>::value>::type* = 0)
256 : c(__c, __a) {}
Howard Hinnant74279a52010-09-04 23:28:19 +0000257#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000258 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000259 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000260 queue(container_type&& __c, const _Alloc& __a,
261 typename enable_if<uses_allocator<container_type,
262 _Alloc>::value>::type* = 0)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000263 : c(_VSTD::move(__c), __a) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000264 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000265 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000266 queue(queue&& __q, const _Alloc& __a,
267 typename enable_if<uses_allocator<container_type,
268 _Alloc>::value>::type* = 0)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000269 : c(_VSTD::move(__q.c), __a) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000270
Howard Hinnant74279a52010-09-04 23:28:19 +0000271#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000272
Howard Hinnantf5f99992010-09-22 18:02:38 +0000273 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000274 bool empty() const {return c.empty();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000275 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000276 size_type size() const {return c.size();}
277
Howard Hinnantf5f99992010-09-22 18:02:38 +0000278 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000279 reference front() {return c.front();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000280 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000281 const_reference front() const {return c.front();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000282 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000283 reference back() {return c.back();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000284 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000285 const_reference back() const {return c.back();}
286
Howard Hinnantf5f99992010-09-22 18:02:38 +0000287 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000288 void push(const value_type& __v) {c.push_back(__v);}
Howard Hinnant74279a52010-09-04 23:28:19 +0000289#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantf5f99992010-09-22 18:02:38 +0000290 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000291 void push(value_type&& __v) {c.push_back(_VSTD::move(__v));}
Howard Hinnant74279a52010-09-04 23:28:19 +0000292#ifndef _LIBCPP_HAS_NO_VARIADICS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000293 template <class... _Args>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000294 _LIBCPP_INLINE_VISIBILITY
Marshall Clowea52cc42017-01-24 23:09:12 +0000295#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +0000296 reference emplace(_Args&&... __args)
297 { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
Marshall Clowea52cc42017-01-24 23:09:12 +0000298#else
299 void emplace(_Args&&... __args)
300 { c.emplace_back(_VSTD::forward<_Args>(__args)...);}
301#endif
Howard Hinnant74279a52010-09-04 23:28:19 +0000302#endif // _LIBCPP_HAS_NO_VARIADICS
303#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantf5f99992010-09-22 18:02:38 +0000304 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000305 void pop() {c.pop_front();}
306
Howard Hinnantf5f99992010-09-22 18:02:38 +0000307 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000308 void swap(queue& __q)
Howard Hinnantbf438282011-06-04 21:32:33 +0000309 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000310 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000311 using _VSTD::swap;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000312 swap(c, __q.c);
313 }
314
315 template <class _T1, class _C1>
316 friend
Howard Hinnantf5f99992010-09-22 18:02:38 +0000317 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000318 bool
319 operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000320
Howard Hinnantc51e1022010-05-11 19:42:16 +0000321 template <class _T1, class _C1>
322 friend
Howard Hinnantf5f99992010-09-22 18:02:38 +0000323 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000324 bool
325 operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
326};
327
328template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000329inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000330bool
331operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
332{
333 return __x.c == __y.c;
334}
335
336template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000337inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000338bool
339operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
340{
341 return __x.c < __y.c;
342}
343
344template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000345inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000346bool
347operator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
348{
349 return !(__x == __y);
350}
351
352template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000353inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000354bool
355operator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
356{
357 return __y < __x;
358}
359
360template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000361inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000362bool
363operator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
364{
365 return !(__x < __y);
366}
367
368template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000369inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000370bool
371operator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
372{
373 return !(__y < __x);
374}
375
376template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000377inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier6bfed252016-04-21 23:38:59 +0000378typename enable_if<
379 __is_swappable<_Container>::value,
380 void
381>::type
Howard Hinnantc51e1022010-05-11 19:42:16 +0000382swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
Howard Hinnantbf438282011-06-04 21:32:33 +0000383 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000384{
385 __x.swap(__y);
386}
387
388template <class _Tp, class _Container, class _Alloc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000389struct _LIBCPP_TEMPLATE_VIS uses_allocator<queue<_Tp, _Container>, _Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000390 : public uses_allocator<_Container, _Alloc>
391{
392};
393
394template <class _Tp, class _Container = vector<_Tp>,
395 class _Compare = less<typename _Container::value_type> >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000396class _LIBCPP_TEMPLATE_VIS priority_queue
Howard Hinnantc51e1022010-05-11 19:42:16 +0000397{
398public:
399 typedef _Container container_type;
400 typedef _Compare value_compare;
401 typedef typename container_type::value_type value_type;
402 typedef typename container_type::reference reference;
403 typedef typename container_type::const_reference const_reference;
404 typedef typename container_type::size_type size_type;
Marshall Clowb8825f02016-03-14 17:58:11 +0000405 static_assert((is_same<_Tp, value_type>::value), "" );
Howard Hinnantc51e1022010-05-11 19:42:16 +0000406
407protected:
408 container_type c;
409 value_compare comp;
410
411public:
Howard Hinnantf5f99992010-09-22 18:02:38 +0000412 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000413 priority_queue()
414 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value &&
415 is_nothrow_default_constructible<value_compare>::value)
416 : c(), comp() {}
417
418 _LIBCPP_INLINE_VISIBILITY
419 priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
420
421#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
422 _LIBCPP_INLINE_VISIBILITY
423 priority_queue(priority_queue&& __q)
424 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value &&
425 is_nothrow_move_constructible<value_compare>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000426 : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {}
Howard Hinnantbf438282011-06-04 21:32:33 +0000427#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
428
429 _LIBCPP_INLINE_VISIBILITY
430 priority_queue& operator=(const priority_queue& __q)
431 {c = __q.c; comp = __q.comp; return *this;}
432
433#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
434 _LIBCPP_INLINE_VISIBILITY
435 priority_queue& operator=(priority_queue&& __q)
436 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value &&
437 is_nothrow_move_assignable<value_compare>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000438 {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
Howard Hinnantbf438282011-06-04 21:32:33 +0000439#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
440
441 _LIBCPP_INLINE_VISIBILITY
442 explicit priority_queue(const value_compare& __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000443 : c(), comp(__comp) {}
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000444 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000445 priority_queue(const value_compare& __comp, const container_type& __c);
Howard Hinnant74279a52010-09-04 23:28:19 +0000446#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000447 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000448 explicit priority_queue(const value_compare& __comp, container_type&& __c);
449#endif
450 template <class _InputIter>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000451 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000452 priority_queue(_InputIter __f, _InputIter __l,
453 const value_compare& __comp = value_compare());
454 template <class _InputIter>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000455 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000456 priority_queue(_InputIter __f, _InputIter __l,
457 const value_compare& __comp, const container_type& __c);
Howard Hinnant74279a52010-09-04 23:28:19 +0000458#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000459 template <class _InputIter>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000460 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000461 priority_queue(_InputIter __f, _InputIter __l,
462 const value_compare& __comp, container_type&& __c);
Howard Hinnant74279a52010-09-04 23:28:19 +0000463#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000464 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000465 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000466 explicit priority_queue(const _Alloc& __a,
467 typename enable_if<uses_allocator<container_type,
468 _Alloc>::value>::type* = 0);
469 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000470 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000471 priority_queue(const value_compare& __comp, const _Alloc& __a,
472 typename enable_if<uses_allocator<container_type,
473 _Alloc>::value>::type* = 0);
474 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000475 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000476 priority_queue(const value_compare& __comp, const container_type& __c,
477 const _Alloc& __a,
478 typename enable_if<uses_allocator<container_type,
479 _Alloc>::value>::type* = 0);
480 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000481 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000482 priority_queue(const priority_queue& __q, const _Alloc& __a,
483 typename enable_if<uses_allocator<container_type,
484 _Alloc>::value>::type* = 0);
Howard Hinnant74279a52010-09-04 23:28:19 +0000485#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000486 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000487 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000488 priority_queue(const value_compare& __comp, container_type&& __c,
489 const _Alloc& __a,
490 typename enable_if<uses_allocator<container_type,
491 _Alloc>::value>::type* = 0);
492 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000493 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000494 priority_queue(priority_queue&& __q, const _Alloc& __a,
495 typename enable_if<uses_allocator<container_type,
496 _Alloc>::value>::type* = 0);
Howard Hinnant74279a52010-09-04 23:28:19 +0000497#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000498
Howard Hinnantf5f99992010-09-22 18:02:38 +0000499 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000500 bool empty() const {return c.empty();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000501 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000502 size_type size() const {return c.size();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000503 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000504 const_reference top() const {return c.front();}
505
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000506 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000507 void push(const value_type& __v);
Howard Hinnant74279a52010-09-04 23:28:19 +0000508#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000509 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000510 void push(value_type&& __v);
Howard Hinnant74279a52010-09-04 23:28:19 +0000511#ifndef _LIBCPP_HAS_NO_VARIADICS
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000512 template <class... _Args> _LIBCPP_INLINE_VISIBILITY void emplace(_Args&&... __args);
Howard Hinnant74279a52010-09-04 23:28:19 +0000513#endif
514#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000515 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000516 void pop();
517
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000518 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000519 void swap(priority_queue& __q)
520 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
521 __is_nothrow_swappable<value_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522};
523
524template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000525inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000526priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
527 const container_type& __c)
528 : c(__c),
529 comp(__comp)
530{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000531 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000532}
533
Howard Hinnant74279a52010-09-04 23:28:19 +0000534#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000535
536template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000537inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000538priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
539 container_type&& __c)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000540 : c(_VSTD::move(__c)),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000541 comp(__comp)
542{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000543 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000544}
545
Howard Hinnant74279a52010-09-04 23:28:19 +0000546#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000547
548template <class _Tp, class _Container, class _Compare>
549template <class _InputIter>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000550inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000551priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
552 const value_compare& __comp)
553 : c(__f, __l),
554 comp(__comp)
555{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000556 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000557}
558
559template <class _Tp, class _Container, class _Compare>
560template <class _InputIter>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000561inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000562priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
563 const value_compare& __comp,
564 const container_type& __c)
565 : c(__c),
566 comp(__comp)
567{
568 c.insert(c.end(), __f, __l);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000569 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000570}
571
Howard Hinnant74279a52010-09-04 23:28:19 +0000572#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000573
574template <class _Tp, class _Container, class _Compare>
575template <class _InputIter>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000576inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000577priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
578 const value_compare& __comp,
579 container_type&& __c)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000580 : c(_VSTD::move(__c)),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000581 comp(__comp)
582{
583 c.insert(c.end(), __f, __l);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000584 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000585}
586
Howard Hinnant74279a52010-09-04 23:28:19 +0000587#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000588
589template <class _Tp, class _Container, class _Compare>
590template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000591inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000592priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
593 typename enable_if<uses_allocator<container_type,
594 _Alloc>::value>::type*)
595 : c(__a)
596{
597}
598
599template <class _Tp, class _Container, class _Compare>
600template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000601inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000602priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
603 const _Alloc& __a,
604 typename enable_if<uses_allocator<container_type,
605 _Alloc>::value>::type*)
606 : c(__a),
607 comp(__comp)
608{
609}
610
611template <class _Tp, class _Container, class _Compare>
612template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000613inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000614priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
615 const container_type& __c,
616 const _Alloc& __a,
617 typename enable_if<uses_allocator<container_type,
618 _Alloc>::value>::type*)
619 : c(__c, __a),
620 comp(__comp)
621{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000622 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000623}
624
625template <class _Tp, class _Container, class _Compare>
626template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000627inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000628priority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
629 const _Alloc& __a,
630 typename enable_if<uses_allocator<container_type,
631 _Alloc>::value>::type*)
632 : c(__q.c, __a),
633 comp(__q.comp)
634{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000635 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000636}
637
Howard Hinnant74279a52010-09-04 23:28:19 +0000638#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000639
640template <class _Tp, class _Container, class _Compare>
641template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000642inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000643priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
644 container_type&& __c,
645 const _Alloc& __a,
646 typename enable_if<uses_allocator<container_type,
647 _Alloc>::value>::type*)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000648 : c(_VSTD::move(__c), __a),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000649 comp(__comp)
650{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000651 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000652}
653
Howard Hinnantc51e1022010-05-11 19:42:16 +0000654template <class _Tp, class _Container, class _Compare>
655template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000656inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000657priority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
658 const _Alloc& __a,
659 typename enable_if<uses_allocator<container_type,
660 _Alloc>::value>::type*)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000661 : c(_VSTD::move(__q.c), __a),
662 comp(_VSTD::move(__q.comp))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000663{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000664 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000665}
666
Howard Hinnant74279a52010-09-04 23:28:19 +0000667#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000668
669template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000670inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000671void
672priority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
673{
674 c.push_back(__v);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000675 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000676}
677
Howard Hinnant74279a52010-09-04 23:28:19 +0000678#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000679
680template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000681inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000682void
683priority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
684{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000685 c.push_back(_VSTD::move(__v));
686 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000687}
688
Howard Hinnant74279a52010-09-04 23:28:19 +0000689#ifndef _LIBCPP_HAS_NO_VARIADICS
690
Howard Hinnantc51e1022010-05-11 19:42:16 +0000691template <class _Tp, class _Container, class _Compare>
692template <class... _Args>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000693inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000694void
695priority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
696{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000697 c.emplace_back(_VSTD::forward<_Args>(__args)...);
698 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000699}
700
Howard Hinnant74279a52010-09-04 23:28:19 +0000701#endif // _LIBCPP_HAS_NO_VARIADICS
702#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000703
704template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000705inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000706void
707priority_queue<_Tp, _Container, _Compare>::pop()
708{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000709 _VSTD::pop_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000710 c.pop_back();
711}
712
713template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000714inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000715void
716priority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
Howard Hinnantbf438282011-06-04 21:32:33 +0000717 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
718 __is_nothrow_swappable<value_compare>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000719{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000720 using _VSTD::swap;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000721 swap(c, __q.c);
722 swap(comp, __q.comp);
723}
724
725template <class _Tp, class _Container, class _Compare>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000726inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier6bfed252016-04-21 23:38:59 +0000727typename enable_if<
728 __is_swappable<_Container>::value
729 && __is_swappable<_Compare>::value,
730 void
731>::type
Howard Hinnantc51e1022010-05-11 19:42:16 +0000732swap(priority_queue<_Tp, _Container, _Compare>& __x,
733 priority_queue<_Tp, _Container, _Compare>& __y)
Howard Hinnantbf438282011-06-04 21:32:33 +0000734 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000735{
736 __x.swap(__y);
737}
738
739template <class _Tp, class _Container, class _Compare, class _Alloc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000740struct _LIBCPP_TEMPLATE_VIS uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000741 : public uses_allocator<_Container, _Alloc>
742{
743};
744
745_LIBCPP_END_NAMESPACE_STD
746
747#endif // _LIBCPP_QUEUE