blob: da5d63077b26ba3dced77bfaf05c97f3563e6b1e [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>
Arthur O'Dwyer7deec122021-03-24 18:19:12 -0400229#include <compare>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000230#include <deque>
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100231#include <type_traits>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400232#include <vector>
Mark de Weverce8f12c2021-12-22 18:14:14 +0100233#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000234
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000235#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Arthur O'Dwyer6eeaa002022-02-01 20:16:40 -0500236# pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000237#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000238
239_LIBCPP_BEGIN_NAMESPACE_STD
240
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000241template <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS queue;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000242
243template <class _Tp, class _Container>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000244_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000245bool
246operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
247
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
Marshall Clow9e1b8452015-02-18 17:51:56 +0000253template <class _Tp, class _Container /*= deque<_Tp>*/>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000254class _LIBCPP_TEMPLATE_VIS queue
Howard Hinnantc51e1022010-05-11 19:42:16 +0000255{
256public:
257 typedef _Container container_type;
258 typedef typename container_type::value_type value_type;
259 typedef typename container_type::reference reference;
260 typedef typename container_type::const_reference const_reference;
261 typedef typename container_type::size_type size_type;
Marshall Clowb8825f02016-03-14 17:58:11 +0000262 static_assert((is_same<_Tp, value_type>::value), "" );
Howard Hinnantc51e1022010-05-11 19:42:16 +0000263
264protected:
265 container_type c;
266
267public:
Howard Hinnantf5f99992010-09-22 18:02:38 +0000268 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000269 queue()
270 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
271 : c() {}
272
273 _LIBCPP_INLINE_VISIBILITY
274 queue(const queue& __q) : c(__q.c) {}
275
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100276#if _LIBCPP_STD_VER > 20
277 template <class _InputIterator,
278 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>>
279 _LIBCPP_HIDE_FROM_ABI
280 queue(_InputIterator __first, _InputIterator __last) : c(__first, __last) {}
281
282 template <class _InputIterator,
283 class _Alloc,
284 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
285 class = __enable_if_t<uses_allocator<container_type, _Alloc>::value>>
286 _LIBCPP_HIDE_FROM_ABI
287 queue(_InputIterator __first, _InputIterator __second, const _Alloc& __alloc) : c(__first, __second, __alloc) {}
288#endif
289
Eric Fiselier26081dd2017-04-18 21:23:18 +0000290 _LIBCPP_INLINE_VISIBILITY
291 queue& operator=(const queue& __q) {c = __q.c; return *this;}
292
293#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000294 _LIBCPP_INLINE_VISIBILITY
295 queue(queue&& __q)
296 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000297 : c(_VSTD::move(__q.c)) {}
Howard Hinnantbf438282011-06-04 21:32:33 +0000298
299 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000300 queue& operator=(queue&& __q)
301 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000302 {c = _VSTD::move(__q.c); return *this;}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400303#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000304
Howard Hinnantf5f99992010-09-22 18:02:38 +0000305 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000306 explicit queue(const container_type& __c) : c(__c) {}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000307#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000308 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000309 explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400310#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000311 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000312 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000313 explicit queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400314 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000315 : c(__a) {}
316 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000317 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000318 queue(const queue& __q, 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(__q.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 container_type& __c, 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(__c, __a) {}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000326#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000327 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000328 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000329 queue(container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400330 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000331 : c(_VSTD::move(__c), __a) {}
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(queue&& __q, 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(__q.c), __a) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400338#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000339
Marshall Clow425f5752017-11-15 05:51:26 +0000340 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000341 bool empty() const {return c.empty();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000342 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000343 size_type size() const {return c.size();}
344
Howard Hinnantf5f99992010-09-22 18:02:38 +0000345 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000346 reference front() {return c.front();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000347 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000348 const_reference front() const {return c.front();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000349 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000350 reference back() {return c.back();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000351 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000352 const_reference back() const {return c.back();}
353
Howard Hinnantf5f99992010-09-22 18:02:38 +0000354 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000355 void push(const value_type& __v) {c.push_back(__v);}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000356#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000357 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000358 void push(value_type&& __v) {c.push_back(_VSTD::move(__v));}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000359 template <class... _Args>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000360 _LIBCPP_INLINE_VISIBILITY
Marshall Clowea52cc42017-01-24 23:09:12 +0000361#if _LIBCPP_STD_VER > 14
Marshall Clow88746852018-01-24 22:42:25 +0000362 decltype(auto) emplace(_Args&&... __args)
Eric Fiselier34ba5b92016-07-21 03:20:17 +0000363 { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
Marshall Clowea52cc42017-01-24 23:09:12 +0000364#else
365 void emplace(_Args&&... __args)
366 { c.emplace_back(_VSTD::forward<_Args>(__args)...);}
367#endif
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400368#endif // _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000369 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000370 void pop() {c.pop_front();}
371
Howard Hinnantf5f99992010-09-22 18:02:38 +0000372 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000373 void swap(queue& __q)
Howard Hinnantbf438282011-06-04 21:32:33 +0000374 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000375 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000376 using _VSTD::swap;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000377 swap(c, __q.c);
378 }
379
380 template <class _T1, class _C1>
381 friend
Howard Hinnantf5f99992010-09-22 18:02:38 +0000382 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000383 bool
384 operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000385
Howard Hinnantc51e1022010-05-11 19:42:16 +0000386 template <class _T1, class _C1>
387 friend
Howard Hinnantf5f99992010-09-22 18:02:38 +0000388 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000389 bool
390 operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
391};
392
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100393#if _LIBCPP_STD_VER > 14
Marshall Clow592d9952018-05-22 01:57:53 +0000394template<class _Container,
Louis Dionne25547162021-08-17 12:26:09 -0400395 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000396>
397queue(_Container)
398 -> queue<typename _Container::value_type, _Container>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000399
Marshall Clow592d9952018-05-22 01:57:53 +0000400template<class _Container,
401 class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400402 class = enable_if_t<!__is_allocator<_Container>::value>,
403 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000404>
405queue(_Container, _Alloc)
406 -> queue<typename _Container::value_type, _Container>;
407#endif
408
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100409#if _LIBCPP_STD_VER > 20
410template <class _InputIterator,
411 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>>
412queue(_InputIterator, _InputIterator)
413 -> queue<__iter_value_type<_InputIterator>>;
414
415template <class _InputIterator,
416 class _Alloc,
417 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
418 class = __enable_if_t<__is_allocator<_Alloc>::value>>
419queue(_InputIterator, _InputIterator, _Alloc)
420 -> queue<__iter_value_type<_InputIterator>, deque<__iter_value_type<_InputIterator>, _Alloc>>;
421#endif
422
Howard Hinnantc51e1022010-05-11 19:42:16 +0000423template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000424inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000425bool
426operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
427{
428 return __x.c == __y.c;
429}
430
431template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000432inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000433bool
434operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
435{
436 return __x.c < __y.c;
437}
438
439template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000440inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000441bool
442operator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
443{
444 return !(__x == __y);
445}
446
447template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000448inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000449bool
450operator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
451{
452 return __y < __x;
453}
454
455template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000456inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000457bool
458operator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
459{
460 return !(__x < __y);
461}
462
463template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000464inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000465bool
466operator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
467{
468 return !(__y < __x);
469}
470
471template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000472inline _LIBCPP_INLINE_VISIBILITY
Louis Dionne9ce598d2021-09-08 09:14:43 -0400473__enable_if_t<__is_swappable<_Container>::value, void>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000474swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
Howard Hinnantbf438282011-06-04 21:32:33 +0000475 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000476{
477 __x.swap(__y);
478}
479
480template <class _Tp, class _Container, class _Alloc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000481struct _LIBCPP_TEMPLATE_VIS uses_allocator<queue<_Tp, _Container>, _Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000482 : public uses_allocator<_Container, _Alloc>
483{
484};
485
486template <class _Tp, class _Container = vector<_Tp>,
487 class _Compare = less<typename _Container::value_type> >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000488class _LIBCPP_TEMPLATE_VIS priority_queue
Howard Hinnantc51e1022010-05-11 19:42:16 +0000489{
490public:
491 typedef _Container container_type;
492 typedef _Compare value_compare;
493 typedef typename container_type::value_type value_type;
494 typedef typename container_type::reference reference;
495 typedef typename container_type::const_reference const_reference;
496 typedef typename container_type::size_type size_type;
Marshall Clowb8825f02016-03-14 17:58:11 +0000497 static_assert((is_same<_Tp, value_type>::value), "" );
Howard Hinnantc51e1022010-05-11 19:42:16 +0000498
499protected:
500 container_type c;
501 value_compare comp;
502
503public:
Howard Hinnantf5f99992010-09-22 18:02:38 +0000504 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000505 priority_queue()
506 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value &&
507 is_nothrow_default_constructible<value_compare>::value)
508 : c(), comp() {}
509
510 _LIBCPP_INLINE_VISIBILITY
511 priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
512
Eric Fiselier26081dd2017-04-18 21:23:18 +0000513 _LIBCPP_INLINE_VISIBILITY
514 priority_queue& operator=(const priority_queue& __q)
515 {c = __q.c; comp = __q.comp; return *this;}
516
517#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000518 _LIBCPP_INLINE_VISIBILITY
519 priority_queue(priority_queue&& __q)
520 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value &&
521 is_nothrow_move_constructible<value_compare>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000522 : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {}
Howard Hinnantbf438282011-06-04 21:32:33 +0000523
524 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000525 priority_queue& operator=(priority_queue&& __q)
526 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value &&
527 is_nothrow_move_assignable<value_compare>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000528 {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400529#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000530
531 _LIBCPP_INLINE_VISIBILITY
532 explicit priority_queue(const value_compare& __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000533 : c(), comp(__comp) {}
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000534 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000535 priority_queue(const value_compare& __comp, const container_type& __c);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000536#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000537 _LIBCPP_INLINE_VISIBILITY
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +0100538 priority_queue(const value_compare& __comp, container_type&& __c);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000539#endif
Louis Dionne9ce598d2021-09-08 09:14:43 -0400540 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000541 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542 priority_queue(_InputIter __f, _InputIter __l,
543 const value_compare& __comp = value_compare());
Louis Dionne9ce598d2021-09-08 09:14:43 -0400544 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000545 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000546 priority_queue(_InputIter __f, _InputIter __l,
547 const value_compare& __comp, const container_type& __c);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000548#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9ce598d2021-09-08 09:14:43 -0400549 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000550 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000551 priority_queue(_InputIter __f, _InputIter __l,
552 const value_compare& __comp, container_type&& __c);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400553#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000554 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000555 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000556 explicit priority_queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400557 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000558 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000559 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000560 priority_queue(const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400561 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000562 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000563 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000564 priority_queue(const value_compare& __comp, const container_type& __c,
565 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400566 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000567 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000568 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000569 priority_queue(const priority_queue& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400570 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000571#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000572 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000573 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000574 priority_queue(const value_compare& __comp, container_type&& __c,
575 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400576 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000577 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000578 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000579 priority_queue(priority_queue&& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400580 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400581#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000582
Louis Dionne9ce598d2021-09-08 09:14:43 -0400583 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500584 _LIBCPP_INLINE_VISIBILITY
585 priority_queue(_InputIter __f, _InputIter __l, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400586 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500587
Louis Dionne9ce598d2021-09-08 09:14:43 -0400588 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500589 _LIBCPP_INLINE_VISIBILITY
590 priority_queue(_InputIter __f, _InputIter __l,
591 const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400592 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500593
Louis Dionne9ce598d2021-09-08 09:14:43 -0400594 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500595 _LIBCPP_INLINE_VISIBILITY
596 priority_queue(_InputIter __f, _InputIter __l,
597 const value_compare& __comp, const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400598 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500599
600#ifndef _LIBCPP_CXX03_LANG
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, 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#endif // _LIBCPP_CXX03_LANG
607
Marshall Clow425f5752017-11-15 05:51:26 +0000608 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000609 bool empty() const {return c.empty();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000610 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000611 size_type size() const {return c.size();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000612 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000613 const_reference top() const {return c.front();}
614
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000615 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000616 void push(const value_type& __v);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000617#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000618 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000619 void push(value_type&& __v);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000620 template <class... _Args>
621 _LIBCPP_INLINE_VISIBILITY
622 void emplace(_Args&&... __args);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400623#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000624 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000625 void pop();
626
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000627 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000628 void swap(priority_queue& __q)
629 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
630 __is_nothrow_swappable<value_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000631};
632
Louis Dionned59f8a52021-08-17 11:59:07 -0400633#if _LIBCPP_STD_VER >= 17
Marshall Clow592d9952018-05-22 01:57:53 +0000634template <class _Compare,
635 class _Container,
Louis Dionne25547162021-08-17 12:26:09 -0400636 class = enable_if_t<!__is_allocator<_Compare>::value>,
637 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000638>
639priority_queue(_Compare, _Container)
640 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000641
642template<class _InputIterator,
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500643 class _Compare = less<__iter_value_type<_InputIterator>>,
644 class _Container = vector<__iter_value_type<_InputIterator>>,
Louis Dionne25547162021-08-17 12:26:09 -0400645 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
646 class = enable_if_t<!__is_allocator<_Compare>::value>,
647 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000648>
649priority_queue(_InputIterator, _InputIterator, _Compare = _Compare(), _Container = _Container())
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500650 -> priority_queue<__iter_value_type<_InputIterator>, _Container, _Compare>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000651
652template<class _Compare,
Marshall Clow592d9952018-05-22 01:57:53 +0000653 class _Container,
654 class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400655 class = enable_if_t<!__is_allocator<_Compare>::value>,
656 class = enable_if_t<!__is_allocator<_Container>::value>,
657 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000658>
659priority_queue(_Compare, _Container, _Alloc)
660 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500661
662template<class _InputIterator, class _Allocator,
Louis Dionne25547162021-08-17 12:26:09 -0400663 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
664 class = enable_if_t<__is_allocator<_Allocator>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500665>
666priority_queue(_InputIterator, _InputIterator, _Allocator)
667 -> priority_queue<__iter_value_type<_InputIterator>,
668 vector<__iter_value_type<_InputIterator>, _Allocator>,
669 less<__iter_value_type<_InputIterator>>>;
670
671template<class _InputIterator, class _Compare, 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<_Compare>::value>,
674 class = enable_if_t<__is_allocator<_Allocator>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500675>
676priority_queue(_InputIterator, _InputIterator, _Compare, _Allocator)
677 -> priority_queue<__iter_value_type<_InputIterator>,
678 vector<__iter_value_type<_InputIterator>, _Allocator>, _Compare>;
679
680template<class _InputIterator, class _Compare, class _Container, class _Alloc,
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<_Container>::value>,
684 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500685>
686priority_queue(_InputIterator, _InputIterator, _Compare, _Container, _Alloc)
687 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Marshall Clow592d9952018-05-22 01:57:53 +0000688#endif
689
Howard Hinnantc51e1022010-05-11 19:42:16 +0000690template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000691inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000692priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
693 const container_type& __c)
694 : c(__c),
695 comp(__comp)
696{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000697 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000698}
699
Eric Fiselier26081dd2017-04-18 21:23:18 +0000700#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000701
702template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000703inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000704priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
705 container_type&& __c)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000706 : c(_VSTD::move(__c)),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000707 comp(__comp)
708{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000709 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000710}
711
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400712#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000713
714template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500715template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000716inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000717priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
718 const value_compare& __comp)
719 : c(__f, __l),
720 comp(__comp)
721{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000722 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000723}
724
725template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500726template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000727inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000728priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
729 const value_compare& __comp,
730 const container_type& __c)
731 : c(__c),
732 comp(__comp)
733{
734 c.insert(c.end(), __f, __l);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000735 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000736}
737
Eric Fiselier26081dd2017-04-18 21:23:18 +0000738#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000739
740template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500741template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000742inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000743priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
744 const value_compare& __comp,
745 container_type&& __c)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000746 : c(_VSTD::move(__c)),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000747 comp(__comp)
748{
749 c.insert(c.end(), __f, __l);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000750 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000751}
752
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400753#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000754
755template <class _Tp, class _Container, class _Compare>
756template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000757inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000758priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400759 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000760 : c(__a)
761{
762}
763
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 value_compare& __comp,
768 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400769 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000770 : c(__a),
771 comp(__comp)
772{
773}
774
775template <class _Tp, class _Container, class _Compare>
776template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000777inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000778priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
779 const container_type& __c,
780 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400781 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000782 : c(__c, __a),
783 comp(__comp)
784{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000785 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000786}
787
788template <class _Tp, class _Container, class _Compare>
789template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000790inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000791priority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
792 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400793 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000794 : c(__q.c, __a),
795 comp(__q.comp)
796{
Howard Hinnantc51e1022010-05-11 19:42:16 +0000797}
798
Eric Fiselier26081dd2017-04-18 21:23:18 +0000799#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000800
801template <class _Tp, class _Container, class _Compare>
802template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000803inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000804priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
805 container_type&& __c,
806 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400807 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000808 : c(_VSTD::move(__c), __a),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000809 comp(__comp)
810{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000811 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000812}
813
Howard Hinnantc51e1022010-05-11 19:42:16 +0000814template <class _Tp, class _Container, class _Compare>
815template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000816inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000817priority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
818 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400819 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000820 : c(_VSTD::move(__q.c), __a),
821 comp(_VSTD::move(__q.comp))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000822{
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500823}
824
825#endif // _LIBCPP_CXX03_LANG
826
827template <class _Tp, class _Container, class _Compare>
828template <class _InputIter, class _Alloc, class>
829inline
830priority_queue<_Tp, _Container, _Compare>::priority_queue(
831 _InputIter __f, _InputIter __l, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400832 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500833 : c(__f, __l, __a),
834 comp()
835{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000836 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000837}
838
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500839template <class _Tp, class _Container, class _Compare>
840template <class _InputIter, class _Alloc, class>
841inline
842priority_queue<_Tp, _Container, _Compare>::priority_queue(
843 _InputIter __f, _InputIter __l,
844 const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400845 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500846 : c(__f, __l, __a),
847 comp(__comp)
848{
849 _VSTD::make_heap(c.begin(), c.end(), comp);
850}
851
852template <class _Tp, class _Container, class _Compare>
853template <class _InputIter, class _Alloc, class>
854inline
855priority_queue<_Tp, _Container, _Compare>::priority_queue(
856 _InputIter __f, _InputIter __l,
857 const value_compare& __comp, const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400858 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500859 : c(__c, __a),
860 comp(__comp)
861{
862 c.insert(c.end(), __f, __l);
863 _VSTD::make_heap(c.begin(), c.end(), comp);
864}
865
866#ifndef _LIBCPP_CXX03_LANG
867template <class _Tp, class _Container, class _Compare>
868template <class _InputIter, class _Alloc, class>
869inline
870priority_queue<_Tp, _Container, _Compare>::priority_queue(
871 _InputIter __f, _InputIter __l, const value_compare& __comp,
872 container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400873 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500874 : c(_VSTD::move(__c), __a),
875 comp(__comp)
876{
877 c.insert(c.end(), __f, __l);
878 _VSTD::make_heap(c.begin(), c.end(), comp);
879}
880#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000881
882template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000883inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000884void
885priority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
886{
887 c.push_back(__v);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000888 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000889}
890
Eric Fiselier26081dd2017-04-18 21:23:18 +0000891#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000892
893template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000894inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000895void
896priority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
897{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000898 c.push_back(_VSTD::move(__v));
899 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000900}
901
902template <class _Tp, class _Container, class _Compare>
903template <class... _Args>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000904inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000905void
906priority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
907{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000908 c.emplace_back(_VSTD::forward<_Args>(__args)...);
909 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000910}
911
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400912#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000913
914template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000915inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000916void
917priority_queue<_Tp, _Container, _Compare>::pop()
918{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000919 _VSTD::pop_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000920 c.pop_back();
921}
922
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>::swap(priority_queue& __q)
Howard Hinnantbf438282011-06-04 21:32:33 +0000927 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
928 __is_nothrow_swappable<value_compare>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000929{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000930 using _VSTD::swap;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000931 swap(c, __q.c);
932 swap(comp, __q.comp);
933}
934
935template <class _Tp, class _Container, class _Compare>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000936inline _LIBCPP_INLINE_VISIBILITY
Louis Dionne9ce598d2021-09-08 09:14:43 -0400937__enable_if_t<
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500938 __is_swappable<_Container>::value && __is_swappable<_Compare>::value,
Eric Fiselier6bfed252016-04-21 23:38:59 +0000939 void
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500940>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000941swap(priority_queue<_Tp, _Container, _Compare>& __x,
942 priority_queue<_Tp, _Container, _Compare>& __y)
Howard Hinnantbf438282011-06-04 21:32:33 +0000943 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000944{
945 __x.swap(__y);
946}
947
948template <class _Tp, class _Container, class _Compare, class _Alloc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000949struct _LIBCPP_TEMPLATE_VIS uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000950 : public uses_allocator<_Container, _Alloc>
951{
952};
953
954_LIBCPP_END_NAMESPACE_STD
955
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400956#endif // _LIBCPP_QUEUE