Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00053 #ifdef _MSC_VER
00054 #pragma once
00055 #endif
00056
00057 #ifndef OGDF_B_STACK_H
00058 #define OGDF_B_STACK_H
00059
00060
00061 #include <ogdf/basic/basic.h>
00062
00063
00064 namespace ogdf {
00065
00066 template<class E, class INDEX> class BoundedStack;
00067
00068
00069 template<class E, class INDEX>
00070 void print(ostream &os, const BoundedStack<E,INDEX> &S, char delim = ' ');
00071
00072
00074 template<class E, class INDEX = int> class BoundedStack {
00075
00076 E *m_pTop;
00077 E *m_pStart;
00078 E *m_pStop;
00079
00080 public:
00082
00086 BoundedStack() {
00087 m_pTop = m_pStart = m_pStop = 0;
00088 }
00089
00091 explicit BoundedStack(INDEX n) {
00092 OGDF_ASSERT(n >= 1)
00093 m_pStart = new E[n];
00094 if (m_pStart == 0) OGDF_THROW(InsufficientMemoryException);
00095 m_pTop = m_pStart - 1;
00096 m_pStop = m_pStart+n;
00097 }
00098
00100 BoundedStack(const BoundedStack<E> &S) {
00101 copy(S);
00102 }
00103
00104
00105 ~BoundedStack() {
00106 delete [] m_pStart;
00107 }
00108
00110 const E &top() const {
00111 OGDF_ASSERT(m_pTop != m_pStart-1)
00112 return *m_pTop;
00113 }
00114
00116 E &top() {
00117 OGDF_ASSERT(m_pTop != m_pStart-1)
00118 return *m_pTop;
00119 }
00120
00122 INDEX size() const { return m_pTop - (m_pStart-1); }
00123
00125 bool empty() { return m_pTop == (m_pStart-1); }
00126
00128 bool full() { return m_pTop == (m_pStop-1); }
00129
00131 bool valid() const { return m_pStart != 0; }
00132
00134 INDEX capacity() const { return m_pStop - m_pStart; }
00135
00137 void init() {
00138 delete [] m_pStart;
00139 m_pTop = m_pStart = m_pStart = 0;
00140 }
00141
00143 void init(INDEX n) {
00144 OGDF_ASSERT(n >= 1)
00145
00146 delete [] m_pStart;
00147
00148 m_pStart = new E[n];
00149 if (m_pStart == 0) OGDF_THROW(InsufficientMemoryException);
00150 m_pTop = m_pStart - 1;
00151 m_pStop = m_pStart+n;
00152 }
00153
00155 BoundedStack<E> &operator=(const BoundedStack &S) {
00156 delete [] m_pStart;
00157 copy(S);
00158 return *this;
00159 }
00160
00162 void push(const E &x) {
00163 OGDF_ASSERT(m_pTop != m_pStop-1)
00164 *++m_pTop = x;
00165 }
00166
00168 E pop() {
00169 OGDF_ASSERT(m_pTop != (m_pStart-1))
00170 return *m_pTop--;
00171 }
00172
00174 void clear() { m_pTop = m_pStart-1; }
00175
00177 void print(ostream &os, char delim = ' ') const
00178 {
00179 for (const E *pX = m_pStart; pX != m_pTop; )
00180 os << *++pX << delim;
00181 }
00182
00183 private:
00184 void copy(const BoundedStack<E> &S)
00185 {
00186 if(!S.valid()) {
00187 m_pTop = m_pStart = m_pStop = 0;
00188 } else {
00189 INDEX sz = S.m_pStop - S.m_pStart;
00190 m_pStart = new E[sz+1];
00191 if (m_pStart == 0) OGDF_THROW(InsufficientMemoryException);
00192 m_pStop = m_pStart + sz;
00193 m_pTop = m_pStart-1;
00194 for (E *pX = S.m_pStart-1; pX != S.m_pTop; )
00195 *++m_pTop = *++pX;
00196 }
00197 }
00198 };
00199
00200
00201
00202
00203 template<class E, class INDEX>
00204 ostream &operator<<(ostream &os, const BoundedStack<E,INDEX> &S)
00205 {
00206 S.print(os);
00207 return os;
00208 }
00209
00210 }
00211
00212
00213 #endif