blob: fe0af168cfbbf6228c2271fd71f9d44958a3cf49 [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
220#include <__config>
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100221#include <__iterator/iterator_traits.h>
Christopher Di Bella55d7a822021-07-01 09:25:35 -0400222#include <__memory/uses_allocator.h>
Christopher Di Bella41f26e82021-06-05 02:47:47 +0000223#include <__utility/forward.h>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400224#include <algorithm>
Arthur O'Dwyer7deec122021-03-24 18:19:12 -0400225#include <compare>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000226#include <deque>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000227#include <functional>
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100228#include <type_traits>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400229#include <vector>
Mark de Weverce8f12c2021-12-22 18:14:14 +0100230#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000231
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000232#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Arthur O'Dwyer6eeaa002022-02-01 20:16:40 -0500233# pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000234#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000235
236_LIBCPP_BEGIN_NAMESPACE_STD
237
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000238template <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS queue;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000239
240template <class _Tp, class _Container>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000241_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000242bool
243operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
244
245template <class _Tp, class _Container>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000246_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000247bool
248operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
249
Marshall Clow9e1b8452015-02-18 17:51:56 +0000250template <class _Tp, class _Container /*= deque<_Tp>*/>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000251class _LIBCPP_TEMPLATE_VIS queue
Howard Hinnantc51e1022010-05-11 19:42:16 +0000252{
253public:
254 typedef _Container container_type;
255 typedef typename container_type::value_type value_type;
256 typedef typename container_type::reference reference;
257 typedef typename container_type::const_reference const_reference;
258 typedef typename container_type::size_type size_type;
Marshall Clowb8825f02016-03-14 17:58:11 +0000259 static_assert((is_same<_Tp, value_type>::value), "" );
Howard Hinnantc51e1022010-05-11 19:42:16 +0000260
261protected:
262 container_type c;
263
264public:
Howard Hinnantf5f99992010-09-22 18:02:38 +0000265 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000266 queue()
267 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
268 : c() {}
269
270 _LIBCPP_INLINE_VISIBILITY
271 queue(const queue& __q) : c(__q.c) {}
272
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100273#if _LIBCPP_STD_VER > 20
274 template <class _InputIterator,
275 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>>
276 _LIBCPP_HIDE_FROM_ABI
277 queue(_InputIterator __first, _InputIterator __last) : c(__first, __last) {}
278
279 template <class _InputIterator,
280 class _Alloc,
281 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
282 class = __enable_if_t<uses_allocator<container_type, _Alloc>::value>>
283 _LIBCPP_HIDE_FROM_ABI
284 queue(_InputIterator __first, _InputIterator __second, const _Alloc& __alloc) : c(__first, __second, __alloc) {}
285#endif
286
Eric Fiselier26081dd2017-04-18 21:23:18 +0000287 _LIBCPP_INLINE_VISIBILITY
288 queue& operator=(const queue& __q) {c = __q.c; return *this;}
289
290#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000291 _LIBCPP_INLINE_VISIBILITY
292 queue(queue&& __q)
293 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000294 : c(_VSTD::move(__q.c)) {}
Howard Hinnantbf438282011-06-04 21:32:33 +0000295
296 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000297 queue& operator=(queue&& __q)
298 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000299 {c = _VSTD::move(__q.c); return *this;}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400300#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000301
Howard Hinnantf5f99992010-09-22 18:02:38 +0000302 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000303 explicit queue(const container_type& __c) : c(__c) {}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000304#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000305 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000306 explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400307#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000308 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000309 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000310 explicit queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400311 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000312 : c(__a) {}
313 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000314 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000315 queue(const queue& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400316 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000317 : c(__q.c, __a) {}
318 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000319 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000320 queue(const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400321 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000322 : c(__c, __a) {}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000323#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000324 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000325 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000326 queue(container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400327 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000328 : c(_VSTD::move(__c), __a) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000329 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000330 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000331 queue(queue&& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400332 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000333 : c(_VSTD::move(__q.c), __a) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000334
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400335#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000336
Marshall Clow425f5752017-11-15 05:51:26 +0000337 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000338 bool empty() const {return c.empty();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000339 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000340 size_type size() const {return c.size();}
341
Howard Hinnantf5f99992010-09-22 18:02:38 +0000342 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000343 reference front() {return c.front();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000344 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000345 const_reference front() const {return c.front();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000346 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000347 reference back() {return c.back();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000348 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000349 const_reference back() const {return c.back();}
350
Howard Hinnantf5f99992010-09-22 18:02:38 +0000351 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000352 void push(const value_type& __v) {c.push_back(__v);}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000353#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000354 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000355 void push(value_type&& __v) {c.push_back(_VSTD::move(__v));}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000356 template <class... _Args>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000357 _LIBCPP_INLINE_VISIBILITY
Marshall Clowea52cc42017-01-24 23:09:12 +0000358#if _LIBCPP_STD_VER > 14
Marshall Clow88746852018-01-24 22:42:25 +0000359 decltype(auto) emplace(_Args&&... __args)
Eric Fiselier34ba5b92016-07-21 03:20:17 +0000360 { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
Marshall Clowea52cc42017-01-24 23:09:12 +0000361#else
362 void emplace(_Args&&... __args)
363 { c.emplace_back(_VSTD::forward<_Args>(__args)...);}
364#endif
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400365#endif // _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000366 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000367 void pop() {c.pop_front();}
368
Howard Hinnantf5f99992010-09-22 18:02:38 +0000369 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000370 void swap(queue& __q)
Howard Hinnantbf438282011-06-04 21:32:33 +0000371 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000372 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000373 using _VSTD::swap;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000374 swap(c, __q.c);
375 }
376
377 template <class _T1, class _C1>
378 friend
Howard Hinnantf5f99992010-09-22 18:02:38 +0000379 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000380 bool
381 operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000382
Howard Hinnantc51e1022010-05-11 19:42:16 +0000383 template <class _T1, class _C1>
384 friend
Howard Hinnantf5f99992010-09-22 18:02:38 +0000385 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000386 bool
387 operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
388};
389
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100390#if _LIBCPP_STD_VER > 14
Marshall Clow592d9952018-05-22 01:57:53 +0000391template<class _Container,
Louis Dionne25547162021-08-17 12:26:09 -0400392 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000393>
394queue(_Container)
395 -> queue<typename _Container::value_type, _Container>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000396
Marshall Clow592d9952018-05-22 01:57:53 +0000397template<class _Container,
398 class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400399 class = enable_if_t<!__is_allocator<_Container>::value>,
400 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000401>
402queue(_Container, _Alloc)
403 -> queue<typename _Container::value_type, _Container>;
404#endif
405
Nikolas Klauserf0b3d872022-01-06 12:36:07 +0100406#if _LIBCPP_STD_VER > 20
407template <class _InputIterator,
408 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>>
409queue(_InputIterator, _InputIterator)
410 -> queue<__iter_value_type<_InputIterator>>;
411
412template <class _InputIterator,
413 class _Alloc,
414 class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
415 class = __enable_if_t<__is_allocator<_Alloc>::value>>
416queue(_InputIterator, _InputIterator, _Alloc)
417 -> queue<__iter_value_type<_InputIterator>, deque<__iter_value_type<_InputIterator>, _Alloc>>;
418#endif
419
Howard Hinnantc51e1022010-05-11 19:42:16 +0000420template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000421inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000422bool
423operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
424{
425 return __x.c == __y.c;
426}
427
428template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000429inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000430bool
431operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
432{
433 return __x.c < __y.c;
434}
435
436template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000437inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000438bool
439operator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
440{
441 return !(__x == __y);
442}
443
444template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000445inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000446bool
447operator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
448{
449 return __y < __x;
450}
451
452template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000453inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000454bool
455operator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
456{
457 return !(__x < __y);
458}
459
460template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000461inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000462bool
463operator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
464{
465 return !(__y < __x);
466}
467
468template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000469inline _LIBCPP_INLINE_VISIBILITY
Louis Dionne9ce598d2021-09-08 09:14:43 -0400470__enable_if_t<__is_swappable<_Container>::value, void>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000471swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
Howard Hinnantbf438282011-06-04 21:32:33 +0000472 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000473{
474 __x.swap(__y);
475}
476
477template <class _Tp, class _Container, class _Alloc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000478struct _LIBCPP_TEMPLATE_VIS uses_allocator<queue<_Tp, _Container>, _Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000479 : public uses_allocator<_Container, _Alloc>
480{
481};
482
483template <class _Tp, class _Container = vector<_Tp>,
484 class _Compare = less<typename _Container::value_type> >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000485class _LIBCPP_TEMPLATE_VIS priority_queue
Howard Hinnantc51e1022010-05-11 19:42:16 +0000486{
487public:
488 typedef _Container container_type;
489 typedef _Compare value_compare;
490 typedef typename container_type::value_type value_type;
491 typedef typename container_type::reference reference;
492 typedef typename container_type::const_reference const_reference;
493 typedef typename container_type::size_type size_type;
Marshall Clowb8825f02016-03-14 17:58:11 +0000494 static_assert((is_same<_Tp, value_type>::value), "" );
Howard Hinnantc51e1022010-05-11 19:42:16 +0000495
496protected:
497 container_type c;
498 value_compare comp;
499
500public:
Howard Hinnantf5f99992010-09-22 18:02:38 +0000501 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000502 priority_queue()
503 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value &&
504 is_nothrow_default_constructible<value_compare>::value)
505 : c(), comp() {}
506
507 _LIBCPP_INLINE_VISIBILITY
508 priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
509
Eric Fiselier26081dd2017-04-18 21:23:18 +0000510 _LIBCPP_INLINE_VISIBILITY
511 priority_queue& operator=(const priority_queue& __q)
512 {c = __q.c; comp = __q.comp; return *this;}
513
514#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000515 _LIBCPP_INLINE_VISIBILITY
516 priority_queue(priority_queue&& __q)
517 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value &&
518 is_nothrow_move_constructible<value_compare>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000519 : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {}
Howard Hinnantbf438282011-06-04 21:32:33 +0000520
521 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000522 priority_queue& operator=(priority_queue&& __q)
523 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value &&
524 is_nothrow_move_assignable<value_compare>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000525 {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400526#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000527
528 _LIBCPP_INLINE_VISIBILITY
529 explicit priority_queue(const value_compare& __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000530 : c(), comp(__comp) {}
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000531 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000532 priority_queue(const value_compare& __comp, const container_type& __c);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000533#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000534 _LIBCPP_INLINE_VISIBILITY
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +0100535 priority_queue(const value_compare& __comp, container_type&& __c);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000536#endif
Louis Dionne9ce598d2021-09-08 09:14:43 -0400537 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000538 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000539 priority_queue(_InputIter __f, _InputIter __l,
540 const value_compare& __comp = value_compare());
Louis Dionne9ce598d2021-09-08 09:14:43 -0400541 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000542 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000543 priority_queue(_InputIter __f, _InputIter __l,
544 const value_compare& __comp, const container_type& __c);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000545#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9ce598d2021-09-08 09:14:43 -0400546 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000547 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000548 priority_queue(_InputIter __f, _InputIter __l,
549 const value_compare& __comp, container_type&& __c);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400550#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000551 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000552 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000553 explicit priority_queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400554 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000555 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000556 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000557 priority_queue(const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400558 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000559 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000560 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000561 priority_queue(const value_compare& __comp, const container_type& __c,
562 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400563 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000564 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000565 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000566 priority_queue(const priority_queue& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400567 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000568#ifndef _LIBCPP_CXX03_LANG
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, 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(priority_queue&& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400577 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400578#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000579
Louis Dionne9ce598d2021-09-08 09:14:43 -0400580 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500581 _LIBCPP_INLINE_VISIBILITY
582 priority_queue(_InputIter __f, _InputIter __l, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400583 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500584
Louis Dionne9ce598d2021-09-08 09:14:43 -0400585 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500586 _LIBCPP_INLINE_VISIBILITY
587 priority_queue(_InputIter __f, _InputIter __l,
588 const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400589 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500590
Louis Dionne9ce598d2021-09-08 09:14:43 -0400591 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500592 _LIBCPP_INLINE_VISIBILITY
593 priority_queue(_InputIter __f, _InputIter __l,
594 const value_compare& __comp, const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400595 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500596
597#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9ce598d2021-09-08 09:14:43 -0400598 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500599 _LIBCPP_INLINE_VISIBILITY
600 priority_queue(_InputIter __f, _InputIter __l,
601 const value_compare& __comp, container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400602 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500603#endif // _LIBCPP_CXX03_LANG
604
Marshall Clow425f5752017-11-15 05:51:26 +0000605 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000606 bool empty() const {return c.empty();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000607 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000608 size_type size() const {return c.size();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000609 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000610 const_reference top() const {return c.front();}
611
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000612 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000613 void push(const value_type& __v);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000614#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000615 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000616 void push(value_type&& __v);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000617 template <class... _Args>
618 _LIBCPP_INLINE_VISIBILITY
619 void emplace(_Args&&... __args);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400620#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000621 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000622 void pop();
623
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000624 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000625 void swap(priority_queue& __q)
626 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
627 __is_nothrow_swappable<value_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000628};
629
Louis Dionned59f8a52021-08-17 11:59:07 -0400630#if _LIBCPP_STD_VER >= 17
Marshall Clow592d9952018-05-22 01:57:53 +0000631template <class _Compare,
632 class _Container,
Louis Dionne25547162021-08-17 12:26:09 -0400633 class = enable_if_t<!__is_allocator<_Compare>::value>,
634 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000635>
636priority_queue(_Compare, _Container)
637 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000638
639template<class _InputIterator,
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500640 class _Compare = less<__iter_value_type<_InputIterator>>,
641 class _Container = vector<__iter_value_type<_InputIterator>>,
Louis Dionne25547162021-08-17 12:26:09 -0400642 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
643 class = enable_if_t<!__is_allocator<_Compare>::value>,
644 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000645>
646priority_queue(_InputIterator, _InputIterator, _Compare = _Compare(), _Container = _Container())
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500647 -> priority_queue<__iter_value_type<_InputIterator>, _Container, _Compare>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000648
649template<class _Compare,
Marshall Clow592d9952018-05-22 01:57:53 +0000650 class _Container,
651 class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400652 class = enable_if_t<!__is_allocator<_Compare>::value>,
653 class = enable_if_t<!__is_allocator<_Container>::value>,
654 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000655>
656priority_queue(_Compare, _Container, _Alloc)
657 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500658
659template<class _InputIterator, class _Allocator,
Louis Dionne25547162021-08-17 12:26:09 -0400660 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
661 class = enable_if_t<__is_allocator<_Allocator>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500662>
663priority_queue(_InputIterator, _InputIterator, _Allocator)
664 -> priority_queue<__iter_value_type<_InputIterator>,
665 vector<__iter_value_type<_InputIterator>, _Allocator>,
666 less<__iter_value_type<_InputIterator>>>;
667
668template<class _InputIterator, class _Compare, class _Allocator,
Louis Dionne25547162021-08-17 12:26:09 -0400669 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
670 class = enable_if_t<!__is_allocator<_Compare>::value>,
671 class = enable_if_t<__is_allocator<_Allocator>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500672>
673priority_queue(_InputIterator, _InputIterator, _Compare, _Allocator)
674 -> priority_queue<__iter_value_type<_InputIterator>,
675 vector<__iter_value_type<_InputIterator>, _Allocator>, _Compare>;
676
677template<class _InputIterator, class _Compare, class _Container, class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400678 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
679 class = enable_if_t<!__is_allocator<_Compare>::value>,
680 class = enable_if_t<!__is_allocator<_Container>::value>,
681 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500682>
683priority_queue(_InputIterator, _InputIterator, _Compare, _Container, _Alloc)
684 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Marshall Clow592d9952018-05-22 01:57:53 +0000685#endif
686
Howard Hinnantc51e1022010-05-11 19:42:16 +0000687template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000688inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000689priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
690 const container_type& __c)
691 : c(__c),
692 comp(__comp)
693{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000694 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000695}
696
Eric Fiselier26081dd2017-04-18 21:23:18 +0000697#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000698
699template <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 value_compare& __comp,
702 container_type&& __c)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000703 : c(_VSTD::move(__c)),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000704 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
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400709#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000710
711template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500712template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000713inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000714priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
715 const value_compare& __comp)
716 : c(__f, __l),
717 comp(__comp)
718{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000719 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000720}
721
722template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500723template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000724inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000725priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
726 const value_compare& __comp,
727 const container_type& __c)
728 : c(__c),
729 comp(__comp)
730{
731 c.insert(c.end(), __f, __l);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000732 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000733}
734
Eric Fiselier26081dd2017-04-18 21:23:18 +0000735#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000736
737template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500738template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000739inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000740priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
741 const value_compare& __comp,
742 container_type&& __c)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000743 : c(_VSTD::move(__c)),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000744 comp(__comp)
745{
746 c.insert(c.end(), __f, __l);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000747 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000748}
749
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400750#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000751
752template <class _Tp, class _Container, class _Compare>
753template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000754inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000755priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400756 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000757 : c(__a)
758{
759}
760
761template <class _Tp, class _Container, class _Compare>
762template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000763inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000764priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
765 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400766 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000767 : c(__a),
768 comp(__comp)
769{
770}
771
772template <class _Tp, class _Container, class _Compare>
773template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000774inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000775priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
776 const container_type& __c,
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(__c, __a),
780 comp(__comp)
781{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000782 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000783}
784
785template <class _Tp, class _Container, class _Compare>
786template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000787inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000788priority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
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(__q.c, __a),
792 comp(__q.comp)
793{
Howard Hinnantc51e1022010-05-11 19:42:16 +0000794}
795
Eric Fiselier26081dd2017-04-18 21:23:18 +0000796#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000797
798template <class _Tp, class _Container, class _Compare>
799template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000800inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000801priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
802 container_type&& __c,
803 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400804 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000805 : c(_VSTD::move(__c), __a),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000806 comp(__comp)
807{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000808 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000809}
810
Howard Hinnantc51e1022010-05-11 19:42:16 +0000811template <class _Tp, class _Container, class _Compare>
812template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000813inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000814priority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
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(__q.c), __a),
818 comp(_VSTD::move(__q.comp))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000819{
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500820}
821
822#endif // _LIBCPP_CXX03_LANG
823
824template <class _Tp, class _Container, class _Compare>
825template <class _InputIter, class _Alloc, class>
826inline
827priority_queue<_Tp, _Container, _Compare>::priority_queue(
828 _InputIter __f, _InputIter __l, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400829 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500830 : c(__f, __l, __a),
831 comp()
832{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000833 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000834}
835
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500836template <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,
841 const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400842 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500843 : c(__f, __l, __a),
844 comp(__comp)
845{
846 _VSTD::make_heap(c.begin(), c.end(), comp);
847}
848
849template <class _Tp, class _Container, class _Compare>
850template <class _InputIter, class _Alloc, class>
851inline
852priority_queue<_Tp, _Container, _Compare>::priority_queue(
853 _InputIter __f, _InputIter __l,
854 const value_compare& __comp, const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400855 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500856 : c(__c, __a),
857 comp(__comp)
858{
859 c.insert(c.end(), __f, __l);
860 _VSTD::make_heap(c.begin(), c.end(), comp);
861}
862
863#ifndef _LIBCPP_CXX03_LANG
864template <class _Tp, class _Container, class _Compare>
865template <class _InputIter, class _Alloc, class>
866inline
867priority_queue<_Tp, _Container, _Compare>::priority_queue(
868 _InputIter __f, _InputIter __l, const value_compare& __comp,
869 container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400870 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500871 : c(_VSTD::move(__c), __a),
872 comp(__comp)
873{
874 c.insert(c.end(), __f, __l);
875 _VSTD::make_heap(c.begin(), c.end(), comp);
876}
877#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000878
879template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000880inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000881void
882priority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
883{
884 c.push_back(__v);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000885 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000886}
887
Eric Fiselier26081dd2017-04-18 21:23:18 +0000888#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000889
890template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000891inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000892void
893priority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
894{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000895 c.push_back(_VSTD::move(__v));
896 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000897}
898
899template <class _Tp, class _Container, class _Compare>
900template <class... _Args>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000901inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000902void
903priority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
904{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000905 c.emplace_back(_VSTD::forward<_Args>(__args)...);
906 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000907}
908
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400909#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000910
911template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000912inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000913void
914priority_queue<_Tp, _Container, _Compare>::pop()
915{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000916 _VSTD::pop_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000917 c.pop_back();
918}
919
920template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000921inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000922void
923priority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
Howard Hinnantbf438282011-06-04 21:32:33 +0000924 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
925 __is_nothrow_swappable<value_compare>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000926{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000927 using _VSTD::swap;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000928 swap(c, __q.c);
929 swap(comp, __q.comp);
930}
931
932template <class _Tp, class _Container, class _Compare>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000933inline _LIBCPP_INLINE_VISIBILITY
Louis Dionne9ce598d2021-09-08 09:14:43 -0400934__enable_if_t<
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500935 __is_swappable<_Container>::value && __is_swappable<_Compare>::value,
Eric Fiselier6bfed252016-04-21 23:38:59 +0000936 void
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500937>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000938swap(priority_queue<_Tp, _Container, _Compare>& __x,
939 priority_queue<_Tp, _Container, _Compare>& __y)
Howard Hinnantbf438282011-06-04 21:32:33 +0000940 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000941{
942 __x.swap(__y);
943}
944
945template <class _Tp, class _Container, class _Compare, class _Alloc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000946struct _LIBCPP_TEMPLATE_VIS uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000947 : public uses_allocator<_Container, _Alloc>
948{
949};
950
951_LIBCPP_END_NAMESPACE_STD
952
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400953#endif // _LIBCPP_QUEUE