00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef BISON_STACK_HH
00036 # define BISON_STACK_HH
00037
00038 #include <deque>
00039
00040 namespace example {
00041
00042 template <class T, class S = std::deque<T> >
00043 class stack
00044 {
00045 public:
00046
00047
00048 typedef typename S::reverse_iterator iterator;
00049 typedef typename S::const_reverse_iterator const_iterator;
00050
00051 stack () : seq_ ()
00052 {
00053 }
00054
00055 stack (unsigned int n) : seq_ (n)
00056 {
00057 }
00058
00059 inline
00060 T&
00061 operator [] (unsigned int i)
00062 {
00063 return seq_[i];
00064 }
00065
00066 inline
00067 const T&
00068 operator [] (unsigned int i) const
00069 {
00070 return seq_[i];
00071 }
00072
00073 inline
00074 void
00075 push (const T& t)
00076 {
00077 seq_.push_front (t);
00078 }
00079
00080 inline
00081 void
00082 pop (unsigned int n = 1)
00083 {
00084 for (; n; --n)
00085 seq_.pop_front ();
00086 }
00087
00088 inline
00089 unsigned int
00090 height () const
00091 {
00092 return seq_.size ();
00093 }
00094
00095 inline const_iterator begin () const { return seq_.rbegin (); }
00096 inline const_iterator end () const { return seq_.rend (); }
00097
00098 private:
00099
00100 S seq_;
00101 };
00102
00104 template <class T, class S = stack<T> >
00105 class slice
00106 {
00107 public:
00108
00109 slice (const S& stack,
00110 unsigned int range) : stack_ (stack),
00111 range_ (range)
00112 {
00113 }
00114
00115 inline
00116 const T&
00117 operator [] (unsigned int i) const
00118 {
00119 return stack_[range_ - i];
00120 }
00121
00122 private:
00123
00124 const S& stack_;
00125 unsigned int range_;
00126 };
00127
00128 }
00129
00130 #endif // not BISON_STACK_HH