IT++ Logo
stack.h
Go to the documentation of this file.
00001 
00035 #ifndef STACK_H
00036 #define STACK_H
00037 
00038 #include <itpp/base/itassert.h>
00039 
00040 
00041 namespace itpp
00042 {
00043 
00065 template<class T>
00066 class Stack
00067 {
00068 public:
00070   Stack();
00072   Stack(int n);
00074   Stack(const Stack<T> &s);
00076   virtual ~Stack();
00077 
00079   T pop();
00081   T peek() const;
00083   void push(T v);
00085   void clear();
00086 
00088   void operator=(const Stack<T> &s);
00089 
00091   int size() const { return ndata; }
00093   int no_elements() const { return valptr; }
00095   void set_size(int n, bool copy = false);
00096 
00097 private:
00098   int valptr;
00099   int ndata;
00100   T *data;
00101 
00102 private:
00103   void alloc(int n);
00104   void free();
00105 };
00106 
00107 // --------------------------- Implementation starts here ----------------------------------
00108 
00109 template<class T>
00110 Stack<T>::Stack()
00111 {
00112   data = 0;
00113   ndata = 0;
00114   valptr = 0;
00115 }
00116 
00117 template<class T>
00118 Stack<T>::Stack(int n)
00119 {
00120   alloc(n);
00121   valptr = 0;
00122 }
00123 
00124 template<class T>
00125 Stack<T>::Stack(const Stack<T> &s)
00126 {
00127   data = NULL;
00128   ndata = 0;
00129   valptr = s.valptr;
00130   alloc(s.ndata);
00131   for (int i = 0; i < s.ndata; i++)
00132     data[i] = s.data[i];
00133 }
00134 
00135 template<class T>
00136 Stack<T>::~Stack()
00137 {
00138   free();
00139 }
00140 
00141 template <class T>
00142 T Stack<T>::pop()
00143 {
00144   it_error_if(valptr == 0, "Stack<T>::pop: Empty stack");
00145   valptr--;
00146   return data[valptr];
00147 }
00148 
00149 template <class T>
00150 T Stack<T>::peek() const
00151 {
00152   it_error_if(valptr == 0, "Stack<T>::peek: Empty stack");
00153   return data[valptr-1];
00154 }
00155 
00156 template <class T>
00157 void Stack<T>::push(T v)
00158 {
00159   it_error_if(valptr >= ndata, "Stack<T>::push: Full stack");
00160   data[valptr] = v;
00161   valptr++;
00162 }
00163 
00164 template <class T>
00165 void Stack<T>::clear()
00166 {
00167   valptr = 0;
00168 }
00169 
00170 template<class T>
00171 void Stack<T>::alloc(int n)
00172 {
00173   if (n == 0) {
00174     data = NULL;
00175     ndata = 0;
00176   }
00177   else {
00178     data = new T[n];
00179     it_assert_debug(data != 0, "Out of memory in Stack::alloc");
00180   }
00181   ndata = n;
00182 }
00183 
00184 template<class T>
00185 void Stack<T>::free()
00186 {
00187 
00188   delete [] data;
00189 
00190   data = 0;
00191   ndata = 0;
00192 }
00193 
00194 template<class T>
00195 void Stack<T>::operator=(const Stack<T> &s)
00196 {
00197   set_size(s.ndata);
00198   for (int i = 0; i < ndata; i++)
00199     data[i] = s.data[i];
00200   valptr = 0;
00201 }
00202 
00203 template<class T>
00204 void Stack<T>::set_size(int sz, bool copy)
00205 {
00206   int i, min;
00207   T *tmp;
00208 
00209   if (ndata == sz)
00210     return;
00211 
00212   if (copy) {
00213     tmp = data;
00214     min = ndata < sz ? ndata : sz;
00215     alloc(sz);
00216     for (i = 0; i < min; i++)
00217       data[i] = tmp[i];
00218     delete [] tmp;
00219   }
00220   else {
00221     free();
00222     alloc(sz);
00223   }
00224   ndata = sz;
00225 }
00226 
00227 } // namespace itpp
00228 
00229 #endif // #ifndef STACK_H
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
SourceForge Logo

Generated on Wed Jul 27 2011 16:27:04 for IT++ by Doxygen 1.7.4