1 // Stack.h 2 3 4 /* 5 * C/C++ Users Journal Sept 2000 <br> 6 * The Simplest Automated Unit Test Framework That Could Possibly Work <br> 7 * Chuck Allison <br> 8 */ 9 10 11 #include <cassert> 12 #include <cstddef> 13 #include <stdexcept> 14 #include <string> 15 #include <new> 16 17 using std::logic_error; 18 using std::string; 19 using std::bad_alloc; 20 21 // size_t work-around 22 #ifdef size_t 23 using std::size_t; 24 #endif /* size_t */ 25 26 class StackError : public logic_error 27 { 28 public: StackError(const string & s)29 StackError(const string& s) 30 : logic_error(s) 31 {} 32 }; 33 34 template<typename T> 35 class Stack 36 { 37 public: 38 Stack(size_t) throw(StackError, bad_alloc); 39 ~Stack(); 40 41 void push(const T&) throw(StackError); 42 T pop() throw(StackError); 43 T top() const throw(StackError); 44 size_t size() const; 45 46 private: 47 T* data; 48 size_t max; 49 size_t ptr; 50 }; 51 52 template<typename T> ~Stack()53inline Stack<T>::~Stack() 54 { 55 delete [] data; 56 max = ptr = 0; 57 } 58 59 template<typename T> size()60inline size_t Stack<T>::size() const 61 { 62 return ptr; 63 } 64 65 template<typename T> Stack(size_t siz)66Stack<T>::Stack(size_t siz) throw(StackError, bad_alloc) 67 { 68 if (siz == 0) 69 throw StackError("bad size in Stack(size_t)"); 70 data = new T[siz]; 71 max = siz; 72 ptr = 0; 73 } 74 75 template<typename T> push(const T & x)76void Stack<T>::push(const T& x) throw(StackError) 77 { 78 if (ptr == max) 79 throw StackError("stack overflow"); 80 81 assert(ptr < max); 82 data[ptr++] = x; 83 } 84 85 template<typename T> pop()86T Stack<T>::pop() throw(StackError) 87 { 88 if (ptr == 0) 89 throw StackError("stack underflow"); 90 return data[--ptr]; 91 } 92 93 template<typename T> top()94T Stack<T>::top() const throw(StackError) 95 { 96 if (ptr == 0) 97 throw StackError("stack underflow"); 98 return data[ptr - 1]; 99 } 100 101