LTP GCOV extension - code coverage report
Current view: directory - usr/include/c++/4.1.2/bits - stl_stack.h
Test: stap.info
Date: 2008-03-12 Instrumented lines: 11
Code covered: 100.0 % Executed lines: 11

       1                 : // Stack implementation -*- C++ -*-
       2                 : 
       3                 : // Copyright (C) 2001, 2002, 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
      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_stack.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 _STACK_H
      62                 : #define _STACK_H 1
      63                 : 
      64                 : #include <bits/concept_check.h>
      65                 : #include <debug/debug.h>
      66                 : 
      67                 : namespace std
      68                 : {
      69                 :   // Forward declarations of operators == and <, needed for friend
      70                 :   // declaration.
      71                 :   template<typename _Tp, typename _Sequence = deque<_Tp> >
      72                 :     class stack;
      73                 : 
      74                 :   template<typename _Tp, typename _Seq>
      75                 :     inline bool
      76                 :     operator==(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y);
      77                 : 
      78                 :   template<typename _Tp, typename _Seq>
      79                 :     inline bool
      80                 :     operator<(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y);
      81                 : 
      82                 :   /**
      83                 :    *  @brief  A standard container giving FILO behavior.
      84                 :    *
      85                 :    *  @ingroup Containers
      86                 :    *  @ingroup Sequences
      87                 :    *
      88                 :    *  Meets many of the requirements of a
      89                 :    *  <a href="tables.html#65">container</a>,
      90                 :    *  but does not define anything to do with iterators.  Very few of the
      91                 :    *  other standard container interfaces are defined.
      92                 :    *
      93                 :    *  This is not a true container, but an @e adaptor.  It holds
      94                 :    *  another container, and provides a wrapper interface to that
      95                 :    *  container.  The wrapper is what enforces strict
      96                 :    *  first-in-last-out %stack behavior.
      97                 :    *
      98                 :    *  The second template parameter defines the type of the underlying
      99                 :    *  sequence/container.  It defaults to std::deque, but it can be
     100                 :    *  any type that supports @c back, @c push_back, and @c pop_front,
     101                 :    *  such as std::list, std::vector, or an appropriate user-defined
     102                 :    *  type.
     103                 :    *
     104                 :    *  Members not found in "normal" containers are @c container_type,
     105                 :    *  which is a typedef for the second Sequence parameter, and @c
     106                 :    *  push, @c pop, and @c top, which are standard %stack/FILO
     107                 :    *  operations.
     108                 :   */
     109                 :   template<typename _Tp, typename _Sequence>
     110                 :     class stack
     111         1678719 :     {
     112                 :       // concept requirements
     113                 :       typedef typename _Sequence::value_type _Sequence_value_type;
     114                 :       __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
     115                 :       __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept)
     116                 :       __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
     117                 : 
     118                 :       template<typename _Tp1, typename _Seq1>
     119                 :         friend bool
     120                 :         operator==(const stack<_Tp1, _Seq1>&, const stack<_Tp1, _Seq1>&);
     121                 : 
     122                 :       template<typename _Tp1, typename _Seq1>
     123                 :         friend bool
     124                 :         operator<(const stack<_Tp1, _Seq1>&, const stack<_Tp1, _Seq1>&);
     125                 : 
     126                 :     public:
     127                 :       typedef typename _Sequence::value_type                value_type;
     128                 :       typedef typename _Sequence::reference                 reference;
     129                 :       typedef typename _Sequence::const_reference           const_reference;
     130                 :       typedef typename _Sequence::size_type                 size_type;
     131                 :       typedef          _Sequence                            container_type;
     132                 : 
     133                 :     protected:
     134                 :       //  See queue::c for notes on this name.
     135                 :       _Sequence c;
     136                 : 
     137                 :     public:
     138                 :       // XXX removed old def ctor, added def arg to this one to match 14882
     139                 :       /**
     140                 :        *  @brief  Default constructor creates no elements.
     141                 :        */
     142                 :       explicit
     143         1678719 :       stack(const _Sequence& __c = _Sequence())
     144         1678719 :       : c(__c) {}
     145                 : 
     146                 :       /**
     147                 :        *  Returns true if the %stack is empty.
     148                 :        */
     149                 :       bool
     150         7373155 :       empty() const
     151         7373155 :       { return c.empty(); }
     152                 : 
     153                 :       /**  Returns the number of elements in the %stack.  */
     154                 :       size_type
     155                 :       size() const
     156                 :       { return c.size(); }
     157                 : 
     158                 :       /**
     159                 :        *  Returns a read/write reference to the data at the first
     160                 :        *  element of the %stack.
     161                 :        */
     162                 :       reference
     163         7373155 :       top()
     164                 :       {
     165                 :         __glibcxx_requires_nonempty();
     166         7373155 :         return c.back();
     167                 :       }
     168                 : 
     169                 :       /**
     170                 :        *  Returns a read-only (constant) reference to the data at the first
     171                 :        *  element of the %stack.
     172                 :        */
     173                 :       const_reference
     174                 :       top() const
     175                 :       {
     176                 :         __glibcxx_requires_nonempty();
     177                 :         return c.back();
     178                 :       }
     179                 : 
     180                 :       /**
     181                 :        *  @brief  Add data to the top of the %stack.
     182                 :        *  @param  x  Data to be added.
     183                 :        *
     184                 :        *  This is a typical %stack operation.  The function creates an
     185                 :        *  element at the top of the %stack and assigns the given data
     186                 :        *  to it.  The time complexity of the operation depends on the
     187                 :        *  underlying sequence.
     188                 :        */
     189                 :       void
     190         7579481 :       push(const value_type& __x)
     191         7579481 :       { c.push_back(__x); }
     192                 : 
     193                 :       /**
     194                 :        *  @brief  Removes first element.
     195                 :        *
     196                 :        *  This is a typical %stack operation.  It shrinks the %stack
     197                 :        *  by one.  The time complexity of the operation depends on the
     198                 :        *  underlying sequence.
     199                 :        *
     200                 :        *  Note that no data is returned, and if the first element's
     201                 :        *  data is needed, it should be retrieved before pop() is
     202                 :        *  called.
     203                 :        */
     204                 :       void
     205         7579459 :       pop()
     206                 :       {
     207                 :         __glibcxx_requires_nonempty();
     208         7579459 :         c.pop_back();
     209                 :       }
     210                 :     };
     211                 : 
     212                 :   /**
     213                 :    *  @brief  Stack equality comparison.
     214                 :    *  @param  x  A %stack.
     215                 :    *  @param  y  A %stack of the same type as @a x.
     216                 :    *  @return  True iff the size and elements of the stacks are equal.
     217                 :    *
     218                 :    *  This is an equivalence relation.  Complexity and semantics
     219                 :    *  depend on the underlying sequence type, but the expected rules
     220                 :    *  are: this relation is linear in the size of the sequences, and
     221                 :    *  stacks are considered equivalent if their sequences compare
     222                 :    *  equal.
     223                 :   */
     224                 :   template<typename _Tp, typename _Seq>
     225                 :     inline bool
     226                 :     operator==(const stack<_Tp, _Seq>& __x, const stack<_Tp, _Seq>& __y)
     227                 :     { return __x.c == __y.c; }
     228                 : 
     229                 :   /**
     230                 :    *  @brief  Stack ordering relation.
     231                 :    *  @param  x  A %stack.
     232                 :    *  @param  y  A %stack of the same type as @a x.
     233                 :    *  @return  True iff @a x is lexicographically less than @a y.
     234                 :    *
     235                 :    *  This is an total ordering relation.  Complexity and semantics
     236                 :    *  depend on the underlying sequence type, but the expected rules
     237                 :    *  are: this relation is linear in the size of the sequences, the
     238                 :    *  elements must be comparable with @c <, and
     239                 :    *  std::lexicographical_compare() is usually used to make the
     240                 :    *  determination.
     241                 :   */
     242                 :   template<typename _Tp, typename _Seq>
     243                 :     inline bool
     244                 :     operator<(const stack<_Tp, _Seq>& __x, const stack<_Tp, _Seq>& __y)
     245                 :     { return __x.c < __y.c; }
     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 !(__x == __y); }
     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 __y < __x; }
     258                 : 
     259                 :   /// Based on operator<
     260                 :   template<typename _Tp, typename _Seq>
     261                 :     inline bool
     262                 :     operator<=(const stack<_Tp, _Seq>& __x, const stack<_Tp, _Seq>& __y)
     263                 :     { return !(__y < __x); }
     264                 : 
     265                 :   /// Based on operator<
     266                 :   template<typename _Tp, typename _Seq>
     267                 :     inline bool
     268                 :     operator>=(const stack<_Tp, _Seq>& __x, const stack<_Tp, _Seq>& __y)
     269                 :     { return !(__x < __y); }
     270                 : } // namespace std
     271                 : 
     272                 : #endif /* _STACK_H */

Generated by: LTP GCOV extension version 1.5