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