blob: 9fad80253c50225abe451191a40b17ee1bc48f5a [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)
Howard Hinnantc51e1022010-05-11 19:42:16 +000044 template <class Alloc>
45 explicit queue(const Alloc& a);
46 template <class Alloc>
47 queue(const container_type& c, const Alloc& a);
48 template <class Alloc>
49 queue(container_type&& c, const Alloc& a);
50 template <class Alloc>
Howard Hinnantbf438282011-06-04 21:32:33 +000051 queue(const queue& q, const Alloc& a);
52 template <class Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +000053 queue(queue&& q, const Alloc& a);
54
Howard Hinnantc51e1022010-05-11 19:42:16 +000055 bool empty() const;
56 size_type size() const;
57
58 reference front();
59 const_reference front() const;
60 reference back();
61 const_reference back() const;
62
63 void push(const value_type& v);
64 void push(value_type&& v);
Marshall Clowea52cc42017-01-24 23:09:12 +000065 template <class... Args> reference emplace(Args&&... args); // reference in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +000066 void pop();
67
Eric Fiselier6bfed252016-04-21 23:38:59 +000068 void swap(queue& q) noexcept(is_nothrow_swappable_v<Container>)
Howard Hinnantc51e1022010-05-11 19:42:16 +000069};
70
Marshall Clow592d9952018-05-22 01:57:53 +000071template<class Container>
72 queue(Container) -> queue<typename Container::value_type, Container>; // C++17
Louis Dionne173f29e2019-05-29 16:01:36 +000073
74template<class Container, class Allocator>
Marshall Clow592d9952018-05-22 01:57:53 +000075 queue(Container, Allocator) -> queue<typename Container::value_type, Container>; // C++17
76
Howard Hinnantc51e1022010-05-11 19:42:16 +000077template <class T, class Container>
78 bool operator==(const queue<T, Container>& x,const queue<T, Container>& y);
79
80template <class T, class Container>
81 bool operator< (const queue<T, Container>& x,const queue<T, Container>& y);
82
83template <class T, class Container>
84 bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y);
85
86template <class T, class Container>
87 bool operator> (const queue<T, Container>& x,const queue<T, Container>& y);
88
89template <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>
Howard Hinnantbf438282011-06-04 21:32:33 +000096 void swap(queue<T, Container>& x, queue<T, Container>& y)
97 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +000098
99template <class T, class Container = vector<T>,
100 class Compare = less<typename Container::value_type>>
101class priority_queue
102{
103public:
104 typedef Container container_type;
105 typedef typename container_type::value_type value_type;
106 typedef typename container_type::reference reference;
107 typedef typename container_type::const_reference const_reference;
108 typedef typename container_type::size_type size_type;
109
110protected:
111 container_type c;
112 Compare comp;
113
114public:
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +0100115 priority_queue() : priority_queue(Compare()) {} // C++20
116 explicit priority_queue(const Compare& x) : priority_queue(x, Container()) {}
117 priority_queue(const Compare& x, const Container&);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500118 explicit priority_queue(const Compare& x = Compare(), Container&& = Container()); // before C++20
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +0100119 priority_queue(const Compare& x, Container&&); // C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000120 template <class InputIterator>
121 priority_queue(InputIterator first, InputIterator last,
122 const Compare& comp = Compare());
123 template <class InputIterator>
124 priority_queue(InputIterator first, InputIterator last,
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500125 const Compare& comp, const Container& c);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000126 template <class InputIterator>
127 priority_queue(InputIterator first, InputIterator last,
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500128 const Compare& comp, Container&& c);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000129 template <class Alloc>
130 explicit priority_queue(const Alloc& a);
131 template <class Alloc>
132 priority_queue(const Compare& comp, const Alloc& a);
133 template <class Alloc>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500134 priority_queue(const Compare& comp, const Container& c,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000135 const Alloc& a);
136 template <class Alloc>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500137 priority_queue(const Compare& comp, Container&& c,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000138 const Alloc& a);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500139 template <class InputIterator>
140 priority_queue(InputIterator first, InputIterator last,
141 const Alloc& a);
142 template <class InputIterator>
143 priority_queue(InputIterator first, InputIterator last,
144 const Compare& comp, const Alloc& a);
145 template <class InputIterator>
146 priority_queue(InputIterator first, InputIterator last,
147 const Compare& comp, const Container& c, const Alloc& a);
148 template <class InputIterator>
149 priority_queue(InputIterator first, InputIterator last,
150 const Compare& comp, Container&& c, const Alloc& a);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000151 template <class Alloc>
Howard Hinnantbf438282011-06-04 21:32:33 +0000152 priority_queue(const priority_queue& q, const Alloc& a);
153 template <class Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000154 priority_queue(priority_queue&& q, const Alloc& a);
155
156 bool empty() const;
157 size_type size() const;
158 const_reference top() const;
159
160 void push(const value_type& v);
161 void push(value_type&& v);
162 template <class... Args> void emplace(Args&&... args);
163 void pop();
164
Howard Hinnantbf438282011-06-04 21:32:33 +0000165 void swap(priority_queue& q)
Eric Fiselier6bfed252016-04-21 23:38:59 +0000166 noexcept(is_nothrow_swappable_v<Container> &&
167 is_nothrow_swappable_v<Comp>)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000168};
169
Marshall Clow592d9952018-05-22 01:57:53 +0000170template <class Compare, class Container>
171priority_queue(Compare, Container)
172 -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
Louis Dionne173f29e2019-05-29 16:01:36 +0000173
174template<class InputIterator,
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500175 class Compare = less<iter-value-type<InputIterator>>,
176 class Container = vector<iter-value-type<InputIterator>>>
Marshall Clow592d9952018-05-22 01:57:53 +0000177priority_queue(InputIterator, InputIterator, Compare = Compare(), Container = Container())
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500178 -> priority_queue<iter-value-type<InputIterator>, Container, Compare>; // C++17
Louis Dionne173f29e2019-05-29 16:01:36 +0000179
Marshall Clow592d9952018-05-22 01:57:53 +0000180template<class Compare, class Container, class Allocator>
181priority_queue(Compare, Container, Allocator)
182 -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
183
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500184template<class InputIterator, class Allocator>
185priority_queue(InputIterator, InputIterator, Allocator)
186 -> priority_queue<iter-value-type<InputIterator>,
187 vector<iter-value-type<InputIterator>, Allocator>,
Konstantin Varlamov53b543c2021-11-09 09:21:02 -0800188 less<iter-value-type<InputIterator>>>; // C++17
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500189
190template<class InputIterator, class Compare, class Allocator>
191priority_queue(InputIterator, InputIterator, Compare, Allocator)
192 -> priority_queue<iter-value-type<InputIterator>,
Konstantin Varlamov53b543c2021-11-09 09:21:02 -0800193 vector<iter-value-type<InputIterator>, Allocator>, Compare>; // C++17
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500194
195template<class InputIterator, class Compare, class Container, class Allocator>
196priority_queue(InputIterator, InputIterator, Compare, Container, Allocator)
Konstantin Varlamov53b543c2021-11-09 09:21:02 -0800197 -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500198
Howard Hinnantc51e1022010-05-11 19:42:16 +0000199template <class T, class Container, class Compare>
200 void swap(priority_queue<T, Container, Compare>& x,
Howard Hinnantbf438282011-06-04 21:32:33 +0000201 priority_queue<T, Container, Compare>& y)
202 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000203
204} // std
205
206*/
207
208#include <__config>
Christopher Di Bella55d7a822021-07-01 09:25:35 -0400209#include <__memory/uses_allocator.h>
Christopher Di Bella41f26e82021-06-05 02:47:47 +0000210#include <__utility/forward.h>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400211#include <algorithm>
Arthur O'Dwyer7deec122021-03-24 18:19:12 -0400212#include <compare>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000213#include <deque>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000214#include <functional>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400215#include <vector>
Mark de Weverce8f12c2021-12-22 18:14:14 +0100216#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000217
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000218#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000219#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000220#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000221
222_LIBCPP_BEGIN_NAMESPACE_STD
223
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000224template <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS queue;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000225
226template <class _Tp, class _Container>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000227_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000228bool
229operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
230
231template <class _Tp, class _Container>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000232_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000233bool
234operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
235
Marshall Clow9e1b8452015-02-18 17:51:56 +0000236template <class _Tp, class _Container /*= deque<_Tp>*/>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000237class _LIBCPP_TEMPLATE_VIS queue
Howard Hinnantc51e1022010-05-11 19:42:16 +0000238{
239public:
240 typedef _Container container_type;
241 typedef typename container_type::value_type value_type;
242 typedef typename container_type::reference reference;
243 typedef typename container_type::const_reference const_reference;
244 typedef typename container_type::size_type size_type;
Marshall Clowb8825f02016-03-14 17:58:11 +0000245 static_assert((is_same<_Tp, value_type>::value), "" );
Howard Hinnantc51e1022010-05-11 19:42:16 +0000246
247protected:
248 container_type c;
249
250public:
Howard Hinnantf5f99992010-09-22 18:02:38 +0000251 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000252 queue()
253 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
254 : c() {}
255
256 _LIBCPP_INLINE_VISIBILITY
257 queue(const queue& __q) : c(__q.c) {}
258
Eric Fiselier26081dd2017-04-18 21:23:18 +0000259 _LIBCPP_INLINE_VISIBILITY
260 queue& operator=(const queue& __q) {c = __q.c; return *this;}
261
262#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000263 _LIBCPP_INLINE_VISIBILITY
264 queue(queue&& __q)
265 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000266 : c(_VSTD::move(__q.c)) {}
Howard Hinnantbf438282011-06-04 21:32:33 +0000267
268 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000269 queue& operator=(queue&& __q)
270 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000271 {c = _VSTD::move(__q.c); return *this;}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400272#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000273
Howard Hinnantf5f99992010-09-22 18:02:38 +0000274 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000275 explicit queue(const container_type& __c) : c(__c) {}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000276#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000277 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000278 explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400279#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000280 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000281 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000282 explicit queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400283 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000284 : c(__a) {}
285 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000286 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000287 queue(const queue& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400288 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000289 : c(__q.c, __a) {}
290 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000291 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000292 queue(const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400293 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000294 : c(__c, __a) {}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000295#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000296 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000297 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000298 queue(container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400299 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000300 : c(_VSTD::move(__c), __a) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000301 template <class _Alloc>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000302 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000303 queue(queue&& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400304 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000305 : c(_VSTD::move(__q.c), __a) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000306
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400307#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000308
Marshall Clow425f5752017-11-15 05:51:26 +0000309 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000310 bool empty() const {return c.empty();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000311 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000312 size_type size() const {return c.size();}
313
Howard Hinnantf5f99992010-09-22 18:02:38 +0000314 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000315 reference front() {return c.front();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000316 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000317 const_reference front() const {return c.front();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000318 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000319 reference back() {return c.back();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000320 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000321 const_reference back() const {return c.back();}
322
Howard Hinnantf5f99992010-09-22 18:02:38 +0000323 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000324 void push(const value_type& __v) {c.push_back(__v);}
Eric Fiselier26081dd2017-04-18 21:23:18 +0000325#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000326 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000327 void push(value_type&& __v) {c.push_back(_VSTD::move(__v));}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000328 template <class... _Args>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000329 _LIBCPP_INLINE_VISIBILITY
Marshall Clowea52cc42017-01-24 23:09:12 +0000330#if _LIBCPP_STD_VER > 14
Marshall Clow88746852018-01-24 22:42:25 +0000331 decltype(auto) emplace(_Args&&... __args)
Eric Fiselier34ba5b92016-07-21 03:20:17 +0000332 { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
Marshall Clowea52cc42017-01-24 23:09:12 +0000333#else
334 void emplace(_Args&&... __args)
335 { c.emplace_back(_VSTD::forward<_Args>(__args)...);}
336#endif
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400337#endif // _LIBCPP_CXX03_LANG
Howard Hinnantf5f99992010-09-22 18:02:38 +0000338 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000339 void pop() {c.pop_front();}
340
Howard Hinnantf5f99992010-09-22 18:02:38 +0000341 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000342 void swap(queue& __q)
Howard Hinnantbf438282011-06-04 21:32:33 +0000343 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000344 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000345 using _VSTD::swap;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000346 swap(c, __q.c);
347 }
348
349 template <class _T1, class _C1>
350 friend
Howard Hinnantf5f99992010-09-22 18:02:38 +0000351 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000352 bool
353 operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000354
Howard Hinnantc51e1022010-05-11 19:42:16 +0000355 template <class _T1, class _C1>
356 friend
Howard Hinnantf5f99992010-09-22 18:02:38 +0000357 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000358 bool
359 operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
360};
361
Louis Dionned59f8a52021-08-17 11:59:07 -0400362#if _LIBCPP_STD_VER >= 17
Marshall Clow592d9952018-05-22 01:57:53 +0000363template<class _Container,
Louis Dionne25547162021-08-17 12:26:09 -0400364 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000365>
366queue(_Container)
367 -> queue<typename _Container::value_type, _Container>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000368
Marshall Clow592d9952018-05-22 01:57:53 +0000369template<class _Container,
370 class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400371 class = enable_if_t<!__is_allocator<_Container>::value>,
372 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000373>
374queue(_Container, _Alloc)
375 -> queue<typename _Container::value_type, _Container>;
376#endif
377
Howard Hinnantc51e1022010-05-11 19:42:16 +0000378template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000379inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000380bool
381operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
382{
383 return __x.c == __y.c;
384}
385
386template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000387inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000388bool
389operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
390{
391 return __x.c < __y.c;
392}
393
394template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000395inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000396bool
397operator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
398{
399 return !(__x == __y);
400}
401
402template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000403inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000404bool
405operator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
406{
407 return __y < __x;
408}
409
410template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000411inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000412bool
413operator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
414{
415 return !(__x < __y);
416}
417
418template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000419inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000420bool
421operator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
422{
423 return !(__y < __x);
424}
425
426template <class _Tp, class _Container>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000427inline _LIBCPP_INLINE_VISIBILITY
Louis Dionne9ce598d2021-09-08 09:14:43 -0400428__enable_if_t<__is_swappable<_Container>::value, void>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000429swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
Howard Hinnantbf438282011-06-04 21:32:33 +0000430 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000431{
432 __x.swap(__y);
433}
434
435template <class _Tp, class _Container, class _Alloc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000436struct _LIBCPP_TEMPLATE_VIS uses_allocator<queue<_Tp, _Container>, _Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000437 : public uses_allocator<_Container, _Alloc>
438{
439};
440
441template <class _Tp, class _Container = vector<_Tp>,
442 class _Compare = less<typename _Container::value_type> >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000443class _LIBCPP_TEMPLATE_VIS priority_queue
Howard Hinnantc51e1022010-05-11 19:42:16 +0000444{
445public:
446 typedef _Container container_type;
447 typedef _Compare value_compare;
448 typedef typename container_type::value_type value_type;
449 typedef typename container_type::reference reference;
450 typedef typename container_type::const_reference const_reference;
451 typedef typename container_type::size_type size_type;
Marshall Clowb8825f02016-03-14 17:58:11 +0000452 static_assert((is_same<_Tp, value_type>::value), "" );
Howard Hinnantc51e1022010-05-11 19:42:16 +0000453
454protected:
455 container_type c;
456 value_compare comp;
457
458public:
Howard Hinnantf5f99992010-09-22 18:02:38 +0000459 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000460 priority_queue()
461 _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value &&
462 is_nothrow_default_constructible<value_compare>::value)
463 : c(), comp() {}
464
465 _LIBCPP_INLINE_VISIBILITY
466 priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
467
Eric Fiselier26081dd2017-04-18 21:23:18 +0000468 _LIBCPP_INLINE_VISIBILITY
469 priority_queue& operator=(const priority_queue& __q)
470 {c = __q.c; comp = __q.comp; return *this;}
471
472#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000473 _LIBCPP_INLINE_VISIBILITY
474 priority_queue(priority_queue&& __q)
475 _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value &&
476 is_nothrow_move_constructible<value_compare>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000477 : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {}
Howard Hinnantbf438282011-06-04 21:32:33 +0000478
479 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000480 priority_queue& operator=(priority_queue&& __q)
481 _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value &&
482 is_nothrow_move_assignable<value_compare>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000483 {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400484#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbf438282011-06-04 21:32:33 +0000485
486 _LIBCPP_INLINE_VISIBILITY
487 explicit priority_queue(const value_compare& __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000488 : c(), comp(__comp) {}
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000489 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000490 priority_queue(const value_compare& __comp, const container_type& __c);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000491#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000492 _LIBCPP_INLINE_VISIBILITY
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +0100493 priority_queue(const value_compare& __comp, container_type&& __c);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000494#endif
Louis Dionne9ce598d2021-09-08 09:14:43 -0400495 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000496 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000497 priority_queue(_InputIter __f, _InputIter __l,
498 const value_compare& __comp = value_compare());
Louis Dionne9ce598d2021-09-08 09:14:43 -0400499 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000500 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000501 priority_queue(_InputIter __f, _InputIter __l,
502 const value_compare& __comp, const container_type& __c);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000503#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9ce598d2021-09-08 09:14:43 -0400504 template <class _InputIter, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000505 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000506 priority_queue(_InputIter __f, _InputIter __l,
507 const value_compare& __comp, container_type&& __c);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400508#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000509 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000510 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000511 explicit priority_queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400512 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000513 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000514 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000515 priority_queue(const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400516 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000517 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000518 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000519 priority_queue(const value_compare& __comp, const container_type& __c,
520 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400521 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000523 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000524 priority_queue(const priority_queue& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400525 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000526#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000527 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000528 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000529 priority_queue(const value_compare& __comp, container_type&& __c,
530 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400531 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000532 template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000533 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000534 priority_queue(priority_queue&& __q, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400535 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400536#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000537
Louis Dionne9ce598d2021-09-08 09:14:43 -0400538 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500539 _LIBCPP_INLINE_VISIBILITY
540 priority_queue(_InputIter __f, _InputIter __l, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400541 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500542
Louis Dionne9ce598d2021-09-08 09:14:43 -0400543 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500544 _LIBCPP_INLINE_VISIBILITY
545 priority_queue(_InputIter __f, _InputIter __l,
546 const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400547 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500548
Louis Dionne9ce598d2021-09-08 09:14:43 -0400549 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500550 _LIBCPP_INLINE_VISIBILITY
551 priority_queue(_InputIter __f, _InputIter __l,
552 const value_compare& __comp, const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400553 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500554
555#ifndef _LIBCPP_CXX03_LANG
Louis Dionne9ce598d2021-09-08 09:14:43 -0400556 template <class _InputIter, class _Alloc, class = __enable_if_t<__is_cpp17_input_iterator<_InputIter>::value> >
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500557 _LIBCPP_INLINE_VISIBILITY
558 priority_queue(_InputIter __f, _InputIter __l,
559 const value_compare& __comp, container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400560 __enable_if_t<uses_allocator<container_type, _Alloc>::value>* = 0);
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500561#endif // _LIBCPP_CXX03_LANG
562
Marshall Clow425f5752017-11-15 05:51:26 +0000563 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000564 bool empty() const {return c.empty();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000565 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000566 size_type size() const {return c.size();}
Howard Hinnantf5f99992010-09-22 18:02:38 +0000567 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000568 const_reference top() const {return c.front();}
569
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000570 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000571 void push(const value_type& __v);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000572#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000573 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000574 void push(value_type&& __v);
Eric Fiselier26081dd2017-04-18 21:23:18 +0000575 template <class... _Args>
576 _LIBCPP_INLINE_VISIBILITY
577 void emplace(_Args&&... __args);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400578#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000579 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000580 void pop();
581
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000582 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbf438282011-06-04 21:32:33 +0000583 void swap(priority_queue& __q)
584 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
585 __is_nothrow_swappable<value_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000586};
587
Louis Dionned59f8a52021-08-17 11:59:07 -0400588#if _LIBCPP_STD_VER >= 17
Marshall Clow592d9952018-05-22 01:57:53 +0000589template <class _Compare,
590 class _Container,
Louis Dionne25547162021-08-17 12:26:09 -0400591 class = enable_if_t<!__is_allocator<_Compare>::value>,
592 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000593>
594priority_queue(_Compare, _Container)
595 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000596
597template<class _InputIterator,
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500598 class _Compare = less<__iter_value_type<_InputIterator>>,
599 class _Container = vector<__iter_value_type<_InputIterator>>,
Louis Dionne25547162021-08-17 12:26:09 -0400600 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
601 class = enable_if_t<!__is_allocator<_Compare>::value>,
602 class = enable_if_t<!__is_allocator<_Container>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000603>
604priority_queue(_InputIterator, _InputIterator, _Compare = _Compare(), _Container = _Container())
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500605 -> priority_queue<__iter_value_type<_InputIterator>, _Container, _Compare>;
Louis Dionne173f29e2019-05-29 16:01:36 +0000606
607template<class _Compare,
Marshall Clow592d9952018-05-22 01:57:53 +0000608 class _Container,
609 class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400610 class = enable_if_t<!__is_allocator<_Compare>::value>,
611 class = enable_if_t<!__is_allocator<_Container>::value>,
612 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Marshall Clow592d9952018-05-22 01:57:53 +0000613>
614priority_queue(_Compare, _Container, _Alloc)
615 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500616
617template<class _InputIterator, class _Allocator,
Louis Dionne25547162021-08-17 12:26:09 -0400618 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
619 class = enable_if_t<__is_allocator<_Allocator>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500620>
621priority_queue(_InputIterator, _InputIterator, _Allocator)
622 -> priority_queue<__iter_value_type<_InputIterator>,
623 vector<__iter_value_type<_InputIterator>, _Allocator>,
624 less<__iter_value_type<_InputIterator>>>;
625
626template<class _InputIterator, class _Compare, class _Allocator,
Louis Dionne25547162021-08-17 12:26:09 -0400627 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
628 class = enable_if_t<!__is_allocator<_Compare>::value>,
629 class = enable_if_t<__is_allocator<_Allocator>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500630>
631priority_queue(_InputIterator, _InputIterator, _Compare, _Allocator)
632 -> priority_queue<__iter_value_type<_InputIterator>,
633 vector<__iter_value_type<_InputIterator>, _Allocator>, _Compare>;
634
635template<class _InputIterator, class _Compare, class _Container, class _Alloc,
Louis Dionne25547162021-08-17 12:26:09 -0400636 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
637 class = enable_if_t<!__is_allocator<_Compare>::value>,
638 class = enable_if_t<!__is_allocator<_Container>::value>,
639 class = enable_if_t<uses_allocator<_Container, _Alloc>::value>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500640>
641priority_queue(_InputIterator, _InputIterator, _Compare, _Container, _Alloc)
642 -> priority_queue<typename _Container::value_type, _Container, _Compare>;
Marshall Clow592d9952018-05-22 01:57:53 +0000643#endif
644
Howard Hinnantc51e1022010-05-11 19:42:16 +0000645template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000646inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000647priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
648 const container_type& __c)
649 : c(__c),
650 comp(__comp)
651{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000652 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000653}
654
Eric Fiselier26081dd2017-04-18 21:23:18 +0000655#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000656
657template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000658inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000659priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
660 container_type&& __c)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000661 : c(_VSTD::move(__c)),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000662 comp(__comp)
663{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000664 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000665}
666
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400667#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000668
669template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500670template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000671inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000672priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
673 const value_compare& __comp)
674 : c(__f, __l),
675 comp(__comp)
676{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000677 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000678}
679
680template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500681template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000682inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000683priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
684 const value_compare& __comp,
685 const container_type& __c)
686 : c(__c),
687 comp(__comp)
688{
689 c.insert(c.end(), __f, __l);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000690 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000691}
692
Eric Fiselier26081dd2017-04-18 21:23:18 +0000693#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000694
695template <class _Tp, class _Container, class _Compare>
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500696template <class _InputIter, class>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000697inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000698priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
699 const value_compare& __comp,
700 container_type&& __c)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000701 : c(_VSTD::move(__c)),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000702 comp(__comp)
703{
704 c.insert(c.end(), __f, __l);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000705 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000706}
707
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400708#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000709
710template <class _Tp, class _Container, class _Compare>
711template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000712inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000713priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400714 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000715 : c(__a)
716{
717}
718
719template <class _Tp, class _Container, class _Compare>
720template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000721inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000722priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
723 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400724 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000725 : c(__a),
726 comp(__comp)
727{
728}
729
730template <class _Tp, class _Container, class _Compare>
731template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000732inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000733priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
734 const container_type& __c,
735 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400736 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000737 : c(__c, __a),
738 comp(__comp)
739{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000740 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000741}
742
743template <class _Tp, class _Container, class _Compare>
744template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000745inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000746priority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
747 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400748 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000749 : c(__q.c, __a),
750 comp(__q.comp)
751{
Howard Hinnantc51e1022010-05-11 19:42:16 +0000752}
753
Eric Fiselier26081dd2017-04-18 21:23:18 +0000754#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000755
756template <class _Tp, class _Container, class _Compare>
757template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000758inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000759priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
760 container_type&& __c,
761 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400762 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000763 : c(_VSTD::move(__c), __a),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000764 comp(__comp)
765{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000766 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000767}
768
Howard Hinnantc51e1022010-05-11 19:42:16 +0000769template <class _Tp, class _Container, class _Compare>
770template <class _Alloc>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000771inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000772priority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
773 const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400774 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000775 : c(_VSTD::move(__q.c), __a),
776 comp(_VSTD::move(__q.comp))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000777{
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500778}
779
780#endif // _LIBCPP_CXX03_LANG
781
782template <class _Tp, class _Container, class _Compare>
783template <class _InputIter, class _Alloc, class>
784inline
785priority_queue<_Tp, _Container, _Compare>::priority_queue(
786 _InputIter __f, _InputIter __l, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400787 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500788 : c(__f, __l, __a),
789 comp()
790{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000791 _VSTD::make_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000792}
793
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500794template <class _Tp, class _Container, class _Compare>
795template <class _InputIter, class _Alloc, class>
796inline
797priority_queue<_Tp, _Container, _Compare>::priority_queue(
798 _InputIter __f, _InputIter __l,
799 const value_compare& __comp, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400800 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500801 : c(__f, __l, __a),
802 comp(__comp)
803{
804 _VSTD::make_heap(c.begin(), c.end(), comp);
805}
806
807template <class _Tp, class _Container, class _Compare>
808template <class _InputIter, class _Alloc, class>
809inline
810priority_queue<_Tp, _Container, _Compare>::priority_queue(
811 _InputIter __f, _InputIter __l,
812 const value_compare& __comp, const container_type& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400813 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500814 : c(__c, __a),
815 comp(__comp)
816{
817 c.insert(c.end(), __f, __l);
818 _VSTD::make_heap(c.begin(), c.end(), comp);
819}
820
821#ifndef _LIBCPP_CXX03_LANG
822template <class _Tp, class _Container, class _Compare>
823template <class _InputIter, class _Alloc, class>
824inline
825priority_queue<_Tp, _Container, _Compare>::priority_queue(
826 _InputIter __f, _InputIter __l, const value_compare& __comp,
827 container_type&& __c, const _Alloc& __a,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400828 __enable_if_t<uses_allocator<container_type, _Alloc>::value>*)
Arthur O'Dwyer4e06bc82021-03-02 00:23:21 -0500829 : c(_VSTD::move(__c), __a),
830 comp(__comp)
831{
832 c.insert(c.end(), __f, __l);
833 _VSTD::make_heap(c.begin(), c.end(), comp);
834}
835#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000836
837template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000838inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000839void
840priority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
841{
842 c.push_back(__v);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000843 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000844}
845
Eric Fiselier26081dd2017-04-18 21:23:18 +0000846#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000847
848template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000849inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000850void
851priority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
852{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000853 c.push_back(_VSTD::move(__v));
854 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000855}
856
857template <class _Tp, class _Container, class _Compare>
858template <class... _Args>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000859inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000860void
861priority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
862{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000863 c.emplace_back(_VSTD::forward<_Args>(__args)...);
864 _VSTD::push_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000865}
866
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400867#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000868
869template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000870inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000871void
872priority_queue<_Tp, _Container, _Compare>::pop()
873{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000874 _VSTD::pop_heap(c.begin(), c.end(), comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000875 c.pop_back();
876}
877
878template <class _Tp, class _Container, class _Compare>
Evgeniy Stepanov3b68ae52016-04-22 01:04:55 +0000879inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000880void
881priority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
Howard Hinnantbf438282011-06-04 21:32:33 +0000882 _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
883 __is_nothrow_swappable<value_compare>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000884{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000885 using _VSTD::swap;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000886 swap(c, __q.c);
887 swap(comp, __q.comp);
888}
889
890template <class _Tp, class _Container, class _Compare>
Howard Hinnantf5f99992010-09-22 18:02:38 +0000891inline _LIBCPP_INLINE_VISIBILITY
Louis Dionne9ce598d2021-09-08 09:14:43 -0400892__enable_if_t<
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500893 __is_swappable<_Container>::value && __is_swappable<_Compare>::value,
Eric Fiselier6bfed252016-04-21 23:38:59 +0000894 void
Arthur O'Dwyer56226762021-03-03 23:02:20 -0500895>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000896swap(priority_queue<_Tp, _Container, _Compare>& __x,
897 priority_queue<_Tp, _Container, _Compare>& __y)
Howard Hinnantbf438282011-06-04 21:32:33 +0000898 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000899{
900 __x.swap(__y);
901}
902
903template <class _Tp, class _Container, class _Compare, class _Alloc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000904struct _LIBCPP_TEMPLATE_VIS uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000905 : public uses_allocator<_Container, _Alloc>
906{
907};
908
909_LIBCPP_END_NAMESPACE_STD
910
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400911#endif // _LIBCPP_QUEUE