2 * Quarn Operating System 0.0.6
3 * quarnos/level1/modules/delegate.cpp
5 * Copyright (C) 2005-2008 Pawel Dziepak
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.
24 #error This file can not be compiled directly.
27 template<typename in
, typename out
>
28 union _type_transform
{
33 template<typename in
, typename out
>
34 out
type_transform(in trans
) {
35 _type_transform
<in
, out
> t
;
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() {
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
>
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
)()) {
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
>
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
)) {
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
>
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
)) {
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
>
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
)) {
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
>
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
)) {
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
>
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
)) {
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
>
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
)) {
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
>
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
)) {
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
)()) {
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
)) {
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
)) {
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
)) {
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
)) {
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
)) {
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
)) {
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
)) {
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()() {
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
) {
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>;*/