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