Changeset 561 for abuse/trunk/src/lisp/stack.h
- Timestamp:
- Apr 30, 2011, 12:24:57 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
abuse/trunk/src/lisp/stack.h
r555 r561 16 16 17 17 // A fixed-size stack class 18 template<class T> class grow_stack18 template<class T> class GrowStack 19 19 { 20 20 public: 21 T **sdata; 22 long son; 21 GrowStack(int max_size) 22 { 23 m_max_size = max_size; 24 m_size = 0; 25 sdata = (T **)malloc(sizeof(T *) * m_max_size); 26 } 23 27 24 private: 25 long smax; 26 27 public: 28 grow_stack(int max_size) 28 ~GrowStack() 29 29 { 30 smax = max_size;31 son = 0;32 sdata = (T **)malloc(sizeof(T *) * smax);30 if (m_size != 0) 31 fprintf(stderr, "warning: cleaning up nonempty stack\n"); 32 free(sdata); 33 33 } 34 34 35 35 void push(T *data) 36 36 { 37 if (son >= smax)37 if (m_size >= m_max_size) 38 38 { 39 lbreak("error: stack overflow (%ld >= %ld)\n", son, smax); 39 lbreak("error: stack overflow (%d >= %d)\n", 40 (int)m_size, (int)m_max_size); 40 41 exit(1); 41 42 } 42 sdata[ son] = data;43 son++;43 sdata[m_size] = data; 44 m_size++; 44 45 } 45 46 46 T *pop( longtotal)47 T *pop(size_t total) 47 48 { 48 if (total > son)49 if (total > m_size) 49 50 { 50 51 lbreak("error: stack underflow\n"); 51 52 exit(1); 52 53 } 53 son-= total;54 return sdata[ son];54 m_size -= total; 55 return sdata[m_size]; 55 56 } 56 57 57 void clean_up() 58 { 59 if(son != 0) 60 fprintf(stderr, "warning: cleaning up stack and not empty\n"); 61 free(sdata); 62 sdata = NULL; 63 son = 0; 64 } 58 public: 59 T **sdata; 60 size_t m_size; 61 62 private: 63 size_t m_max_size; 65 64 }; 66 65 67 66 #endif 67
Note: See TracChangeset
for help on using the changeset viewer.