1 /* -*- c++ -*- */ 2 #ifndef STACK_H 3 #define STACK_H 4 5 6 #include <string.h> 7 8 namespace ProtoMol { 9 10 //_________________________________________________________________ Stack 11 /** 12 * Stack which also enables random access. 13 */ 14 template<class T> 15 class Stack { 16 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 17 // Constructors, destructors, assignment 18 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19 public: 20 Stack(); 21 ~Stack(); 22 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 23 // New methods of class Stack 24 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 25 public: 26 void addElement(T newElement); 27 T popElement(); 28 T getElement(unsigned int index); 29 unsigned int getNumElements(); 30 void reset(bool delmem); 31 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 32 // My data members 33 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 34 private: 35 T *m_elem; 36 unsigned int m_numElements; 37 unsigned int m_size; 38 static const unsigned int INCR_SIZE=50; 39 40 }; 41 42 //______________________________________________________________________ INLINES 43 template<class T> Stack()44 Stack<T>::Stack() { 45 m_elem = NULL; 46 m_numElements = 0; 47 m_size = 0; 48 } 49 50 template<class T> ~Stack()51 Stack<T>::~Stack() { 52 if (m_elem != NULL) { 53 delete[] m_elem; 54 } 55 m_elem = NULL; 56 } 57 58 template<class T> addElement(T newElement)59 void Stack<T>::addElement(T newElement) { 60 T *temp; 61 62 if (m_numElements >= m_size) { 63 temp = new T[m_size + INCR_SIZE]; 64 if (m_numElements > 0) { 65 memcpy(temp,m_elem,sizeof(T)*m_numElements); 66 delete[] m_elem; 67 } 68 m_size += INCR_SIZE; 69 m_elem = temp; 70 } 71 m_elem[m_numElements] = newElement; 72 m_numElements++; 73 74 } 75 76 template<class T> popElement()77 T Stack<T>::popElement() { 78 T result; 79 80 result = m_elem[m_numElements-1]; 81 m_numElements--; 82 83 return result; 84 } 85 86 template<class T> getElement(unsigned int index)87 T Stack<T>::getElement(unsigned int index) { 88 T result=T(); 89 90 if (index < m_numElements) { 91 result = m_elem[index]; 92 } 93 94 return result; 95 } 96 97 template<class T> reset(bool delMem)98 void Stack<T>::reset(bool delMem) { 99 100 if (delMem == true) { 101 if (m_size > 0) { 102 delete[] m_elem; 103 } 104 m_elem = NULL; 105 m_size = 0; 106 m_numElements = 0; 107 } 108 else { 109 m_numElements = 0; 110 } 111 } 112 113 template<class T> getNumElements()114 unsigned int Stack<T>::getNumElements() { 115 return m_numElements; 116 } 117 118 119 } 120 121 #endif 122