Open
Graph Drawing
Framework

 v.2012.05
 

BoundedStack.h
Go to the documentation of this file.
00001 /*
00002  * $Revision: 2299 $
00003  * 
00004  * last checkin:
00005  *   $Author: gutwenger $ 
00006  *   $Date: 2012-05-07 15:57:08 +0200 (Mon, 07 May 2012) $ 
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 // output
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     // destruction
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 }; // class BoundedStack
00189 
00190 
00191 
00192 // output operator
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 } // end namespace ogdf
00201 
00202 
00203 #endif