1 #ifndef AS_GEN_WRAPPER_H
2 #define AS_GEN_WRAPPER_H
3
4 #ifndef ANGELSCRIPT_H
5 // Avoid having to inform include path if header is already include before
6 #include <angelscript.h>
7 #endif
8 #include <new>
9
10 #ifdef GetObject
11 #undef GetObject
12 #endif
13
14 namespace gw {
15
16 template <typename T> class Proxy {
17 public:
18 T value;
Proxy(T value)19 Proxy(T value) : value(value) {}
cast(void * ptr)20 static T cast(void * ptr) {
21 return reinterpret_cast<Proxy<T> *>(&ptr)->value;
22 }
23 private:
24 Proxy(const Proxy &);
25 Proxy & operator=(const Proxy &);
26 };
27
28 template <typename T> struct Wrapper {};
29 template <typename T> struct ObjFirst {};
30 template <typename T> struct ObjLast {};
31 template <typename T> struct Constructor {};
32
33 template <typename T>
destroy(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen)34 void destroy(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
35 static_cast<T *>(gen->GetObject())->~T();
36 }
37 template <>
38 struct Wrapper<void (*)(void)> {
39 template <void (*fp)(void)>
fgw::Wrapper40 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
41 ((fp)());
42 }
43 };
44 template <typename R>
45 struct Wrapper<R (*)(void)> {
46 template <R (*fp)(void)>
fgw::Wrapper47 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
48 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)());
49 }
50 };
51 template <typename T>
52 struct Wrapper<void (T::*)(void)> {
53 template <void (T::*fp)(void)>
fgw::Wrapper54 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
55 ((static_cast<T *>(gen->GetObject())->*fp)());
56 }
57 };
58 template <typename T, typename R>
59 struct Wrapper<R (T::*)(void)> {
60 template <R (T::*fp)(void)>
fgw::Wrapper61 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
62 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)());
63 }
64 };
65 template <typename T>
66 struct Wrapper<void (T::*)(void) const> {
67 template <void (T::*fp)(void) const>
fgw::Wrapper68 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
69 ((static_cast<T *>(gen->GetObject())->*fp)());
70 }
71 };
72 template <typename T, typename R>
73 struct Wrapper<R (T::*)(void) const> {
74 template <R (T::*fp)(void) const>
fgw::Wrapper75 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
76 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)());
77 }
78 };
79 template <typename T>
80 struct ObjFirst<void (*)(T)> {
81 template <void (*fp)(T)>
fgw::ObjFirst82 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
83 ((fp)(
84 Proxy<T>::cast(gen->GetObject())));
85 }
86 };
87 template <typename T, typename R>
88 struct ObjFirst<R (*)(T)> {
89 template <R (*fp)(T)>
fgw::ObjFirst90 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
91 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
92 Proxy<T>::cast(gen->GetObject())));
93 }
94 };
95 template <typename T>
96 struct ObjLast<void (*)(T)> {
97 template <void (*fp)(T)>
fgw::ObjLast98 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
99 ((fp)(
100 Proxy<T>::cast(gen->GetObject())));
101 }
102 };
103 template <typename T, typename R>
104 struct ObjLast<R (*)(T)> {
105 template <R (*fp)(T)>
fgw::ObjLast106 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
107 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
108 Proxy<T>::cast(gen->GetObject())));
109 }
110 };
111 template <typename T>
112 struct Constructor <T ()> {
fgw::Constructor113 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
114 new (gen->GetObject()) T();
115 }
116 };
117 template <typename A0>
118 struct Wrapper<void (*)(A0)> {
119 template <void (*fp)(A0)>
fgw::Wrapper120 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
121 ((fp)(
122 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value));
123 }
124 };
125 template <typename R, typename A0>
126 struct Wrapper<R (*)(A0)> {
127 template <R (*fp)(A0)>
fgw::Wrapper128 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
129 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
130 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value));
131 }
132 };
133 template <typename T, typename A0>
134 struct Wrapper<void (T::*)(A0)> {
135 template <void (T::*fp)(A0)>
fgw::Wrapper136 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
137 ((static_cast<T *>(gen->GetObject())->*fp)(
138 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value));
139 }
140 };
141 template <typename T, typename R, typename A0>
142 struct Wrapper<R (T::*)(A0)> {
143 template <R (T::*fp)(A0)>
fgw::Wrapper144 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
145 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)(
146 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value));
147 }
148 };
149 template <typename T, typename A0>
150 struct Wrapper<void (T::*)(A0) const> {
151 template <void (T::*fp)(A0) const>
fgw::Wrapper152 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
153 ((static_cast<T *>(gen->GetObject())->*fp)(
154 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value));
155 }
156 };
157 template <typename T, typename R, typename A0>
158 struct Wrapper<R (T::*)(A0) const> {
159 template <R (T::*fp)(A0) const>
fgw::Wrapper160 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
161 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)(
162 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value));
163 }
164 };
165 template <typename T, typename A0>
166 struct ObjFirst<void (*)(T, A0)> {
167 template <void (*fp)(T, A0)>
fgw::ObjFirst168 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
169 ((fp)(
170 Proxy<T>::cast(gen->GetObject()),
171 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value));
172 }
173 };
174 template <typename T, typename R, typename A0>
175 struct ObjFirst<R (*)(T, A0)> {
176 template <R (*fp)(T, A0)>
fgw::ObjFirst177 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
178 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
179 Proxy<T>::cast(gen->GetObject()),
180 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value));
181 }
182 };
183 template <typename T, typename A0>
184 struct ObjLast<void (*)(A0, T)> {
185 template <void (*fp)(A0, T)>
fgw::ObjLast186 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
187 ((fp)(
188 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
189 Proxy<T>::cast(gen->GetObject())));
190 }
191 };
192 template <typename T, typename R, typename A0>
193 struct ObjLast<R (*)(A0, T)> {
194 template <R (*fp)(A0, T)>
fgw::ObjLast195 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
196 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
197 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
198 Proxy<T>::cast(gen->GetObject())));
199 }
200 };
201 template <typename T, typename A0>
202 struct Constructor <T (A0)> {
fgw::Constructor203 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
204 new (gen->GetObject()) T(
205 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value);
206 }
207 };
208 template <typename A0, typename A1>
209 struct Wrapper<void (*)(A0, A1)> {
210 template <void (*fp)(A0, A1)>
fgw::Wrapper211 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
212 ((fp)(
213 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
214 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value));
215 }
216 };
217 template <typename R, typename A0, typename A1>
218 struct Wrapper<R (*)(A0, A1)> {
219 template <R (*fp)(A0, A1)>
fgw::Wrapper220 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
221 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
222 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
223 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value));
224 }
225 };
226 template <typename T, typename A0, typename A1>
227 struct Wrapper<void (T::*)(A0, A1)> {
228 template <void (T::*fp)(A0, A1)>
fgw::Wrapper229 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
230 ((static_cast<T *>(gen->GetObject())->*fp)(
231 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
232 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value));
233 }
234 };
235 template <typename T, typename R, typename A0, typename A1>
236 struct Wrapper<R (T::*)(A0, A1)> {
237 template <R (T::*fp)(A0, A1)>
fgw::Wrapper238 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
239 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)(
240 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
241 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value));
242 }
243 };
244 template <typename T, typename A0, typename A1>
245 struct Wrapper<void (T::*)(A0, A1) const> {
246 template <void (T::*fp)(A0, A1) const>
fgw::Wrapper247 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
248 ((static_cast<T *>(gen->GetObject())->*fp)(
249 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
250 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value));
251 }
252 };
253 template <typename T, typename R, typename A0, typename A1>
254 struct Wrapper<R (T::*)(A0, A1) const> {
255 template <R (T::*fp)(A0, A1) const>
fgw::Wrapper256 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
257 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)(
258 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
259 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value));
260 }
261 };
262 template <typename T, typename A0, typename A1>
263 struct ObjFirst<void (*)(T, A0, A1)> {
264 template <void (*fp)(T, A0, A1)>
fgw::ObjFirst265 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
266 ((fp)(
267 Proxy<T>::cast(gen->GetObject()),
268 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
269 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value));
270 }
271 };
272 template <typename T, typename R, typename A0, typename A1>
273 struct ObjFirst<R (*)(T, A0, A1)> {
274 template <R (*fp)(T, A0, A1)>
fgw::ObjFirst275 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
276 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
277 Proxy<T>::cast(gen->GetObject()),
278 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
279 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value));
280 }
281 };
282 template <typename T, typename A0, typename A1>
283 struct ObjLast<void (*)(A0, A1, T)> {
284 template <void (*fp)(A0, A1, T)>
fgw::ObjLast285 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
286 ((fp)(
287 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
288 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
289 Proxy<T>::cast(gen->GetObject())));
290 }
291 };
292 template <typename T, typename R, typename A0, typename A1>
293 struct ObjLast<R (*)(A0, A1, T)> {
294 template <R (*fp)(A0, A1, T)>
fgw::ObjLast295 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
296 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
297 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
298 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
299 Proxy<T>::cast(gen->GetObject())));
300 }
301 };
302 template <typename T, typename A0, typename A1>
303 struct Constructor <T (A0, A1)> {
fgw::Constructor304 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
305 new (gen->GetObject()) T(
306 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
307 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value);
308 }
309 };
310 template <typename A0, typename A1, typename A2>
311 struct Wrapper<void (*)(A0, A1, A2)> {
312 template <void (*fp)(A0, A1, A2)>
fgw::Wrapper313 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
314 ((fp)(
315 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
316 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
317 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value));
318 }
319 };
320 template <typename R, typename A0, typename A1, typename A2>
321 struct Wrapper<R (*)(A0, A1, A2)> {
322 template <R (*fp)(A0, A1, A2)>
fgw::Wrapper323 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
324 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
325 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
326 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
327 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value));
328 }
329 };
330 template <typename T, typename A0, typename A1, typename A2>
331 struct Wrapper<void (T::*)(A0, A1, A2)> {
332 template <void (T::*fp)(A0, A1, A2)>
fgw::Wrapper333 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
334 ((static_cast<T *>(gen->GetObject())->*fp)(
335 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
336 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
337 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value));
338 }
339 };
340 template <typename T, typename R, typename A0, typename A1, typename A2>
341 struct Wrapper<R (T::*)(A0, A1, A2)> {
342 template <R (T::*fp)(A0, A1, A2)>
fgw::Wrapper343 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
344 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)(
345 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
346 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
347 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value));
348 }
349 };
350 template <typename T, typename A0, typename A1, typename A2>
351 struct Wrapper<void (T::*)(A0, A1, A2) const> {
352 template <void (T::*fp)(A0, A1, A2) const>
fgw::Wrapper353 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
354 ((static_cast<T *>(gen->GetObject())->*fp)(
355 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
356 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
357 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value));
358 }
359 };
360 template <typename T, typename R, typename A0, typename A1, typename A2>
361 struct Wrapper<R (T::*)(A0, A1, A2) const> {
362 template <R (T::*fp)(A0, A1, A2) const>
fgw::Wrapper363 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
364 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)(
365 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
366 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
367 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value));
368 }
369 };
370 template <typename T, typename A0, typename A1, typename A2>
371 struct ObjFirst<void (*)(T, A0, A1, A2)> {
372 template <void (*fp)(T, A0, A1, A2)>
fgw::ObjFirst373 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
374 ((fp)(
375 Proxy<T>::cast(gen->GetObject()),
376 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
377 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
378 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value));
379 }
380 };
381 template <typename T, typename R, typename A0, typename A1, typename A2>
382 struct ObjFirst<R (*)(T, A0, A1, A2)> {
383 template <R (*fp)(T, A0, A1, A2)>
fgw::ObjFirst384 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
385 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
386 Proxy<T>::cast(gen->GetObject()),
387 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
388 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
389 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value));
390 }
391 };
392 template <typename T, typename A0, typename A1, typename A2>
393 struct ObjLast<void (*)(A0, A1, A2, T)> {
394 template <void (*fp)(A0, A1, A2, T)>
fgw::ObjLast395 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
396 ((fp)(
397 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
398 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
399 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
400 Proxy<T>::cast(gen->GetObject())));
401 }
402 };
403 template <typename T, typename R, typename A0, typename A1, typename A2>
404 struct ObjLast<R (*)(A0, A1, A2, T)> {
405 template <R (*fp)(A0, A1, A2, T)>
fgw::ObjLast406 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
407 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
408 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
409 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
410 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
411 Proxy<T>::cast(gen->GetObject())));
412 }
413 };
414 template <typename T, typename A0, typename A1, typename A2>
415 struct Constructor <T (A0, A1, A2)> {
fgw::Constructor416 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
417 new (gen->GetObject()) T(
418 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
419 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
420 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value);
421 }
422 };
423 template <typename A0, typename A1, typename A2, typename A3>
424 struct Wrapper<void (*)(A0, A1, A2, A3)> {
425 template <void (*fp)(A0, A1, A2, A3)>
fgw::Wrapper426 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
427 ((fp)(
428 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
429 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
430 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
431 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value));
432 }
433 };
434 template <typename R, typename A0, typename A1, typename A2, typename A3>
435 struct Wrapper<R (*)(A0, A1, A2, A3)> {
436 template <R (*fp)(A0, A1, A2, A3)>
fgw::Wrapper437 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
438 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
439 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
440 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
441 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
442 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value));
443 }
444 };
445 template <typename T, typename A0, typename A1, typename A2, typename A3>
446 struct Wrapper<void (T::*)(A0, A1, A2, A3)> {
447 template <void (T::*fp)(A0, A1, A2, A3)>
fgw::Wrapper448 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
449 ((static_cast<T *>(gen->GetObject())->*fp)(
450 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
451 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
452 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
453 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value));
454 }
455 };
456 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
457 struct Wrapper<R (T::*)(A0, A1, A2, A3)> {
458 template <R (T::*fp)(A0, A1, A2, A3)>
fgw::Wrapper459 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
460 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)(
461 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
462 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
463 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
464 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value));
465 }
466 };
467 template <typename T, typename A0, typename A1, typename A2, typename A3>
468 struct Wrapper<void (T::*)(A0, A1, A2, A3) const> {
469 template <void (T::*fp)(A0, A1, A2, A3) const>
fgw::Wrapper470 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
471 ((static_cast<T *>(gen->GetObject())->*fp)(
472 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
473 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
474 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
475 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value));
476 }
477 };
478 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
479 struct Wrapper<R (T::*)(A0, A1, A2, A3) const> {
480 template <R (T::*fp)(A0, A1, A2, A3) const>
fgw::Wrapper481 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
482 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)(
483 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
484 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
485 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
486 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value));
487 }
488 };
489 template <typename T, typename A0, typename A1, typename A2, typename A3>
490 struct ObjFirst<void (*)(T, A0, A1, A2, A3)> {
491 template <void (*fp)(T, A0, A1, A2, A3)>
fgw::ObjFirst492 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
493 ((fp)(
494 Proxy<T>::cast(gen->GetObject()),
495 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
496 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
497 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
498 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value));
499 }
500 };
501 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
502 struct ObjFirst<R (*)(T, A0, A1, A2, A3)> {
503 template <R (*fp)(T, A0, A1, A2, A3)>
fgw::ObjFirst504 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
505 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
506 Proxy<T>::cast(gen->GetObject()),
507 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
508 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
509 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
510 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value));
511 }
512 };
513 template <typename T, typename A0, typename A1, typename A2, typename A3>
514 struct ObjLast<void (*)(A0, A1, A2, A3, T)> {
515 template <void (*fp)(A0, A1, A2, A3, T)>
fgw::ObjLast516 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
517 ((fp)(
518 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
519 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
520 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
521 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
522 Proxy<T>::cast(gen->GetObject())));
523 }
524 };
525 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
526 struct ObjLast<R (*)(A0, A1, A2, A3, T)> {
527 template <R (*fp)(A0, A1, A2, A3, T)>
fgw::ObjLast528 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
529 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
530 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
531 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
532 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
533 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
534 Proxy<T>::cast(gen->GetObject())));
535 }
536 };
537 template <typename T, typename A0, typename A1, typename A2, typename A3>
538 struct Constructor <T (A0, A1, A2, A3)> {
fgw::Constructor539 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
540 new (gen->GetObject()) T(
541 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
542 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
543 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
544 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value);
545 }
546 };
547 template <typename A0, typename A1, typename A2, typename A3, typename A4>
548 struct Wrapper<void (*)(A0, A1, A2, A3, A4)> {
549 template <void (*fp)(A0, A1, A2, A3, A4)>
fgw::Wrapper550 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
551 ((fp)(
552 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
553 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
554 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
555 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
556 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value));
557 }
558 };
559 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
560 struct Wrapper<R (*)(A0, A1, A2, A3, A4)> {
561 template <R (*fp)(A0, A1, A2, A3, A4)>
fgw::Wrapper562 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
563 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
564 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
565 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
566 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
567 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
568 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value));
569 }
570 };
571 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
572 struct Wrapper<void (T::*)(A0, A1, A2, A3, A4)> {
573 template <void (T::*fp)(A0, A1, A2, A3, A4)>
fgw::Wrapper574 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
575 ((static_cast<T *>(gen->GetObject())->*fp)(
576 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
577 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
578 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
579 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
580 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value));
581 }
582 };
583 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
584 struct Wrapper<R (T::*)(A0, A1, A2, A3, A4)> {
585 template <R (T::*fp)(A0, A1, A2, A3, A4)>
fgw::Wrapper586 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
587 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)(
588 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
589 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
590 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
591 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
592 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value));
593 }
594 };
595 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
596 struct Wrapper<void (T::*)(A0, A1, A2, A3, A4) const> {
597 template <void (T::*fp)(A0, A1, A2, A3, A4) const>
fgw::Wrapper598 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
599 ((static_cast<T *>(gen->GetObject())->*fp)(
600 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
601 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
602 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
603 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
604 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value));
605 }
606 };
607 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
608 struct Wrapper<R (T::*)(A0, A1, A2, A3, A4) const> {
609 template <R (T::*fp)(A0, A1, A2, A3, A4) const>
fgw::Wrapper610 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
611 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)(
612 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
613 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
614 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
615 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
616 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value));
617 }
618 };
619 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
620 struct ObjFirst<void (*)(T, A0, A1, A2, A3, A4)> {
621 template <void (*fp)(T, A0, A1, A2, A3, A4)>
fgw::ObjFirst622 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
623 ((fp)(
624 Proxy<T>::cast(gen->GetObject()),
625 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
626 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
627 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
628 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
629 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value));
630 }
631 };
632 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
633 struct ObjFirst<R (*)(T, A0, A1, A2, A3, A4)> {
634 template <R (*fp)(T, A0, A1, A2, A3, A4)>
fgw::ObjFirst635 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
636 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
637 Proxy<T>::cast(gen->GetObject()),
638 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
639 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
640 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
641 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
642 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value));
643 }
644 };
645 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
646 struct ObjLast<void (*)(A0, A1, A2, A3, A4, T)> {
647 template <void (*fp)(A0, A1, A2, A3, A4, T)>
fgw::ObjLast648 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
649 ((fp)(
650 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
651 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
652 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
653 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
654 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
655 Proxy<T>::cast(gen->GetObject())));
656 }
657 };
658 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
659 struct ObjLast<R (*)(A0, A1, A2, A3, A4, T)> {
660 template <R (*fp)(A0, A1, A2, A3, A4, T)>
fgw::ObjLast661 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
662 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
663 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
664 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
665 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
666 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
667 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
668 Proxy<T>::cast(gen->GetObject())));
669 }
670 };
671 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
672 struct Constructor <T (A0, A1, A2, A3, A4)> {
fgw::Constructor673 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
674 new (gen->GetObject()) T(
675 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
676 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
677 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
678 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
679 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value);
680 }
681 };
682 template <typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
683 struct Wrapper<void (*)(A0, A1, A2, A3, A4, A5)> {
684 template <void (*fp)(A0, A1, A2, A3, A4, A5)>
fgw::Wrapper685 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
686 ((fp)(
687 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
688 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
689 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
690 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
691 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
692 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value));
693 }
694 };
695 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
696 struct Wrapper<R (*)(A0, A1, A2, A3, A4, A5)> {
697 template <R (*fp)(A0, A1, A2, A3, A4, A5)>
fgw::Wrapper698 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
699 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
700 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
701 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
702 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
703 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
704 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
705 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value));
706 }
707 };
708 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
709 struct Wrapper<void (T::*)(A0, A1, A2, A3, A4, A5)> {
710 template <void (T::*fp)(A0, A1, A2, A3, A4, A5)>
fgw::Wrapper711 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
712 ((static_cast<T *>(gen->GetObject())->*fp)(
713 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
714 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
715 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
716 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
717 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
718 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value));
719 }
720 };
721 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
722 struct Wrapper<R (T::*)(A0, A1, A2, A3, A4, A5)> {
723 template <R (T::*fp)(A0, A1, A2, A3, A4, A5)>
fgw::Wrapper724 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
725 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)(
726 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
727 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
728 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
729 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
730 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
731 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value));
732 }
733 };
734 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
735 struct Wrapper<void (T::*)(A0, A1, A2, A3, A4, A5) const> {
736 template <void (T::*fp)(A0, A1, A2, A3, A4, A5) const>
fgw::Wrapper737 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
738 ((static_cast<T *>(gen->GetObject())->*fp)(
739 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
740 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
741 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
742 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
743 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
744 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value));
745 }
746 };
747 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
748 struct Wrapper<R (T::*)(A0, A1, A2, A3, A4, A5) const> {
749 template <R (T::*fp)(A0, A1, A2, A3, A4, A5) const>
fgw::Wrapper750 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
751 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)(
752 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
753 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
754 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
755 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
756 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
757 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value));
758 }
759 };
760 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
761 struct ObjFirst<void (*)(T, A0, A1, A2, A3, A4, A5)> {
762 template <void (*fp)(T, A0, A1, A2, A3, A4, A5)>
fgw::ObjFirst763 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
764 ((fp)(
765 Proxy<T>::cast(gen->GetObject()),
766 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
767 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
768 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
769 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
770 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
771 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value));
772 }
773 };
774 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
775 struct ObjFirst<R (*)(T, A0, A1, A2, A3, A4, A5)> {
776 template <R (*fp)(T, A0, A1, A2, A3, A4, A5)>
fgw::ObjFirst777 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
778 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
779 Proxy<T>::cast(gen->GetObject()),
780 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
781 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
782 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
783 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
784 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
785 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value));
786 }
787 };
788 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
789 struct ObjLast<void (*)(A0, A1, A2, A3, A4, A5, T)> {
790 template <void (*fp)(A0, A1, A2, A3, A4, A5, T)>
fgw::ObjLast791 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
792 ((fp)(
793 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
794 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
795 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
796 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
797 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
798 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value,
799 Proxy<T>::cast(gen->GetObject())));
800 }
801 };
802 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
803 struct ObjLast<R (*)(A0, A1, A2, A3, A4, A5, T)> {
804 template <R (*fp)(A0, A1, A2, A3, A4, A5, T)>
fgw::ObjLast805 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
806 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
807 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
808 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
809 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
810 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
811 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
812 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value,
813 Proxy<T>::cast(gen->GetObject())));
814 }
815 };
816 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
817 struct Constructor <T (A0, A1, A2, A3, A4, A5)> {
fgw::Constructor818 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
819 new (gen->GetObject()) T(
820 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
821 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
822 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
823 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
824 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
825 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value);
826 }
827 };
828 template <typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
829 struct Wrapper<void (*)(A0, A1, A2, A3, A4, A5, A6)> {
830 template <void (*fp)(A0, A1, A2, A3, A4, A5, A6)>
fgw::Wrapper831 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
832 ((fp)(
833 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
834 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
835 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
836 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
837 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
838 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value,
839 static_cast<Proxy <A6> *>(gen->GetAddressOfArg(6))->value));
840 }
841 };
842 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
843 struct Wrapper<R (*)(A0, A1, A2, A3, A4, A5, A6)> {
844 template <R (*fp)(A0, A1, A2, A3, A4, A5, A6)>
fgw::Wrapper845 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
846 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
847 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
848 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
849 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
850 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
851 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
852 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value,
853 static_cast<Proxy <A6> *>(gen->GetAddressOfArg(6))->value));
854 }
855 };
856 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
857 struct Wrapper<void (T::*)(A0, A1, A2, A3, A4, A5, A6)> {
858 template <void (T::*fp)(A0, A1, A2, A3, A4, A5, A6)>
fgw::Wrapper859 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
860 ((static_cast<T *>(gen->GetObject())->*fp)(
861 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
862 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
863 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
864 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
865 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
866 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value,
867 static_cast<Proxy <A6> *>(gen->GetAddressOfArg(6))->value));
868 }
869 };
870 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
871 struct Wrapper<R (T::*)(A0, A1, A2, A3, A4, A5, A6)> {
872 template <R (T::*fp)(A0, A1, A2, A3, A4, A5, A6)>
fgw::Wrapper873 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
874 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)(
875 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
876 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
877 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
878 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
879 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
880 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value,
881 static_cast<Proxy <A6> *>(gen->GetAddressOfArg(6))->value));
882 }
883 };
884 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
885 struct Wrapper<void (T::*)(A0, A1, A2, A3, A4, A5, A6) const> {
886 template <void (T::*fp)(A0, A1, A2, A3, A4, A5, A6) const>
fgw::Wrapper887 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
888 ((static_cast<T *>(gen->GetObject())->*fp)(
889 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
890 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
891 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
892 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
893 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
894 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value,
895 static_cast<Proxy <A6> *>(gen->GetAddressOfArg(6))->value));
896 }
897 };
898 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
899 struct Wrapper<R (T::*)(A0, A1, A2, A3, A4, A5, A6) const> {
900 template <R (T::*fp)(A0, A1, A2, A3, A4, A5, A6) const>
fgw::Wrapper901 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
902 new (gen->GetAddressOfReturnLocation()) Proxy<R>((static_cast<T *>(gen->GetObject())->*fp)(
903 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
904 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
905 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
906 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
907 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
908 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value,
909 static_cast<Proxy <A6> *>(gen->GetAddressOfArg(6))->value));
910 }
911 };
912 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
913 struct ObjFirst<void (*)(T, A0, A1, A2, A3, A4, A5, A6)> {
914 template <void (*fp)(T, A0, A1, A2, A3, A4, A5, A6)>
fgw::ObjFirst915 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
916 ((fp)(
917 Proxy<T>::cast(gen->GetObject()),
918 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
919 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
920 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
921 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
922 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
923 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value,
924 static_cast<Proxy <A6> *>(gen->GetAddressOfArg(6))->value));
925 }
926 };
927 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
928 struct ObjFirst<R (*)(T, A0, A1, A2, A3, A4, A5, A6)> {
929 template <R (*fp)(T, A0, A1, A2, A3, A4, A5, A6)>
fgw::ObjFirst930 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
931 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
932 Proxy<T>::cast(gen->GetObject()),
933 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
934 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
935 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
936 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
937 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
938 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value,
939 static_cast<Proxy <A6> *>(gen->GetAddressOfArg(6))->value));
940 }
941 };
942 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
943 struct ObjLast<void (*)(A0, A1, A2, A3, A4, A5, A6, T)> {
944 template <void (*fp)(A0, A1, A2, A3, A4, A5, A6, T)>
fgw::ObjLast945 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
946 ((fp)(
947 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
948 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
949 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
950 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
951 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
952 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value,
953 static_cast<Proxy <A6> *>(gen->GetAddressOfArg(6))->value,
954 Proxy<T>::cast(gen->GetObject())));
955 }
956 };
957 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
958 struct ObjLast<R (*)(A0, A1, A2, A3, A4, A5, A6, T)> {
959 template <R (*fp)(A0, A1, A2, A3, A4, A5, A6, T)>
fgw::ObjLast960 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
961 new (gen->GetAddressOfReturnLocation()) Proxy<R>((fp)(
962 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
963 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
964 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
965 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
966 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
967 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value,
968 static_cast<Proxy <A6> *>(gen->GetAddressOfArg(6))->value,
969 Proxy<T>::cast(gen->GetObject())));
970 }
971 };
972 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
973 struct Constructor <T (A0, A1, A2, A3, A4, A5, A6)> {
fgw::Constructor974 static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) {
975 new (gen->GetObject()) T(
976 static_cast<Proxy <A0> *>(gen->GetAddressOfArg(0))->value,
977 static_cast<Proxy <A1> *>(gen->GetAddressOfArg(1))->value,
978 static_cast<Proxy <A2> *>(gen->GetAddressOfArg(2))->value,
979 static_cast<Proxy <A3> *>(gen->GetAddressOfArg(3))->value,
980 static_cast<Proxy <A4> *>(gen->GetAddressOfArg(4))->value,
981 static_cast<Proxy <A5> *>(gen->GetAddressOfArg(5))->value,
982 static_cast<Proxy <A6> *>(gen->GetAddressOfArg(6))->value);
983 }
984 };
985 template <typename T>
986 struct Id {
fgw::Id987 template <T fn_ptr> AS_NAMESPACE_QUALIFIER asSFuncPtr f(void) { return asFUNCTION(&Wrapper<T>::template f<fn_ptr>); }
ofgw::Id988 template <T fn_ptr> AS_NAMESPACE_QUALIFIER asSFuncPtr of(void) { return asFUNCTION(&ObjFirst<T>::template f<fn_ptr>); }
olgw::Id989 template <T fn_ptr> AS_NAMESPACE_QUALIFIER asSFuncPtr ol(void) { return asFUNCTION(&ObjLast<T>::template f<fn_ptr>); }
990 };
991
992 template <typename T>
id(T fn_ptr)993 Id<T> id(T fn_ptr) { return Id<T>(); }
994
995 // On some versions of GNUC it is necessary to use the template keyword as disambiguator,
996 // on others the template keyword gives an error, hence the need for the following define.
997 // MSVC on the other hand seems to accept both with or without the template keyword.
998 #if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4))
999 // GNUC 4.4.3 doesn't need the template keyword, and
1000 // hopefully upcoming versions won't need it either
1001 #define TMPL template
1002 #else
1003 #define TMPL
1004 #endif
1005
1006 #define WRAP_FN(name) (::gw::id(name).TMPL f< name >())
1007 #define WRAP_MFN(ClassType, name) (::gw::id(&ClassType::name).TMPL f< &ClassType::name >())
1008 #define WRAP_OBJ_FIRST(name) (::gw::id(name).TMPL of< name >())
1009 #define WRAP_OBJ_LAST(name) (::gw::id(name).TMPL ol< name >())
1010
1011 #define WRAP_FN_PR(name, Parameters, ReturnType) asFUNCTION((::gw::Wrapper<ReturnType (*)Parameters>::TMPL f< name >))
1012 #define WRAP_MFN_PR(ClassType, name, Parameters, ReturnType) asFUNCTION((::gw::Wrapper<ReturnType (ClassType::*)Parameters>::TMPL f< &ClassType::name >))
1013 #define WRAP_OBJ_FIRST_PR(name, Parameters, ReturnType) asFUNCTION((::gw::ObjFirst<ReturnType (*)Parameters>::TMPL f< name >))
1014 #define WRAP_OBJ_LAST_PR(name, Parameters, ReturnType) asFUNCTION((::gw::ObjLast<ReturnType (*)Parameters>::TMPL f< name >))
1015
1016 #define WRAP_CON(ClassType, Parameters) asFUNCTION((::gw::Constructor<ClassType Parameters>::f))
1017 #define WRAP_DES(ClassType) asFUNCTION((::gw::destroy<ClassType>))
1018
1019 } // end namespace gw
1020
1021 #endif
1022