1 // Queue implementation -*- C++ -*-
3 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 // Free Software Foundation, Inc.
6 // This file is part of the GNU ISO C++ Library. This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 3, or (at your option)
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
17 // Under Section 7 of GPL version 3, you are granted additional
18 // permissions described in the GCC Runtime Library Exception, version
19 // 3.1, as published by the Free Software Foundation.
21 // You should have received a copy of the GNU General Public License and
22 // a copy of the GCC Runtime Library Exception along with this program;
23 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 // <http://www.gnu.org/licenses/>.
29 * Hewlett-Packard Company
31 * Permission to use, copy, modify, distribute and sell this software
32 * and its documentation for any purpose is hereby granted without fee,
33 * provided that the above copyright notice appear in all copies and
34 * that both that copyright notice and this permission notice appear
35 * in supporting documentation. Hewlett-Packard Company makes no
36 * representations about the suitability of this software for any
37 * purpose. It is provided "as is" without express or implied warranty.
40 * Copyright (c) 1996,1997
41 * Silicon Graphics Computer Systems, Inc.
43 * Permission to use, copy, modify, distribute and sell this software
44 * and its documentation for any purpose is hereby granted without fee,
45 * provided that the above copyright notice appear in all copies and
46 * that both that copyright notice and this permission notice appear
47 * in supporting documentation. Silicon Graphics makes no
48 * representations about the suitability of this software for any
49 * purpose. It is provided "as is" without express or implied warranty.
52 /** @file bits/stl_queue.h
53 * This is an internal header file, included by other library headers.
54 * Do not attempt to use it directly. @headername{queue}
58 #define _STL_QUEUE_H 1
60 #include <bits/concept_check.h>
61 #include <debug/debug.h>
63 _GLIBCXX_BEGIN_NAMESPACE(std
)
66 * @brief A standard container giving FIFO behavior.
70 * Meets many of the requirements of a
71 * <a href="tables.html#65">container</a>,
72 * but does not define anything to do with iterators. Very few of the
73 * other standard container interfaces are defined.
75 * This is not a true container, but an @e adaptor. It holds another
76 * container, and provides a wrapper interface to that container. The
77 * wrapper is what enforces strict first-in-first-out %queue behavior.
79 * The second template parameter defines the type of the underlying
80 * sequence/container. It defaults to std::deque, but it can be any type
81 * that supports @c front, @c back, @c push_back, and @c pop_front,
82 * such as std::list or an appropriate user-defined type.
84 * Members not found in @a normal containers are @c container_type,
85 * which is a typedef for the second Sequence parameter, and @c push and
86 * @c pop, which are standard %queue/FIFO operations.
88 template<typename _Tp
, typename _Sequence
= deque
<_Tp
> >
91 // concept requirements
92 typedef typename
_Sequence::value_type _Sequence_value_type
;
93 __glibcxx_class_requires(_Tp
, _SGIAssignableConcept
)
94 __glibcxx_class_requires(_Sequence
, _FrontInsertionSequenceConcept
)
95 __glibcxx_class_requires(_Sequence
, _BackInsertionSequenceConcept
)
96 __glibcxx_class_requires2(_Tp
, _Sequence_value_type
, _SameTypeConcept
)
98 template<typename _Tp1
, typename _Seq1
>
100 operator==(const queue
<_Tp1
, _Seq1
>&, const queue
<_Tp1
, _Seq1
>&);
102 template<typename _Tp1
, typename _Seq1
>
104 operator<(const queue
<_Tp1
, _Seq1
>&, const queue
<_Tp1
, _Seq1
>&);
107 typedef typename
_Sequence::value_type value_type
;
108 typedef typename
_Sequence::reference reference
;
109 typedef typename
_Sequence::const_reference const_reference
;
110 typedef typename
_Sequence::size_type size_type
;
111 typedef _Sequence container_type
;
115 * 'c' is the underlying container. Maintainers wondering why
116 * this isn't uglified as per style guidelines should note that
117 * this name is specified in the standard, [23.2.3.1]. (Why?
118 * Presumably for the same reason that it's protected instead
119 * of private: to allow derivation. But none of the other
120 * containers allow for derivation. Odd.)
126 * @brief Default constructor creates no elements.
128 #ifndef __GXX_EXPERIMENTAL_CXX0X__
130 queue(const _Sequence
& __c
= _Sequence())
134 queue(const _Sequence
& __c
)
138 queue(_Sequence
&& __c
= _Sequence())
139 : c(std::move(__c
)) { }
143 * Returns true if the %queue is empty.
147 { return c
.empty(); }
149 /** Returns the number of elements in the %queue. */
155 * Returns a read/write reference to the data at the first
156 * element of the %queue.
161 __glibcxx_requires_nonempty();
166 * Returns a read-only (constant) reference to the data at the first
167 * element of the %queue.
172 __glibcxx_requires_nonempty();
177 * Returns a read/write reference to the data at the last
178 * element of the %queue.
183 __glibcxx_requires_nonempty();
188 * Returns a read-only (constant) reference to the data at the last
189 * element of the %queue.
194 __glibcxx_requires_nonempty();
199 * @brief Add data to the end of the %queue.
200 * @param x Data to be added.
202 * This is a typical %queue operation. The function creates an
203 * element at the end of the %queue and assigns the given data
204 * to it. The time complexity of the operation depends on the
205 * underlying sequence.
208 push(const value_type
& __x
)
209 { c
.push_back(__x
); }
211 #ifdef __GXX_EXPERIMENTAL_CXX0X__
213 push(value_type
&& __x
)
214 { c
.push_back(std::move(__x
)); }
216 template<typename
... _Args
>
218 emplace(_Args
&&... __args
)
219 { c
.emplace_back(std::forward
<_Args
>(__args
)...); }
223 * @brief Removes first element.
225 * This is a typical %queue operation. It shrinks the %queue by one.
226 * The time complexity of the operation depends on the underlying
229 * Note that no data is returned, and if the first element's
230 * data is needed, it should be retrieved before pop() is
236 __glibcxx_requires_nonempty();
240 #ifdef __GXX_EXPERIMENTAL_CXX0X__
248 * @brief Queue equality comparison.
250 * @param y A %queue of the same type as @a x.
251 * @return True iff the size and elements of the queues are equal.
253 * This is an equivalence relation. Complexity and semantics depend on the
254 * underlying sequence type, but the expected rules are: this relation is
255 * linear in the size of the sequences, and queues are considered equivalent
256 * if their sequences compare equal.
258 template<typename _Tp
, typename _Seq
>
260 operator==(const queue
<_Tp
, _Seq
>& __x
, const queue
<_Tp
, _Seq
>& __y
)
261 { return __x
.c
== __y
.c
; }
264 * @brief Queue ordering relation.
266 * @param y A %queue of the same type as @a x.
267 * @return True iff @a x is lexicographically less than @a y.
269 * This is an total ordering relation. Complexity and semantics
270 * depend on the underlying sequence type, but the expected rules
271 * are: this relation is linear in the size of the sequences, the
272 * elements must be comparable with @c <, and
273 * std::lexicographical_compare() is usually used to make the
276 template<typename _Tp
, typename _Seq
>
278 operator<(const queue
<_Tp
, _Seq
>& __x
, const queue
<_Tp
, _Seq
>& __y
)
279 { return __x
.c
< __y
.c
; }
281 /// Based on operator==
282 template<typename _Tp
, typename _Seq
>
284 operator!=(const queue
<_Tp
, _Seq
>& __x
, const queue
<_Tp
, _Seq
>& __y
)
285 { return !(__x
== __y
); }
287 /// Based on operator<
288 template<typename _Tp
, typename _Seq
>
290 operator>(const queue
<_Tp
, _Seq
>& __x
, const queue
<_Tp
, _Seq
>& __y
)
291 { return __y
< __x
; }
293 /// Based on operator<
294 template<typename _Tp
, typename _Seq
>
296 operator<=(const queue
<_Tp
, _Seq
>& __x
, const queue
<_Tp
, _Seq
>& __y
)
297 { return !(__y
< __x
); }
299 /// Based on operator<
300 template<typename _Tp
, typename _Seq
>
302 operator>=(const queue
<_Tp
, _Seq
>& __x
, const queue
<_Tp
, _Seq
>& __y
)
303 { return !(__x
< __y
); }
305 #ifdef __GXX_EXPERIMENTAL_CXX0X__
306 template<typename _Tp
, typename _Seq
>
308 swap(queue
<_Tp
, _Seq
>& __x
, queue
<_Tp
, _Seq
>& __y
)
311 template<typename _Tp
, typename _Seq
, typename _Alloc
>
312 struct uses_allocator
<queue
<_Tp
, _Seq
>, _Alloc
>
313 : public uses_allocator
<_Seq
, _Alloc
>::type
{ };
317 * @brief A standard container automatically sorting its contents.
321 * This is not a true container, but an @e adaptor. It holds
322 * another container, and provides a wrapper interface to that
323 * container. The wrapper is what enforces priority-based sorting
324 * and %queue behavior. Very few of the standard container/sequence
325 * interface requirements are met (e.g., iterators).
327 * The second template parameter defines the type of the underlying
328 * sequence/container. It defaults to std::vector, but it can be
329 * any type that supports @c front(), @c push_back, @c pop_back,
330 * and random-access iterators, such as std::deque or an
331 * appropriate user-defined type.
333 * The third template parameter supplies the means of making
334 * priority comparisons. It defaults to @c less<value_type> but
335 * can be anything defining a strict weak ordering.
337 * Members not found in @a normal containers are @c container_type,
338 * which is a typedef for the second Sequence parameter, and @c
339 * push, @c pop, and @c top, which are standard %queue operations.
341 * @note No equality/comparison operators are provided for
344 * @note Sorting of the elements takes place as they are added to,
345 * and removed from, the %priority_queue using the
346 * %priority_queue's member functions. If you access the elements
347 * by other means, and change their data such that the sorting
348 * order would be different, the %priority_queue will not re-sort
349 * the elements for you. (How could it know to do so?)
351 template<typename _Tp
, typename _Sequence
= vector
<_Tp
>,
352 typename _Compare
= less
<typename
_Sequence::value_type
> >
355 // concept requirements
356 typedef typename
_Sequence::value_type _Sequence_value_type
;
357 __glibcxx_class_requires(_Tp
, _SGIAssignableConcept
)
358 __glibcxx_class_requires(_Sequence
, _SequenceConcept
)
359 __glibcxx_class_requires(_Sequence
, _RandomAccessContainerConcept
)
360 __glibcxx_class_requires2(_Tp
, _Sequence_value_type
, _SameTypeConcept
)
361 __glibcxx_class_requires4(_Compare
, bool, _Tp
, _Tp
,
362 _BinaryFunctionConcept
)
365 typedef typename
_Sequence::value_type value_type
;
366 typedef typename
_Sequence::reference reference
;
367 typedef typename
_Sequence::const_reference const_reference
;
368 typedef typename
_Sequence::size_type size_type
;
369 typedef _Sequence container_type
;
372 // See queue::c for notes on these names.
378 * @brief Default constructor creates no elements.
380 #ifndef __GXX_EXPERIMENTAL_CXX0X__
382 priority_queue(const _Compare
& __x
= _Compare(),
383 const _Sequence
& __s
= _Sequence())
385 { std::make_heap(c
.begin(), c
.end(), comp
); }
388 priority_queue(const _Compare
& __x
,
389 const _Sequence
& __s
)
391 { std::make_heap(c
.begin(), c
.end(), comp
); }
394 priority_queue(const _Compare
& __x
= _Compare(),
395 _Sequence
&& __s
= _Sequence())
396 : c(std::move(__s
)), comp(__x
)
397 { std::make_heap(c
.begin(), c
.end(), comp
); }
401 * @brief Builds a %queue from a range.
402 * @param first An input iterator.
403 * @param last An input iterator.
404 * @param x A comparison functor describing a strict weak ordering.
405 * @param s An initial sequence with which to start.
407 * Begins by copying @a s, inserting a copy of the elements
408 * from @a [first,last) into the copy of @a s, then ordering
409 * the copy according to @a x.
411 * For more information on function objects, see the
412 * documentation on @link functors functor base
415 #ifndef __GXX_EXPERIMENTAL_CXX0X__
416 template<typename _InputIterator
>
417 priority_queue(_InputIterator __first
, _InputIterator __last
,
418 const _Compare
& __x
= _Compare(),
419 const _Sequence
& __s
= _Sequence())
422 __glibcxx_requires_valid_range(__first
, __last
);
423 c
.insert(c
.end(), __first
, __last
);
424 std::make_heap(c
.begin(), c
.end(), comp
);
427 template<typename _InputIterator
>
428 priority_queue(_InputIterator __first
, _InputIterator __last
,
430 const _Sequence
& __s
)
433 __glibcxx_requires_valid_range(__first
, __last
);
434 c
.insert(c
.end(), __first
, __last
);
435 std::make_heap(c
.begin(), c
.end(), comp
);
438 template<typename _InputIterator
>
439 priority_queue(_InputIterator __first
, _InputIterator __last
,
440 const _Compare
& __x
= _Compare(),
441 _Sequence
&& __s
= _Sequence())
442 : c(std::move(__s
)), comp(__x
)
444 __glibcxx_requires_valid_range(__first
, __last
);
445 c
.insert(c
.end(), __first
, __last
);
446 std::make_heap(c
.begin(), c
.end(), comp
);
451 * Returns true if the %queue is empty.
455 { return c
.empty(); }
457 /** Returns the number of elements in the %queue. */
463 * Returns a read-only (constant) reference to the data at the first
464 * element of the %queue.
469 __glibcxx_requires_nonempty();
474 * @brief Add data to the %queue.
475 * @param x Data to be added.
477 * This is a typical %queue operation.
478 * The time complexity of the operation depends on the underlying
482 push(const value_type
& __x
)
485 std::push_heap(c
.begin(), c
.end(), comp
);
488 #ifdef __GXX_EXPERIMENTAL_CXX0X__
490 push(value_type
&& __x
)
492 c
.push_back(std::move(__x
));
493 std::push_heap(c
.begin(), c
.end(), comp
);
496 template<typename
... _Args
>
498 emplace(_Args
&&... __args
)
500 c
.emplace_back(std::forward
<_Args
>(__args
)...);
501 std::push_heap(c
.begin(), c
.end(), comp
);
506 * @brief Removes first element.
508 * This is a typical %queue operation. It shrinks the %queue
509 * by one. The time complexity of the operation depends on the
510 * underlying sequence.
512 * Note that no data is returned, and if the first element's
513 * data is needed, it should be retrieved before pop() is
519 __glibcxx_requires_nonempty();
520 std::pop_heap(c
.begin(), c
.end(), comp
);
524 #ifdef __GXX_EXPERIMENTAL_CXX0X__
526 swap(priority_queue
& __pq
)
530 swap(comp
, __pq
.comp
);
535 // No equality/comparison operators are provided for priority_queue.
537 #ifdef __GXX_EXPERIMENTAL_CXX0X__
538 template<typename _Tp
, typename _Sequence
, typename _Compare
>
540 swap(priority_queue
<_Tp
, _Sequence
, _Compare
>& __x
,
541 priority_queue
<_Tp
, _Sequence
, _Compare
>& __y
)
544 template<typename _Tp
, typename _Sequence
, typename _Compare
,
546 struct uses_allocator
<priority_queue
<_Tp
, _Sequence
, _Compare
>, _Alloc
>
547 : public uses_allocator
<_Sequence
, _Alloc
>::type
{ };
550 _GLIBCXX_END_NAMESPACE
552 #endif /* _STL_QUEUE_H */