1// Stack implementation -*- C++ -*-
2
3// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
4// Free Software Foundation, Inc.
5//
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 2, or (at your option)
10// any later version.
11
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.
16
17// You should have received a copy of the GNU General Public License along
18// with this library; see the file COPYING.  If not, write to the Free
19// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
20// USA.
21
22// As a special exception, you may use this file as part of a free software
23// library without restriction.  Specifically, if other files instantiate
24// templates or use macros or inline functions from this file, or you compile
25// this file and link it with other files to produce an executable, this
26// file does not by itself cause the resulting executable to be covered by
27// the GNU General Public License.  This exception does not however
28// invalidate any other reasons why the executable file might be covered by
29// the GNU General Public License.
30
31/*
32 *
33 * Copyright (c) 1994
34 * Hewlett-Packard Company
35 *
36 * Permission to use, copy, modify, distribute and sell this software
37 * and its documentation for any purpose is hereby granted without fee,
38 * provided that the above copyright notice appear in all copies and
39 * that both that copyright notice and this permission notice appear
40 * in supporting documentation.  Hewlett-Packard Company makes no
41 * representations about the suitability of this software for any
42 * purpose.  It is provided "as is" without express or implied warranty.
43 *
44 *
45 * Copyright (c) 1996,1997
46 * Silicon Graphics Computer Systems, Inc.
47 *
48 * Permission to use, copy, modify, distribute and sell this software
49 * and its documentation for any purpose is hereby granted without fee,
50 * provided that the above copyright notice appear in all copies and
51 * that both that copyright notice and this permission notice appear
52 * in supporting documentation.  Silicon Graphics makes no
53 * representations about the suitability of this software for any
54 * purpose.  It is provided "as is" without express or implied warranty.
55 */
56
57/** @file stl_stack.h
58 *  This is an internal header file, included by other library headers.
59 *  You should not attempt to use it directly.
60 */
61
62#ifndef _STACK_H
63#define _STACK_H 1
64
65#include <bits/concept_check.h>
66#include <debug/debug.h>
67
68_GLIBCXX_BEGIN_NAMESPACE(std)
69
70  /**
71   *  @brief  A standard container giving FILO behavior.
72   *
73   *  @ingroup Containers
74   *  @ingroup Sequences
75   *
76   *  Meets many of the requirements of a
77   *  <a href="tables.html#65">container</a>,
78   *  but does not define anything to do with iterators.  Very few of the
79   *  other standard container interfaces are defined.
80   *
81   *  This is not a true container, but an @e adaptor.  It holds
82   *  another container, and provides a wrapper interface to that
83   *  container.  The wrapper is what enforces strict
84   *  first-in-last-out %stack behavior.
85   *
86   *  The second template parameter defines the type of the underlying
87   *  sequence/container.  It defaults to std::deque, but it can be
88   *  any type that supports @c back, @c push_back, and @c pop_front,
89   *  such as std::list, std::vector, or an appropriate user-defined
90   *  type.
91   *
92   *  Members not found in "normal" containers are @c container_type,
93   *  which is a typedef for the second Sequence parameter, and @c
94   *  push, @c pop, and @c top, which are standard %stack/FILO
95   *  operations.
96  */
97  template<typename _Tp, typename _Sequence = deque<_Tp> >
98    class stack
99    {
100      // concept requirements
101      typedef typename _Sequence::value_type _Sequence_value_type;
102      __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
103      __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept)
104      __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
105
106      template<typename _Tp1, typename _Seq1>
107        friend bool
108        operator==(const stack<_Tp1, _Seq1>&, const stack<_Tp1, _Seq1>&);
109
110      template<typename _Tp1, typename _Seq1>
111        friend bool
112        operator<(const stack<_Tp1, _Seq1>&, const stack<_Tp1, _Seq1>&);
113
114    public:
115      typedef typename _Sequence::value_type                value_type;
116      typedef typename _Sequence::reference                 reference;
117      typedef typename _Sequence::const_reference           const_reference;
118      typedef typename _Sequence::size_type                 size_type;
119      typedef          _Sequence                            container_type;
120
121    protected:
122      //  See queue::c for notes on this name.
123      _Sequence c;
124
125    public:
126      // XXX removed old def ctor, added def arg to this one to match 14882
127      /**
128       *  @brief  Default constructor creates no elements.
129       */
130      explicit
131      stack(const _Sequence& __c = _Sequence())
132      : c(__c) { }
133
134      /**
135       *  Returns true if the %stack is empty.
136       */
137      bool
138      empty() const
139      { return c.empty(); }
140
141      /**  Returns the number of elements in the %stack.  */
142      size_type
143      size() const
144      { return c.size(); }
145
146      /**
147       *  Returns a read/write reference to the data at the first
148       *  element of the %stack.
149       */
150      reference
151      top()
152      {
153	__glibcxx_requires_nonempty();
154	return c.back();
155      }
156
157      /**
158       *  Returns a read-only (constant) reference to the data at the first
159       *  element of the %stack.
160       */
161      const_reference
162      top() const
163      {
164	__glibcxx_requires_nonempty();
165	return c.back();
166      }
167
168      /**
169       *  @brief  Add data to the top of the %stack.
170       *  @param  x  Data to be added.
171       *
172       *  This is a typical %stack operation.  The function creates an
173       *  element at the top of the %stack and assigns the given data
174       *  to it.  The time complexity of the operation depends on the
175       *  underlying sequence.
176       */
177      void
178      push(const value_type& __x)
179      { c.push_back(__x); }
180
181      /**
182       *  @brief  Removes first element.
183       *
184       *  This is a typical %stack operation.  It shrinks the %stack
185       *  by one.  The time complexity of the operation depends on the
186       *  underlying sequence.
187       *
188       *  Note that no data is returned, and if the first element's
189       *  data is needed, it should be retrieved before pop() is
190       *  called.
191       */
192      void
193      pop()
194      {
195	__glibcxx_requires_nonempty();
196	c.pop_back();
197      }
198    };
199
200  /**
201   *  @brief  Stack equality comparison.
202   *  @param  x  A %stack.
203   *  @param  y  A %stack of the same type as @a x.
204   *  @return  True iff the size and elements of the stacks are equal.
205   *
206   *  This is an equivalence relation.  Complexity and semantics
207   *  depend on the underlying sequence type, but the expected rules
208   *  are: this relation is linear in the size of the sequences, and
209   *  stacks are considered equivalent if their sequences compare
210   *  equal.
211  */
212  template<typename _Tp, typename _Seq>
213    inline bool
214    operator==(const stack<_Tp, _Seq>& __x, const stack<_Tp, _Seq>& __y)
215    { return __x.c == __y.c; }
216
217  /**
218   *  @brief  Stack ordering relation.
219   *  @param  x  A %stack.
220   *  @param  y  A %stack of the same type as @a x.
221   *  @return  True iff @a x is lexicographically less than @a y.
222   *
223   *  This is an total ordering relation.  Complexity and semantics
224   *  depend on the underlying sequence type, but the expected rules
225   *  are: this relation is linear in the size of the sequences, the
226   *  elements must be comparable with @c <, and
227   *  std::lexicographical_compare() is usually used to make the
228   *  determination.
229  */
230  template<typename _Tp, typename _Seq>
231    inline bool
232    operator<(const stack<_Tp, _Seq>& __x, const stack<_Tp, _Seq>& __y)
233    { return __x.c < __y.c; }
234
235  /// Based on operator==
236  template<typename _Tp, typename _Seq>
237    inline bool
238    operator!=(const stack<_Tp, _Seq>& __x, const stack<_Tp, _Seq>& __y)
239    { return !(__x == __y); }
240
241  /// Based on operator<
242  template<typename _Tp, typename _Seq>
243    inline bool
244    operator>(const stack<_Tp, _Seq>& __x, const stack<_Tp, _Seq>& __y)
245    { return __y < __x; }
246
247  /// Based on operator<
248  template<typename _Tp, typename _Seq>
249    inline bool
250    operator<=(const stack<_Tp, _Seq>& __x, const stack<_Tp, _Seq>& __y)
251    { return !(__y < __x); }
252
253  /// Based on operator<
254  template<typename _Tp, typename _Seq>
255    inline bool
256    operator>=(const stack<_Tp, _Seq>& __x, const stack<_Tp, _Seq>& __y)
257    { return !(__x < __y); }
258
259_GLIBCXX_END_NAMESPACE
260
261#endif /* _STACK_H */
262