|
|
1.1 ! root 1: ! 2: #ifndef GENERICH ! 3: #include "generic.h" ! 4: #endif ! 5: ! 6: #define vector(type) name2(type,vector) ! 7: #define vectordeclare(type) \ ! 8: extern GPT errorhandler(vector,type); \ ! 9: extern GPT set_handler(vector,type,GPT); \ ! 10: class vector(type) { \ ! 11: type* v; \ ! 12: int sz; \ ! 13: public: \ ! 14: vector(type)(int s) \ ! 15: { if (s<=0) callerror(vector,type,1,"bad vector size"); v = new type[sz=s]; }\ ! 16: ~vector(type)() { delete v; } \ ! 17: vector(type)(vector(type)&); \ ! 18: vector(type)& operator=(vector(type)&); \ ! 19: int size() { return sz; } \ ! 20: void set_size(int); \ ! 21: type& elem(int i) { return &v[i]; } \ ! 22: type& operator[](int i) \ ! 23: { if (i<0 || sz<=i) callerror(vector,type,2,"vector index out of range"); \ ! 24: return &v[i]; } \ ! 25: }; ! 26: ! 27: #define vectorimplement(type) \ ! 28: GPT errorhandler(vector,type) = genericerror; \ ! 29: vector(type).vector(type)(vector(type)& a) \ ! 30: { \ ! 31: register i = a.sz; \ ! 32: v = new type[i]; \ ! 33: register type* vv = &v[i]; \ ! 34: register type* av = &a.v[i]; \ ! 35: while (i--) *--vv = *--av; \ ! 36: } \ ! 37: \ ! 38: vector(type)& vector(type).operator=(vector(type)& a) \ ! 39: { \ ! 40: delete v; \ ! 41: register i = a.sz; \ ! 42: if (i != sz) callerror(vector,type,3,"different vector sizes in assignment");\ ! 43: register type* vv = &v[i]; \ ! 44: register type* av = &a.v[i]; \ ! 45: while (i--) *--vv = *--av; \ ! 46: return this; \ ! 47: } \ ! 48: \ ! 49: void vector(type).set_size(int s) \ ! 50: { \ ! 51: if (s<=0) callerror(vector,type,4,"bad new vector size"); \ ! 52: type* nv = new type[s]; \ ! 53: register i = (s<=sz)?s:sz; \ ! 54: register type* vv = &v[i]; \ ! 55: register type* av = &nv[i]; \ ! 56: while (i--) *--vv = *--av; \ ! 57: delete v; \ ! 58: v = nv; \ ! 59: sz = s; \ ! 60: } \ ! 61: \ ! 62: GPT set_handler(vector,type, GPT a) \ ! 63: { \ ! 64: GPT oo = errorhandler(vector,type); \ ! 65: errorhandler(vector,type) = a; \ ! 66: return oo; \ ! 67: } ! 68: ! 69: ! 70: ! 71: #define stack(type) name2(type,stack) ! 72: ! 73: #define stackdeclare(type) \ ! 74: extern GPT errorhandler(stack,type); \ ! 75: extern GPT set_handler(stack,type,GPT); \ ! 76: class stack(type) : vector(type) { \ ! 77: int t; \ ! 78: public: \ ! 79: stack(type)(int s) : (s) { t = 0; } \ ! 80: stack(type)(stack(type)& a) : (&(vector(type))a) { t = a.t; } \ ! 81: void push(type& a) \ ! 82: { if (t==size()-1) callerror(stack,type,1,"stack overflow"); elem(++t) = a; }\ ! 83: type pop() \ ! 84: { if (t==0) callerror(stack,type,2,"stack underflow"); return elem(t--); } \ ! 85: type& top() \ ! 86: { if (t==0) callerror(stack,type,3,"stack empty"); return &elem(t); } \ ! 87: }; ! 88: ! 89: #define stackimplement(type) \ ! 90: GPT errorhandler(stack,type); \ ! 91: GPT set_handler(stack,type, GPT a) \ ! 92: { \ ! 93: GPT oo = errorhandler(stack,type); \ ! 94: errorhandler(stack,type) = a; \ ! 95: return oo; \ ! 96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.