1 // Stack implementation -*- C++ -*- 2 3 // Copyright (C) 2001 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_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 __GLIBCPP_INTERNAL_STACK_H 62 #define __GLIBCPP_INTERNAL_STACK_H 63 64 #include <bits/concept_check.h> 65 66 namespace std 67 { 68 69 // Forward declarations of operators == and <, needed for friend declaration. 70 71 template <class _Tp, 72 class _Sequence = deque<_Tp> > 73 class stack; 74 75 template <class _Tp, class _Seq> 76 bool operator==(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y); 77 78 template <class _Tp, class _Seq> 79 bool operator<(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y); 80 81 82 template <class _Tp, class _Sequence> 83 class stack 84 { 85 // concept requirements 86 __glibcpp_class_requires(_Tp, _SGIAssignableConcept) 87 __glibcpp_class_requires(_Sequence, _BackInsertionSequenceConcept) 88 typedef typename _Sequence::value_type _Sequence_value_type; 89 __glibcpp_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept); 90 91 template <class _Tp1, class _Seq1> 92 friend bool operator== (const stack<_Tp1, _Seq1>&, 93 const stack<_Tp1, _Seq1>&); 94 template <class _Tp1, class _Seq1> 95 friend bool operator< (const stack<_Tp1, _Seq1>&, 96 const stack<_Tp1, _Seq1>&); 97 public: 98 typedef typename _Sequence::value_type value_type; 99 typedef typename _Sequence::size_type size_type; 100 typedef _Sequence container_type; 101 102 typedef typename _Sequence::reference reference; 103 typedef typename _Sequence::const_reference const_reference; 104 protected: 105 _Sequence c; 106 public: 107 stack() : c() {} 108 explicit stack(const _Sequence& __s) : c(__s) {} 109 110 bool empty() const { return c.empty(); } 111 size_type size() const { return c.size(); } 112 reference top() { return c.back(); } 113 const_reference top() const { return c.back(); } 114 void push(const value_type& __x) { c.push_back(__x); } 115 void pop() { c.pop_back(); } 116 }; 117 118 template <class _Tp, class _Seq> 119 bool operator==(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y) 120 { 121 return __x.c == __y.c; 122 } 123 124 template <class _Tp, class _Seq> 125 bool operator<(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y) 126 { 127 return __x.c < __y.c; 128 } 129 130 template <class _Tp, class _Seq> 131 bool operator!=(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y) 132 { 133 return !(__x == __y); 134 } 135 136 template <class _Tp, class _Seq> 137 bool operator>(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y) 138 { 139 return __y < __x; 140 } 141 142 template <class _Tp, class _Seq> 143 bool operator<=(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y) 144 { 145 return !(__y < __x); 146 } 147 148 template <class _Tp, class _Seq> 149 bool operator>=(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y) 150 { 151 return !(__x < __y); 152 } 153 154 } // namespace std 155 156 #endif /* __GLIBCPP_INTERNAL_STACK_H */ 157 158 // Local Variables: 159 // mode:C++ 160 // End: 161