blob: 6c1b892efadc3d8c83ccef7820089b0e5f957f28 [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
Nikolas Klauser71619e72022-09-22 18:05:08 +0200235
236// [queue.syn]
Nikolas Klausera0e0edb2022-06-16 22:43:46 +0200237#include <compare>
238#include <initializer_list>
239
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000240#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Arthur O'Dwyer6eeaa002022-02-01 20:16:40 -0500241# pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000242#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000243
244_LIBCPP_BEGIN_NAMESPACE_STD
245
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000246template <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS queue;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000247
248template <class _Tp, class _Container>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000249_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000250bool
251operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
252
253template <class _Tp, class _Container>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000254_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000255bool
256operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
257
Marshall Clow9e1b8452015-02-18 17:51:56 +0000258template <class _Tp, class _Container /*= deque<_Tp>*/>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000259class _LIBCPP_TEMPLATE_VIS queue
Howard Hinnantc51e1022010-05-11 19:42:16 +0000260{
261public:
262 typedef _Container container_type;
263 typedef typename container_type::value_type value_type;
264 typedef typename container_type::reference reference;
265 typedef typename container_type::const_reference const_reference;
266 typedef typename container_type::size_type size_type;
Marshall Clowb8825f02016-03-14 17:58:11 +0000267 static_assert((is_same<_Tp, value_type>::value), "" );
Howard Hinnantc51e1022010-05-11 19:42:16 +0000268
269protected:
270 container_type c;
271
272public:
Howard Hinnantf5f99992010-09-22 18:02:38 +0000273 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000274 queue()
275 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
276 : c() {}
277
278 _LIBCPP_INLINE_VISIBILITY
279 queue(const queue& __q) : c(__q.c) {}
280
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100281#if _LIBCPP_STD_VER > 20
282 template <class _InputIterator,
283 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>>
284 _LIBCPP_HIDE_FROM_ABI
285 queue(_InputIterator __first, _InputIterator __last) : c(__first, __last) {}
286
287 template <class _InputIterator,
288 class _Alloc,
289 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
290 class = __enable_if_t<uses_allocator<container_type, _Alloc>::value>>
291 _LIBCPP_HIDE_FROM_ABI
292 queue(_InputIterator __first, _InputIterator __second, const _Alloc& __alloc) : c(__first, __second, __alloc) {}
293#endif
294
Eric Fiselier26081dd2017-04-18 21:23:18 +0000295 _LIBCPP_INLINE_VISIBILITY
296 queue& operator=(const queue& __q) {c = __q.c; return *this;}
297
298#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000299 _LIBCPP_INLINE_VISIBILITY
300 queue(queue&& __q)
301 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000302 : c(_VSTD::move(__q.c)) {}
Howard Hinnantbf438282011-06-04 21:32:33 +0000303
304 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000305 queue& operator=(queue&& __q)
306 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000307 {c = _VSTD::move(__q.c); return *this;}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400308#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000309
Howard Hinnantf5f99992010-09-22 18:02:38 +0000310 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000311 explicit queue(const container_type& __c) : c(__c) {}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000312#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000313 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000314 explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400315#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000316 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000317 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000318 explicit queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400319 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000320 : c(__a) {}
321 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000322 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000323 queue(const queue& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400324 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000325 : c(__q.c, __a) {}
326 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000327 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000328 queue(const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400329 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000330 : c(__c, __a) {}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000331#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000332 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000333 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000334 queue(container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400335 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000336 : c(_VSTD::move(__c), __a) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000338 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000339 queue(queue&& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400340 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000341 : c(_VSTD::move(__q.c), __a) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000342
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400343#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000344
Marshall Clow425f5752017-11-15 05:51:26 +0000345 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000346 bool empty() const {return c.empty();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000347 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000348 size_type size() const {return c.size();}
349
Howard Hinnantf5f99992010-09-22 18:02:38 +0000350 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000351 reference front() {return c.front();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000352 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000353 const_reference front() const {return c.front();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000354 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000355 reference back() {return c.back();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000356 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000357 const_reference back() const {return c.back();}
358
Howard Hinnantf5f99992010-09-22 18:02:38 +0000359 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000360 void push(const value_type& __v) {c.push_back(__v);}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000361#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000362 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000363 void push(value_type&& __v) {c.push_back(_VSTD::move(__v));}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000364 template <class... _Args>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000365 _LIBCPP_INLINE_VISIBILITY
Marshall Clowea52cc42017-01-24 23:09:12 +0000366#if _LIBCPP_STD_VER > 14
Marshall Clow88746852018-01-24 22:42:25 +0000367 decltype(auto) emplace(_Args&&... __args)
Eric Fiselier34ba5b92016-07-21 03:20:17 +0000368 { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
Marshall Clowea52cc42017-01-24 23:09:12 +0000369#else
370 void emplace(_Args&&... __args)
371 { c.emplace_back(_VSTD::forward<_Args>(__args)...);}
372#endif
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400373#endif // _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000374 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000375 void pop() {c.pop_front();}
376
Howard Hinnantf5f99992010-09-22 18:02:38 +0000377 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000378 void swap(queue& __q)
Howard Hinnantbf438282011-06-04 21:32:33 +0000379 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000380 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000381 using _VSTD::swap;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000382 swap(c, __q.c);
383 }
384
Mark de Wever73b8b012022-05-05 18:57:32 +0200385 _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI const _Container& __get_container() const { return c; }
386
Howard Hinnantc51e1022010-05-11 19:42:16 +0000387 template <class _T1, class _C1>
388 friend
Howard Hinnantf5f99992010-09-22 18:02:38 +0000389 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000390 bool
391 operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000392
Howard Hinnantc51e1022010-05-11 19:42:16 +0000393 template <class _T1, class _C1>
394 friend
Howard Hinnantf5f99992010-09-22 18:02:38 +0000395 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000396 bool
397 operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
398};
399
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100400#if _LIBCPP_STD_VER > 14
Marshall Clow592d9952018-05-22 01:57:53 +0000401template<class _Container,
Louis Dionne25547162021-08-17 12:26:09 -0400402 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000403>
404queue(_Container)
405 -> queue<typename _Container::value_type, _Container>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000406
Marshall Clow592d9952018-05-22 01:57:53 +0000407template<class _Container,
408 class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400409 class = enable_if_t<!__is_allocator<_Container>::value>,
410 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000411>
412queue(_Container, _Alloc)
413 -> queue<typename _Container::value_type, _Container>;
414#endif
415
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100416#if _LIBCPP_STD_VER > 20
417template <class _InputIterator,
418 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>>
419queue(_InputIterator, _InputIterator)
420 -> queue<__iter_value_type<_InputIterator>>;
421
422template <class _InputIterator,
423 class _Alloc,
424 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
425 class = __enable_if_t<__is_allocator<_Alloc>::value>>
426queue(_InputIterator, _InputIterator, _Alloc)
427 -> queue<__iter_value_type<_InputIterator>, deque<__iter_value_type<_InputIterator>, _Alloc>>;
428#endif
429
Howard Hinnantc51e1022010-05-11 19:42:16 +0000430template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000431inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000432bool
433operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
434{
435 return __x.c == __y.c;
436}
437
438template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000439inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000440bool
441operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
442{
443 return __x.c < __y.c;
444}
445
446template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000447inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000448bool
449operator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
450{
451 return !(__x == __y);
452}
453
454template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000455inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000456bool
457operator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
458{
459 return __y < __x;
460}
461
462template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000463inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000464bool
465operator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
466{
467 return !(__x < __y);
468}
469
470template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000471inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000472bool
473operator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
474{
475 return !(__y < __x);
476}
477
478template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000479inline _LIBCPP_INLINE_VISIBILITY
Louis Dionne9ce598d2021-09-08 09:14:43 -0400480__enable_if_t<__is_swappable<_Container>::value, void>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000481swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
Howard Hinnantbf438282011-06-04 21:32:33 +0000482 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000483{
484 __x.swap(__y);
485}
486
487template <class _Tp, class _Container, class _Alloc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000488struct _LIBCPP_TEMPLATE_VIS uses_allocator<queue<_Tp, _Container>, _Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000489 : public uses_allocator<_Container, _Alloc>
490{
491};
492
493template <class _Tp, class _Container = vector<_Tp>,
494 class _Compare = less<typename _Container::value_type> >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000495class _LIBCPP_TEMPLATE_VIS priority_queue
Howard Hinnantc51e1022010-05-11 19:42:16 +0000496{
497public:
498 typedef _Container container_type;
499 typedef _Compare value_compare;
500 typedef typename container_type::value_type value_type;
501 typedef typename container_type::reference reference;
502 typedef typename container_type::const_reference const_reference;
503 typedef typename container_type::size_type size_type;
Marshall Clowb8825f02016-03-14 17:58:11 +0000504 static_assert((is_same<_Tp, value_type>::value), "" );
Howard Hinnantc51e1022010-05-11 19:42:16 +0000505
506protected:
507 container_type c;
508 value_compare comp;
509
510public:
Howard Hinnantf5f99992010-09-22 18:02:38 +0000511 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000512 priority_queue()
513 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value &&
514 is_nothrow_default_constructible<value_compare>::value)
515 : c(), comp() {}
516
517 _LIBCPP_INLINE_VISIBILITY
518 priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
519
Eric Fiselier26081dd2017-04-18 21:23:18 +0000520 _LIBCPP_INLINE_VISIBILITY
521 priority_queue& operator=(const priority_queue& __q)
522 {c = __q.c; comp = __q.comp; return *this;}
523
524#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000525 _LIBCPP_INLINE_VISIBILITY
526 priority_queue(priority_queue&& __q)
527 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value &&
528 is_nothrow_move_constructible<value_compare>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000529 : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {}
Howard Hinnantbf438282011-06-04 21:32:33 +0000530
531 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000532 priority_queue& operator=(priority_queue&& __q)
533 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value &&
534 is_nothrow_move_assignable<value_compare>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000535 {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400536#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000537
538 _LIBCPP_INLINE_VISIBILITY
539 explicit priority_queue(const value_compare& __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000540 : c(), comp(__comp) {}
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000541 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542 priority_queue(const value_compare& __comp, const container_type& __c);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000543#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000544 _LIBCPP_INLINE_VISIBILITY
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +0100545 priority_queue(const value_compare& __comp, container_type&& __c);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000546#endif
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 = value_compare());
Louis Dionne9ce598d2021-09-08 09:14:43 -0400551 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000552 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000553 priority_queue(_InputIter __f, _InputIter __l,
554 const value_compare& __comp, const container_type& __c);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000555#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9ce598d2021-09-08 09:14:43 -0400556 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000557 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000558 priority_queue(_InputIter __f, _InputIter __l,
559 const value_compare& __comp, container_type&& __c);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400560#endif // _LIBCPP_CXX03_LANG
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 explicit priority_queue(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 _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400568 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000569 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000570 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000571 priority_queue(const value_compare& __comp, const container_type& __c,
572 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400573 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000574 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000575 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000576 priority_queue(const priority_queue& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400577 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000578#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000579 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000580 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000581 priority_queue(const value_compare& __comp, container_type&& __c,
582 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400583 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000584 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000585 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000586 priority_queue(priority_queue&& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400587 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400588#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000589
Louis Dionne9ce598d2021-09-08 09:14:43 -0400590 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500591 _LIBCPP_INLINE_VISIBILITY
592 priority_queue(_InputIter __f, _InputIter __l, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400593 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500594
Louis Dionne9ce598d2021-09-08 09:14:43 -0400595 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500596 _LIBCPP_INLINE_VISIBILITY
597 priority_queue(_InputIter __f, _InputIter __l,
598 const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400599 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500600
Louis Dionne9ce598d2021-09-08 09:14:43 -0400601 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500602 _LIBCPP_INLINE_VISIBILITY
603 priority_queue(_InputIter __f, _InputIter __l,
604 const value_compare& __comp, const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400605 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500606
607#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9ce598d2021-09-08 09:14:43 -0400608 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500609 _LIBCPP_INLINE_VISIBILITY
610 priority_queue(_InputIter __f, _InputIter __l,
611 const value_compare& __comp, container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400612 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500613#endif // _LIBCPP_CXX03_LANG
614
Marshall Clow425f5752017-11-15 05:51:26 +0000615 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000616 bool empty() const {return c.empty();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000617 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000618 size_type size() const {return c.size();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000619 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000620 const_reference top() const {return c.front();}
621
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000622 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000623 void push(const value_type& __v);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000624#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000625 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000626 void push(value_type&& __v);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000627 template <class... _Args>
628 _LIBCPP_INLINE_VISIBILITY
629 void emplace(_Args&&... __args);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400630#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000631 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000632 void pop();
633
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000634 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000635 void swap(priority_queue& __q)
636 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
637 __is_nothrow_swappable<value_compare>::value);
Mark de Wever73b8b012022-05-05 18:57:32 +0200638
639 _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI const _Container& __get_container() const { return c; }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000640};
641
Louis Dionned59f8a52021-08-17 11:59:07 -0400642#if _LIBCPP_STD_VER >= 17
Marshall Clow592d9952018-05-22 01:57:53 +0000643template <class _Compare,
644 class _Container,
Louis Dionne25547162021-08-17 12:26:09 -0400645 class = enable_if_t<!__is_allocator<_Compare>::value>,
646 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000647>
648priority_queue(_Compare, _Container)
649 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000650
651template<class _InputIterator,
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500652 class _Compare = less<__iter_value_type<_InputIterator>>,
653 class _Container = vector<__iter_value_type<_InputIterator>>,
Louis Dionne25547162021-08-17 12:26:09 -0400654 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
655 class = enable_if_t<!__is_allocator<_Compare>::value>,
656 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000657>
658priority_queue(_InputIterator, _InputIterator, _Compare = _Compare(), _Container = _Container())
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500659 -> priority_queue<__iter_value_type<_InputIterator>, _Container, _Compare>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000660
661template<class _Compare,
Marshall Clow592d9952018-05-22 01:57:53 +0000662 class _Container,
663 class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400664 class = enable_if_t<!__is_allocator<_Compare>::value>,
665 class = enable_if_t<!__is_allocator<_Container>::value>,
666 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000667>
668priority_queue(_Compare, _Container, _Alloc)
669 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500670
671template<class _InputIterator, class _Allocator,
Louis Dionne25547162021-08-17 12:26:09 -0400672 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
673 class = enable_if_t<__is_allocator<_Allocator>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500674>
675priority_queue(_InputIterator, _InputIterator, _Allocator)
676 -> priority_queue<__iter_value_type<_InputIterator>,
677 vector<__iter_value_type<_InputIterator>, _Allocator>,
678 less<__iter_value_type<_InputIterator>>>;
679
680template<class _InputIterator, class _Compare, class _Allocator,
Louis Dionne25547162021-08-17 12:26:09 -0400681 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
682 class = enable_if_t<!__is_allocator<_Compare>::value>,
683 class = enable_if_t<__is_allocator<_Allocator>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500684>
685priority_queue(_InputIterator, _InputIterator, _Compare, _Allocator)
686 -> priority_queue<__iter_value_type<_InputIterator>,
687 vector<__iter_value_type<_InputIterator>, _Allocator>, _Compare>;
688
689template<class _InputIterator, class _Compare, class _Container, class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400690 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
691 class = enable_if_t<!__is_allocator<_Compare>::value>,
692 class = enable_if_t<!__is_allocator<_Container>::value>,
693 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500694>
695priority_queue(_InputIterator, _InputIterator, _Compare, _Container, _Alloc)
696 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Marshall Clow592d9952018-05-22 01:57:53 +0000697#endif
698
Howard Hinnantc51e1022010-05-11 19:42:16 +0000699template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000700inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000701priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
702 const container_type& __c)
703 : c(__c),
704 comp(__comp)
705{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000706 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000707}
708
Eric Fiselier26081dd2017-04-18 21:23:18 +0000709#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000710
711template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000712inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000713priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
714 container_type&& __c)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000715 : c(_VSTD::move(__c)),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000716 comp(__comp)
717{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000718 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000719}
720
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400721#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000722
723template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500724template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000725inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000726priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
727 const value_compare& __comp)
728 : c(__f, __l),
729 comp(__comp)
730{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000731 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000732}
733
734template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500735template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000736inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000737priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
738 const value_compare& __comp,
739 const container_type& __c)
740 : c(__c),
741 comp(__comp)
742{
743 c.insert(c.end(), __f, __l);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000744 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000745}
746
Eric Fiselier26081dd2017-04-18 21:23:18 +0000747#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000748
749template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500750template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000751inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000752priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
753 const value_compare& __comp,
754 container_type&& __c)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000755 : c(_VSTD::move(__c)),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000756 comp(__comp)
757{
758 c.insert(c.end(), __f, __l);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000759 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000760}
761
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400762#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000763
764template <class _Tp, class _Container, class _Compare>
765template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000766inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000767priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400768 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000769 : c(__a)
770{
771}
772
773template <class _Tp, class _Container, class _Compare>
774template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000775inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000776priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
777 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400778 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000779 : c(__a),
780 comp(__comp)
781{
782}
783
784template <class _Tp, class _Container, class _Compare>
785template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000786inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000787priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
788 const container_type& __c,
789 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400790 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000791 : c(__c, __a),
792 comp(__comp)
793{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000794 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000795}
796
797template <class _Tp, class _Container, class _Compare>
798template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000799inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000800priority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
801 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400802 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000803 : c(__q.c, __a),
804 comp(__q.comp)
805{
Howard Hinnantc51e1022010-05-11 19:42:16 +0000806}
807
Eric Fiselier26081dd2017-04-18 21:23:18 +0000808#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000809
810template <class _Tp, class _Container, class _Compare>
811template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000812inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000813priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
814 container_type&& __c,
815 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400816 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000817 : c(_VSTD::move(__c), __a),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000818 comp(__comp)
819{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000820 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000821}
822
Howard Hinnantc51e1022010-05-11 19:42:16 +0000823template <class _Tp, class _Container, class _Compare>
824template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000825inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000826priority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
827 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400828 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000829 : c(_VSTD::move(__q.c), __a),
830 comp(_VSTD::move(__q.comp))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000831{
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500832}
833
834#endif // _LIBCPP_CXX03_LANG
835
836template <class _Tp, class _Container, class _Compare>
837template <class _InputIter, class _Alloc, class>
838inline
839priority_queue<_Tp, _Container, _Compare>::priority_queue(
840 _InputIter __f, _InputIter __l, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400841 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500842 : c(__f, __l, __a),
843 comp()
844{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000845 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000846}
847
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500848template <class _Tp, class _Container, class _Compare>
849template <class _InputIter, class _Alloc, class>
850inline
851priority_queue<_Tp, _Container, _Compare>::priority_queue(
852 _InputIter __f, _InputIter __l,
853 const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400854 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500855 : c(__f, __l, __a),
856 comp(__comp)
857{
858 _VSTD::make_heap(c.begin(), c.end(), comp);
859}
860
861template <class _Tp, class _Container, class _Compare>
862template <class _InputIter, class _Alloc, class>
863inline
864priority_queue<_Tp, _Container, _Compare>::priority_queue(
865 _InputIter __f, _InputIter __l,
866 const value_compare& __comp, const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400867 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500868 : c(__c, __a),
869 comp(__comp)
870{
871 c.insert(c.end(), __f, __l);
872 _VSTD::make_heap(c.begin(), c.end(), comp);
873}
874
875#ifndef _LIBCPP_CXX03_LANG
876template <class _Tp, class _Container, class _Compare>
877template <class _InputIter, class _Alloc, class>
878inline
879priority_queue<_Tp, _Container, _Compare>::priority_queue(
880 _InputIter __f, _InputIter __l, const value_compare& __comp,
881 container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400882 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500883 : c(_VSTD::move(__c), __a),
884 comp(__comp)
885{
886 c.insert(c.end(), __f, __l);
887 _VSTD::make_heap(c.begin(), c.end(), comp);
888}
889#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000890
891template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000892inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000893void
894priority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
895{
896 c.push_back(__v);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000897 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000898}
899
Eric Fiselier26081dd2017-04-18 21:23:18 +0000900#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000901
902template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000903inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000904void
905priority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
906{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000907 c.push_back(_VSTD::move(__v));
908 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000909}
910
911template <class _Tp, class _Container, class _Compare>
912template <class... _Args>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000913inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000914void
915priority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
916{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000917 c.emplace_back(_VSTD::forward<_Args>(__args)...);
918 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000919}
920
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400921#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000922
923template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000924inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000925void
926priority_queue<_Tp, _Container, _Compare>::pop()
927{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000928 _VSTD::pop_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000929 c.pop_back();
930}
931
932template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000933inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000934void
935priority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
Howard Hinnantbf438282011-06-04 21:32:33 +0000936 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
937 __is_nothrow_swappable<value_compare>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000938{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000939 using _VSTD::swap;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000940 swap(c, __q.c);
941 swap(comp, __q.comp);
942}
943
944template <class _Tp, class _Container, class _Compare>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000945inline _LIBCPP_INLINE_VISIBILITY
Louis Dionne9ce598d2021-09-08 09:14:43 -0400946__enable_if_t<
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500947 __is_swappable<_Container>::value && __is_swappable<_Compare>::value,
Eric Fiselier6bfed252016-04-21 23:38:59 +0000948 void
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500949>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000950swap(priority_queue<_Tp, _Container, _Compare>& __x,
951 priority_queue<_Tp, _Container, _Compare>& __y)
Howard Hinnantbf438282011-06-04 21:32:33 +0000952 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000953{
954 __x.swap(__y);
955}
956
957template <class _Tp, class _Container, class _Compare, class _Alloc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000958struct _LIBCPP_TEMPLATE_VIS uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000959 : public uses_allocator<_Container, _Alloc>
960{
961};
962
963_LIBCPP_END_NAMESPACE_STD
964
Nikolas Klauser0b5df932022-09-05 00:01:15 +0200965#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
Nikolas Klauser1e4ae5d2022-11-02 20:27:42 +0100966# include <concepts>
Mark de Weveree5fe272022-09-02 17:53:28 +0200967# include <functional>
968#endif
969
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400970#endif // _LIBCPP_QUEUE