replacing static tables by lists
[quarnos.git] / libs / delegate.cpp
blobe013df21a4c75a7601bc69e8f41e3d022a93874c
1 /*
2 * Quarn Operating System 0.0.6
3 * quarnos/level1/modules/delegate.cpp
4 *
5 * Copyright (C) 2005-2008 Pawel Dziepak
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 #ifndef _DELEGATE_H_
24 #error This file can not be compiled directly.
25 #endif
27 template<typename in, typename out>
28 union _type_transform {
29 in a;
30 out b;
33 template<typename in, typename out>
34 out type_transform(in trans) {
35 _type_transform<in, out> t;
36 t.a=trans;
37 return t.b;
39 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
40 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
41 typename arg_type6 , typename arg_type7 >
42 delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::~delegate() {}
44 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
45 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
46 typename arg_type6 , typename arg_type7 >
47 delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::delegate() {
48 type=del_uninit;
51 /* Save method pointer for different number of arguments */
52 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
53 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
54 typename arg_type6 , typename arg_type7>
55 template<typename T>
56 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::method(T *obj,ret_type (T::*_ptr)()) {
57 type=del_method;
58 ptr.meth_a0=type_transform<ret_type (T::*)(),ret_type (A::*)()>(_ptr);
59 o=type_transform<T*,A*>(obj);
62 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
63 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
64 typename arg_type6 , typename arg_type7 >
65 template<typename T>
66 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::method(T *obj,ret_type (T::*_ptr)(arg_type1)) {
67 type=del_method;
68 ptr.meth_a1=type_transform<ret_type (T::*)(arg_type1),ret_type (A::*)(arg_type1)>(_ptr);
69 o=type_transform<T*,A*>(obj);
72 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
73 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
74 typename arg_type6 , typename arg_type7 >
75 template<typename T>
76 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::method(T *obj,ret_type (T::*_ptr)(arg_type1, arg_type2)) {
77 type=del_method;
78 ptr.meth_a2=type_transform<ret_type (T::*)(arg_type1, arg_type2),
79 ret_type (A::*)(arg_type1, arg_type2)>(_ptr);
80 o=type_transform<T*,A*>(obj);
83 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
84 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
85 typename arg_type6 , typename arg_type7 >
86 template<typename T>
87 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::method(T *obj,ret_type (T::*_ptr)(arg_type1, arg_type2, arg_type3)) {
88 type=del_method;
89 ptr.meth_a3=type_transform<ret_type (T::*)(arg_type1, arg_type2, arg_type3),
90 ret_type (A::*)(arg_type1, arg_type2, arg_type3)>(_ptr);
91 o=type_transform<T*,A*>(obj);
94 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
95 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
96 typename arg_type6 , typename arg_type7 >
97 template<typename T>
98 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::method(T *obj,ret_type (T::*_ptr)(arg_type1, arg_type2, arg_type3, arg_type4)) {
99 type=del_method;
100 ptr.meth_a4=type_transform<ret_type (T::*)(arg_type1, arg_type2, arg_type3, arg_type4),
101 ret_type (A::*)(arg_type1, arg_type2, arg_type3, arg_type4)>(_ptr);
102 o=type_transform<T*,A*>(obj);
105 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
106 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
107 typename arg_type6 , typename arg_type7 >
108 template<typename T>
109 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::method(T *obj,ret_type (T::*_ptr)(arg_type1, arg_type2, arg_type3, arg_type4, arg_type5)) {
110 type=del_method;
111 ptr.meth_a5=type_transform<ret_type (T::*)(arg_type1, arg_type2, arg_type3, arg_type4, arg_type5),
112 ret_type (A::*)(arg_type1, arg_type2, arg_type3, arg_type4, arg_type5)>(_ptr);
113 o=type_transform<T*,A*>(obj);
116 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
117 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
118 typename arg_type6 , typename arg_type7 >
119 template<typename T>
120 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::method(T *obj,ret_type (T::*_ptr)(arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6)) {
121 type=del_method;
122 ptr.meth_a6=type_transform<ret_type (T::*)(arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6),
123 ret_type (A::*)(arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6)>(_ptr);
124 o=type_transform<T*,A*>(obj);
127 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
128 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
129 typename arg_type6 , typename arg_type7 >
130 template<typename T>
131 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::method(T *obj,ret_type (T::*_ptr)(arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7)) {
132 type=del_method;
133 ptr.meth_a7=type_transform<ret_type (T::*)(arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7),
134 ret_type (A::*)(arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7)>(_ptr);
135 o=type_transform<T*,A*>(obj);
138 /* Save function pointer for different number of arguments */
139 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
140 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
141 typename arg_type6 , typename arg_type7 >
142 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::function(ret_type (*_ptr)()) {
143 type=del_function;
144 ptr.func_a0=_ptr;
146 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
147 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
148 typename arg_type6 , typename arg_type7 >
149 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::function(ret_type (*_ptr)(arg_type1)) {
150 type=del_function;
151 ptr.func_a1=_ptr;
153 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
154 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
155 typename arg_type6 , typename arg_type7 >
156 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::function(ret_type (*_ptr)(arg_type1, arg_type2)) {
157 type=del_function;
158 ptr.func_a2=_ptr;
160 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
161 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
162 typename arg_type6 , typename arg_type7 >
163 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::function(ret_type (*_ptr)(arg_type1, arg_type2, arg_type3)) {
164 type=del_function;
165 ptr.func_a3=_ptr;
167 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
168 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
169 typename arg_type6 , typename arg_type7 >
170 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::function(ret_type (*_ptr)(arg_type1, arg_type2, arg_type3, arg_type4)) {
171 type=del_function;
172 ptr.func_a4=_ptr;
174 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
175 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
176 typename arg_type6 , typename arg_type7 >
177 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::function(ret_type (*_ptr)(arg_type1, arg_type2, arg_type3, arg_type4, arg_type5)) {
178 type=del_function;
179 ptr.func_a5=_ptr;
181 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
182 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
183 typename arg_type6 , typename arg_type7 >
184 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::function(ret_type (*_ptr)(arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6)) {
185 type=del_function;
186 ptr.func_a6=_ptr;
188 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
189 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
190 typename arg_type6 , typename arg_type7 >
191 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::function(ret_type (*_ptr)(arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7)) {
192 type=del_function;
193 ptr.func_a7=_ptr;
198 /* Calling function/method with different number of arguments */
199 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
200 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
201 typename arg_type6 , typename arg_type7 >
202 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::call() {
203 if (type==del_method) return (o->*(ptr.meth_a0))();
204 else if (type==del_function) return ptr.func_a0();
207 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
208 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
209 typename arg_type6 , typename arg_type7 >
210 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::call(arg_type1 arg1) {
211 if (type==del_method) return (o->*(ptr.meth_a1))(arg1);
212 else if (type==del_function) return ptr.func_a1(arg1);
215 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
216 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
217 typename arg_type6 , typename arg_type7 >
218 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::call(arg_type1 arg1, arg_type2 arg2) {
219 if (type==del_method) return (o->*(ptr.meth_a2))(arg1, arg2);
220 else if (type==del_function) return ptr.func_a2(arg1, arg2);
223 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
224 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
225 typename arg_type6 , typename arg_type7 >
226 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::call(arg_type1 arg1, arg_type2 arg2, arg_type3 arg3) {
227 if (type==del_method) return (o->*(ptr.meth_a3))(arg1, arg2, arg3);
228 else if (type==del_function) return ptr.func_a3(arg1, arg2, arg3);
231 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
232 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
233 typename arg_type6 , typename arg_type7 >
234 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::call(arg_type1 arg1, arg_type2 arg2, arg_type3 arg3, arg_type4 arg4) {
235 if (type==del_method) return (o->*(ptr.meth_a4))(arg1, arg2, arg3, arg4);
236 else if (type==del_function) return ptr.func_a4(arg1, arg2, arg3, arg4);
239 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
240 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
241 typename arg_type6 , typename arg_type7 >
242 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::call(arg_type1 arg1, arg_type2 arg2, arg_type3 arg3, arg_type4 arg4, arg_type5 arg5) {
243 if (type==del_method) return (o->*(ptr.meth_a5))(arg1, arg2, arg3, arg4, arg5);
244 else if (type==del_function) return ptr.func_a5(arg1, arg2, arg3, arg4, arg5);
247 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
248 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
249 typename arg_type6 , typename arg_type7 >
250 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::call(arg_type1 arg1, arg_type2 arg2, arg_type3 arg3, arg_type4 arg4, arg_type5 arg5, arg_type6 arg6) {
251 if (type==del_method) return (o->*(ptr.meth_a6))(arg1, arg2, arg3, arg4, arg5, arg6);
252 else if (type==del_function) return ptr.func_a6(arg1, arg2, arg3, arg4, arg5, arg6);
255 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
256 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
257 typename arg_type6 , typename arg_type7 >
258 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::call(arg_type1 arg1, arg_type2 arg2, arg_type3 arg3, arg_type4 arg4, arg_type5 arg5, arg_type6 arg6, arg_type7 arg7) {
259 if (type==del_method) return (o->*(ptr.meth_a7))(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
260 else if (type==del_function) return ptr.func_a7(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
263 /* Overloaded operators () for different numbers of arguments */
264 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
265 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
266 typename arg_type6 , typename arg_type7 >
267 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::operator()() {
268 return call();
270 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
271 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
272 typename arg_type6 , typename arg_type7 >
273 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::operator()(arg_type1 arg1) {
274 return call(arg1);
276 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
277 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
278 typename arg_type6 , typename arg_type7 >
279 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::operator()(arg_type1 arg1, arg_type2 arg2) {
280 return call(arg1, arg2);
282 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
283 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
284 typename arg_type6 , typename arg_type7 >
285 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::operator()(arg_type1 arg1, arg_type2 arg2, arg_type3 arg3) {
286 return call(arg1, arg2, arg3);
288 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
289 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
290 typename arg_type6 , typename arg_type7 >
291 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::operator()(arg_type1 arg1, arg_type2 arg2, arg_type3 arg3, arg_type4 arg4) {
292 return call(arg1, arg2, arg3, arg4);
294 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
295 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
296 typename arg_type6 , typename arg_type7 >
297 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::operator()(arg_type1 arg1, arg_type2 arg2, arg_type3 arg3, arg_type4 arg4, arg_type5 arg5) {
298 return call(arg1, arg2, arg3, arg4, arg5);
300 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
301 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
302 typename arg_type6 , typename arg_type7 >
303 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::operator()(arg_type1 arg1, arg_type2 arg2, arg_type3 arg3, arg_type4 arg4, arg_type5 arg5, arg_type6 arg6) {
304 return call(arg1, arg2, arg3, arg4, arg5, arg6);
306 template<typename ret_type, typename arg_type1 , typename arg_type2 ,
307 typename arg_type3 , typename arg_type4 , typename arg_type5 ,
308 typename arg_type6 , typename arg_type7 >
309 ret_type delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::operator()(arg_type1 arg1, arg_type2 arg2, arg_type3 arg3, arg_type4 arg4, arg_type5 arg5, arg_type6 arg6, arg_type7 arg7) {
310 return call(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
313 template<typename ret_type, typename arg_type1 , typename arg_type2,
314 typename arg_type3, typename arg_type4, typename arg_type5,
315 typename arg_type6, typename arg_type7>
316 void delegate<ret_type, arg_type1, arg_type2, arg_type3, arg_type4, arg_type5, arg_type6, arg_type7>::update() {
317 ptr.func_a0 = type_transform<void(*)(),ret_type(*)()>(func);
320 /*extern class delegate<void>;
321 extern class delegate<void, int, char, int>;
322 extern class delegate<void, char>;*/