blob: 521a465713cd22e00456947c72e2109456617bb3 [file] [log] [blame]
Howard Hinnant3e519522010-05-11 19:42:161// -*- C++ -*-
Louis Dionneeb8650a2021-11-17 21:25:012//===----------------------------------------------------------------------===//
Howard Hinnant3e519522010-05-11 19:42:163//
Chandler Carruth57b08b02019-01-19 10:56:404// 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 Hinnant3e519522010-05-11 19:42:167//
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 Hinnant6971d822011-06-04 21:32:3333 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 Hinnant3e519522010-05-11 19:42:1642 explicit queue(const container_type& c);
Howard Hinnant6971d822011-06-04 21:32:3343 explicit queue(container_type&& c)
Nikolas Klauserf3aed362022-01-06 11:36:0744 template<class InputIterator>
45 queue(InputIterator first, InputIterator last); // since C++23
varconst87f3ff32023-06-03 02:23:2946 template<container-compatible-range<T> R> queue(from_range_t, R&& rg); // since C++23
Howard Hinnant3e519522010-05-11 19:42:1647 template <class Alloc>
48 explicit queue(const Alloc& a);
49 template <class Alloc>
50 queue(const container_type& c, const Alloc& a);
51 template <class Alloc>
52 queue(container_type&& c, const Alloc& a);
53 template <class Alloc>
Howard Hinnant6971d822011-06-04 21:32:3354 queue(const queue& q, const Alloc& a);
55 template <class Alloc>
Howard Hinnant3e519522010-05-11 19:42:1656 queue(queue&& q, const Alloc& a);
Nikolas Klauserf3aed362022-01-06 11:36:0757 template <class InputIterator, class Alloc>
58 queue(InputIterator first, InputIterator last, const Alloc&); // since C++23
varconst87f3ff32023-06-03 02:23:2959 template<container-compatible-range<T> R, class Alloc>
60 queue(from_range_t, R&& rg, const Alloc&); // since C++23
Howard Hinnant3e519522010-05-11 19:42:1661
Howard Hinnant3e519522010-05-11 19:42:1662 bool empty() const;
63 size_type size() const;
64
65 reference front();
66 const_reference front() const;
67 reference back();
68 const_reference back() const;
69
70 void push(const value_type& v);
71 void push(value_type&& v);
varconst87f3ff32023-06-03 02:23:2972 template<container-compatible-range<T> R>
73 void push_range(R&& rg); // C++23
Marshall Clow63b560b2017-01-24 23:09:1274 template <class... Args> reference emplace(Args&&... args); // reference in C++17
Howard Hinnant3e519522010-05-11 19:42:1675 void pop();
76
Eric Fiselierf07dd8d2016-04-21 23:38:5977 void swap(queue& q) noexcept(is_nothrow_swappable_v<Container>)
Howard Hinnant3e519522010-05-11 19:42:1678};
79
Marshall Clow5b8b8b52018-05-22 01:57:5380template<class Container>
81 queue(Container) -> queue<typename Container::value_type, Container>; // C++17
Louis Dionnea2a1ec22019-05-29 16:01:3682
Nikolas Klauserf3aed362022-01-06 11:36:0783template<class InputIterator>
84 queue(InputIterator, InputIterator) -> queue<iter-value-type<InputIterator>>; // since C++23
85
varconst87f3ff32023-06-03 02:23:2986template<ranges::input_range R>
87 queue(from_range_t, R&&) -> queue<ranges::range_value_t<R>>; // since C++23
88
Louis Dionnea2a1ec22019-05-29 16:01:3689template<class Container, class Allocator>
Marshall Clow5b8b8b52018-05-22 01:57:5390 queue(Container, Allocator) -> queue<typename Container::value_type, Container>; // C++17
91
Nikolas Klauserf3aed362022-01-06 11:36:0792template<class InputIterator, class Allocator>
93 queue(InputIterator, InputIterator, Allocator)
94 -> queue<iter-value-type<InputIterator>,
95 deque<iter-value-type<InputIterator>, Allocator>>; // since C++23
96
varconst87f3ff32023-06-03 02:23:2997template<ranges::input_range R, class Allocator>
98 queue(from_range_t, R&&, Allocator)
99 -> queue<ranges::range_value_t<R>, deque<ranges::range_value_t<R>, Allocator>>; // since C++23
100
Howard Hinnant3e519522010-05-11 19:42:16101template <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>
108 bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y);
109
110template <class T, class Container>
111 bool operator> (const queue<T, Container>& x,const queue<T, Container>& y);
112
113template <class T, class Container>
114 bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y);
115
116template <class T, class Container>
117 bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y);
118
Hristo Hristov172d9902023-03-14 16:32:15119template<class T, three_way_comparable Container>
120 compare_three_way_result_t<Container>
121 operator<=>(const queue<T, Container>& x, const queue<T, Container>& y); // since C++20
122
Howard Hinnant3e519522010-05-11 19:42:16123template <class T, class Container>
Howard Hinnant6971d822011-06-04 21:32:33124 void swap(queue<T, Container>& x, queue<T, Container>& y)
125 noexcept(noexcept(x.swap(y)));
Howard Hinnant3e519522010-05-11 19:42:16126
127template <class T, class Container = vector<T>,
128 class Compare = less<typename Container::value_type>>
129class priority_queue
130{
131public:
132 typedef Container container_type;
133 typedef typename container_type::value_type value_type;
134 typedef typename container_type::reference reference;
135 typedef typename container_type::const_reference const_reference;
136 typedef typename container_type::size_type size_type;
137
138protected:
139 container_type c;
140 Compare comp;
141
142public:
Marek Kurdeja11f8b12021-01-19 07:21:09143 priority_queue() : priority_queue(Compare()) {} // C++20
144 explicit priority_queue(const Compare& x) : priority_queue(x, Container()) {}
145 priority_queue(const Compare& x, const Container&);
Arthur O'Dwyer3894a8a2021-03-02 05:23:21146 explicit priority_queue(const Compare& x = Compare(), Container&& = Container()); // before C++20
Marek Kurdeja11f8b12021-01-19 07:21:09147 priority_queue(const Compare& x, Container&&); // C++20
Howard Hinnant3e519522010-05-11 19:42:16148 template <class InputIterator>
149 priority_queue(InputIterator first, InputIterator last,
150 const Compare& comp = Compare());
151 template <class InputIterator>
152 priority_queue(InputIterator first, InputIterator last,
Arthur O'Dwyer3894a8a2021-03-02 05:23:21153 const Compare& comp, const Container& c);
Howard Hinnant3e519522010-05-11 19:42:16154 template <class InputIterator>
155 priority_queue(InputIterator first, InputIterator last,
Arthur O'Dwyer3894a8a2021-03-02 05:23:21156 const Compare& comp, Container&& c);
varconst87f3ff32023-06-03 02:23:29157 template <container-compatible-range<T> R>
158 priority_queue(from_range_t, R&& rg, const Compare& x = Compare()); // since C++23
Howard Hinnant3e519522010-05-11 19:42:16159 template <class Alloc>
160 explicit priority_queue(const Alloc& a);
161 template <class Alloc>
162 priority_queue(const Compare& comp, const Alloc& a);
163 template <class Alloc>
Arthur O'Dwyer3894a8a2021-03-02 05:23:21164 priority_queue(const Compare& comp, const Container& c,
Howard Hinnant3e519522010-05-11 19:42:16165 const Alloc& a);
166 template <class Alloc>
Arthur O'Dwyer3894a8a2021-03-02 05:23:21167 priority_queue(const Compare& comp, Container&& c,
Howard Hinnant3e519522010-05-11 19:42:16168 const Alloc& a);
Arthur O'Dwyer3894a8a2021-03-02 05:23:21169 template <class InputIterator>
170 priority_queue(InputIterator first, InputIterator last,
171 const Alloc& a);
172 template <class InputIterator>
173 priority_queue(InputIterator first, InputIterator last,
174 const Compare& comp, const Alloc& a);
175 template <class InputIterator>
176 priority_queue(InputIterator first, InputIterator last,
177 const Compare& comp, const Container& c, const Alloc& a);
178 template <class InputIterator>
179 priority_queue(InputIterator first, InputIterator last,
180 const Compare& comp, Container&& c, const Alloc& a);
varconst87f3ff32023-06-03 02:23:29181 template <container-compatible-range<T> R, class Alloc>
182 priority_queue(from_range_t, R&& rg, const Compare&, const Alloc&); // since C++23
183 template <container-compatible-range<T> R, class Alloc>
184 priority_queue(from_range_t, R&& rg, const Alloc&); // since C++23
Howard Hinnant3e519522010-05-11 19:42:16185 template <class Alloc>
Howard Hinnant6971d822011-06-04 21:32:33186 priority_queue(const priority_queue& q, const Alloc& a);
187 template <class Alloc>
Howard Hinnant3e519522010-05-11 19:42:16188 priority_queue(priority_queue&& q, const Alloc& a);
189
190 bool empty() const;
191 size_type size() const;
192 const_reference top() const;
193
194 void push(const value_type& v);
195 void push(value_type&& v);
varconst87f3ff32023-06-03 02:23:29196 template<container-compatible-range<T> R>
197 void push_range(R&& rg); // C++23
Howard Hinnant3e519522010-05-11 19:42:16198 template <class... Args> void emplace(Args&&... args);
199 void pop();
200
Howard Hinnant6971d822011-06-04 21:32:33201 void swap(priority_queue& q)
Eric Fiselierf07dd8d2016-04-21 23:38:59202 noexcept(is_nothrow_swappable_v<Container> &&
203 is_nothrow_swappable_v<Comp>)
Howard Hinnant3e519522010-05-11 19:42:16204};
205
Marshall Clow5b8b8b52018-05-22 01:57:53206template <class Compare, class Container>
207priority_queue(Compare, Container)
208 -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
Louis Dionnea2a1ec22019-05-29 16:01:36209
210template<class InputIterator,
Arthur O'Dwyer3894a8a2021-03-02 05:23:21211 class Compare = less<iter-value-type<InputIterator>>,
212 class Container = vector<iter-value-type<InputIterator>>>
Marshall Clow5b8b8b52018-05-22 01:57:53213priority_queue(InputIterator, InputIterator, Compare = Compare(), Container = Container())
Arthur O'Dwyer3894a8a2021-03-02 05:23:21214 -> priority_queue<iter-value-type<InputIterator>, Container, Compare>; // C++17
Louis Dionnea2a1ec22019-05-29 16:01:36215
varconst87f3ff32023-06-03 02:23:29216template<ranges::input_range R, class Compare = less<ranges::range_value_t<R>>>
217 priority_queue(from_range_t, R&&, Compare = Compare())
218 -> priority_queue<ranges::range_value_t<R>, vector<ranges::range_value_t<R>>, Compare>; // C++23
219
Marshall Clow5b8b8b52018-05-22 01:57:53220template<class Compare, class Container, class Allocator>
221priority_queue(Compare, Container, Allocator)
222 -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
223
Arthur O'Dwyer3894a8a2021-03-02 05:23:21224template<class InputIterator, class Allocator>
225priority_queue(InputIterator, InputIterator, Allocator)
226 -> priority_queue<iter-value-type<InputIterator>,
227 vector<iter-value-type<InputIterator>, Allocator>,
Konstantin Varlamov68072a72021-11-09 17:21:02228 less<iter-value-type<InputIterator>>>; // C++17
Arthur O'Dwyer3894a8a2021-03-02 05:23:21229
230template<class InputIterator, class Compare, class Allocator>
231priority_queue(InputIterator, InputIterator, Compare, Allocator)
232 -> priority_queue<iter-value-type<InputIterator>,
Konstantin Varlamov68072a72021-11-09 17:21:02233 vector<iter-value-type<InputIterator>, Allocator>, Compare>; // C++17
Arthur O'Dwyer3894a8a2021-03-02 05:23:21234
235template<class InputIterator, class Compare, class Container, class Allocator>
236priority_queue(InputIterator, InputIterator, Compare, Container, Allocator)
Konstantin Varlamov68072a72021-11-09 17:21:02237 -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
Arthur O'Dwyer3894a8a2021-03-02 05:23:21238
varconst87f3ff32023-06-03 02:23:29239template<ranges::input_range R, class Compare, class Allocator>
240 priority_queue(from_range_t, R&&, Compare, Allocator)
241 -> priority_queue<ranges::range_value_t<R>, vector<ranges::range_value_t<R>, Allocator>,
242 Compare>; // C++23
243
244template<ranges::input_range R, class Allocator>
245 priority_queue(from_range_t, R&&, Allocator)
246 -> priority_queue<ranges::range_value_t<R>, vector<ranges::range_value_t<R>, Allocator>>; // C++23
247
Howard Hinnant3e519522010-05-11 19:42:16248template <class T, class Container, class Compare>
249 void swap(priority_queue<T, Container, Compare>& x,
Howard Hinnant6971d822011-06-04 21:32:33250 priority_queue<T, Container, Compare>& y)
251 noexcept(noexcept(x.swap(y)));
Howard Hinnant3e519522010-05-11 19:42:16252
253} // std
254
255*/
256
Nikolas Klauser2e2f3152022-02-15 17:18:08257#include <__algorithm/make_heap.h>
258#include <__algorithm/pop_heap.h>
259#include <__algorithm/push_heap.h>
varconst87f3ff32023-06-03 02:23:29260#include <__algorithm/ranges_copy.h>
Howard Hinnant3e519522010-05-11 19:42:16261#include <__config>
Nikolas Klauser34f73802022-05-20 22:45:51262#include <__functional/operations.h>
varconst87f3ff32023-06-03 02:23:29263#include <__iterator/back_insert_iterator.h>
Nikolas Klauserf3aed362022-01-06 11:36:07264#include <__iterator/iterator_traits.h>
Christopher Di Bella050b0642021-07-01 13:25:35265#include <__memory/uses_allocator.h>
varconst87f3ff32023-06-03 02:23:29266#include <__ranges/access.h>
267#include <__ranges/concepts.h>
268#include <__ranges/container_compatible_range.h>
269#include <__ranges/from_range.h>
Christopher Di Bella6adbc832021-06-05 02:47:47270#include <__utility/forward.h>
Howard Hinnant3e519522010-05-11 19:42:16271#include <deque>
Arthur O'Dwyerbfbd73f2021-05-19 15:57:04272#include <vector>
Mark de Weverbd6e6842021-12-22 17:14:14273#include <version>
Howard Hinnant3e519522010-05-11 19:42:16274
Nikolas Klauserdb1978b2022-06-16 20:43:46275// standard-mandated includes
Nikolas Klauser473a1602022-09-22 16:05:08276
277// [queue.syn]
Nikolas Klauserdb1978b2022-06-16 20:43:46278#include <compare>
279#include <initializer_list>
280
Howard Hinnant073458b2011-10-17 20:05:10281#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Arthur O'Dwyerfa6b9e42022-02-02 01:16:40282# pragma GCC system_header
Howard Hinnant073458b2011-10-17 20:05:10283#endif
Howard Hinnant3e519522010-05-11 19:42:16284
Louis Dionne7b462252024-01-25 20:48:46285_LIBCPP_PUSH_MACROS
286#include <__undef_macros>
287
Howard Hinnant3e519522010-05-11 19:42:16288_LIBCPP_BEGIN_NAMESPACE_STD
289
Louis Dionne9783f282023-12-18 19:01:33290template <class _Tp, class _Container = deque<_Tp> >
291class _LIBCPP_TEMPLATE_VIS queue;
Howard Hinnant3e519522010-05-11 19:42:16292
293template <class _Tp, class _Container>
Louis Dionne9783f282023-12-18 19:01:33294_LIBCPP_HIDE_FROM_ABI bool operator==(const queue<_Tp, _Container>& __x, const queue<_Tp, _Container>& __y);
Howard Hinnant3e519522010-05-11 19:42:16295
296template <class _Tp, class _Container>
Louis Dionne9783f282023-12-18 19:01:33297_LIBCPP_HIDE_FROM_ABI bool operator<(const queue<_Tp, _Container>& __x, const queue<_Tp, _Container>& __y);
Howard Hinnant3e519522010-05-11 19:42:16298
Marshall Clow3afa22a2015-02-18 17:51:56299template <class _Tp, class _Container /*= deque<_Tp>*/>
Louis Dionne9783f282023-12-18 19:01:33300class _LIBCPP_TEMPLATE_VIS queue {
Howard Hinnant3e519522010-05-11 19:42:16301public:
Louis Dionne9783f282023-12-18 19:01:33302 typedef _Container container_type;
303 typedef typename container_type::value_type value_type;
304 typedef typename container_type::reference reference;
305 typedef typename container_type::const_reference const_reference;
306 typedef typename container_type::size_type size_type;
307 static_assert((is_same<_Tp, value_type>::value), "");
Howard Hinnant3e519522010-05-11 19:42:16308
309protected:
Louis Dionne9783f282023-12-18 19:01:33310 container_type c;
Howard Hinnant3e519522010-05-11 19:42:16311
312public:
Louis Dionne9783f282023-12-18 19:01:33313 _LIBCPP_HIDE_FROM_ABI queue() _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value) : c() {}
Howard Hinnant6971d822011-06-04 21:32:33314
Louis Dionne9783f282023-12-18 19:01:33315 _LIBCPP_HIDE_FROM_ABI queue(const queue& __q) : c(__q.c) {}
Howard Hinnant6971d822011-06-04 21:32:33316
Nikolas Klauser4f152672023-02-13 23:56:09317#if _LIBCPP_STD_VER >= 23
Nikolas Klauser76a24722024-02-20 00:47:38318 template <class _InputIterator, __enable_if_t<__has_input_iterator_category<_InputIterator>::value, int> = 0>
Louis Dionne9783f282023-12-18 19:01:33319 _LIBCPP_HIDE_FROM_ABI queue(_InputIterator __first, _InputIterator __last) : c(__first, __last) {}
Nikolas Klauserf3aed362022-01-06 11:36:07320
Louis Dionne9783f282023-12-18 19:01:33321 template <_ContainerCompatibleRange<_Tp> _Range>
322 _LIBCPP_HIDE_FROM_ABI queue(from_range_t, _Range&& __range) : c(from_range, std::forward<_Range>(__range)) {}
varconst87f3ff32023-06-03 02:23:29323
Louis Dionne9783f282023-12-18 19:01:33324 template <class _InputIterator,
325 class _Alloc,
Nikolas Klauser76a24722024-02-20 00:47:38326 __enable_if_t<__has_input_iterator_category<_InputIterator>::value, int> = 0,
327 __enable_if_t<uses_allocator<container_type, _Alloc>::value, int> = 0>
Louis Dionne9783f282023-12-18 19:01:33328 _LIBCPP_HIDE_FROM_ABI queue(_InputIterator __first, _InputIterator __second, const _Alloc& __alloc)
329 : c(__first, __second, __alloc) {}
varconst87f3ff32023-06-03 02:23:29330
Louis Dionne9783f282023-12-18 19:01:33331 template <_ContainerCompatibleRange<_Tp> _Range,
332 class _Alloc,
Nikolas Klauser76a24722024-02-20 00:47:38333 __enable_if_t<uses_allocator<container_type, _Alloc>::value, int> = 0>
Louis Dionne9783f282023-12-18 19:01:33334 _LIBCPP_HIDE_FROM_ABI queue(from_range_t, _Range&& __range, const _Alloc& __alloc)
varconst87f3ff32023-06-03 02:23:29335 : c(from_range, std::forward<_Range>(__range), __alloc) {}
336
Nikolas Klauserf3aed362022-01-06 11:36:07337#endif
338
Louis Dionne9783f282023-12-18 19:01:33339 _LIBCPP_HIDE_FROM_ABI queue& operator=(const queue& __q) {
340 c = __q.c;
341 return *this;
342 }
Eric Fiselierf5427b22017-04-18 21:23:18343
344#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9783f282023-12-18 19:01:33345 _LIBCPP_HIDE_FROM_ABI queue(queue&& __q) _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
346 : c(std::move(__q.c)) {}
Howard Hinnant6971d822011-06-04 21:32:33347
Louis Dionne9783f282023-12-18 19:01:33348 _LIBCPP_HIDE_FROM_ABI queue& operator=(queue&& __q) _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value) {
349 c = std::move(__q.c);
350 return *this;
351 }
Louis Dionne4cd6ca12021-04-20 16:03:32352#endif // _LIBCPP_CXX03_LANG
Howard Hinnant6971d822011-06-04 21:32:33353
Louis Dionne9783f282023-12-18 19:01:33354 _LIBCPP_HIDE_FROM_ABI explicit queue(const container_type& __c) : c(__c) {}
Eric Fiselierf5427b22017-04-18 21:23:18355#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9783f282023-12-18 19:01:33356 _LIBCPP_HIDE_FROM_ABI explicit queue(container_type&& __c) : c(std::move(__c)) {}
Louis Dionne4cd6ca12021-04-20 16:03:32357#endif // _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16358
Nikolas Klauser76a24722024-02-20 00:47:38359 template <class _Alloc, __enable_if_t<uses_allocator<container_type, _Alloc>::value, int> = 0>
360 _LIBCPP_HIDE_FROM_ABI explicit queue(const _Alloc& __a) : c(__a) {}
361
362 template <class _Alloc, __enable_if_t<uses_allocator<container_type, _Alloc>::value, int> = 0>
363 _LIBCPP_HIDE_FROM_ABI queue(const queue& __q, const _Alloc& __a) : c(__q.c, __a) {}
364
365 template <class _Alloc, __enable_if_t<uses_allocator<container_type, _Alloc>::value, int> = 0>
366 _LIBCPP_HIDE_FROM_ABI queue(const container_type& __c, const _Alloc& __a) : c(__c, __a) {}
367
368#ifndef _LIBCPP_CXX03_LANG
369 template <class _Alloc, __enable_if_t<uses_allocator<container_type, _Alloc>::value, int> = 0>
370 _LIBCPP_HIDE_FROM_ABI queue(container_type&& __c, const _Alloc& __a) : c(std::move(__c), __a) {}
371
372 template <class _Alloc, __enable_if_t<uses_allocator<container_type, _Alloc>::value, int> = 0>
373 _LIBCPP_HIDE_FROM_ABI queue(queue&& __q, const _Alloc& __a) : c(std::move(__q.c), __a) {}
Louis Dionne4cd6ca12021-04-20 16:03:32374#endif // _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16375
Louis Dionne9783f282023-12-18 19:01:33376 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_HIDE_FROM_ABI bool empty() const { return c.empty(); }
377 _LIBCPP_HIDE_FROM_ABI size_type size() const { return c.size(); }
Howard Hinnant3e519522010-05-11 19:42:16378
Louis Dionne9783f282023-12-18 19:01:33379 _LIBCPP_HIDE_FROM_ABI reference front() { return c.front(); }
380 _LIBCPP_HIDE_FROM_ABI const_reference front() const { return c.front(); }
381 _LIBCPP_HIDE_FROM_ABI reference back() { return c.back(); }
382 _LIBCPP_HIDE_FROM_ABI const_reference back() const { return c.back(); }
Howard Hinnant3e519522010-05-11 19:42:16383
Louis Dionne9783f282023-12-18 19:01:33384 _LIBCPP_HIDE_FROM_ABI void push(const value_type& __v) { c.push_back(__v); }
Eric Fiselierf5427b22017-04-18 21:23:18385#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9783f282023-12-18 19:01:33386 _LIBCPP_HIDE_FROM_ABI void push(value_type&& __v) { c.push_back(std::move(__v)); }
varconst87f3ff32023-06-03 02:23:29387
Louis Dionne9783f282023-12-18 19:01:33388# if _LIBCPP_STD_VER >= 23
389 template <_ContainerCompatibleRange<_Tp> _Range>
390 _LIBCPP_HIDE_FROM_ABI void push_range(_Range&& __range) {
391 if constexpr (requires(container_type& __c) { __c.append_range(std::forward<_Range>(__range)); }) {
392 c.append_range(std::forward<_Range>(__range));
393 } else {
394 ranges::copy(std::forward<_Range>(__range), std::back_inserter(c));
varconst87f3ff32023-06-03 02:23:29395 }
Louis Dionne9783f282023-12-18 19:01:33396 }
397# endif
varconst87f3ff32023-06-03 02:23:29398
Louis Dionne9783f282023-12-18 19:01:33399 template <class... _Args>
400 _LIBCPP_HIDE_FROM_ABI
401# if _LIBCPP_STD_VER >= 17
402 decltype(auto)
403 emplace(_Args&&... __args) {
404 return c.emplace_back(std::forward<_Args>(__args)...);
405 }
406# else
407 void
408 emplace(_Args&&... __args) {
409 c.emplace_back(std::forward<_Args>(__args)...);
410 }
411# endif
Louis Dionne4cd6ca12021-04-20 16:03:32412#endif // _LIBCPP_CXX03_LANG
Louis Dionne9783f282023-12-18 19:01:33413 _LIBCPP_HIDE_FROM_ABI void pop() { c.pop_front(); }
Howard Hinnant3e519522010-05-11 19:42:16414
Louis Dionne9783f282023-12-18 19:01:33415 _LIBCPP_HIDE_FROM_ABI void swap(queue& __q) _NOEXCEPT_(__is_nothrow_swappable<container_type>::value) {
416 using std::swap;
417 swap(c, __q.c);
418 }
Howard Hinnant3e519522010-05-11 19:42:16419
Louis Dionne9783f282023-12-18 19:01:33420 _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI const _Container& __get_container() const { return c; }
Mark de Wever04d4f4b2022-05-05 16:57:32421
Louis Dionne9783f282023-12-18 19:01:33422 template <class _T1, class _OtherContainer>
423 friend _LIBCPP_HIDE_FROM_ABI bool
424 operator==(const queue<_T1, _OtherContainer>& __x, const queue<_T1, _OtherContainer>& __y);
Howard Hinnantb3371f62010-08-22 00:02:43425
Louis Dionne9783f282023-12-18 19:01:33426 template <class _T1, class _OtherContainer>
427 friend _LIBCPP_HIDE_FROM_ABI bool
428 operator<(const queue<_T1, _OtherContainer>& __x, const queue<_T1, _OtherContainer>& __y);
Howard Hinnant3e519522010-05-11 19:42:16429};
430
Nikolas Klauser4f152672023-02-13 23:56:09431#if _LIBCPP_STD_VER >= 17
Louis Dionne9783f282023-12-18 19:01:33432template <class _Container, class = enable_if_t<!__is_allocator<_Container>::value> >
433queue(_Container) -> queue<typename _Container::value_type, _Container>;
Louis Dionnea2a1ec22019-05-29 16:01:36434
Louis Dionne9783f282023-12-18 19:01:33435template <class _Container,
436 class _Alloc,
437 class = enable_if_t<!__is_allocator<_Container>::value>,
438 class = enable_if_t<uses_allocator<_Container, _Alloc>::value> >
439queue(_Container, _Alloc) -> queue<typename _Container::value_type, _Container>;
Marshall Clow5b8b8b52018-05-22 01:57:53440#endif
441
Nikolas Klauser4f152672023-02-13 23:56:09442#if _LIBCPP_STD_VER >= 23
Nikolas Klauser76a24722024-02-20 00:47:38443template <class _InputIterator, __enable_if_t<__has_input_iterator_category<_InputIterator>::value, int> = 0>
Louis Dionne9783f282023-12-18 19:01:33444queue(_InputIterator, _InputIterator) -> queue<__iter_value_type<_InputIterator>>;
Nikolas Klauserf3aed362022-01-06 11:36:07445
varconst87f3ff32023-06-03 02:23:29446template <ranges::input_range _Range>
Louis Dionne9783f282023-12-18 19:01:33447queue(from_range_t, _Range&&) -> queue<ranges::range_value_t<_Range>>;
varconst87f3ff32023-06-03 02:23:29448
Nikolas Klauserf3aed362022-01-06 11:36:07449template <class _InputIterator,
450 class _Alloc,
Nikolas Klauser76a24722024-02-20 00:47:38451 __enable_if_t<__has_input_iterator_category<_InputIterator>::value, int> = 0,
452 __enable_if_t<__is_allocator<_Alloc>::value, int> = 0>
453queue(_InputIterator,
454 _InputIterator,
455 _Alloc) -> queue<__iter_value_type<_InputIterator>, deque<__iter_value_type<_InputIterator>, _Alloc>>;
varconst87f3ff32023-06-03 02:23:29456
Nikolas Klauser76a24722024-02-20 00:47:38457template <ranges::input_range _Range, class _Alloc, __enable_if_t<__is_allocator<_Alloc>::value, int> = 0>
458queue(from_range_t,
459 _Range&&,
460 _Alloc) -> queue<ranges::range_value_t<_Range>, deque<ranges::range_value_t<_Range>, _Alloc>>;
Nikolas Klauserf3aed362022-01-06 11:36:07461#endif
462
Howard Hinnant3e519522010-05-11 19:42:16463template <class _Tp, class _Container>
Louis Dionne9783f282023-12-18 19:01:33464inline _LIBCPP_HIDE_FROM_ABI bool operator==(const queue<_Tp, _Container>& __x, const queue<_Tp, _Container>& __y) {
465 return __x.c == __y.c;
Howard Hinnant3e519522010-05-11 19:42:16466}
467
468template <class _Tp, class _Container>
Louis Dionne9783f282023-12-18 19:01:33469inline _LIBCPP_HIDE_FROM_ABI bool operator<(const queue<_Tp, _Container>& __x, const queue<_Tp, _Container>& __y) {
470 return __x.c < __y.c;
Howard Hinnant3e519522010-05-11 19:42:16471}
472
473template <class _Tp, class _Container>
Louis Dionne9783f282023-12-18 19:01:33474inline _LIBCPP_HIDE_FROM_ABI bool operator!=(const queue<_Tp, _Container>& __x, const queue<_Tp, _Container>& __y) {
475 return !(__x == __y);
Howard Hinnant3e519522010-05-11 19:42:16476}
477
478template <class _Tp, class _Container>
Louis Dionne9783f282023-12-18 19:01:33479inline _LIBCPP_HIDE_FROM_ABI bool operator>(const queue<_Tp, _Container>& __x, const queue<_Tp, _Container>& __y) {
480 return __y < __x;
Howard Hinnant3e519522010-05-11 19:42:16481}
482
483template <class _Tp, class _Container>
Louis Dionne9783f282023-12-18 19:01:33484inline _LIBCPP_HIDE_FROM_ABI bool operator>=(const queue<_Tp, _Container>& __x, const queue<_Tp, _Container>& __y) {
485 return !(__x < __y);
Howard Hinnant3e519522010-05-11 19:42:16486}
487
488template <class _Tp, class _Container>
Louis Dionne9783f282023-12-18 19:01:33489inline _LIBCPP_HIDE_FROM_ABI bool operator<=(const queue<_Tp, _Container>& __x, const queue<_Tp, _Container>& __y) {
490 return !(__y < __x);
Howard Hinnant3e519522010-05-11 19:42:16491}
492
Hristo Hristov172d9902023-03-14 16:32:15493#if _LIBCPP_STD_VER >= 20
494
495template <class _Tp, three_way_comparable _Container>
496_LIBCPP_HIDE_FROM_ABI compare_three_way_result_t<_Container>
497operator<=>(const queue<_Tp, _Container>& __x, const queue<_Tp, _Container>& __y) {
Louis Dionne9783f282023-12-18 19:01:33498 // clang 16 bug: declaring `friend operator<=>` causes "use of overloaded operator '*' is ambiguous" errors
499 return __x.__get_container() <=> __y.__get_container();
Hristo Hristov172d9902023-03-14 16:32:15500}
501
502#endif
503
Nikolas Klauser9f3e3ef2023-09-02 00:52:02504template <class _Tp, class _Container, __enable_if_t<__is_swappable<_Container>::value, int> = 0>
Louis Dionne9783f282023-12-18 19:01:33505inline _LIBCPP_HIDE_FROM_ABI void swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
506 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) {
507 __x.swap(__y);
Howard Hinnant3e519522010-05-11 19:42:16508}
509
510template <class _Tp, class _Container, class _Alloc>
Louis Dionne9783f282023-12-18 19:01:33511struct _LIBCPP_TEMPLATE_VIS uses_allocator<queue<_Tp, _Container>, _Alloc> : public uses_allocator<_Container, _Alloc> {
Howard Hinnant3e519522010-05-11 19:42:16512};
513
Louis Dionne9783f282023-12-18 19:01:33514template <class _Tp, class _Container = vector<_Tp>, class _Compare = less<typename _Container::value_type> >
515class _LIBCPP_TEMPLATE_VIS priority_queue {
Howard Hinnant3e519522010-05-11 19:42:16516public:
Louis Dionne9783f282023-12-18 19:01:33517 typedef _Container container_type;
518 typedef _Compare value_compare;
519 typedef typename container_type::value_type value_type;
520 typedef typename container_type::reference reference;
521 typedef typename container_type::const_reference const_reference;
522 typedef typename container_type::size_type size_type;
523 static_assert((is_same<_Tp, value_type>::value), "");
Howard Hinnant3e519522010-05-11 19:42:16524
525protected:
Louis Dionne9783f282023-12-18 19:01:33526 container_type c;
527 value_compare comp;
Howard Hinnant3e519522010-05-11 19:42:16528
529public:
Louis Dionne9783f282023-12-18 19:01:33530 _LIBCPP_HIDE_FROM_ABI priority_queue() _NOEXCEPT_(
531 is_nothrow_default_constructible<container_type>::value&& is_nothrow_default_constructible<value_compare>::value)
532 : c(), comp() {}
Howard Hinnant6971d822011-06-04 21:32:33533
Louis Dionne9783f282023-12-18 19:01:33534 _LIBCPP_HIDE_FROM_ABI priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
Howard Hinnant6971d822011-06-04 21:32:33535
Louis Dionne9783f282023-12-18 19:01:33536 _LIBCPP_HIDE_FROM_ABI priority_queue& operator=(const priority_queue& __q) {
537 c = __q.c;
538 comp = __q.comp;
539 return *this;
540 }
Eric Fiselierf5427b22017-04-18 21:23:18541
542#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9783f282023-12-18 19:01:33543 _LIBCPP_HIDE_FROM_ABI priority_queue(priority_queue&& __q) _NOEXCEPT_(
544 is_nothrow_move_constructible<container_type>::value&& is_nothrow_move_constructible<value_compare>::value)
545 : c(std::move(__q.c)), comp(std::move(__q.comp)) {}
Howard Hinnant6971d822011-06-04 21:32:33546
Louis Dionne9783f282023-12-18 19:01:33547 _LIBCPP_HIDE_FROM_ABI priority_queue& operator=(priority_queue&& __q)
548 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value&& is_nothrow_move_assignable<value_compare>::value) {
549 c = std::move(__q.c);
550 comp = std::move(__q.comp);
551 return *this;
552 }
Louis Dionne4cd6ca12021-04-20 16:03:32553#endif // _LIBCPP_CXX03_LANG
Howard Hinnant6971d822011-06-04 21:32:33554
Louis Dionne9783f282023-12-18 19:01:33555 _LIBCPP_HIDE_FROM_ABI explicit priority_queue(const value_compare& __comp) : c(), comp(__comp) {}
556 _LIBCPP_HIDE_FROM_ABI priority_queue(const value_compare& __comp, const container_type& __c);
Eric Fiselierf5427b22017-04-18 21:23:18557#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9783f282023-12-18 19:01:33558 _LIBCPP_HIDE_FROM_ABI priority_queue(const value_compare& __comp, container_type&& __c);
Howard Hinnant3e519522010-05-11 19:42:16559#endif
Nikolas Klauser76a24722024-02-20 00:47:38560 template <class _InputIter, __enable_if_t<__has_input_iterator_category<_InputIter>::value, int> = 0>
Louis Dionne9783f282023-12-18 19:01:33561 _LIBCPP_HIDE_FROM_ABI priority_queue(_InputIter __f, _InputIter __l, const value_compare& __comp = value_compare());
Nikolas Klauser76a24722024-02-20 00:47:38562
563 template <class _InputIter, __enable_if_t<__has_input_iterator_category<_InputIter>::value, int> = 0>
Louis Dionne9783f282023-12-18 19:01:33564 _LIBCPP_HIDE_FROM_ABI
565 priority_queue(_InputIter __f, _InputIter __l, const value_compare& __comp, const container_type& __c);
Nikolas Klauser76a24722024-02-20 00:47:38566
Eric Fiselierf5427b22017-04-18 21:23:18567#ifndef _LIBCPP_CXX03_LANG
Nikolas Klauser76a24722024-02-20 00:47:38568 template <class _InputIter, __enable_if_t<__has_input_iterator_category<_InputIter>::value, int> = 0>
Louis Dionne9783f282023-12-18 19:01:33569 _LIBCPP_HIDE_FROM_ABI
570 priority_queue(_InputIter __f, _InputIter __l, const value_compare& __comp, container_type&& __c);
Louis Dionne4cd6ca12021-04-20 16:03:32571#endif // _LIBCPP_CXX03_LANG
varconst87f3ff32023-06-03 02:23:29572
573#if _LIBCPP_STD_VER >= 23
Louis Dionne9783f282023-12-18 19:01:33574 template <_ContainerCompatibleRange<_Tp> _Range>
575 _LIBCPP_HIDE_FROM_ABI priority_queue(from_range_t, _Range&& __range, const value_compare& __comp = value_compare())
576 : c(from_range, std::forward<_Range>(__range)), comp(__comp) {
577 std::make_heap(c.begin(), c.end(), comp);
578 }
varconst87f3ff32023-06-03 02:23:29579#endif
580
Nikolas Klauser76a24722024-02-20 00:47:38581 template <class _Alloc, __enable_if_t<uses_allocator<container_type, _Alloc>::value, int> = 0>
582 _LIBCPP_HIDE_FROM_ABI explicit priority_queue(const _Alloc& __a);
583
584 template <class _Alloc, __enable_if_t<uses_allocator<container_type, _Alloc>::value, int> = 0>
585 _LIBCPP_HIDE_FROM_ABI priority_queue(const value_compare& __comp, const _Alloc& __a);
586
587 template <class _Alloc, __enable_if_t<uses_allocator<container_type, _Alloc>::value, int> = 0>
588 _LIBCPP_HIDE_FROM_ABI priority_queue(const value_compare& __comp, const container_type& __c, const _Alloc& __a);
589
590 template <class _Alloc, __enable_if_t<uses_allocator<container_type, _Alloc>::value, int> = 0>
591 _LIBCPP_HIDE_FROM_ABI priority_queue(const priority_queue& __q, const _Alloc& __a);
592
Eric Fiselierf5427b22017-04-18 21:23:18593#ifndef _LIBCPP_CXX03_LANG
Nikolas Klauser76a24722024-02-20 00:47:38594 template <class _Alloc, __enable_if_t<uses_allocator<container_type, _Alloc>::value, int> = 0>
595 _LIBCPP_HIDE_FROM_ABI priority_queue(const value_compare& __comp, container_type&& __c, const _Alloc& __a);
596
597 template <class _Alloc, __enable_if_t<uses_allocator<container_type, _Alloc>::value, int> = 0>
598 _LIBCPP_HIDE_FROM_ABI priority_queue(priority_queue&& __q, const _Alloc& __a);
Louis Dionne4cd6ca12021-04-20 16:03:32599#endif // _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16600
Nikolas Klauser76a24722024-02-20 00:47:38601 template <
602 class _InputIter,
603 class _Alloc,
604 __enable_if_t<__has_input_iterator_category<_InputIter>::value && uses_allocator<container_type, _Alloc>::value,
605 int> = 0>
606 _LIBCPP_HIDE_FROM_ABI priority_queue(_InputIter __f, _InputIter __l, const _Alloc& __a);
Arthur O'Dwyer3894a8a2021-03-02 05:23:21607
Nikolas Klauser76a24722024-02-20 00:47:38608 template <
609 class _InputIter,
610 class _Alloc,
611 __enable_if_t<__has_input_iterator_category<_InputIter>::value && uses_allocator<container_type, _Alloc>::value,
612 int> = 0>
613 _LIBCPP_HIDE_FROM_ABI priority_queue(_InputIter __f, _InputIter __l, const value_compare& __comp, const _Alloc& __a);
Arthur O'Dwyer3894a8a2021-03-02 05:23:21614
Nikolas Klauser76a24722024-02-20 00:47:38615 template <
616 class _InputIter,
617 class _Alloc,
618 __enable_if_t<__has_input_iterator_category<_InputIter>::value && uses_allocator<container_type, _Alloc>::value,
619 int> = 0>
Louis Dionne9783f282023-12-18 19:01:33620 _LIBCPP_HIDE_FROM_ABI priority_queue(
Nikolas Klauser76a24722024-02-20 00:47:38621 _InputIter __f, _InputIter __l, const value_compare& __comp, const container_type& __c, const _Alloc& __a);
Arthur O'Dwyer3894a8a2021-03-02 05:23:21622
623#ifndef _LIBCPP_CXX03_LANG
Nikolas Klauser76a24722024-02-20 00:47:38624 template <
625 class _InputIter,
626 class _Alloc,
627 __enable_if_t<__has_input_iterator_category<_InputIter>::value && uses_allocator<container_type, _Alloc>::value,
628 int> = 0>
629 _LIBCPP_HIDE_FROM_ABI
630 priority_queue(_InputIter __f, _InputIter __l, const value_compare& __comp, container_type&& __c, const _Alloc& __a);
Louis Dionne9783f282023-12-18 19:01:33631#endif // _LIBCPP_CXX03_LANG
Arthur O'Dwyer3894a8a2021-03-02 05:23:21632
varconst87f3ff32023-06-03 02:23:29633#if _LIBCPP_STD_VER >= 23
634
Louis Dionne9783f282023-12-18 19:01:33635 template <_ContainerCompatibleRange<_Tp> _Range,
636 class _Alloc,
637 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>>
638 _LIBCPP_HIDE_FROM_ABI priority_queue(from_range_t, _Range&& __range, const value_compare& __comp, const _Alloc& __a)
639 : c(from_range, std::forward<_Range>(__range), __a), comp(__comp) {
640 std::make_heap(c.begin(), c.end(), comp);
641 }
varconst87f3ff32023-06-03 02:23:29642
Louis Dionne9783f282023-12-18 19:01:33643 template <_ContainerCompatibleRange<_Tp> _Range,
644 class _Alloc,
645 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>>
646 _LIBCPP_HIDE_FROM_ABI priority_queue(from_range_t, _Range&& __range, const _Alloc& __a)
647 : c(from_range, std::forward<_Range>(__range), __a), comp() {
648 std::make_heap(c.begin(), c.end(), comp);
649 }
varconst87f3ff32023-06-03 02:23:29650
651#endif
652
Louis Dionne9783f282023-12-18 19:01:33653 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_HIDE_FROM_ABI bool empty() const { return c.empty(); }
654 _LIBCPP_HIDE_FROM_ABI size_type size() const { return c.size(); }
655 _LIBCPP_HIDE_FROM_ABI const_reference top() const { return c.front(); }
Howard Hinnant3e519522010-05-11 19:42:16656
Louis Dionne9783f282023-12-18 19:01:33657 _LIBCPP_HIDE_FROM_ABI void push(const value_type& __v);
Eric Fiselierf5427b22017-04-18 21:23:18658#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9783f282023-12-18 19:01:33659 _LIBCPP_HIDE_FROM_ABI void push(value_type&& __v);
varconst87f3ff32023-06-03 02:23:29660
Louis Dionne9783f282023-12-18 19:01:33661# if _LIBCPP_STD_VER >= 23
662 template <_ContainerCompatibleRange<_Tp> _Range>
663 _LIBCPP_HIDE_FROM_ABI void push_range(_Range&& __range) {
664 if constexpr (requires(container_type& __c) { __c.append_range(std::forward<_Range>(__range)); }) {
665 c.append_range(std::forward<_Range>(__range));
666 } else {
667 ranges::copy(std::forward<_Range>(__range), std::back_inserter(c));
varconst87f3ff32023-06-03 02:23:29668 }
varconst87f3ff32023-06-03 02:23:29669
Louis Dionne9783f282023-12-18 19:01:33670 std::make_heap(c.begin(), c.end(), comp);
671 }
672# endif
673
674 template <class... _Args>
675 _LIBCPP_HIDE_FROM_ABI void emplace(_Args&&... __args);
Louis Dionne4cd6ca12021-04-20 16:03:32676#endif // _LIBCPP_CXX03_LANG
Louis Dionne9783f282023-12-18 19:01:33677 _LIBCPP_HIDE_FROM_ABI void pop();
Howard Hinnant3e519522010-05-11 19:42:16678
Louis Dionne9783f282023-12-18 19:01:33679 _LIBCPP_HIDE_FROM_ABI void swap(priority_queue& __q)
680 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value&& __is_nothrow_swappable<value_compare>::value);
Mark de Wever04d4f4b2022-05-05 16:57:32681
Louis Dionne9783f282023-12-18 19:01:33682 _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI const _Container& __get_container() const { return c; }
Howard Hinnant3e519522010-05-11 19:42:16683};
684
Louis Dionne01666902021-08-17 15:59:07685#if _LIBCPP_STD_VER >= 17
Marshall Clow5b8b8b52018-05-22 01:57:53686template <class _Compare,
687 class _Container,
Louis Dionne4e0ea2c2021-08-17 16:26:09688 class = enable_if_t<!__is_allocator<_Compare>::value>,
Louis Dionne9783f282023-12-18 19:01:33689 class = enable_if_t<!__is_allocator<_Container>::value> >
690priority_queue(_Compare, _Container) -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Louis Dionnea2a1ec22019-05-29 16:01:36691
Louis Dionne9783f282023-12-18 19:01:33692template <class _InputIterator,
693 class _Compare = less<__iter_value_type<_InputIterator>>,
694 class _Container = vector<__iter_value_type<_InputIterator>>,
695 class = enable_if_t<__has_input_iterator_category<_InputIterator>::value>,
696 class = enable_if_t<!__is_allocator<_Compare>::value>,
697 class = enable_if_t<!__is_allocator<_Container>::value> >
Marshall Clow5b8b8b52018-05-22 01:57:53698priority_queue(_InputIterator, _InputIterator, _Compare = _Compare(), _Container = _Container())
Arthur O'Dwyer199d2eb2021-03-04 04:02:20699 -> priority_queue<__iter_value_type<_InputIterator>, _Container, _Compare>;
Louis Dionnea2a1ec22019-05-29 16:01:36700
Louis Dionne9783f282023-12-18 19:01:33701template <class _Compare,
702 class _Container,
703 class _Alloc,
704 class = enable_if_t<!__is_allocator<_Compare>::value>,
705 class = enable_if_t<!__is_allocator<_Container>::value>,
706 class = enable_if_t<uses_allocator<_Container, _Alloc>::value> >
707priority_queue(_Compare, _Container, _Alloc) -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Arthur O'Dwyer3894a8a2021-03-02 05:23:21708
Louis Dionne9783f282023-12-18 19:01:33709template <class _InputIterator,
710 class _Allocator,
711 class = enable_if_t<__has_input_iterator_category<_InputIterator>::value>,
712 class = enable_if_t<__is_allocator<_Allocator>::value> >
Arthur O'Dwyer3894a8a2021-03-02 05:23:21713priority_queue(_InputIterator, _InputIterator, _Allocator)
714 -> priority_queue<__iter_value_type<_InputIterator>,
715 vector<__iter_value_type<_InputIterator>, _Allocator>,
716 less<__iter_value_type<_InputIterator>>>;
717
Louis Dionne9783f282023-12-18 19:01:33718template <class _InputIterator,
719 class _Compare,
720 class _Allocator,
721 class = enable_if_t<__has_input_iterator_category<_InputIterator>::value>,
722 class = enable_if_t<!__is_allocator<_Compare>::value>,
723 class = enable_if_t<__is_allocator<_Allocator>::value> >
Arthur O'Dwyer3894a8a2021-03-02 05:23:21724priority_queue(_InputIterator, _InputIterator, _Compare, _Allocator)
725 -> priority_queue<__iter_value_type<_InputIterator>,
Louis Dionne9783f282023-12-18 19:01:33726 vector<__iter_value_type<_InputIterator>, _Allocator>,
727 _Compare>;
Arthur O'Dwyer3894a8a2021-03-02 05:23:21728
Louis Dionne9783f282023-12-18 19:01:33729template <class _InputIterator,
730 class _Compare,
731 class _Container,
732 class _Alloc,
733 class = enable_if_t<__has_input_iterator_category<_InputIterator>::value>,
734 class = enable_if_t<!__is_allocator<_Compare>::value>,
735 class = enable_if_t<!__is_allocator<_Container>::value>,
736 class = enable_if_t<uses_allocator<_Container, _Alloc>::value> >
Arthur O'Dwyer3894a8a2021-03-02 05:23:21737priority_queue(_InputIterator, _InputIterator, _Compare, _Container, _Alloc)
738 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Marshall Clow5b8b8b52018-05-22 01:57:53739#endif
740
varconst87f3ff32023-06-03 02:23:29741#if _LIBCPP_STD_VER >= 23
742
743template <ranges::input_range _Range,
744 class _Compare = less<ranges::range_value_t<_Range>>,
Louis Dionne9783f282023-12-18 19:01:33745 class = enable_if_t<!__is_allocator<_Compare>::value>>
varconst87f3ff32023-06-03 02:23:29746priority_queue(from_range_t, _Range&&, _Compare = _Compare())
747 -> priority_queue<ranges::range_value_t<_Range>, vector<ranges::range_value_t<_Range>>, _Compare>;
748
749template <ranges::input_range _Range,
750 class _Compare,
751 class _Alloc,
752 class = enable_if_t<!__is_allocator<_Compare>::value>,
753 class = enable_if_t<__is_allocator<_Alloc>::value>>
754priority_queue(from_range_t, _Range&&, _Compare, _Alloc)
Louis Dionne9783f282023-12-18 19:01:33755 -> priority_queue<ranges::range_value_t<_Range>, vector<ranges::range_value_t<_Range>, _Alloc>, _Compare>;
varconst87f3ff32023-06-03 02:23:29756
Louis Dionne9783f282023-12-18 19:01:33757template <ranges::input_range _Range, class _Alloc, class = enable_if_t<__is_allocator<_Alloc>::value>>
varconst87f3ff32023-06-03 02:23:29758priority_queue(from_range_t, _Range&&, _Alloc)
759 -> priority_queue<ranges::range_value_t<_Range>, vector<ranges::range_value_t<_Range>, _Alloc>>;
760
761#endif
762
Howard Hinnant3e519522010-05-11 19:42:16763template <class _Tp, class _Container, class _Compare>
Louis Dionne9783f282023-12-18 19:01:33764inline priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp, const container_type& __c)
765 : c(__c), comp(__comp) {
766 std::make_heap(c.begin(), c.end(), comp);
Howard Hinnant3e519522010-05-11 19:42:16767}
768
Eric Fiselierf5427b22017-04-18 21:23:18769#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16770
771template <class _Tp, class _Container, class _Compare>
Louis Dionne9783f282023-12-18 19:01:33772inline priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp, container_type&& __c)
773 : c(std::move(__c)), comp(__comp) {
774 std::make_heap(c.begin(), c.end(), comp);
Howard Hinnant3e519522010-05-11 19:42:16775}
776
Louis Dionne4cd6ca12021-04-20 16:03:32777#endif // _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16778
779template <class _Tp, class _Container, class _Compare>
Nikolas Klauser76a24722024-02-20 00:47:38780template <class _InputIter, __enable_if_t<__has_input_iterator_category<_InputIter>::value, int> >
Louis Dionne9783f282023-12-18 19:01:33781inline priority_queue<_Tp, _Container, _Compare>::priority_queue(
782 _InputIter __f, _InputIter __l, const value_compare& __comp)
783 : c(__f, __l), comp(__comp) {
784 std::make_heap(c.begin(), c.end(), comp);
Howard Hinnant3e519522010-05-11 19:42:16785}
786
787template <class _Tp, class _Container, class _Compare>
Nikolas Klauser76a24722024-02-20 00:47:38788template <class _InputIter, __enable_if_t<__has_input_iterator_category<_InputIter>::value, int> >
Louis Dionne9783f282023-12-18 19:01:33789inline priority_queue<_Tp, _Container, _Compare>::priority_queue(
790 _InputIter __f, _InputIter __l, const value_compare& __comp, const container_type& __c)
791 : c(__c), comp(__comp) {
792 c.insert(c.end(), __f, __l);
793 std::make_heap(c.begin(), c.end(), comp);
Howard Hinnant3e519522010-05-11 19:42:16794}
795
Eric Fiselierf5427b22017-04-18 21:23:18796#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16797
798template <class _Tp, class _Container, class _Compare>
Nikolas Klauser76a24722024-02-20 00:47:38799template <class _InputIter, __enable_if_t<__has_input_iterator_category<_InputIter>::value, int> >
Louis Dionne9783f282023-12-18 19:01:33800inline priority_queue<_Tp, _Container, _Compare>::priority_queue(
801 _InputIter __f, _InputIter __l, const value_compare& __comp, container_type&& __c)
802 : c(std::move(__c)), comp(__comp) {
803 c.insert(c.end(), __f, __l);
804 std::make_heap(c.begin(), c.end(), comp);
Howard Hinnant3e519522010-05-11 19:42:16805}
806
Louis Dionne4cd6ca12021-04-20 16:03:32807#endif // _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16808
809template <class _Tp, class _Container, class _Compare>
Nikolas Klauser76a24722024-02-20 00:47:38810template <class _Alloc, __enable_if_t<uses_allocator<_Container, _Alloc>::value, int> >
811inline priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a) : c(__a) {}
Louis Dionne9783f282023-12-18 19:01:33812
813template <class _Tp, class _Container, class _Compare>
Nikolas Klauser76a24722024-02-20 00:47:38814template <class _Alloc, __enable_if_t<uses_allocator<_Container, _Alloc>::value, int> >
815inline priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp, const _Alloc& __a)
Louis Dionne9783f282023-12-18 19:01:33816 : c(__a), comp(__comp) {}
817
818template <class _Tp, class _Container, class _Compare>
Nikolas Klauser76a24722024-02-20 00:47:38819template <class _Alloc, __enable_if_t<uses_allocator<_Container, _Alloc>::value, int> >
Louis Dionne9783f282023-12-18 19:01:33820inline priority_queue<_Tp, _Container, _Compare>::priority_queue(
Nikolas Klauser76a24722024-02-20 00:47:38821 const value_compare& __comp, const container_type& __c, const _Alloc& __a)
Louis Dionne9783f282023-12-18 19:01:33822 : c(__c, __a), comp(__comp) {
823 std::make_heap(c.begin(), c.end(), comp);
Howard Hinnant3e519522010-05-11 19:42:16824}
825
826template <class _Tp, class _Container, class _Compare>
Nikolas Klauser76a24722024-02-20 00:47:38827template <class _Alloc, __enable_if_t<uses_allocator<_Container, _Alloc>::value, int> >
828inline priority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q, const _Alloc& __a)
Louis Dionne9783f282023-12-18 19:01:33829 : c(__q.c, __a), comp(__q.comp) {}
Howard Hinnant3e519522010-05-11 19:42:16830
Eric Fiselierf5427b22017-04-18 21:23:18831#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16832
833template <class _Tp, class _Container, class _Compare>
Nikolas Klauser76a24722024-02-20 00:47:38834template <class _Alloc, __enable_if_t<uses_allocator<_Container, _Alloc>::value, int> >
Louis Dionne9783f282023-12-18 19:01:33835inline priority_queue<_Tp, _Container, _Compare>::priority_queue(
Nikolas Klauser76a24722024-02-20 00:47:38836 const value_compare& __comp, container_type&& __c, const _Alloc& __a)
Louis Dionne9783f282023-12-18 19:01:33837 : c(std::move(__c), __a), comp(__comp) {
838 std::make_heap(c.begin(), c.end(), comp);
Howard Hinnant3e519522010-05-11 19:42:16839}
840
Howard Hinnant3e519522010-05-11 19:42:16841template <class _Tp, class _Container, class _Compare>
Nikolas Klauser76a24722024-02-20 00:47:38842template <class _Alloc, __enable_if_t<uses_allocator<_Container, _Alloc>::value, int> >
843inline priority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q, const _Alloc& __a)
Louis Dionne9783f282023-12-18 19:01:33844 : c(std::move(__q.c), __a), comp(std::move(__q.comp)) {}
Arthur O'Dwyer3894a8a2021-03-02 05:23:21845
Louis Dionne9783f282023-12-18 19:01:33846#endif // _LIBCPP_CXX03_LANG
Arthur O'Dwyer3894a8a2021-03-02 05:23:21847
848template <class _Tp, class _Container, class _Compare>
Nikolas Klauser76a24722024-02-20 00:47:38849template <
850 class _InputIter,
851 class _Alloc,
852 __enable_if_t<__has_input_iterator_category<_InputIter>::value && uses_allocator<_Container, _Alloc>::value, int> >
853inline priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l, const _Alloc& __a)
Louis Dionne9783f282023-12-18 19:01:33854 : c(__f, __l, __a), comp() {
855 std::make_heap(c.begin(), c.end(), comp);
Howard Hinnant3e519522010-05-11 19:42:16856}
857
Arthur O'Dwyer3894a8a2021-03-02 05:23:21858template <class _Tp, class _Container, class _Compare>
Nikolas Klauser76a24722024-02-20 00:47:38859template <
860 class _InputIter,
861 class _Alloc,
862 __enable_if_t<__has_input_iterator_category<_InputIter>::value && uses_allocator<_Container, _Alloc>::value, int> >
Louis Dionne9783f282023-12-18 19:01:33863inline priority_queue<_Tp, _Container, _Compare>::priority_queue(
Nikolas Klauser76a24722024-02-20 00:47:38864 _InputIter __f, _InputIter __l, const value_compare& __comp, const _Alloc& __a)
Louis Dionne9783f282023-12-18 19:01:33865 : c(__f, __l, __a), comp(__comp) {
866 std::make_heap(c.begin(), c.end(), comp);
Arthur O'Dwyer3894a8a2021-03-02 05:23:21867}
868
869template <class _Tp, class _Container, class _Compare>
Nikolas Klauser76a24722024-02-20 00:47:38870template <
871 class _InputIter,
872 class _Alloc,
873 __enable_if_t<__has_input_iterator_category<_InputIter>::value && uses_allocator<_Container, _Alloc>::value, int> >
Louis Dionne9783f282023-12-18 19:01:33874inline priority_queue<_Tp, _Container, _Compare>::priority_queue(
Nikolas Klauser76a24722024-02-20 00:47:38875 _InputIter __f, _InputIter __l, const value_compare& __comp, const container_type& __c, const _Alloc& __a)
Louis Dionne9783f282023-12-18 19:01:33876 : c(__c, __a), comp(__comp) {
877 c.insert(c.end(), __f, __l);
878 std::make_heap(c.begin(), c.end(), comp);
Arthur O'Dwyer3894a8a2021-03-02 05:23:21879}
880
881#ifndef _LIBCPP_CXX03_LANG
882template <class _Tp, class _Container, class _Compare>
Nikolas Klauser76a24722024-02-20 00:47:38883template <
884 class _InputIter,
885 class _Alloc,
886 __enable_if_t<__has_input_iterator_category<_InputIter>::value && uses_allocator<_Container, _Alloc>::value, int> >
Louis Dionne9783f282023-12-18 19:01:33887inline priority_queue<_Tp, _Container, _Compare>::priority_queue(
Nikolas Klauser76a24722024-02-20 00:47:38888 _InputIter __f, _InputIter __l, const value_compare& __comp, container_type&& __c, const _Alloc& __a)
Louis Dionne9783f282023-12-18 19:01:33889 : c(std::move(__c), __a), comp(__comp) {
890 c.insert(c.end(), __f, __l);
891 std::make_heap(c.begin(), c.end(), comp);
Arthur O'Dwyer3894a8a2021-03-02 05:23:21892}
Louis Dionne9783f282023-12-18 19:01:33893#endif // _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16894
895template <class _Tp, class _Container, class _Compare>
Louis Dionne9783f282023-12-18 19:01:33896inline void priority_queue<_Tp, _Container, _Compare>::push(const value_type& __v) {
897 c.push_back(__v);
898 std::push_heap(c.begin(), c.end(), comp);
Howard Hinnant3e519522010-05-11 19:42:16899}
900
Eric Fiselierf5427b22017-04-18 21:23:18901#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16902
903template <class _Tp, class _Container, class _Compare>
Louis Dionne9783f282023-12-18 19:01:33904inline void priority_queue<_Tp, _Container, _Compare>::push(value_type&& __v) {
905 c.push_back(std::move(__v));
906 std::push_heap(c.begin(), c.end(), comp);
Howard Hinnant3e519522010-05-11 19:42:16907}
908
909template <class _Tp, class _Container, class _Compare>
910template <class... _Args>
Louis Dionne9783f282023-12-18 19:01:33911inline void priority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args) {
912 c.emplace_back(std::forward<_Args>(__args)...);
913 std::push_heap(c.begin(), c.end(), comp);
Howard Hinnant3e519522010-05-11 19:42:16914}
915
Louis Dionne4cd6ca12021-04-20 16:03:32916#endif // _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16917
918template <class _Tp, class _Container, class _Compare>
Louis Dionne9783f282023-12-18 19:01:33919inline void priority_queue<_Tp, _Container, _Compare>::pop() {
920 std::pop_heap(c.begin(), c.end(), comp);
921 c.pop_back();
Howard Hinnant3e519522010-05-11 19:42:16922}
923
924template <class _Tp, class _Container, class _Compare>
Louis Dionne9783f282023-12-18 19:01:33925inline void priority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
926 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value&& __is_nothrow_swappable<value_compare>::value) {
927 using std::swap;
928 swap(c, __q.c);
929 swap(comp, __q.comp);
Howard Hinnant3e519522010-05-11 19:42:16930}
931
Louis Dionne9783f282023-12-18 19:01:33932template <class _Tp,
933 class _Container,
934 class _Compare,
Nikolas Klauser9f3e3ef2023-09-02 00:52:02935 __enable_if_t<__is_swappable<_Container>::value && __is_swappable<_Compare>::value, int> = 0>
Louis Dionne9783f282023-12-18 19:01:33936inline _LIBCPP_HIDE_FROM_ABI void
937swap(priority_queue<_Tp, _Container, _Compare>& __x, priority_queue<_Tp, _Container, _Compare>& __y)
938 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) {
939 __x.swap(__y);
Howard Hinnant3e519522010-05-11 19:42:16940}
941
942template <class _Tp, class _Container, class _Compare, class _Alloc>
Eric Fiseliere2f2d1ed2017-01-04 23:56:00943struct _LIBCPP_TEMPLATE_VIS uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
Louis Dionne9783f282023-12-18 19:01:33944 : public uses_allocator<_Container, _Alloc> {};
Howard Hinnant3e519522010-05-11 19:42:16945
946_LIBCPP_END_NAMESPACE_STD
947
Louis Dionne7b462252024-01-25 20:48:46948_LIBCPP_POP_MACROS
949
Nikolas Klauserd5e26772022-09-04 22:01:15950#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
Nikolas Klauser89b356f2022-11-02 19:27:42951# include <concepts>
Nikolas Klauser75196f82023-01-08 15:47:53952# include <cstdlib>
Mark de Wevere31c2a12022-09-02 15:53:28953# include <functional>
Nikolas Klauser0a4aa8a2023-02-12 11:32:36954# include <type_traits>
Mark de Wevere31c2a12022-09-02 15:53:28955#endif
956
Louis Dionne4cd6ca12021-04-20 16:03:32957#endif // _LIBCPP_QUEUE