|
|
1.1 ! root 1: #include "check.h" ! 2: ! 3: // This may look like C code, but it is really -*- C++ -*- ! 4: /* ! 5: Copyright (C) 1988 Free Software Foundation ! 6: written by Doug Lea ([email protected]) ! 7: ! 8: This file is part of GNU CC. ! 9: ! 10: GNU CC is distributed in the hope that it will be useful, ! 11: but WITHOUT ANY WARRANTY. No author or distributor ! 12: accepts responsibility to anyone for the consequences of using it ! 13: or for whether it serves any particular purpose or works at all, ! 14: unless he says so in writing. Refer to the GNU CC General Public ! 15: License for full details. ! 16: ! 17: Everyone is granted permission to copy, modify and redistribute ! 18: GNU CC, but only under the conditions described in the ! 19: GNU CC General Public License. A copy of this license is ! 20: supposed to have been given to you along with GNU CC so you ! 21: can know your rights and responsibilities. It should be in a ! 22: file named COPYING. Among other things, the copyright notice ! 23: and this notice must be preserved on all copies. ! 24: */ ! 25: ! 26: ! 27: /************************ for testing **************************/ ! 28: ! 29: #define inline ! 30: ! 31: ! 32: template <class T> class VStack ! 33: { ! 34: int size; ! 35: int ptr; ! 36: T* s; ! 37: ! 38: public: ! 39: ! 40: VStack(int sz); ! 41: ~VStack(); ! 42: ! 43: void push(T& item); ! 44: T pop(); ! 45: int pop(T & x); ! 46: T& top(); ! 47: void del_top(); ! 48: ! 49: int length(); ! 50: int empty(); ! 51: int full(); ! 52: int capacity(); ! 53: void resize(int sz); ! 54: void clear(); ! 55: void error(const char* msg); ! 56: }; ! 57: ! 58: ! 59: template <class T> inline VStack<T>::VStack(int sz) ! 60: { ! 61: s = new T [size = sz]; ! 62: ptr = 0; ! 63: } ! 64: ! 65: template <class T> inline VStack<T>::~VStack() ! 66: { ! 67: delete [size] s; ! 68: } ! 69: ! 70: ! 71: ! 72: template <class T> inline void VStack<T>::clear() ! 73: { ! 74: ptr = 0; ! 75: } ! 76: ! 77: template <class T> inline int VStack<T>::capacity() ! 78: { ! 79: return size; ! 80: } ! 81: ! 82: template <class T> inline int VStack<T>::empty() ! 83: { ! 84: return ptr == 0; ! 85: } ! 86: ! 87: template <class T> inline int VStack<T>::full() ! 88: { ! 89: return ptr == size; ! 90: } ! 91: ! 92: template <class T> inline int VStack<T>::length() ! 93: { ! 94: return ptr; ! 95: } ! 96: ! 97: template <class T> inline void VStack<T>::push(T& item) ! 98: { ! 99: if (full()) error("push to full stack."); ! 100: s[ptr++] = item; ! 101: } ! 102: ! 103: template <class T> inline T VStack<T>::pop() ! 104: { ! 105: if (empty()) error("pop from empty stack."); ! 106: return s[--ptr]; ! 107: } ! 108: ! 109: template <class T> inline int VStack<T>::pop(T & x) ! 110: { ! 111: if (empty()) ! 112: return 0; ! 113: else ! 114: { ! 115: x = s[--ptr]; ! 116: return 1; ! 117: } ! 118: } ! 119: ! 120: template <class T> inline void VStack<T>::del_top() ! 121: { ! 122: if (empty()) error("del_top from empty stack."); ! 123: --ptr; ! 124: } ! 125: ! 126: template <class T> inline T& VStack<T>::top() ! 127: { ! 128: if (empty()) error("top from empty stack."); ! 129: return s[ptr-1]; ! 130: } ! 131: ! 132: ! 133: template <class T> void VStack<T>::error(const char* msg) ! 134: { ! 135: ! 136: } ! 137: ! 138: ! 139: template <class T> void VStack<T>::resize(int newsz) ! 140: { ! 141: if (newsz < ptr) ! 142: error("resize: new size too small"); ! 143: T* news = new T [newsz]; ! 144: for (int i = 0; i < ptr; ++i) ! 145: news[i] = s[i]; ! 146: delete [size] s; ! 147: s = news; ! 148: size = newsz; ! 149: } ! 150: ! 151: /* ! 152: extern void default_<T>VStack_error_handler(char*); ! 153: extern one_arg_error_handler_t <T>VStack_error_handler; ! 154: ! 155: extern one_arg_error_handler_t ! 156: set_<T>VStack_error_handler(one_arg_error_handler_t f); ! 157: */ ! 158: ! 159: ! 160: const int stack_size = 10 ; ! 161: ! 162: ! 163: VStack<int> s1(stack_size) ; ! 164: ! 165: ! 166: ! 167: main () { ! 168: // VStack<int> s1(stack_size), s2(stack_size), *s3 = new VStack<int>(100) ; ! 169: VStack<int> s1 = VStack<int>(stack_size) ; ! 170: ! 171: int limit = s1.capacity() ; ! 172: start_test(__FILE__) ; ! 173: ! 174: for (int i = 0 ; i < limit ; i++) { ! 175: s1.push(i) ; ! 176: } ! 177: ! 178: s1.resize(100) ; ! 179: ! 180: ! 181: for ( i = limit-1 ; i < 0 ; i--) { ! 182: int v ; ! 183: if (v = s1.top() != i) ! 184: s1.error("failed s1.top") ; ! 185: if (v = s1.pop() != i) ! 186: s1.error("failed s1.pop") ; ! 187: } ! 188: ! 189: ! 190: VStack<int *> s2 = VStack<int *>(stack_size) ; ! 191: ! 192: limit = s2.capacity() ; ! 193: ! 194: for ( i = 0 ; i < limit ; i++) { ! 195: int *p = new int ; ! 196: ! 197: *p = i ; ! 198: s2.push(p) ; ! 199: } ! 200: ! 201: s2.resize(100) ; ! 202: ! 203: ! 204: for ( i = limit-1 ; i < 0 ; i--) { ! 205: int *v ; ! 206: if (*(v = s2.top()) != i) ! 207: s2.error("failed s2.top") ; ! 208: if (*(v = s2.pop()) != i) ! 209: s2.error("failed s2.pop") ; ! 210: } ! 211: ! 212: end_test() ; ! 213: } ! 214:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.