blob: b8b7ec46d9568c02020118d33dc4eb1e99e0fd04 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
Louis Dionne9bd93882021-11-17 16:25:01 -05002//===----------------------------------------------------------------------===//
Howard Hinnantc51e1022010-05-11 19:42:16 +00003//
Chandler Carruthd2012102019-01-19 10:56:40 +00004// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantc51e1022010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_QUEUE
11#define _LIBCPP_QUEUE
12
13/*
14 queue synopsis
15
16namespace std
17{
18
19template <class T, class Container = deque<T>>
20class queue
21{
22public:
23 typedef Container container_type;
24 typedef typename container_type::value_type value_type;
25 typedef typename container_type::reference reference;
26 typedef typename container_type::const_reference const_reference;
27 typedef typename container_type::size_type size_type;
28
29protected:
30 container_type c;
31
32public:
Howard Hinnantbf438282011-06-04 21:32:33 +000033 queue() = default;
34 ~queue() = default;
35
36 queue(const queue& q) = default;
37 queue(queue&& q) = default;
38
39 queue& operator=(const queue& q) = default;
40 queue& operator=(queue&& q) = default;
41
Howard Hinnantc51e1022010-05-11 19:42:16 +000042 explicit queue(const container_type& c);
Howard Hinnantbf438282011-06-04 21:32:33 +000043 explicit queue(container_type&& c)
Nikolas Klauserf0b3d872022-01-06 12:36:07 +010044 template<class InputIterator>
45 queue(InputIterator first, InputIterator last); // since C++23
Howard Hinnantc51e1022010-05-11 19:42:16 +000046 template <class Alloc>
47 explicit queue(const Alloc& a);
48 template <class Alloc>
49 queue(const container_type& c, const Alloc& a);
50 template <class Alloc>
51 queue(container_type&& c, const Alloc& a);
52 template <class Alloc>
Howard Hinnantbf438282011-06-04 21:32:33 +000053 queue(const queue& q, const Alloc& a);
54 template <class Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +000055 queue(queue&& q, const Alloc& a);
Nikolas Klauserf0b3d872022-01-06 12:36:07 +010056 template <class InputIterator, class Alloc>
57 queue(InputIterator first, InputIterator last, const Alloc&); // since C++23
Howard Hinnantc51e1022010-05-11 19:42:16 +000058
Howard Hinnantc51e1022010-05-11 19:42:16 +000059 bool empty() const;
60 size_type size() const;
61
62 reference front();
63 const_reference front() const;
64 reference back();
65 const_reference back() const;
66
67 void push(const value_type& v);
68 void push(value_type&& v);
Marshall Clowea52cc42017-01-24 23:09:12 +000069 template <class... Args> reference emplace(Args&&... args); // reference in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +000070 void pop();
71
Eric Fiselier6bfed252016-04-21 23:38:59 +000072 void swap(queue& q) noexcept(is_nothrow_swappable_v<Container>)
Howard Hinnantc51e1022010-05-11 19:42:16 +000073};
74
Marshall Clow592d9952018-05-22 01:57:53 +000075template<class Container>
76 queue(Container) -> queue<typename Container::value_type, Container>; // C++17
Louis Dionne173f29e2019-05-29 16:01:36 +000077
Nikolas Klauserf0b3d872022-01-06 12:36:07 +010078template<class InputIterator>
79 queue(InputIterator, InputIterator) -> queue<iter-value-type<InputIterator>>; // since C++23
80
Louis Dionne173f29e2019-05-29 16:01:36 +000081template<class Container, class Allocator>
Marshall Clow592d9952018-05-22 01:57:53 +000082 queue(Container, Allocator) -> queue<typename Container::value_type, Container>; // C++17
83
Nikolas Klauserf0b3d872022-01-06 12:36:07 +010084template<class InputIterator, class Allocator>
85 queue(InputIterator, InputIterator, Allocator)
86 -> queue<iter-value-type<InputIterator>,
87 deque<iter-value-type<InputIterator>, Allocator>>; // since C++23
88
Howard Hinnantc51e1022010-05-11 19:42:16 +000089template <class T, class Container>
90 bool operator==(const queue<T, Container>& x,const queue<T, Container>& y);
91
92template <class T, class Container>
93 bool operator< (const queue<T, Container>& x,const queue<T, Container>& y);
94
95template <class T, class Container>
96 bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y);
97
98template <class T, class Container>
99 bool operator> (const queue<T, Container>& x,const queue<T, Container>& y);
100
101template <class T, class Container>
102 bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y);
103
104template <class T, class Container>
105 bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y);
106
107template <class T, class Container>
Howard Hinnantbf438282011-06-04 21:32:33 +0000108 void swap(queue<T, Container>& x, queue<T, Container>& y)
109 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000110
111template <class T, class Container = vector<T>,
112 class Compare = less<typename Container::value_type>>
113class priority_queue
114{
115public:
116 typedef Container container_type;
117 typedef typename container_type::value_type value_type;
118 typedef typename container_type::reference reference;
119 typedef typename container_type::const_reference const_reference;
120 typedef typename container_type::size_type size_type;
121
122protected:
123 container_type c;
124 Compare comp;
125
126public:
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +0100127 priority_queue() : priority_queue(Compare()) {} // C++20
128 explicit priority_queue(const Compare& x) : priority_queue(x, Container()) {}
129 priority_queue(const Compare& x, const Container&);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500130 explicit priority_queue(const Compare& x = Compare(), Container&& = Container()); // before C++20
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +0100131 priority_queue(const Compare& x, Container&&); // C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000132 template <class InputIterator>
133 priority_queue(InputIterator first, InputIterator last,
134 const Compare& comp = Compare());
135 template <class InputIterator>
136 priority_queue(InputIterator first, InputIterator last,
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500137 const Compare& comp, const Container& c);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000138 template <class InputIterator>
139 priority_queue(InputIterator first, InputIterator last,
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500140 const Compare& comp, Container&& c);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000141 template <class Alloc>
142 explicit priority_queue(const Alloc& a);
143 template <class Alloc>
144 priority_queue(const Compare& comp, const Alloc& a);
145 template <class Alloc>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500146 priority_queue(const Compare& comp, const Container& c,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000147 const Alloc& a);
148 template <class Alloc>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500149 priority_queue(const Compare& comp, Container&& c,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000150 const Alloc& a);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500151 template <class InputIterator>
152 priority_queue(InputIterator first, InputIterator last,
153 const Alloc& a);
154 template <class InputIterator>
155 priority_queue(InputIterator first, InputIterator last,
156 const Compare& comp, const Alloc& a);
157 template <class InputIterator>
158 priority_queue(InputIterator first, InputIterator last,
159 const Compare& comp, const Container& c, const Alloc& a);
160 template <class InputIterator>
161 priority_queue(InputIterator first, InputIterator last,
162 const Compare& comp, Container&& c, const Alloc& a);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000163 template <class Alloc>
Howard Hinnantbf438282011-06-04 21:32:33 +0000164 priority_queue(const priority_queue& q, const Alloc& a);
165 template <class Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000166 priority_queue(priority_queue&& q, const Alloc& a);
167
168 bool empty() const;
169 size_type size() const;
170 const_reference top() const;
171
172 void push(const value_type& v);
173 void push(value_type&& v);
174 template <class... Args> void emplace(Args&&... args);
175 void pop();
176
Howard Hinnantbf438282011-06-04 21:32:33 +0000177 void swap(priority_queue& q)
Eric Fiselier6bfed252016-04-21 23:38:59 +0000178 noexcept(is_nothrow_swappable_v<Container> &&
179 is_nothrow_swappable_v<Comp>)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000180};
181
Marshall Clow592d9952018-05-22 01:57:53 +0000182template <class Compare, class Container>
183priority_queue(Compare, Container)
184 -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
Louis Dionne173f29e2019-05-29 16:01:36 +0000185
186template<class InputIterator,
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500187 class Compare = less<iter-value-type<InputIterator>>,
188 class Container = vector<iter-value-type<InputIterator>>>
Marshall Clow592d9952018-05-22 01:57:53 +0000189priority_queue(InputIterator, InputIterator, Compare = Compare(), Container = Container())
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500190 -> priority_queue<iter-value-type<InputIterator>, Container, Compare>; // C++17
Louis Dionne173f29e2019-05-29 16:01:36 +0000191
Marshall Clow592d9952018-05-22 01:57:53 +0000192template<class Compare, class Container, class Allocator>
193priority_queue(Compare, Container, Allocator)
194 -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
195
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500196template<class InputIterator, class Allocator>
197priority_queue(InputIterator, InputIterator, Allocator)
198 -> priority_queue<iter-value-type<InputIterator>,
199 vector<iter-value-type<InputIterator>, Allocator>,
Konstantin Varlamov53b543c2021-11-09 09:21:02 -0800200 less<iter-value-type<InputIterator>>>; // C++17
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500201
202template<class InputIterator, class Compare, class Allocator>
203priority_queue(InputIterator, InputIterator, Compare, Allocator)
204 -> priority_queue<iter-value-type<InputIterator>,
Konstantin Varlamov53b543c2021-11-09 09:21:02 -0800205 vector<iter-value-type<InputIterator>, Allocator>, Compare>; // C++17
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500206
207template<class InputIterator, class Compare, class Container, class Allocator>
208priority_queue(InputIterator, InputIterator, Compare, Container, Allocator)
Konstantin Varlamov53b543c2021-11-09 09:21:02 -0800209 -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500210
Howard Hinnantc51e1022010-05-11 19:42:16 +0000211template <class T, class Container, class Compare>
212 void swap(priority_queue<T, Container, Compare>& x,
Howard Hinnantbf438282011-06-04 21:32:33 +0000213 priority_queue<T, Container, Compare>& y)
214 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000215
216} // std
217
218*/
219
Nikolas Klauserf210d8a2022-02-15 18:18:08 +0100220#include <__algorithm/make_heap.h>
221#include <__algorithm/pop_heap.h>
222#include <__algorithm/push_heap.h>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000223#include <__config>
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100224#include <__iterator/iterator_traits.h>
Christopher Di Bella55d7a822021-07-01 09:25:35 -0400225#include <__memory/uses_allocator.h>
Christopher Di Bella41f26e82021-06-05 02:47:47 +0000226#include <__utility/forward.h>
Arthur O'Dwyer7deec122021-03-24 18:19:12 -0400227#include <compare>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000228#include <deque>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000229#include <functional>
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100230#include <type_traits>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400231#include <vector>
Mark de Weverce8f12c2021-12-22 18:14:14 +0100232#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000233
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000234#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Arthur O'Dwyer6eeaa002022-02-01 20:16:40 -0500235# pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000236#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000237
238_LIBCPP_BEGIN_NAMESPACE_STD
239
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000240template <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS queue;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000241
242template <class _Tp, class _Container>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000243_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000244bool
245operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
246
247template <class _Tp, class _Container>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000248_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000249bool
250operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
251
Marshall Clow9e1b8452015-02-18 17:51:56 +0000252template <class _Tp, class _Container /*= deque<_Tp>*/>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000253class _LIBCPP_TEMPLATE_VIS queue
Howard Hinnantc51e1022010-05-11 19:42:16 +0000254{
255public:
256 typedef _Container container_type;
257 typedef typename container_type::value_type value_type;
258 typedef typename container_type::reference reference;
259 typedef typename container_type::const_reference const_reference;
260 typedef typename container_type::size_type size_type;
Marshall Clowb8825f02016-03-14 17:58:11 +0000261 static_assert((is_same<_Tp, value_type>::value), "" );
Howard Hinnantc51e1022010-05-11 19:42:16 +0000262
263protected:
264 container_type c;
265
266public:
Howard Hinnantf5f99992010-09-22 18:02:38 +0000267 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000268 queue()
269 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
270 : c() {}
271
272 _LIBCPP_INLINE_VISIBILITY
273 queue(const queue& __q) : c(__q.c) {}
274
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100275#if _LIBCPP_STD_VER > 20
276 template <class _InputIterator,
277 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>>
278 _LIBCPP_HIDE_FROM_ABI
279 queue(_InputIterator __first, _InputIterator __last) : c(__first, __last) {}
280
281 template <class _InputIterator,
282 class _Alloc,
283 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
284 class = __enable_if_t<uses_allocator<container_type, _Alloc>::value>>
285 _LIBCPP_HIDE_FROM_ABI
286 queue(_InputIterator __first, _InputIterator __second, const _Alloc& __alloc) : c(__first, __second, __alloc) {}
287#endif
288
Eric Fiselier26081dd2017-04-18 21:23:18 +0000289 _LIBCPP_INLINE_VISIBILITY
290 queue& operator=(const queue& __q) {c = __q.c; return *this;}
291
292#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000293 _LIBCPP_INLINE_VISIBILITY
294 queue(queue&& __q)
295 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000296 : c(_VSTD::move(__q.c)) {}
Howard Hinnantbf438282011-06-04 21:32:33 +0000297
298 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000299 queue& operator=(queue&& __q)
300 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000301 {c = _VSTD::move(__q.c); return *this;}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400302#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000303
Howard Hinnantf5f99992010-09-22 18:02:38 +0000304 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000305 explicit queue(const container_type& __c) : c(__c) {}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000306#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000307 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000308 explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400309#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000310 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000311 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000312 explicit queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400313 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000314 : c(__a) {}
315 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000316 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000317 queue(const queue& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400318 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000319 : c(__q.c, __a) {}
320 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000321 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000322 queue(const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400323 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000324 : c(__c, __a) {}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000325#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000326 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000327 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000328 queue(container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400329 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000330 : c(_VSTD::move(__c), __a) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000331 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000332 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000333 queue(queue&& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400334 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000335 : c(_VSTD::move(__q.c), __a) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000336
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400337#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000338
Marshall Clow425f5752017-11-15 05:51:26 +0000339 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000340 bool empty() const {return c.empty();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000341 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000342 size_type size() const {return c.size();}
343
Howard Hinnantf5f99992010-09-22 18:02:38 +0000344 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000345 reference front() {return c.front();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000346 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000347 const_reference front() const {return c.front();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000348 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000349 reference back() {return c.back();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000350 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000351 const_reference back() const {return c.back();}
352
Howard Hinnantf5f99992010-09-22 18:02:38 +0000353 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000354 void push(const value_type& __v) {c.push_back(__v);}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000355#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000356 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000357 void push(value_type&& __v) {c.push_back(_VSTD::move(__v));}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000358 template <class... _Args>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000359 _LIBCPP_INLINE_VISIBILITY
Marshall Clowea52cc42017-01-24 23:09:12 +0000360#if _LIBCPP_STD_VER > 14
Marshall Clow88746852018-01-24 22:42:25 +0000361 decltype(auto) emplace(_Args&&... __args)
Eric Fiselier34ba5b92016-07-21 03:20:17 +0000362 { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
Marshall Clowea52cc42017-01-24 23:09:12 +0000363#else
364 void emplace(_Args&&... __args)
365 { c.emplace_back(_VSTD::forward<_Args>(__args)...);}
366#endif
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400367#endif // _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000368 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000369 void pop() {c.pop_front();}
370
Howard Hinnantf5f99992010-09-22 18:02:38 +0000371 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000372 void swap(queue& __q)
Howard Hinnantbf438282011-06-04 21:32:33 +0000373 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000374 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000375 using _VSTD::swap;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000376 swap(c, __q.c);
377 }
378
379 template <class _T1, class _C1>
380 friend
Howard Hinnantf5f99992010-09-22 18:02:38 +0000381 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000382 bool
383 operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000384
Howard Hinnantc51e1022010-05-11 19:42:16 +0000385 template <class _T1, class _C1>
386 friend
Howard Hinnantf5f99992010-09-22 18:02:38 +0000387 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000388 bool
389 operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
390};
391
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100392#if _LIBCPP_STD_VER > 14
Marshall Clow592d9952018-05-22 01:57:53 +0000393template<class _Container,
Louis Dionne25547162021-08-17 12:26:09 -0400394 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000395>
396queue(_Container)
397 -> queue<typename _Container::value_type, _Container>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000398
Marshall Clow592d9952018-05-22 01:57:53 +0000399template<class _Container,
400 class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400401 class = enable_if_t<!__is_allocator<_Container>::value>,
402 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000403>
404queue(_Container, _Alloc)
405 -> queue<typename _Container::value_type, _Container>;
406#endif
407
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100408#if _LIBCPP_STD_VER > 20
409template <class _InputIterator,
410 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>>
411queue(_InputIterator, _InputIterator)
412 -> queue<__iter_value_type<_InputIterator>>;
413
414template <class _InputIterator,
415 class _Alloc,
416 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
417 class = __enable_if_t<__is_allocator<_Alloc>::value>>
418queue(_InputIterator, _InputIterator, _Alloc)
419 -> queue<__iter_value_type<_InputIterator>, deque<__iter_value_type<_InputIterator>, _Alloc>>;
420#endif
421
Howard Hinnantc51e1022010-05-11 19:42:16 +0000422template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000423inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000424bool
425operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
426{
427 return __x.c == __y.c;
428}
429
430template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000431inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000432bool
433operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
434{
435 return __x.c < __y.c;
436}
437
438template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000439inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000440bool
441operator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
442{
443 return !(__x == __y);
444}
445
446template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000447inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000448bool
449operator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
450{
451 return __y < __x;
452}
453
454template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000455inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000456bool
457operator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
458{
459 return !(__x < __y);
460}
461
462template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000463inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000464bool
465operator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
466{
467 return !(__y < __x);
468}
469
470template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000471inline _LIBCPP_INLINE_VISIBILITY
Louis Dionne9ce598d2021-09-08 09:14:43 -0400472__enable_if_t<__is_swappable<_Container>::value, void>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000473swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
Howard Hinnantbf438282011-06-04 21:32:33 +0000474 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000475{
476 __x.swap(__y);
477}
478
479template <class _Tp, class _Container, class _Alloc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000480struct _LIBCPP_TEMPLATE_VIS uses_allocator<queue<_Tp, _Container>, _Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000481 : public uses_allocator<_Container, _Alloc>
482{
483};
484
485template <class _Tp, class _Container = vector<_Tp>,
486 class _Compare = less<typename _Container::value_type> >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000487class _LIBCPP_TEMPLATE_VIS priority_queue
Howard Hinnantc51e1022010-05-11 19:42:16 +0000488{
489public:
490 typedef _Container container_type;
491 typedef _Compare value_compare;
492 typedef typename container_type::value_type value_type;
493 typedef typename container_type::reference reference;
494 typedef typename container_type::const_reference const_reference;
495 typedef typename container_type::size_type size_type;
Marshall Clowb8825f02016-03-14 17:58:11 +0000496 static_assert((is_same<_Tp, value_type>::value), "" );
Howard Hinnantc51e1022010-05-11 19:42:16 +0000497
498protected:
499 container_type c;
500 value_compare comp;
501
502public:
Howard Hinnantf5f99992010-09-22 18:02:38 +0000503 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000504 priority_queue()
505 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value &&
506 is_nothrow_default_constructible<value_compare>::value)
507 : c(), comp() {}
508
509 _LIBCPP_INLINE_VISIBILITY
510 priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
511
Eric Fiselier26081dd2017-04-18 21:23:18 +0000512 _LIBCPP_INLINE_VISIBILITY
513 priority_queue& operator=(const priority_queue& __q)
514 {c = __q.c; comp = __q.comp; return *this;}
515
516#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000517 _LIBCPP_INLINE_VISIBILITY
518 priority_queue(priority_queue&& __q)
519 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value &&
520 is_nothrow_move_constructible<value_compare>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000521 : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {}
Howard Hinnantbf438282011-06-04 21:32:33 +0000522
523 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000524 priority_queue& operator=(priority_queue&& __q)
525 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value &&
526 is_nothrow_move_assignable<value_compare>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000527 {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400528#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000529
530 _LIBCPP_INLINE_VISIBILITY
531 explicit priority_queue(const value_compare& __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000532 : c(), comp(__comp) {}
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000533 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000534 priority_queue(const value_compare& __comp, const container_type& __c);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000535#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000536 _LIBCPP_INLINE_VISIBILITY
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +0100537 priority_queue(const value_compare& __comp, container_type&& __c);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000538#endif
Louis Dionne9ce598d2021-09-08 09:14:43 -0400539 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000540 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000541 priority_queue(_InputIter __f, _InputIter __l,
542 const value_compare& __comp = value_compare());
Louis Dionne9ce598d2021-09-08 09:14:43 -0400543 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000544 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000545 priority_queue(_InputIter __f, _InputIter __l,
546 const value_compare& __comp, const container_type& __c);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000547#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9ce598d2021-09-08 09:14:43 -0400548 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000549 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000550 priority_queue(_InputIter __f, _InputIter __l,
551 const value_compare& __comp, container_type&& __c);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400552#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000553 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000554 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000555 explicit priority_queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400556 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000557 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000558 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000559 priority_queue(const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400560 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000561 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000562 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000563 priority_queue(const value_compare& __comp, const container_type& __c,
564 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400565 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000566 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000567 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000568 priority_queue(const priority_queue& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400569 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000570#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000571 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000572 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000573 priority_queue(const value_compare& __comp, container_type&& __c,
574 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400575 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000576 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000577 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000578 priority_queue(priority_queue&& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400579 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400580#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000581
Louis Dionne9ce598d2021-09-08 09:14:43 -0400582 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500583 _LIBCPP_INLINE_VISIBILITY
584 priority_queue(_InputIter __f, _InputIter __l, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400585 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500586
Louis Dionne9ce598d2021-09-08 09:14:43 -0400587 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500588 _LIBCPP_INLINE_VISIBILITY
589 priority_queue(_InputIter __f, _InputIter __l,
590 const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400591 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500592
Louis Dionne9ce598d2021-09-08 09:14:43 -0400593 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500594 _LIBCPP_INLINE_VISIBILITY
595 priority_queue(_InputIter __f, _InputIter __l,
596 const value_compare& __comp, const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400597 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500598
599#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9ce598d2021-09-08 09:14:43 -0400600 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500601 _LIBCPP_INLINE_VISIBILITY
602 priority_queue(_InputIter __f, _InputIter __l,
603 const value_compare& __comp, container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400604 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500605#endif // _LIBCPP_CXX03_LANG
606
Marshall Clow425f5752017-11-15 05:51:26 +0000607 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000608 bool empty() const {return c.empty();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000609 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000610 size_type size() const {return c.size();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000611 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000612 const_reference top() const {return c.front();}
613
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000614 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000615 void push(const value_type& __v);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000616#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000617 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000618 void push(value_type&& __v);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000619 template <class... _Args>
620 _LIBCPP_INLINE_VISIBILITY
621 void emplace(_Args&&... __args);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400622#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000623 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000624 void pop();
625
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000626 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000627 void swap(priority_queue& __q)
628 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
629 __is_nothrow_swappable<value_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000630};
631
Louis Dionned59f8a52021-08-17 11:59:07 -0400632#if _LIBCPP_STD_VER >= 17
Marshall Clow592d9952018-05-22 01:57:53 +0000633template <class _Compare,
634 class _Container,
Louis Dionne25547162021-08-17 12:26:09 -0400635 class = enable_if_t<!__is_allocator<_Compare>::value>,
636 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000637>
638priority_queue(_Compare, _Container)
639 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000640
641template<class _InputIterator,
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500642 class _Compare = less<__iter_value_type<_InputIterator>>,
643 class _Container = vector<__iter_value_type<_InputIterator>>,
Louis Dionne25547162021-08-17 12:26:09 -0400644 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
645 class = enable_if_t<!__is_allocator<_Compare>::value>,
646 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000647>
648priority_queue(_InputIterator, _InputIterator, _Compare = _Compare(), _Container = _Container())
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500649 -> priority_queue<__iter_value_type<_InputIterator>, _Container, _Compare>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000650
651template<class _Compare,
Marshall Clow592d9952018-05-22 01:57:53 +0000652 class _Container,
653 class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400654 class = enable_if_t<!__is_allocator<_Compare>::value>,
655 class = enable_if_t<!__is_allocator<_Container>::value>,
656 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000657>
658priority_queue(_Compare, _Container, _Alloc)
659 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500660
661template<class _InputIterator, class _Allocator,
Louis Dionne25547162021-08-17 12:26:09 -0400662 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
663 class = enable_if_t<__is_allocator<_Allocator>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500664>
665priority_queue(_InputIterator, _InputIterator, _Allocator)
666 -> priority_queue<__iter_value_type<_InputIterator>,
667 vector<__iter_value_type<_InputIterator>, _Allocator>,
668 less<__iter_value_type<_InputIterator>>>;
669
670template<class _InputIterator, class _Compare, class _Allocator,
Louis Dionne25547162021-08-17 12:26:09 -0400671 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
672 class = enable_if_t<!__is_allocator<_Compare>::value>,
673 class = enable_if_t<__is_allocator<_Allocator>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500674>
675priority_queue(_InputIterator, _InputIterator, _Compare, _Allocator)
676 -> priority_queue<__iter_value_type<_InputIterator>,
677 vector<__iter_value_type<_InputIterator>, _Allocator>, _Compare>;
678
679template<class _InputIterator, class _Compare, class _Container, class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400680 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
681 class = enable_if_t<!__is_allocator<_Compare>::value>,
682 class = enable_if_t<!__is_allocator<_Container>::value>,
683 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500684>
685priority_queue(_InputIterator, _InputIterator, _Compare, _Container, _Alloc)
686 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Marshall Clow592d9952018-05-22 01:57:53 +0000687#endif
688
Howard Hinnantc51e1022010-05-11 19:42:16 +0000689template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000690inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000691priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
692 const container_type& __c)
693 : c(__c),
694 comp(__comp)
695{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000696 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000697}
698
Eric Fiselier26081dd2017-04-18 21:23:18 +0000699#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000700
701template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000702inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000703priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
704 container_type&& __c)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000705 : c(_VSTD::move(__c)),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000706 comp(__comp)
707{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000708 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000709}
710
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400711#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000712
713template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500714template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000715inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000716priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
717 const value_compare& __comp)
718 : c(__f, __l),
719 comp(__comp)
720{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000721 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000722}
723
724template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500725template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000726inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000727priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
728 const value_compare& __comp,
729 const container_type& __c)
730 : c(__c),
731 comp(__comp)
732{
733 c.insert(c.end(), __f, __l);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000734 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000735}
736
Eric Fiselier26081dd2017-04-18 21:23:18 +0000737#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000738
739template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500740template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000741inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000742priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
743 const value_compare& __comp,
744 container_type&& __c)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000745 : c(_VSTD::move(__c)),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000746 comp(__comp)
747{
748 c.insert(c.end(), __f, __l);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000749 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000750}
751
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400752#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000753
754template <class _Tp, class _Container, class _Compare>
755template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000756inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000757priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400758 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000759 : c(__a)
760{
761}
762
763template <class _Tp, class _Container, class _Compare>
764template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000765inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000766priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
767 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400768 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000769 : c(__a),
770 comp(__comp)
771{
772}
773
774template <class _Tp, class _Container, class _Compare>
775template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000776inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000777priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
778 const container_type& __c,
779 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400780 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000781 : c(__c, __a),
782 comp(__comp)
783{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000784 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000785}
786
787template <class _Tp, class _Container, class _Compare>
788template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000789inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000790priority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
791 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400792 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000793 : c(__q.c, __a),
794 comp(__q.comp)
795{
Howard Hinnantc51e1022010-05-11 19:42:16 +0000796}
797
Eric Fiselier26081dd2017-04-18 21:23:18 +0000798#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000799
800template <class _Tp, class _Container, class _Compare>
801template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000802inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000803priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
804 container_type&& __c,
805 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400806 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000807 : c(_VSTD::move(__c), __a),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000808 comp(__comp)
809{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000810 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000811}
812
Howard Hinnantc51e1022010-05-11 19:42:16 +0000813template <class _Tp, class _Container, class _Compare>
814template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000815inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000816priority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
817 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400818 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000819 : c(_VSTD::move(__q.c), __a),
820 comp(_VSTD::move(__q.comp))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000821{
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500822}
823
824#endif // _LIBCPP_CXX03_LANG
825
826template <class _Tp, class _Container, class _Compare>
827template <class _InputIter, class _Alloc, class>
828inline
829priority_queue<_Tp, _Container, _Compare>::priority_queue(
830 _InputIter __f, _InputIter __l, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400831 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500832 : c(__f, __l, __a),
833 comp()
834{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000835 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000836}
837
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500838template <class _Tp, class _Container, class _Compare>
839template <class _InputIter, class _Alloc, class>
840inline
841priority_queue<_Tp, _Container, _Compare>::priority_queue(
842 _InputIter __f, _InputIter __l,
843 const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400844 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500845 : c(__f, __l, __a),
846 comp(__comp)
847{
848 _VSTD::make_heap(c.begin(), c.end(), comp);
849}
850
851template <class _Tp, class _Container, class _Compare>
852template <class _InputIter, class _Alloc, class>
853inline
854priority_queue<_Tp, _Container, _Compare>::priority_queue(
855 _InputIter __f, _InputIter __l,
856 const value_compare& __comp, const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400857 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500858 : c(__c, __a),
859 comp(__comp)
860{
861 c.insert(c.end(), __f, __l);
862 _VSTD::make_heap(c.begin(), c.end(), comp);
863}
864
865#ifndef _LIBCPP_CXX03_LANG
866template <class _Tp, class _Container, class _Compare>
867template <class _InputIter, class _Alloc, class>
868inline
869priority_queue<_Tp, _Container, _Compare>::priority_queue(
870 _InputIter __f, _InputIter __l, const value_compare& __comp,
871 container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400872 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500873 : c(_VSTD::move(__c), __a),
874 comp(__comp)
875{
876 c.insert(c.end(), __f, __l);
877 _VSTD::make_heap(c.begin(), c.end(), comp);
878}
879#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000880
881template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000882inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000883void
884priority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
885{
886 c.push_back(__v);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000887 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000888}
889
Eric Fiselier26081dd2017-04-18 21:23:18 +0000890#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000891
892template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000893inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000894void
895priority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
896{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000897 c.push_back(_VSTD::move(__v));
898 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000899}
900
901template <class _Tp, class _Container, class _Compare>
902template <class... _Args>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000903inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000904void
905priority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
906{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000907 c.emplace_back(_VSTD::forward<_Args>(__args)...);
908 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000909}
910
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400911#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000912
913template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000914inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000915void
916priority_queue<_Tp, _Container, _Compare>::pop()
917{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000918 _VSTD::pop_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000919 c.pop_back();
920}
921
922template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000923inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000924void
925priority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
Howard Hinnantbf438282011-06-04 21:32:33 +0000926 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
927 __is_nothrow_swappable<value_compare>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000928{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000929 using _VSTD::swap;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000930 swap(c, __q.c);
931 swap(comp, __q.comp);
932}
933
934template <class _Tp, class _Container, class _Compare>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000935inline _LIBCPP_INLINE_VISIBILITY
Louis Dionne9ce598d2021-09-08 09:14:43 -0400936__enable_if_t<
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500937 __is_swappable<_Container>::value && __is_swappable<_Compare>::value,
Eric Fiselier6bfed252016-04-21 23:38:59 +0000938 void
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500939>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000940swap(priority_queue<_Tp, _Container, _Compare>& __x,
941 priority_queue<_Tp, _Container, _Compare>& __y)
Howard Hinnantbf438282011-06-04 21:32:33 +0000942 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000943{
944 __x.swap(__y);
945}
946
947template <class _Tp, class _Container, class _Compare, class _Alloc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000948struct _LIBCPP_TEMPLATE_VIS uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000949 : public uses_allocator<_Container, _Alloc>
950{
951};
952
953_LIBCPP_END_NAMESPACE_STD
954
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400955#endif // _LIBCPP_QUEUE