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