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