blob: f36ccfdeedb3da596d379e462986d5ffa8f20497 [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>
Louis Dionneb4fce352022-03-25 12:55:36 -0400223#include <__assert> // all public C++ headers provide the assertion handler
Howard Hinnantc51e1022010-05-11 19:42:16 +0000224#include <__config>
Nikolas Klauser24540d32022-05-21 00:45:51 +0200225#include <__functional/operations.h>
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100226#include <__iterator/iterator_traits.h>
Christopher Di Bella55d7a822021-07-01 09:25:35 -0400227#include <__memory/uses_allocator.h>
Christopher Di Bella41f26e82021-06-05 02:47:47 +0000228#include <__utility/forward.h>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000229#include <deque>
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
Nikolas Klausera0e0edb2022-06-16 22:43:46 +0200234// standard-mandated includes
235#include <compare>
236#include <initializer_list>
237
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000238#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Arthur O'Dwyer6eeaa002022-02-01 20:16:40 -0500239# pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000240#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000241
242_LIBCPP_BEGIN_NAMESPACE_STD
243
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000244template <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS queue;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000245
246template <class _Tp, class _Container>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000247_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000248bool
249operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
250
251template <class _Tp, class _Container>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000252_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000253bool
254operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
255
Marshall Clow9e1b8452015-02-18 17:51:56 +0000256template <class _Tp, class _Container /*= deque<_Tp>*/>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000257class _LIBCPP_TEMPLATE_VIS queue
Howard Hinnantc51e1022010-05-11 19:42:16 +0000258{
259public:
260 typedef _Container container_type;
261 typedef typename container_type::value_type value_type;
262 typedef typename container_type::reference reference;
263 typedef typename container_type::const_reference const_reference;
264 typedef typename container_type::size_type size_type;
Marshall Clowb8825f02016-03-14 17:58:11 +0000265 static_assert((is_same<_Tp, value_type>::value), "" );
Howard Hinnantc51e1022010-05-11 19:42:16 +0000266
267protected:
268 container_type c;
269
270public:
Howard Hinnantf5f99992010-09-22 18:02:38 +0000271 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000272 queue()
273 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
274 : c() {}
275
276 _LIBCPP_INLINE_VISIBILITY
277 queue(const queue& __q) : c(__q.c) {}
278
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100279#if _LIBCPP_STD_VER > 20
280 template <class _InputIterator,
281 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>>
282 _LIBCPP_HIDE_FROM_ABI
283 queue(_InputIterator __first, _InputIterator __last) : c(__first, __last) {}
284
285 template <class _InputIterator,
286 class _Alloc,
287 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
288 class = __enable_if_t<uses_allocator<container_type, _Alloc>::value>>
289 _LIBCPP_HIDE_FROM_ABI
290 queue(_InputIterator __first, _InputIterator __second, const _Alloc& __alloc) : c(__first, __second, __alloc) {}
291#endif
292
Eric Fiselier26081dd2017-04-18 21:23:18 +0000293 _LIBCPP_INLINE_VISIBILITY
294 queue& operator=(const queue& __q) {c = __q.c; return *this;}
295
296#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000297 _LIBCPP_INLINE_VISIBILITY
298 queue(queue&& __q)
299 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000300 : c(_VSTD::move(__q.c)) {}
Howard Hinnantbf438282011-06-04 21:32:33 +0000301
302 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000303 queue& operator=(queue&& __q)
304 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000305 {c = _VSTD::move(__q.c); return *this;}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400306#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000307
Howard Hinnantf5f99992010-09-22 18:02:38 +0000308 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000309 explicit queue(const container_type& __c) : c(__c) {}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000310#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000311 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000312 explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400313#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000314 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000315 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000316 explicit queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400317 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000318 : c(__a) {}
319 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000320 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000321 queue(const queue& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400322 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000323 : c(__q.c, __a) {}
324 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000325 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000326 queue(const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400327 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000328 : c(__c, __a) {}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000329#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000330 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000331 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000332 queue(container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400333 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000334 : c(_VSTD::move(__c), __a) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000335 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000336 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337 queue(queue&& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400338 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000339 : c(_VSTD::move(__q.c), __a) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000340
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400341#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000342
Marshall Clow425f5752017-11-15 05:51:26 +0000343 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000344 bool empty() const {return c.empty();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000345 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000346 size_type size() const {return c.size();}
347
Howard Hinnantf5f99992010-09-22 18:02:38 +0000348 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000349 reference front() {return c.front();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000350 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000351 const_reference front() const {return c.front();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000352 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000353 reference back() {return c.back();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000354 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000355 const_reference back() const {return c.back();}
356
Howard Hinnantf5f99992010-09-22 18:02:38 +0000357 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000358 void push(const value_type& __v) {c.push_back(__v);}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000359#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000360 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000361 void push(value_type&& __v) {c.push_back(_VSTD::move(__v));}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000362 template <class... _Args>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000363 _LIBCPP_INLINE_VISIBILITY
Marshall Clowea52cc42017-01-24 23:09:12 +0000364#if _LIBCPP_STD_VER > 14
Marshall Clow88746852018-01-24 22:42:25 +0000365 decltype(auto) emplace(_Args&&... __args)
Eric Fiselier34ba5b92016-07-21 03:20:17 +0000366 { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
Marshall Clowea52cc42017-01-24 23:09:12 +0000367#else
368 void emplace(_Args&&... __args)
369 { c.emplace_back(_VSTD::forward<_Args>(__args)...);}
370#endif
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400371#endif // _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000372 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000373 void pop() {c.pop_front();}
374
Howard Hinnantf5f99992010-09-22 18:02:38 +0000375 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000376 void swap(queue& __q)
Howard Hinnantbf438282011-06-04 21:32:33 +0000377 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000378 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000379 using _VSTD::swap;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000380 swap(c, __q.c);
381 }
382
383 template <class _T1, class _C1>
384 friend
Howard Hinnantf5f99992010-09-22 18:02:38 +0000385 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000386 bool
387 operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000388
Howard Hinnantc51e1022010-05-11 19:42:16 +0000389 template <class _T1, class _C1>
390 friend
Howard Hinnantf5f99992010-09-22 18:02:38 +0000391 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000392 bool
393 operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
394};
395
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100396#if _LIBCPP_STD_VER > 14
Marshall Clow592d9952018-05-22 01:57:53 +0000397template<class _Container,
Louis Dionne25547162021-08-17 12:26:09 -0400398 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000399>
400queue(_Container)
401 -> queue<typename _Container::value_type, _Container>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000402
Marshall Clow592d9952018-05-22 01:57:53 +0000403template<class _Container,
404 class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400405 class = enable_if_t<!__is_allocator<_Container>::value>,
406 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000407>
408queue(_Container, _Alloc)
409 -> queue<typename _Container::value_type, _Container>;
410#endif
411
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100412#if _LIBCPP_STD_VER > 20
413template <class _InputIterator,
414 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>>
415queue(_InputIterator, _InputIterator)
416 -> queue<__iter_value_type<_InputIterator>>;
417
418template <class _InputIterator,
419 class _Alloc,
420 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
421 class = __enable_if_t<__is_allocator<_Alloc>::value>>
422queue(_InputIterator, _InputIterator, _Alloc)
423 -> queue<__iter_value_type<_InputIterator>, deque<__iter_value_type<_InputIterator>, _Alloc>>;
424#endif
425
Howard Hinnantc51e1022010-05-11 19:42:16 +0000426template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000427inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000428bool
429operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
430{
431 return __x.c == __y.c;
432}
433
434template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000435inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000436bool
437operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
438{
439 return __x.c < __y.c;
440}
441
442template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000443inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000444bool
445operator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
446{
447 return !(__x == __y);
448}
449
450template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000451inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000452bool
453operator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
454{
455 return __y < __x;
456}
457
458template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000459inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000460bool
461operator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
462{
463 return !(__x < __y);
464}
465
466template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000467inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000468bool
469operator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
470{
471 return !(__y < __x);
472}
473
474template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000475inline _LIBCPP_INLINE_VISIBILITY
Louis Dionne9ce598d2021-09-08 09:14:43 -0400476__enable_if_t<__is_swappable<_Container>::value, void>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000477swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
Howard Hinnantbf438282011-06-04 21:32:33 +0000478 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000479{
480 __x.swap(__y);
481}
482
483template <class _Tp, class _Container, class _Alloc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000484struct _LIBCPP_TEMPLATE_VIS uses_allocator<queue<_Tp, _Container>, _Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000485 : public uses_allocator<_Container, _Alloc>
486{
487};
488
489template <class _Tp, class _Container = vector<_Tp>,
490 class _Compare = less<typename _Container::value_type> >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000491class _LIBCPP_TEMPLATE_VIS priority_queue
Howard Hinnantc51e1022010-05-11 19:42:16 +0000492{
493public:
494 typedef _Container container_type;
495 typedef _Compare value_compare;
496 typedef typename container_type::value_type value_type;
497 typedef typename container_type::reference reference;
498 typedef typename container_type::const_reference const_reference;
499 typedef typename container_type::size_type size_type;
Marshall Clowb8825f02016-03-14 17:58:11 +0000500 static_assert((is_same<_Tp, value_type>::value), "" );
Howard Hinnantc51e1022010-05-11 19:42:16 +0000501
502protected:
503 container_type c;
504 value_compare comp;
505
506public:
Howard Hinnantf5f99992010-09-22 18:02:38 +0000507 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000508 priority_queue()
509 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value &&
510 is_nothrow_default_constructible<value_compare>::value)
511 : c(), comp() {}
512
513 _LIBCPP_INLINE_VISIBILITY
514 priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
515
Eric Fiselier26081dd2017-04-18 21:23:18 +0000516 _LIBCPP_INLINE_VISIBILITY
517 priority_queue& operator=(const priority_queue& __q)
518 {c = __q.c; comp = __q.comp; return *this;}
519
520#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000521 _LIBCPP_INLINE_VISIBILITY
522 priority_queue(priority_queue&& __q)
523 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value &&
524 is_nothrow_move_constructible<value_compare>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000525 : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {}
Howard Hinnantbf438282011-06-04 21:32:33 +0000526
527 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000528 priority_queue& operator=(priority_queue&& __q)
529 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value &&
530 is_nothrow_move_assignable<value_compare>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000531 {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400532#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000533
534 _LIBCPP_INLINE_VISIBILITY
535 explicit priority_queue(const value_compare& __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000536 : c(), comp(__comp) {}
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000537 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000538 priority_queue(const value_compare& __comp, const container_type& __c);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000539#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000540 _LIBCPP_INLINE_VISIBILITY
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +0100541 priority_queue(const value_compare& __comp, container_type&& __c);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542#endif
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 = value_compare());
Louis Dionne9ce598d2021-09-08 09:14:43 -0400547 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000548 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000549 priority_queue(_InputIter __f, _InputIter __l,
550 const value_compare& __comp, const container_type& __c);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000551#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9ce598d2021-09-08 09:14:43 -0400552 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000553 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000554 priority_queue(_InputIter __f, _InputIter __l,
555 const value_compare& __comp, container_type&& __c);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400556#endif // _LIBCPP_CXX03_LANG
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 explicit priority_queue(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 _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400564 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000565 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000566 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000567 priority_queue(const value_compare& __comp, const container_type& __c,
568 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400569 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000570 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000571 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000572 priority_queue(const priority_queue& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400573 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000574#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000575 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000576 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000577 priority_queue(const value_compare& __comp, container_type&& __c,
578 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400579 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000580 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000581 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000582 priority_queue(priority_queue&& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400583 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400584#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000585
Louis Dionne9ce598d2021-09-08 09:14:43 -0400586 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500587 _LIBCPP_INLINE_VISIBILITY
588 priority_queue(_InputIter __f, _InputIter __l, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400589 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500590
Louis Dionne9ce598d2021-09-08 09:14:43 -0400591 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500592 _LIBCPP_INLINE_VISIBILITY
593 priority_queue(_InputIter __f, _InputIter __l,
594 const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400595 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500596
Louis Dionne9ce598d2021-09-08 09:14:43 -0400597 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500598 _LIBCPP_INLINE_VISIBILITY
599 priority_queue(_InputIter __f, _InputIter __l,
600 const value_compare& __comp, const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400601 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500602
603#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9ce598d2021-09-08 09:14:43 -0400604 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500605 _LIBCPP_INLINE_VISIBILITY
606 priority_queue(_InputIter __f, _InputIter __l,
607 const value_compare& __comp, container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400608 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500609#endif // _LIBCPP_CXX03_LANG
610
Marshall Clow425f5752017-11-15 05:51:26 +0000611 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000612 bool empty() const {return c.empty();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000613 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000614 size_type size() const {return c.size();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000615 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000616 const_reference top() const {return c.front();}
617
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000618 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000619 void push(const value_type& __v);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000620#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000621 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000622 void push(value_type&& __v);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000623 template <class... _Args>
624 _LIBCPP_INLINE_VISIBILITY
625 void emplace(_Args&&... __args);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400626#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000627 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000628 void pop();
629
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000630 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000631 void swap(priority_queue& __q)
632 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
633 __is_nothrow_swappable<value_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000634};
635
Louis Dionned59f8a52021-08-17 11:59:07 -0400636#if _LIBCPP_STD_VER >= 17
Marshall Clow592d9952018-05-22 01:57:53 +0000637template <class _Compare,
638 class _Container,
Louis Dionne25547162021-08-17 12:26:09 -0400639 class = enable_if_t<!__is_allocator<_Compare>::value>,
640 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000641>
642priority_queue(_Compare, _Container)
643 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000644
645template<class _InputIterator,
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500646 class _Compare = less<__iter_value_type<_InputIterator>>,
647 class _Container = vector<__iter_value_type<_InputIterator>>,
Louis Dionne25547162021-08-17 12:26:09 -0400648 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
649 class = enable_if_t<!__is_allocator<_Compare>::value>,
650 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000651>
652priority_queue(_InputIterator, _InputIterator, _Compare = _Compare(), _Container = _Container())
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500653 -> priority_queue<__iter_value_type<_InputIterator>, _Container, _Compare>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000654
655template<class _Compare,
Marshall Clow592d9952018-05-22 01:57:53 +0000656 class _Container,
657 class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400658 class = enable_if_t<!__is_allocator<_Compare>::value>,
659 class = enable_if_t<!__is_allocator<_Container>::value>,
660 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000661>
662priority_queue(_Compare, _Container, _Alloc)
663 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500664
665template<class _InputIterator, class _Allocator,
Louis Dionne25547162021-08-17 12:26:09 -0400666 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
667 class = enable_if_t<__is_allocator<_Allocator>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500668>
669priority_queue(_InputIterator, _InputIterator, _Allocator)
670 -> priority_queue<__iter_value_type<_InputIterator>,
671 vector<__iter_value_type<_InputIterator>, _Allocator>,
672 less<__iter_value_type<_InputIterator>>>;
673
674template<class _InputIterator, class _Compare, class _Allocator,
Louis Dionne25547162021-08-17 12:26:09 -0400675 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
676 class = enable_if_t<!__is_allocator<_Compare>::value>,
677 class = enable_if_t<__is_allocator<_Allocator>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500678>
679priority_queue(_InputIterator, _InputIterator, _Compare, _Allocator)
680 -> priority_queue<__iter_value_type<_InputIterator>,
681 vector<__iter_value_type<_InputIterator>, _Allocator>, _Compare>;
682
683template<class _InputIterator, class _Compare, class _Container, class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400684 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
685 class = enable_if_t<!__is_allocator<_Compare>::value>,
686 class = enable_if_t<!__is_allocator<_Container>::value>,
687 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500688>
689priority_queue(_InputIterator, _InputIterator, _Compare, _Container, _Alloc)
690 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Marshall Clow592d9952018-05-22 01:57:53 +0000691#endif
692
Howard Hinnantc51e1022010-05-11 19:42:16 +0000693template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000694inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000695priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
696 const container_type& __c)
697 : c(__c),
698 comp(__comp)
699{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000700 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000701}
702
Eric Fiselier26081dd2017-04-18 21:23:18 +0000703#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000704
705template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000706inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000707priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
708 container_type&& __c)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000709 : c(_VSTD::move(__c)),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000710 comp(__comp)
711{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000712 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000713}
714
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400715#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000716
717template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500718template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000719inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000720priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
721 const value_compare& __comp)
722 : c(__f, __l),
723 comp(__comp)
724{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000725 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000726}
727
728template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500729template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000730inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000731priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
732 const value_compare& __comp,
733 const container_type& __c)
734 : c(__c),
735 comp(__comp)
736{
737 c.insert(c.end(), __f, __l);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000738 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000739}
740
Eric Fiselier26081dd2017-04-18 21:23:18 +0000741#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000742
743template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500744template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000745inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000746priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
747 const value_compare& __comp,
748 container_type&& __c)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000749 : c(_VSTD::move(__c)),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000750 comp(__comp)
751{
752 c.insert(c.end(), __f, __l);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000753 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000754}
755
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400756#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000757
758template <class _Tp, class _Container, class _Compare>
759template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000760inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000761priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400762 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000763 : c(__a)
764{
765}
766
767template <class _Tp, class _Container, class _Compare>
768template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000769inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000770priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
771 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400772 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000773 : c(__a),
774 comp(__comp)
775{
776}
777
778template <class _Tp, class _Container, class _Compare>
779template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000780inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000781priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
782 const container_type& __c,
783 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400784 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000785 : c(__c, __a),
786 comp(__comp)
787{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000788 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000789}
790
791template <class _Tp, class _Container, class _Compare>
792template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000793inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000794priority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
795 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400796 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000797 : c(__q.c, __a),
798 comp(__q.comp)
799{
Howard Hinnantc51e1022010-05-11 19:42:16 +0000800}
801
Eric Fiselier26081dd2017-04-18 21:23:18 +0000802#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000803
804template <class _Tp, class _Container, class _Compare>
805template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000806inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000807priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
808 container_type&& __c,
809 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400810 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000811 : c(_VSTD::move(__c), __a),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000812 comp(__comp)
813{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000814 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000815}
816
Howard Hinnantc51e1022010-05-11 19:42:16 +0000817template <class _Tp, class _Container, class _Compare>
818template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000819inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000820priority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
821 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400822 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000823 : c(_VSTD::move(__q.c), __a),
824 comp(_VSTD::move(__q.comp))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000825{
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500826}
827
828#endif // _LIBCPP_CXX03_LANG
829
830template <class _Tp, class _Container, class _Compare>
831template <class _InputIter, class _Alloc, class>
832inline
833priority_queue<_Tp, _Container, _Compare>::priority_queue(
834 _InputIter __f, _InputIter __l, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400835 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500836 : c(__f, __l, __a),
837 comp()
838{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000839 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000840}
841
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500842template <class _Tp, class _Container, class _Compare>
843template <class _InputIter, class _Alloc, class>
844inline
845priority_queue<_Tp, _Container, _Compare>::priority_queue(
846 _InputIter __f, _InputIter __l,
847 const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400848 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500849 : c(__f, __l, __a),
850 comp(__comp)
851{
852 _VSTD::make_heap(c.begin(), c.end(), comp);
853}
854
855template <class _Tp, class _Container, class _Compare>
856template <class _InputIter, class _Alloc, class>
857inline
858priority_queue<_Tp, _Container, _Compare>::priority_queue(
859 _InputIter __f, _InputIter __l,
860 const value_compare& __comp, const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400861 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500862 : c(__c, __a),
863 comp(__comp)
864{
865 c.insert(c.end(), __f, __l);
866 _VSTD::make_heap(c.begin(), c.end(), comp);
867}
868
869#ifndef _LIBCPP_CXX03_LANG
870template <class _Tp, class _Container, class _Compare>
871template <class _InputIter, class _Alloc, class>
872inline
873priority_queue<_Tp, _Container, _Compare>::priority_queue(
874 _InputIter __f, _InputIter __l, const value_compare& __comp,
875 container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400876 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500877 : c(_VSTD::move(__c), __a),
878 comp(__comp)
879{
880 c.insert(c.end(), __f, __l);
881 _VSTD::make_heap(c.begin(), c.end(), comp);
882}
883#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000884
885template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000886inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000887void
888priority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
889{
890 c.push_back(__v);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000891 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000892}
893
Eric Fiselier26081dd2017-04-18 21:23:18 +0000894#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000895
896template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000897inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000898void
899priority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
900{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000901 c.push_back(_VSTD::move(__v));
902 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000903}
904
905template <class _Tp, class _Container, class _Compare>
906template <class... _Args>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000907inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000908void
909priority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
910{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000911 c.emplace_back(_VSTD::forward<_Args>(__args)...);
912 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000913}
914
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400915#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000916
917template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000918inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000919void
920priority_queue<_Tp, _Container, _Compare>::pop()
921{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000922 _VSTD::pop_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000923 c.pop_back();
924}
925
926template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000927inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000928void
929priority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
Howard Hinnantbf438282011-06-04 21:32:33 +0000930 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
931 __is_nothrow_swappable<value_compare>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000932{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000933 using _VSTD::swap;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000934 swap(c, __q.c);
935 swap(comp, __q.comp);
936}
937
938template <class _Tp, class _Container, class _Compare>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000939inline _LIBCPP_INLINE_VISIBILITY
Louis Dionne9ce598d2021-09-08 09:14:43 -0400940__enable_if_t<
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500941 __is_swappable<_Container>::value && __is_swappable<_Compare>::value,
Eric Fiselier6bfed252016-04-21 23:38:59 +0000942 void
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500943>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000944swap(priority_queue<_Tp, _Container, _Compare>& __x,
945 priority_queue<_Tp, _Container, _Compare>& __y)
Howard Hinnantbf438282011-06-04 21:32:33 +0000946 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000947{
948 __x.swap(__y);
949}
950
951template <class _Tp, class _Container, class _Compare, class _Alloc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000952struct _LIBCPP_TEMPLATE_VIS uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000953 : public uses_allocator<_Container, _Alloc>
954{
955};
956
957_LIBCPP_END_NAMESPACE_STD
958
Nikolas Klauser0b5df932022-09-05 00:01:15 +0200959#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
Mark de Weveree5fe272022-09-02 17:53:28 +0200960# include <functional>
961#endif
962
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400963#endif // _LIBCPP_QUEUE