00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef _CATStack_H_
00013 #define _CATStack_H_
00014
00015 #include "CATInternal.h"
00016
00017
00018
00019
00020
00021
00022
00023
00024 template<class T>
00025 class CATStack
00026 {
00027 public:
00028
00029
00030 typedef void (*CATSTACKENUMCB)(T& object, void* userParam);
00031
00032 protected:
00033
00034
00035
00036
00037 template<class T>
00038 class Node
00039 {
00040 friend CATStack<T>;
00041 protected:
00042 Node(T& data)
00043 {
00044 fData = data;
00045 fNext = 0;
00046 }
00047
00048
00049
00050
00051 virtual ~Node()
00052 {
00053 }
00054
00055 private:
00056 T fData;
00057 Node<T>* fNext;
00058 };
00059
00060
00061 public:
00062
00063 CATStack()
00064 {
00065 fHead = 0;
00066 fSize = 0;
00067 }
00068
00069
00070 CATStack(const CATStack& srcStack)
00071 {
00072 CATUInt32 size = srcStack.Size();
00073
00074 Node<T>* curNode = srcStack.fHead;
00075 while (curNode)
00076 {
00077 this->Push(curNode->fData);
00078 curNode = curNode->fNext;
00079 }
00080 }
00081
00082
00083 virtual ~CATStack()
00084 {
00085 Clear();
00086 }
00087
00088
00089
00090
00091
00092 void Clear()
00093 {
00094 T object;
00095 while (CATSUCCEEDED(this->Pop(object)));
00096 }
00097
00098
00099 CATStack& operator=(const CATStack& srcStack)
00100 {
00101
00102 if (&srcStack == this)
00103 return *this;
00104
00105 int size = srcStack.Size();
00106
00107 Node<T>* curNode = srcStack.fHead;
00108 while (curNode)
00109 {
00110 this->Push(curNode->fData);
00111 curNode = curNode->fNext;
00112 }
00113
00114 return *this;
00115 }
00116
00117
00118
00119
00120
00121
00122
00123
00124 CATResult Push(T& object)
00125 {
00126 Node<T>* node = 0;
00127 try
00128 {
00129 node = new Node<T>(object);
00130 }
00131 catch(...)
00132 {
00133
00134
00135
00136
00137
00138 node = 0;
00139 }
00140
00141 if (node == 0)
00142 {
00143 return CATRESULT(CAT_ERR_OUT_OF_MEMORY);
00144 }
00145
00146 node->fNext = fHead;
00147 fHead = node;
00148 fSize++;
00149 return CATRESULT(CAT_SUCCESS);
00150 }
00151
00152
00153
00154
00155
00156
00157
00158
00159 CATResult Pop(T& object)
00160 {
00161 if (fSize == 0)
00162 {
00163
00164 return CATRESULT(CAT_ERR_STACK_EMPTY);
00165 }
00166 Node<T>* node = fHead;
00167 object = node->fData;
00168 fHead = node->fNext;
00169 delete node;
00170 fSize--;
00171
00172 return CATRESULT(CAT_SUCCESS);
00173 }
00174
00175
00176 CATUInt32 Size() const
00177 {
00178 return fSize;
00179 }
00180
00181
00182
00183
00184
00185
00186
00187
00188 void Enumerate(CATSTACKENUMCB enumCallback, void* userParam)
00189 {
00190 CATASSERT(enumCallback != 0, "Callback must be valid.");
00191
00192 if (!enumCallback)
00193 return;
00194
00195 Node<T>* curNode = fHead;
00196 while (curNode != 0)
00197 {
00198 enumCallback(curNode->fData,userParam);
00199 curNode = curNode->fNext;
00200 }
00201 }
00202
00203
00204 private:
00205 Node<T>* fHead;
00206 CATUInt32 fSize;
00207 };
00208
00209
00210 #endif // _CATStack_H_