source: svn/trunk/newcon3bcm2_21bu/toolchain/include/c++/3.4.2/bits/stl_queue.h

Last change on this file was 2, checked in by jglee, 11 years ago

first commit

  • Property svn:executable set to *
File size: 15.7 KB
Line 
1// Queue implementation -*- C++ -*-
2
3// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 2, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// You should have received a copy of the GNU General Public License along
17// with this library; see the file COPYING.  If not, write to the Free
18// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19// USA.
20
21// As a special exception, you may use this file as part of a free software
22// library without restriction.  Specifically, if other files instantiate
23// templates or use macros or inline functions from this file, or you compile
24// this file and link it with other files to produce an executable, this
25// file does not by itself cause the resulting executable to be covered by
26// the GNU General Public License.  This exception does not however
27// invalidate any other reasons why the executable file might be covered by
28// the GNU General Public License.
29
30/*
31 *
32 * Copyright (c) 1994
33 * Hewlett-Packard Company
34 *
35 * Permission to use, copy, modify, distribute and sell this software
36 * and its documentation for any purpose is hereby granted without fee,
37 * provided that the above copyright notice appear in all copies and
38 * that both that copyright notice and this permission notice appear
39 * in supporting documentation.  Hewlett-Packard Company makes no
40 * representations about the suitability of this software for any
41 * purpose.  It is provided "as is" without express or implied warranty.
42 *
43 *
44 * Copyright (c) 1996,1997
45 * Silicon Graphics Computer Systems, Inc.
46 *
47 * Permission to use, copy, modify, distribute and sell this software
48 * and its documentation for any purpose is hereby granted without fee,
49 * provided that the above copyright notice appear in all copies and
50 * that both that copyright notice and this permission notice appear
51 * in supporting documentation.  Silicon Graphics makes no
52 * representations about the suitability of this software for any
53 * purpose.  It is provided "as is" without express or implied warranty.
54 */
55
56/** @file stl_queue.h
57 *  This is an internal header file, included by other library headers.
58 *  You should not attempt to use it directly.
59 */
60
61#ifndef _QUEUE_H
62#define _QUEUE_H 1
63
64#include <bits/concept_check.h>
65#include <debug/debug.h>
66
67namespace std
68{
69  // Forward declarations of operators < and ==, needed for friend declaration.
70  template<typename _Tp, typename _Sequence = deque<_Tp> >
71    class queue;
72
73  template<typename _Tp, typename _Seq>
74    inline bool
75    operator==(const queue<_Tp,_Seq>&, const queue<_Tp,_Seq>&);
76
77  template<typename _Tp, typename _Seq>
78    inline bool
79    operator<(const queue<_Tp,_Seq>&, const queue<_Tp,_Seq>&);
80
81  /**
82   *  @brief  A standard container giving FIFO behavior.
83   *
84   *  @ingroup Containers
85   *  @ingroup Sequences
86   *
87   *  Meets many of the requirements of a
88   *  <a href="tables.html#65">container</a>,
89   *  but does not define anything to do with iterators.  Very few of the
90   *  other standard container interfaces are defined.
91   *
92   *  This is not a true container, but an @e adaptor.  It holds another
93   *  container, and provides a wrapper interface to that container.  The
94   *  wrapper is what enforces strict first-in-first-out %queue behavior.
95   *
96   *  The second template parameter defines the type of the underlying
97   *  sequence/container.  It defaults to std::deque, but it can be any type
98   *  that supports @c front, @c back, @c push_back, and @c pop_front,
99   *  such as std::list or an appropriate user-defined type.
100   *
101   *  Members not found in "normal" containers are @c container_type,
102   *  which is a typedef for the second Sequence parameter, and @c push and
103   *  @c pop, which are standard %queue/FIFO operations.
104  */
105  template<typename _Tp, typename _Sequence>
106    class queue
107    {
108      // concept requirements
109      typedef typename _Sequence::value_type _Sequence_value_type;
110      __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
111      __glibcxx_class_requires(_Sequence, _FrontInsertionSequenceConcept)
112      __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept)
113      __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
114
115      template<typename _Tp1, typename _Seq1>
116        friend bool
117        operator==(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
118
119      template<typename _Tp1, typename _Seq1>
120        friend bool
121        operator<(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
122
123    public:
124      typedef typename _Sequence::value_type                value_type;
125      typedef typename _Sequence::reference                 reference;
126      typedef typename _Sequence::const_reference           const_reference;
127      typedef typename _Sequence::size_type                 size_type;
128      typedef          _Sequence                            container_type;
129
130    protected:
131      /**
132       *  'c' is the underlying container.  Maintainers wondering why
133       *  this isn't uglified as per style guidelines should note that
134       *  this name is specified in the standard, [23.2.3.1].  (Why?
135       *  Presumably for the same reason that it's protected instead
136       *  of private: to allow derivation.  But none of the other
137       *  containers allow for derivation.  Odd.)
138       */
139      _Sequence c;
140
141    public:
142      /**
143       *  @brief  Default constructor creates no elements.
144       */
145      explicit
146      queue(const _Sequence& __c = _Sequence()) : c(__c) {}
147
148      /**
149       *  Returns true if the %queue is empty.
150       */
151      bool
152      empty() const
153      { return c.empty(); }
154
155      /**  Returns the number of elements in the %queue.  */
156      size_type
157      size() const
158      { return c.size(); }
159
160      /**
161       *  Returns a read/write reference to the data at the first
162       *  element of the %queue.
163       */
164      reference
165      front()
166      {
167        __glibcxx_requires_nonempty();
168        return c.front();
169      }
170
171      /**
172       *  Returns a read-only (constant) reference to the data at the first
173       *  element of the %queue.
174       */
175      const_reference
176      front() const
177      {
178        __glibcxx_requires_nonempty();
179        return c.front();
180      }
181
182      /**
183       *  Returns a read/write reference to the data at the last
184       *  element of the %queue.
185       */
186      reference
187      back()
188      {
189        __glibcxx_requires_nonempty();
190        return c.back();
191      }
192
193      /**
194       *  Returns a read-only (constant) reference to the data at the last
195       *  element of the %queue.
196       */
197      const_reference
198      back() const
199      {
200        __glibcxx_requires_nonempty();
201        return c.back();
202      }
203
204      /**
205       *  @brief  Add data to the end of the %queue.
206       *  @param  x  Data to be added.
207       *
208       *  This is a typical %queue operation.  The function creates an
209       *  element at the end of the %queue and assigns the given data
210       *  to it.  The time complexity of the operation depends on the
211       *  underlying sequence.
212       */
213      void
214      push(const value_type& __x)
215      { c.push_back(__x); }
216
217      /**
218       *  @brief  Removes first element.
219       *
220       *  This is a typical %queue operation.  It shrinks the %queue by one.
221       *  The time complexity of the operation depends on the underlying
222       *  sequence.
223       *
224       *  Note that no data is returned, and if the first element's
225       *  data is needed, it should be retrieved before pop() is
226       *  called.
227       */
228      void
229      pop()
230      {
231        __glibcxx_requires_nonempty();
232        c.pop_front();
233      }
234    };
235
236
237  /**
238   *  @brief  Queue equality comparison.
239   *  @param  x  A %queue.
240   *  @param  y  A %queue of the same type as @a x.
241   *  @return  True iff the size and elements of the queues are equal.
242   *
243   *  This is an equivalence relation.  Complexity and semantics depend on the
244   *  underlying sequence type, but the expected rules are:  this relation is
245   *  linear in the size of the sequences, and queues are considered equivalent
246   *  if their sequences compare equal.
247  */
248  template<typename _Tp, typename _Sequence>
249    inline bool
250    operator==(const queue<_Tp,_Sequence>& __x,
251               const queue<_Tp,_Sequence>& __y)
252    { return __x.c == __y.c; }
253
254  /**
255   *  @brief  Queue ordering relation.
256   *  @param  x  A %queue.
257   *  @param  y  A %queue of the same type as @a x.
258   *  @return  True iff @a x is lexicographically less than @a y.
259   *
260   *  This is an total ordering relation.  Complexity and semantics
261   *  depend on the underlying sequence type, but the expected rules
262   *  are: this relation is linear in the size of the sequences, the
263   *  elements must be comparable with @c <, and
264   *  std::lexicographical_compare() is usually used to make the
265   *  determination.
266  */
267  template<typename _Tp, typename _Sequence>
268    inline bool
269    operator<(const queue<_Tp,_Sequence>& __x, const queue<_Tp,_Sequence>& __y)
270    { return __x.c < __y.c; }
271
272  /// Based on operator==
273  template<typename _Tp, typename _Sequence>
274    inline bool
275    operator!=(const queue<_Tp,_Sequence>& __x,
276               const queue<_Tp,_Sequence>& __y)
277    { return !(__x == __y); }
278
279  /// Based on operator<
280  template<typename _Tp, typename _Sequence>
281    inline bool
282    operator>(const queue<_Tp,_Sequence>& __x, const queue<_Tp,_Sequence>& __y)
283    { return __y < __x; }
284
285  /// Based on operator<
286  template<typename _Tp, typename _Sequence>
287    inline bool
288    operator<=(const queue<_Tp,_Sequence>& __x,
289               const queue<_Tp,_Sequence>& __y)
290    { return !(__y < __x); }
291
292  /// Based on operator<
293  template<typename _Tp, typename _Sequence>
294    inline bool
295    operator>=(const queue<_Tp,_Sequence>& __x,
296               const queue<_Tp,_Sequence>& __y)
297    { return !(__x < __y); }
298
299  /**
300   *  @brief  A standard container automatically sorting its contents.
301   *
302   *  @ingroup Containers
303   *  @ingroup Sequences
304   *
305   *  This is not a true container, but an @e adaptor.  It holds
306   *  another container, and provides a wrapper interface to that
307   *  container.  The wrapper is what enforces sorting and
308   *  first-in-first-out %queue behavior.  Very few of the standard
309   *  container/sequence interface requirements are met (e.g.,
310   *  iterators).
311   *
312   *  The second template parameter defines the type of the underlying
313   *  sequence/container.  It defaults to std::vector, but it can be
314   *  any type that supports @c front(), @c push_back, @c pop_back,
315   *  and random-access iterators, such as std::deque or an
316   *  appropriate user-defined type.
317   *
318   *  The third template parameter supplies the means of making
319   *  priority comparisons.  It defaults to @c less<value_type> but
320   *  can be anything defining a strict weak ordering.
321   *
322   *  Members not found in "normal" containers are @c container_type,
323   *  which is a typedef for the second Sequence parameter, and @c
324   *  push, @c pop, and @c top, which are standard %queue/FIFO
325   *  operations.
326   *
327   *  @note No equality/comparison operators are provided for
328   *  %priority_queue.
329   *
330   *  @note Sorting of the elements takes place as they are added to,
331   *  and removed from, the %priority_queue using the
332   *  %priority_queue's member functions.  If you access the elements
333   *  by other means, and change their data such that the sorting
334   *  order would be different, the %priority_queue will not re-sort
335   *  the elements for you.  (How could it know to do so?)
336  */
337  template<typename _Tp, typename _Sequence = vector<_Tp>,
338           typename _Compare  = less<typename _Sequence::value_type> >
339    class priority_queue
340    {
341      // concept requirements
342      typedef typename _Sequence::value_type _Sequence_value_type;
343      __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
344      __glibcxx_class_requires(_Sequence, _SequenceConcept)
345      __glibcxx_class_requires(_Sequence, _RandomAccessContainerConcept)
346      __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
347      __glibcxx_class_requires4(_Compare, bool, _Tp,_Tp,_BinaryFunctionConcept)
348
349    public:
350      typedef typename _Sequence::value_type                value_type;
351      typedef typename _Sequence::reference                 reference;
352      typedef typename _Sequence::const_reference           const_reference;
353      typedef typename _Sequence::size_type                 size_type;
354      typedef          _Sequence                            container_type;
355
356    protected:
357      //  See queue::c for notes on these names.
358      _Sequence  c;
359      _Compare   comp;
360
361    public:
362      /**
363       *  @brief  Default constructor creates no elements.
364       */
365      explicit
366      priority_queue(const _Compare& __x = _Compare(),
367                     const _Sequence& __s = _Sequence())
368      : c(__s), comp(__x)
369      { std::make_heap(c.begin(), c.end(), comp); }
370
371      /**
372       *  @brief  Builds a %queue from a range.
373       *  @param  first  An input iterator.
374       *  @param  last  An input iterator.
375       *  @param  x  A comparison functor describing a strict weak ordering.
376       *  @param  s  An initial sequence with which to start.
377       *
378       *  Begins by copying @a s, inserting a copy of the elements
379       *  from @a [first,last) into the copy of @a s, then ordering
380       *  the copy according to @a x.
381       *
382       *  For more information on function objects, see the
383       *  documentation on @link s20_3_1_base functor base
384       *  classes@endlink.
385       */
386      template<typename _InputIterator>
387        priority_queue(_InputIterator __first, _InputIterator __last,
388                       const _Compare& __x = _Compare(),
389                       const _Sequence& __s = _Sequence())
390        : c(__s), comp(__x)
391        {
392          __glibcxx_requires_valid_range(__first, __last);
393          c.insert(c.end(), __first, __last);
394          std::make_heap(c.begin(), c.end(), comp);
395        }
396
397      /**
398       *  Returns true if the %queue is empty.
399       */
400      bool
401      empty() const { return c.empty(); }
402
403      /**  Returns the number of elements in the %queue.  */
404      size_type
405      size() const { return c.size(); }
406
407      /**
408       *  Returns a read-only (constant) reference to the data at the first
409       *  element of the %queue.
410       */
411      const_reference
412      top() const
413      {
414        __glibcxx_requires_nonempty();
415        return c.front();
416      }
417
418      /**
419       *  @brief  Add data to the %queue.
420       *  @param  x  Data to be added.
421       *
422       *  This is a typical %queue operation.
423       *  The time complexity of the operation depends on the underlying
424       *  sequence.
425       */
426      void
427      push(const value_type& __x)
428      {
429        try
430        {
431          c.push_back(__x);
432          std::push_heap(c.begin(), c.end(), comp);
433        }
434        catch(...)
435        {
436          c.clear();
437          __throw_exception_again;
438        }
439      }
440
441      /**
442       *  @brief  Removes first element.
443       *
444       *  This is a typical %queue operation.  It shrinks the %queue
445       *  by one.  The time complexity of the operation depends on the
446       *  underlying sequence.
447       *
448       *  Note that no data is returned, and if the first element's
449       *  data is needed, it should be retrieved before pop() is
450       *  called.
451       */
452      void
453      pop()
454      {
455        __glibcxx_requires_nonempty();
456        try
457        {
458          std::pop_heap(c.begin(), c.end(), comp);
459          c.pop_back();
460        }
461        catch(...)
462        {
463          c.clear();
464          __throw_exception_again;
465        }
466      }
467    };
468
469  // No equality/comparison operators are provided for priority_queue.
470} // namespace std
471
472#endif /* _QUEUE_H */
Note: See TracBrowser for help on using the repository browser.