Open
Graph Drawing
Framework

 v.2010.10
 

BoundedStack.h

Go to the documentation of this file.
00001 /*
00002  * $Revision: 2027 $
00003  * 
00004  * last checkin:
00005  *   $Author: gutwenger $ 
00006  *   $Date: 2010-09-01 11:55:17 +0200 (Wed, 01 Sep 2010) $ 
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 // output
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     // destruction
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 }; // class BoundedStack
00199 
00200 
00201 
00202 // output operator
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 } // end namespace ogdf
00211 
00212 
00213 #endif