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()53 inline Stack<T>::~Stack()
54 {
55     delete [] data;
56     max = ptr = 0;
57 }
58 
59 template<typename T>
size()60 inline size_t Stack<T>::size() const
61 {
62     return ptr;
63 }
64 
65 template<typename T>
Stack(size_t siz)66 Stack<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)76 void 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()86 T 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()94 T Stack<T>::top() const throw(StackError)
95 {
96     if (ptr == 0)
97         throw StackError("stack underflow");
98     return data[ptr - 1];
99 }
100 
101