100db7afdSDavid E. O'Brien // Queue implementation -*- C++ -*-
200db7afdSDavid E. O'Brien
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
4*f8a1b7d9SAlexander Kabaev // Free Software Foundation, Inc.
500db7afdSDavid E. O'Brien //
600db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library. This library is free
700db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
800db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
900db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
1000db7afdSDavid E. O'Brien // any later version.
1100db7afdSDavid E. O'Brien
1200db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1300db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1400db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1500db7afdSDavid E. O'Brien // GNU General Public License for more details.
1600db7afdSDavid E. O'Brien
1700db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1800db7afdSDavid E. O'Brien // with this library; see the file COPYING. If not, write to the Free
19*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
2000db7afdSDavid E. O'Brien // USA.
2100db7afdSDavid E. O'Brien
2200db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2300db7afdSDavid E. O'Brien // library without restriction. Specifically, if other files instantiate
2400db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2500db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2600db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2700db7afdSDavid E. O'Brien // the GNU General Public License. This exception does not however
2800db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
2900db7afdSDavid E. O'Brien // the GNU General Public License.
3000db7afdSDavid E. O'Brien
3100db7afdSDavid E. O'Brien /*
3200db7afdSDavid E. O'Brien *
3300db7afdSDavid E. O'Brien * Copyright (c) 1994
3400db7afdSDavid E. O'Brien * Hewlett-Packard Company
3500db7afdSDavid E. O'Brien *
3600db7afdSDavid E. O'Brien * Permission to use, copy, modify, distribute and sell this software
3700db7afdSDavid E. O'Brien * and its documentation for any purpose is hereby granted without fee,
3800db7afdSDavid E. O'Brien * provided that the above copyright notice appear in all copies and
3900db7afdSDavid E. O'Brien * that both that copyright notice and this permission notice appear
4000db7afdSDavid E. O'Brien * in supporting documentation. Hewlett-Packard Company makes no
4100db7afdSDavid E. O'Brien * representations about the suitability of this software for any
4200db7afdSDavid E. O'Brien * purpose. It is provided "as is" without express or implied warranty.
4300db7afdSDavid E. O'Brien *
4400db7afdSDavid E. O'Brien *
4500db7afdSDavid E. O'Brien * Copyright (c) 1996,1997
4600db7afdSDavid E. O'Brien * Silicon Graphics Computer Systems, Inc.
4700db7afdSDavid E. O'Brien *
4800db7afdSDavid E. O'Brien * Permission to use, copy, modify, distribute and sell this software
4900db7afdSDavid E. O'Brien * and its documentation for any purpose is hereby granted without fee,
5000db7afdSDavid E. O'Brien * provided that the above copyright notice appear in all copies and
5100db7afdSDavid E. O'Brien * that both that copyright notice and this permission notice appear
5200db7afdSDavid E. O'Brien * in supporting documentation. Silicon Graphics makes no
5300db7afdSDavid E. O'Brien * representations about the suitability of this software for any
5400db7afdSDavid E. O'Brien * purpose. It is provided "as is" without express or implied warranty.
5500db7afdSDavid E. O'Brien */
5600db7afdSDavid E. O'Brien
5700db7afdSDavid E. O'Brien /** @file stl_queue.h
5800db7afdSDavid E. O'Brien * This is an internal header file, included by other library headers.
5900db7afdSDavid E. O'Brien * You should not attempt to use it directly.
6000db7afdSDavid E. O'Brien */
6100db7afdSDavid E. O'Brien
62ffeaf689SAlexander Kabaev #ifndef _QUEUE_H
63ffeaf689SAlexander Kabaev #define _QUEUE_H 1
6400db7afdSDavid E. O'Brien
6500db7afdSDavid E. O'Brien #include <bits/concept_check.h>
66ffeaf689SAlexander Kabaev #include <debug/debug.h>
6700db7afdSDavid E. O'Brien
_GLIBCXX_BEGIN_NAMESPACE(std)68*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
6900db7afdSDavid E. O'Brien
701b86b14eSAlexander Kabaev /**
711b86b14eSAlexander Kabaev * @brief A standard container giving FIFO behavior.
721b86b14eSAlexander Kabaev *
731b86b14eSAlexander Kabaev * @ingroup Containers
741b86b14eSAlexander Kabaev * @ingroup Sequences
751b86b14eSAlexander Kabaev *
761b86b14eSAlexander Kabaev * Meets many of the requirements of a
771b86b14eSAlexander Kabaev * <a href="tables.html#65">container</a>,
781b86b14eSAlexander Kabaev * but does not define anything to do with iterators. Very few of the
791b86b14eSAlexander Kabaev * other standard container interfaces are defined.
801b86b14eSAlexander Kabaev *
811b86b14eSAlexander Kabaev * This is not a true container, but an @e adaptor. It holds another
821b86b14eSAlexander Kabaev * container, and provides a wrapper interface to that container. The
831b86b14eSAlexander Kabaev * wrapper is what enforces strict first-in-first-out %queue behavior.
841b86b14eSAlexander Kabaev *
851b86b14eSAlexander Kabaev * The second template parameter defines the type of the underlying
861b86b14eSAlexander Kabaev * sequence/container. It defaults to std::deque, but it can be any type
871b86b14eSAlexander Kabaev * that supports @c front, @c back, @c push_back, and @c pop_front,
881b86b14eSAlexander Kabaev * such as std::list or an appropriate user-defined type.
891b86b14eSAlexander Kabaev *
901b86b14eSAlexander Kabaev * Members not found in "normal" containers are @c container_type,
911b86b14eSAlexander Kabaev * which is a typedef for the second Sequence parameter, and @c push and
921b86b14eSAlexander Kabaev * @c pop, which are standard %queue/FIFO operations.
931b86b14eSAlexander Kabaev */
94*f8a1b7d9SAlexander Kabaev template<typename _Tp, typename _Sequence = deque<_Tp> >
9500db7afdSDavid E. O'Brien class queue
9600db7afdSDavid E. O'Brien {
9700db7afdSDavid E. O'Brien // concept requirements
981b86b14eSAlexander Kabaev typedef typename _Sequence::value_type _Sequence_value_type;
99ffeaf689SAlexander Kabaev __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
100ffeaf689SAlexander Kabaev __glibcxx_class_requires(_Sequence, _FrontInsertionSequenceConcept)
101ffeaf689SAlexander Kabaev __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept)
102ffeaf689SAlexander Kabaev __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
10300db7afdSDavid E. O'Brien
1041b86b14eSAlexander Kabaev template<typename _Tp1, typename _Seq1>
105ffeaf689SAlexander Kabaev friend bool
106ffeaf689SAlexander Kabaev operator==(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
107ffeaf689SAlexander Kabaev
1081b86b14eSAlexander Kabaev template<typename _Tp1, typename _Seq1>
109ffeaf689SAlexander Kabaev friend bool
110ffeaf689SAlexander Kabaev operator<(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
1111b86b14eSAlexander Kabaev
11200db7afdSDavid E. O'Brien public:
11300db7afdSDavid E. O'Brien typedef typename _Sequence::value_type value_type;
1141b86b14eSAlexander Kabaev typedef typename _Sequence::reference reference;
1151b86b14eSAlexander Kabaev typedef typename _Sequence::const_reference const_reference;
11600db7afdSDavid E. O'Brien typedef typename _Sequence::size_type size_type;
11700db7afdSDavid E. O'Brien typedef _Sequence container_type;
11800db7afdSDavid E. O'Brien
11900db7afdSDavid E. O'Brien protected:
1201b86b14eSAlexander Kabaev /**
121ffeaf689SAlexander Kabaev * 'c' is the underlying container. Maintainers wondering why
122ffeaf689SAlexander Kabaev * this isn't uglified as per style guidelines should note that
123ffeaf689SAlexander Kabaev * this name is specified in the standard, [23.2.3.1]. (Why?
124ffeaf689SAlexander Kabaev * Presumably for the same reason that it's protected instead
125ffeaf689SAlexander Kabaev * of private: to allow derivation. But none of the other
126ffeaf689SAlexander Kabaev * containers allow for derivation. Odd.)
1271b86b14eSAlexander Kabaev */
12800db7afdSDavid E. O'Brien _Sequence c;
12900db7afdSDavid E. O'Brien
1301b86b14eSAlexander Kabaev public:
1311b86b14eSAlexander Kabaev /**
1321b86b14eSAlexander Kabaev * @brief Default constructor creates no elements.
1331b86b14eSAlexander Kabaev */
1341b86b14eSAlexander Kabaev explicit
135ffeaf689SAlexander Kabaev queue(const _Sequence& __c = _Sequence()) : c(__c) {}
1361b86b14eSAlexander Kabaev
1371b86b14eSAlexander Kabaev /**
1381b86b14eSAlexander Kabaev * Returns true if the %queue is empty.
1391b86b14eSAlexander Kabaev */
1401b86b14eSAlexander Kabaev bool
141ffeaf689SAlexander Kabaev empty() const
142ffeaf689SAlexander Kabaev { return c.empty(); }
1431b86b14eSAlexander Kabaev
1441b86b14eSAlexander Kabaev /** Returns the number of elements in the %queue. */
1451b86b14eSAlexander Kabaev size_type
146ffeaf689SAlexander Kabaev size() const
147ffeaf689SAlexander Kabaev { return c.size(); }
1481b86b14eSAlexander Kabaev
1491b86b14eSAlexander Kabaev /**
150ffeaf689SAlexander Kabaev * Returns a read/write reference to the data at the first
151ffeaf689SAlexander Kabaev * element of the %queue.
1521b86b14eSAlexander Kabaev */
1531b86b14eSAlexander Kabaev reference
154ffeaf689SAlexander Kabaev front()
155ffeaf689SAlexander Kabaev {
156ffeaf689SAlexander Kabaev __glibcxx_requires_nonempty();
157ffeaf689SAlexander Kabaev return c.front();
158ffeaf689SAlexander Kabaev }
1591b86b14eSAlexander Kabaev
1601b86b14eSAlexander Kabaev /**
1611b86b14eSAlexander Kabaev * Returns a read-only (constant) reference to the data at the first
1621b86b14eSAlexander Kabaev * element of the %queue.
1631b86b14eSAlexander Kabaev */
1641b86b14eSAlexander Kabaev const_reference
165ffeaf689SAlexander Kabaev front() const
166ffeaf689SAlexander Kabaev {
167ffeaf689SAlexander Kabaev __glibcxx_requires_nonempty();
168ffeaf689SAlexander Kabaev return c.front();
169ffeaf689SAlexander Kabaev }
1701b86b14eSAlexander Kabaev
1711b86b14eSAlexander Kabaev /**
172ffeaf689SAlexander Kabaev * Returns a read/write reference to the data at the last
173ffeaf689SAlexander Kabaev * element of the %queue.
1741b86b14eSAlexander Kabaev */
1751b86b14eSAlexander Kabaev reference
176ffeaf689SAlexander Kabaev back()
177ffeaf689SAlexander Kabaev {
178ffeaf689SAlexander Kabaev __glibcxx_requires_nonempty();
179ffeaf689SAlexander Kabaev return c.back();
180ffeaf689SAlexander Kabaev }
1811b86b14eSAlexander Kabaev
1821b86b14eSAlexander Kabaev /**
1831b86b14eSAlexander Kabaev * Returns a read-only (constant) reference to the data at the last
1841b86b14eSAlexander Kabaev * element of the %queue.
1851b86b14eSAlexander Kabaev */
1861b86b14eSAlexander Kabaev const_reference
187ffeaf689SAlexander Kabaev back() const
188ffeaf689SAlexander Kabaev {
189ffeaf689SAlexander Kabaev __glibcxx_requires_nonempty();
190ffeaf689SAlexander Kabaev return c.back();
191ffeaf689SAlexander Kabaev }
1921b86b14eSAlexander Kabaev
1931b86b14eSAlexander Kabaev /**
1941b86b14eSAlexander Kabaev * @brief Add data to the end of the %queue.
1951b86b14eSAlexander Kabaev * @param x Data to be added.
1961b86b14eSAlexander Kabaev *
197ffeaf689SAlexander Kabaev * This is a typical %queue operation. The function creates an
198ffeaf689SAlexander Kabaev * element at the end of the %queue and assigns the given data
199ffeaf689SAlexander Kabaev * to it. The time complexity of the operation depends on the
200ffeaf689SAlexander Kabaev * underlying sequence.
2011b86b14eSAlexander Kabaev */
2021b86b14eSAlexander Kabaev void
203ffeaf689SAlexander Kabaev push(const value_type& __x)
204ffeaf689SAlexander Kabaev { c.push_back(__x); }
2051b86b14eSAlexander Kabaev
2061b86b14eSAlexander Kabaev /**
2071b86b14eSAlexander Kabaev * @brief Removes first element.
2081b86b14eSAlexander Kabaev *
2091b86b14eSAlexander Kabaev * This is a typical %queue operation. It shrinks the %queue by one.
2101b86b14eSAlexander Kabaev * The time complexity of the operation depends on the underlying
2111b86b14eSAlexander Kabaev * sequence.
2121b86b14eSAlexander Kabaev *
213ffeaf689SAlexander Kabaev * Note that no data is returned, and if the first element's
214ffeaf689SAlexander Kabaev * data is needed, it should be retrieved before pop() is
215ffeaf689SAlexander Kabaev * called.
2161b86b14eSAlexander Kabaev */
2171b86b14eSAlexander Kabaev void
218ffeaf689SAlexander Kabaev pop()
219ffeaf689SAlexander Kabaev {
220ffeaf689SAlexander Kabaev __glibcxx_requires_nonempty();
221ffeaf689SAlexander Kabaev c.pop_front();
222ffeaf689SAlexander Kabaev }
22300db7afdSDavid E. O'Brien };
22400db7afdSDavid E. O'Brien
2251b86b14eSAlexander Kabaev
2261b86b14eSAlexander Kabaev /**
2271b86b14eSAlexander Kabaev * @brief Queue equality comparison.
2281b86b14eSAlexander Kabaev * @param x A %queue.
2291b86b14eSAlexander Kabaev * @param y A %queue of the same type as @a x.
2301b86b14eSAlexander Kabaev * @return True iff the size and elements of the queues are equal.
2311b86b14eSAlexander Kabaev *
2321b86b14eSAlexander Kabaev * This is an equivalence relation. Complexity and semantics depend on the
2331b86b14eSAlexander Kabaev * underlying sequence type, but the expected rules are: this relation is
2341b86b14eSAlexander Kabaev * linear in the size of the sequences, and queues are considered equivalent
2351b86b14eSAlexander Kabaev * if their sequences compare equal.
2361b86b14eSAlexander Kabaev */
237*f8a1b7d9SAlexander Kabaev template<typename _Tp, typename _Seq>
2381b86b14eSAlexander Kabaev inline bool
239*f8a1b7d9SAlexander Kabaev operator==(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
2401b86b14eSAlexander Kabaev { return __x.c == __y.c; }
24100db7afdSDavid E. O'Brien
2421b86b14eSAlexander Kabaev /**
2431b86b14eSAlexander Kabaev * @brief Queue ordering relation.
2441b86b14eSAlexander Kabaev * @param x A %queue.
2451b86b14eSAlexander Kabaev * @param y A %queue of the same type as @a x.
246ffeaf689SAlexander Kabaev * @return True iff @a x is lexicographically less than @a y.
2471b86b14eSAlexander Kabaev *
248ffeaf689SAlexander Kabaev * This is an total ordering relation. Complexity and semantics
249ffeaf689SAlexander Kabaev * depend on the underlying sequence type, but the expected rules
250ffeaf689SAlexander Kabaev * are: this relation is linear in the size of the sequences, the
251ffeaf689SAlexander Kabaev * elements must be comparable with @c <, and
252ffeaf689SAlexander Kabaev * std::lexicographical_compare() is usually used to make the
2531b86b14eSAlexander Kabaev * determination.
2541b86b14eSAlexander Kabaev */
255*f8a1b7d9SAlexander Kabaev template<typename _Tp, typename _Seq>
2561b86b14eSAlexander Kabaev inline bool
257*f8a1b7d9SAlexander Kabaev operator<(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
2581b86b14eSAlexander Kabaev { return __x.c < __y.c; }
25900db7afdSDavid E. O'Brien
2601b86b14eSAlexander Kabaev /// Based on operator==
261*f8a1b7d9SAlexander Kabaev template<typename _Tp, typename _Seq>
2621b86b14eSAlexander Kabaev inline bool
263*f8a1b7d9SAlexander Kabaev operator!=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
2641b86b14eSAlexander Kabaev { return !(__x == __y); }
26500db7afdSDavid E. O'Brien
2661b86b14eSAlexander Kabaev /// Based on operator<
267*f8a1b7d9SAlexander Kabaev template<typename _Tp, typename _Seq>
2681b86b14eSAlexander Kabaev inline bool
269*f8a1b7d9SAlexander Kabaev operator>(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
2701b86b14eSAlexander Kabaev { return __y < __x; }
27100db7afdSDavid E. O'Brien
2721b86b14eSAlexander Kabaev /// Based on operator<
273*f8a1b7d9SAlexander Kabaev template<typename _Tp, typename _Seq>
2741b86b14eSAlexander Kabaev inline bool
275*f8a1b7d9SAlexander Kabaev operator<=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
2761b86b14eSAlexander Kabaev { return !(__y < __x); }
27700db7afdSDavid E. O'Brien
2781b86b14eSAlexander Kabaev /// Based on operator<
279*f8a1b7d9SAlexander Kabaev template<typename _Tp, typename _Seq>
2801b86b14eSAlexander Kabaev inline bool
281*f8a1b7d9SAlexander Kabaev operator>=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
2821b86b14eSAlexander Kabaev { return !(__x < __y); }
28300db7afdSDavid E. O'Brien
2841b86b14eSAlexander Kabaev /**
2851b86b14eSAlexander Kabaev * @brief A standard container automatically sorting its contents.
2861b86b14eSAlexander Kabaev *
2871b86b14eSAlexander Kabaev * @ingroup Containers
2881b86b14eSAlexander Kabaev * @ingroup Sequences
2891b86b14eSAlexander Kabaev *
290ffeaf689SAlexander Kabaev * This is not a true container, but an @e adaptor. It holds
291ffeaf689SAlexander Kabaev * another container, and provides a wrapper interface to that
292*f8a1b7d9SAlexander Kabaev * container. The wrapper is what enforces priority-based sorting
293*f8a1b7d9SAlexander Kabaev * and %queue behavior. Very few of the standard container/sequence
294*f8a1b7d9SAlexander Kabaev * interface requirements are met (e.g., iterators).
2951b86b14eSAlexander Kabaev *
2961b86b14eSAlexander Kabaev * The second template parameter defines the type of the underlying
297ffeaf689SAlexander Kabaev * sequence/container. It defaults to std::vector, but it can be
298ffeaf689SAlexander Kabaev * any type that supports @c front(), @c push_back, @c pop_back,
299ffeaf689SAlexander Kabaev * and random-access iterators, such as std::deque or an
300ffeaf689SAlexander Kabaev * appropriate user-defined type.
3011b86b14eSAlexander Kabaev *
302ffeaf689SAlexander Kabaev * The third template parameter supplies the means of making
303ffeaf689SAlexander Kabaev * priority comparisons. It defaults to @c less<value_type> but
304ffeaf689SAlexander Kabaev * can be anything defining a strict weak ordering.
3051b86b14eSAlexander Kabaev *
3061b86b14eSAlexander Kabaev * Members not found in "normal" containers are @c container_type,
307ffeaf689SAlexander Kabaev * which is a typedef for the second Sequence parameter, and @c
308*f8a1b7d9SAlexander Kabaev * push, @c pop, and @c top, which are standard %queue operations.
3091b86b14eSAlexander Kabaev *
310ffeaf689SAlexander Kabaev * @note No equality/comparison operators are provided for
311ffeaf689SAlexander Kabaev * %priority_queue.
3121b86b14eSAlexander Kabaev *
313ffeaf689SAlexander Kabaev * @note Sorting of the elements takes place as they are added to,
314ffeaf689SAlexander Kabaev * and removed from, the %priority_queue using the
315ffeaf689SAlexander Kabaev * %priority_queue's member functions. If you access the elements
316ffeaf689SAlexander Kabaev * by other means, and change their data such that the sorting
317ffeaf689SAlexander Kabaev * order would be different, the %priority_queue will not re-sort
318ffeaf689SAlexander Kabaev * the elements for you. (How could it know to do so?)
3191b86b14eSAlexander Kabaev */
3201b86b14eSAlexander Kabaev template<typename _Tp, typename _Sequence = vector<_Tp>,
3211b86b14eSAlexander Kabaev typename _Compare = less<typename _Sequence::value_type> >
32200db7afdSDavid E. O'Brien class priority_queue
32300db7afdSDavid E. O'Brien {
32400db7afdSDavid E. O'Brien // concept requirements
3251b86b14eSAlexander Kabaev typedef typename _Sequence::value_type _Sequence_value_type;
326ffeaf689SAlexander Kabaev __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
327ffeaf689SAlexander Kabaev __glibcxx_class_requires(_Sequence, _SequenceConcept)
328ffeaf689SAlexander Kabaev __glibcxx_class_requires(_Sequence, _RandomAccessContainerConcept)
329ffeaf689SAlexander Kabaev __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
330*f8a1b7d9SAlexander Kabaev __glibcxx_class_requires4(_Compare, bool, _Tp, _Tp,
331*f8a1b7d9SAlexander Kabaev _BinaryFunctionConcept)
33200db7afdSDavid E. O'Brien
33300db7afdSDavid E. O'Brien public:
33400db7afdSDavid E. O'Brien typedef typename _Sequence::value_type value_type;
3351b86b14eSAlexander Kabaev typedef typename _Sequence::reference reference;
3361b86b14eSAlexander Kabaev typedef typename _Sequence::const_reference const_reference;
33700db7afdSDavid E. O'Brien typedef typename _Sequence::size_type size_type;
33800db7afdSDavid E. O'Brien typedef _Sequence container_type;
33900db7afdSDavid E. O'Brien
34000db7afdSDavid E. O'Brien protected:
3411b86b14eSAlexander Kabaev // See queue::c for notes on these names.
34200db7afdSDavid E. O'Brien _Sequence c;
34300db7afdSDavid E. O'Brien _Compare comp;
3441b86b14eSAlexander Kabaev
34500db7afdSDavid E. O'Brien public:
3461b86b14eSAlexander Kabaev /**
3471b86b14eSAlexander Kabaev * @brief Default constructor creates no elements.
3481b86b14eSAlexander Kabaev */
3491b86b14eSAlexander Kabaev explicit
3501b86b14eSAlexander Kabaev priority_queue(const _Compare& __x = _Compare(),
35100db7afdSDavid E. O'Brien const _Sequence& __s = _Sequence())
c(__s)35200db7afdSDavid E. O'Brien : c(__s), comp(__x)
353ffeaf689SAlexander Kabaev { std::make_heap(c.begin(), c.end(), comp); }
35400db7afdSDavid E. O'Brien
3551b86b14eSAlexander Kabaev /**
3561b86b14eSAlexander Kabaev * @brief Builds a %queue from a range.
3571b86b14eSAlexander Kabaev * @param first An input iterator.
3581b86b14eSAlexander Kabaev * @param last An input iterator.
3591b86b14eSAlexander Kabaev * @param x A comparison functor describing a strict weak ordering.
3601b86b14eSAlexander Kabaev * @param s An initial sequence with which to start.
3611b86b14eSAlexander Kabaev *
362ffeaf689SAlexander Kabaev * Begins by copying @a s, inserting a copy of the elements
363ffeaf689SAlexander Kabaev * from @a [first,last) into the copy of @a s, then ordering
364ffeaf689SAlexander Kabaev * the copy according to @a x.
3651b86b14eSAlexander Kabaev *
366ffeaf689SAlexander Kabaev * For more information on function objects, see the
367ffeaf689SAlexander Kabaev * documentation on @link s20_3_1_base functor base
368ffeaf689SAlexander Kabaev * classes@endlink.
3691b86b14eSAlexander Kabaev */
3701b86b14eSAlexander Kabaev template<typename _InputIterator>
37100db7afdSDavid E. O'Brien priority_queue(_InputIterator __first, _InputIterator __last,
37200db7afdSDavid E. O'Brien const _Compare& __x = _Compare(),
37300db7afdSDavid E. O'Brien const _Sequence& __s = _Sequence())
c(__s)37400db7afdSDavid E. O'Brien : c(__s), comp(__x)
37500db7afdSDavid E. O'Brien {
376ffeaf689SAlexander Kabaev __glibcxx_requires_valid_range(__first, __last);
37700db7afdSDavid E. O'Brien c.insert(c.end(), __first, __last);
378ffeaf689SAlexander Kabaev std::make_heap(c.begin(), c.end(), comp);
37900db7afdSDavid E. O'Brien }
38000db7afdSDavid E. O'Brien
3811b86b14eSAlexander Kabaev /**
3821b86b14eSAlexander Kabaev * Returns true if the %queue is empty.
3831b86b14eSAlexander Kabaev */
3841b86b14eSAlexander Kabaev bool
empty()385*f8a1b7d9SAlexander Kabaev empty() const
386*f8a1b7d9SAlexander Kabaev { return c.empty(); }
38700db7afdSDavid E. O'Brien
3881b86b14eSAlexander Kabaev /** Returns the number of elements in the %queue. */
3891b86b14eSAlexander Kabaev size_type
size()390*f8a1b7d9SAlexander Kabaev size() const
391*f8a1b7d9SAlexander Kabaev { return c.size(); }
3921b86b14eSAlexander Kabaev
3931b86b14eSAlexander Kabaev /**
3941b86b14eSAlexander Kabaev * Returns a read-only (constant) reference to the data at the first
3951b86b14eSAlexander Kabaev * element of the %queue.
3961b86b14eSAlexander Kabaev */
3971b86b14eSAlexander Kabaev const_reference
top()398ffeaf689SAlexander Kabaev top() const
399ffeaf689SAlexander Kabaev {
400ffeaf689SAlexander Kabaev __glibcxx_requires_nonempty();
401ffeaf689SAlexander Kabaev return c.front();
402ffeaf689SAlexander Kabaev }
4031b86b14eSAlexander Kabaev
4041b86b14eSAlexander Kabaev /**
4051b86b14eSAlexander Kabaev * @brief Add data to the %queue.
4061b86b14eSAlexander Kabaev * @param x Data to be added.
4071b86b14eSAlexander Kabaev *
4081b86b14eSAlexander Kabaev * This is a typical %queue operation.
4091b86b14eSAlexander Kabaev * The time complexity of the operation depends on the underlying
4101b86b14eSAlexander Kabaev * sequence.
4111b86b14eSAlexander Kabaev */
41200db7afdSDavid E. O'Brien void
push(const value_type & __x)41300db7afdSDavid E. O'Brien push(const value_type& __x)
41400db7afdSDavid E. O'Brien {
41500db7afdSDavid E. O'Brien c.push_back(__x);
416ffeaf689SAlexander Kabaev std::push_heap(c.begin(), c.end(), comp);
41700db7afdSDavid E. O'Brien }
41800db7afdSDavid E. O'Brien
4191b86b14eSAlexander Kabaev /**
4201b86b14eSAlexander Kabaev * @brief Removes first element.
4211b86b14eSAlexander Kabaev *
422ffeaf689SAlexander Kabaev * This is a typical %queue operation. It shrinks the %queue
423ffeaf689SAlexander Kabaev * by one. The time complexity of the operation depends on the
424ffeaf689SAlexander Kabaev * underlying sequence.
4251b86b14eSAlexander Kabaev *
426ffeaf689SAlexander Kabaev * Note that no data is returned, and if the first element's
427ffeaf689SAlexander Kabaev * data is needed, it should be retrieved before pop() is
428ffeaf689SAlexander Kabaev * called.
4291b86b14eSAlexander Kabaev */
43000db7afdSDavid E. O'Brien void
pop()43100db7afdSDavid E. O'Brien pop()
43200db7afdSDavid E. O'Brien {
433ffeaf689SAlexander Kabaev __glibcxx_requires_nonempty();
434ffeaf689SAlexander Kabaev std::pop_heap(c.begin(), c.end(), comp);
43500db7afdSDavid E. O'Brien c.pop_back();
43600db7afdSDavid E. O'Brien }
43700db7afdSDavid E. O'Brien };
43800db7afdSDavid E. O'Brien
4391b86b14eSAlexander Kabaev // No equality/comparison operators are provided for priority_queue.
440*f8a1b7d9SAlexander Kabaev
441*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
44200db7afdSDavid E. O'Brien
443ffeaf689SAlexander Kabaev #endif /* _QUEUE_H */
444