Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00043 #ifdef _MSC_VER
00044 #pragma once
00045 #endif
00046
00047 #ifndef OGDF_B_STACK_H
00048 #define OGDF_B_STACK_H
00049
00050
00051 #include <ogdf/basic/basic.h>
00052
00053
00054 namespace ogdf {
00055
00056 template<class E, class INDEX> class BoundedStack;
00057
00058
00059 template<class E, class INDEX>
00060 void print(ostream &os, const BoundedStack<E,INDEX> &S, char delim = ' ');
00061
00062
00064 template<class E, class INDEX = int> class BoundedStack {
00065
00066 E *m_pTop;
00067 E *m_pStart;
00068 E *m_pStop;
00069
00070 public:
00072
00076 BoundedStack() {
00077 m_pTop = m_pStart = m_pStop = 0;
00078 }
00079
00081 explicit BoundedStack(INDEX n) {
00082 OGDF_ASSERT(n >= 1)
00083 m_pStart = new E[n];
00084 if (m_pStart == 0) OGDF_THROW(InsufficientMemoryException);
00085 m_pTop = m_pStart - 1;
00086 m_pStop = m_pStart+n;
00087 }
00088
00090 BoundedStack(const BoundedStack<E> &S) {
00091 copy(S);
00092 }
00093
00094
00095 ~BoundedStack() {
00096 delete [] m_pStart;
00097 }
00098
00100 const E &top() const {
00101 OGDF_ASSERT(m_pTop != m_pStart-1)
00102 return *m_pTop;
00103 }
00104
00106 E &top() {
00107 OGDF_ASSERT(m_pTop != m_pStart-1)
00108 return *m_pTop;
00109 }
00110
00112 INDEX size() const { return m_pTop - (m_pStart-1); }
00113
00115 bool empty() { return m_pTop == (m_pStart-1); }
00116
00118 bool full() { return m_pTop == (m_pStop-1); }
00119
00121 bool valid() const { return m_pStart != 0; }
00122
00124 INDEX capacity() const { return m_pStop - m_pStart; }
00125
00127 void init() {
00128 delete [] m_pStart;
00129 m_pTop = m_pStart = m_pStart = 0;
00130 }
00131
00133 void init(INDEX n) {
00134 OGDF_ASSERT(n >= 1)
00135
00136 delete [] m_pStart;
00137
00138 m_pStart = new E[n];
00139 if (m_pStart == 0) OGDF_THROW(InsufficientMemoryException);
00140 m_pTop = m_pStart - 1;
00141 m_pStop = m_pStart+n;
00142 }
00143
00145 BoundedStack<E> &operator=(const BoundedStack &S) {
00146 delete [] m_pStart;
00147 copy(S);
00148 return *this;
00149 }
00150
00152 void push(const E &x) {
00153 OGDF_ASSERT(m_pTop != m_pStop-1)
00154 *++m_pTop = x;
00155 }
00156
00158 E pop() {
00159 OGDF_ASSERT(m_pTop != (m_pStart-1))
00160 return *m_pTop--;
00161 }
00162
00164 void clear() { m_pTop = m_pStart-1; }
00165
00167 void print(ostream &os, char delim = ' ') const
00168 {
00169 for (const E *pX = m_pStart; pX != m_pTop; )
00170 os << *++pX << delim;
00171 }
00172
00173 private:
00174 void copy(const BoundedStack<E> &S)
00175 {
00176 if(!S.valid()) {
00177 m_pTop = m_pStart = m_pStop = 0;
00178 } else {
00179 INDEX sz = S.m_pStop - S.m_pStart;
00180 m_pStart = new E[sz+1];
00181 if (m_pStart == 0) OGDF_THROW(InsufficientMemoryException);
00182 m_pStop = m_pStart + sz;
00183 m_pTop = m_pStart-1;
00184 for (E *pX = S.m_pStart-1; pX != S.m_pTop; )
00185 *++m_pTop = *++pX;
00186 }
00187 }
00188 };
00189
00190
00191
00192
00193 template<class E, class INDEX>
00194 ostream &operator<<(ostream &os, const BoundedStack<E,INDEX> &S)
00195 {
00196 S.print(os);
00197 return os;
00198 }
00199
00200 }
00201
00202
00203 #endif