simplified function dispatch
[luabind.git] / luabind / detail / call.hpp
blobfba67e56b63b9542b2ddd0cc2f213a15bd741bb7
1 // Copyright (c) 2003 Daniel Wallin and Arvid Norberg
3 // Permission is hereby granted, free of charge, to any person obtaining a
4 // copy of this software and associated documentation files (the "Software"),
5 // to deal in the Software without restriction, including without limitation
6 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
7 // and/or sell copies of the Software, and to permit persons to whom the
8 // Software is furnished to do so, subject to the following conditions:
10 // The above copyright notice and this permission notice shall be included
11 // in all copies or substantial portions of the Software.
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
14 // ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
15 // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
16 // PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
17 // SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
18 // ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
21 // OR OTHER DEALINGS IN THE SOFTWARE.
24 #if !BOOST_PP_IS_ITERATING
26 #ifndef LUABIND_CALL_HPP_INCLUDED
27 #define LUABIND_CALL_HPP_INCLUDED
29 #include <boost/config.hpp>
30 #include <boost/preprocessor/repeat.hpp>
31 #include <boost/preprocessor/iteration/iterate.hpp>
32 #include <boost/preprocessor/repetition/enum.hpp>
33 #include <boost/preprocessor/repetition/enum_params.hpp>
34 #include <boost/preprocessor/repetition/enum_trailing.hpp>
35 #include <boost/preprocessor/repetition/repeat.hpp>
36 #include <boost/preprocessor/punctuation/comma_if.hpp>
37 #include <boost/preprocessor/cat.hpp>
38 #include <boost/mpl/bool.hpp>
40 #include <luabind/config.hpp>
41 #include <luabind/detail/policy.hpp>
42 #include <luabind/yield_policy.hpp>
45 #define LUABIND_DECL(z, n, text) typedef typename detail::get_policy<n+1,Policies>::type BOOST_PP_CAT(a##n,_policy); \
46 typedef typename BOOST_PP_CAT(a##n,_policy)::head BOOST_PP_CAT(a##n,_converter_intermediate); \
47 typedef typename BOOST_PP_CAT(a##n,_converter_intermediate)::template generate_converter<A##n, lua_to_cpp>::type BOOST_PP_CAT(p##n,_conv);
48 #define LUABIND_PARAMS(z,n,text) BOOST_PP_CAT(p##n,_conv)::apply(L, LUABIND_DECORATE_TYPE(A##n), n + 2)
51 #define LUABIND_DECL(z, n, text) typedef typename find_conversion_policy<n + 1, Policies>::type BOOST_PP_CAT(converter_policy,n); \
52 typename BOOST_PP_CAT(converter_policy,n)::template generate_converter<A##n, lua_to_cpp>::type BOOST_PP_CAT(c,n);
53 //typedef typename BOOST_PP_CAT(converter_policy,n)::template generate_converter<A##n, lua_to_cpp>::type BOOST_PP_CAT(converter,n);
54 //#define LUABIND_PARAMS(z,n,text) BOOST_PP_CAT(converter,n)::apply(L, LUABIND_DECORATE_TYPE(A##n), n + 2)
55 #define LUABIND_ADD_INDEX(z,n,text) + BOOST_PP_CAT(converter_policy,n)::has_arg
56 #define LUABIND_INDEX_MAP(z,n,text) 2 BOOST_PP_REPEAT(n, LUABIND_ADD_INDEX, _)
57 #define LUABIND_PARAMS(z,n,text) BOOST_PP_CAT(c,n).apply(L, LUABIND_DECORATE_TYPE(A##n), LUABIND_INDEX_MAP(_,n,_))
58 #define LUABIND_POSTCALL(z,n,text) BOOST_PP_CAT(c,n).converter_postcall(L, LUABIND_DECORATE_TYPE(A##n), LUABIND_INDEX_MAP(_,n,_));
60 namespace luabind { namespace detail
62 template<class Policies>
63 struct maybe_yield
65 static inline int apply(lua_State* L, int nret)
67 return ret(L, nret, boost::mpl::bool_<has_yield<Policies>::value>());
70 static inline int ret(lua_State* L, int nret, boost::mpl::bool_<true>)
72 return lua_yield(L, nret);
75 static inline int ret(lua_State*, int nret, boost::mpl::bool_<false>)
77 return nret;
81 template<class T, class U>
82 U& dereference(T* p, U&(*)())
84 return *p;
87 template<class T, class U>
88 U* dereference(T* p, U*(*)())
90 return p;
93 template<class T>
94 struct returns
96 #define BOOST_PP_ITERATION_PARAMS_1 (4, (0, LUABIND_MAX_ARITY, <luabind/detail/call.hpp>, 1))
97 #include BOOST_PP_ITERATE()
100 template<>
101 struct returns<void>
103 #define BOOST_PP_ITERATION_PARAMS_1 (4, (0, LUABIND_MAX_ARITY, <luabind/detail/call.hpp>, 2))
104 #include BOOST_PP_ITERATE()
107 #define BOOST_PP_ITERATION_PARAMS_1 (4, (0, LUABIND_MAX_ARITY, <luabind/detail/call.hpp>, 3))
108 #include BOOST_PP_ITERATE()
111 #undef LUABIND_DECL
112 #undef LUABIND_PARAMS
113 #undef LUABIND_POSTCALL
114 #undef LUABIND_ADD_INDEX
115 #undef LUABIND_INDEX_MAP
117 #endif // LUABIND_CALL_HPP_INCLUDED
119 #elif BOOST_PP_ITERATION_FLAGS() == 1
121 template<class C, class Policies BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
122 static int call(T(C::*f)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), C* obj, lua_State* L, const Policies*)
124 int nargs = lua_gettop(L);
126 typedef typename find_conversion_policy<0, Policies>::type converter_policy_ret;
127 typename converter_policy_ret::template generate_converter<T, cpp_to_lua>::type converter_ret;
129 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_DECL, _)
131 converter_ret.apply(L, (obj->*f)
133 BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_PARAMS, _)
136 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POSTCALL, _)
138 int nret = lua_gettop(L) - nargs;
140 const int indices[] =
142 1 /* self */,
143 nargs + nret /* result */
144 BOOST_PP_ENUM_TRAILING(BOOST_PP_ITERATION(), LUABIND_INDEX_MAP, _)
147 policy_list_postcall<Policies>::apply(L, indices);
149 return maybe_yield<Policies>::apply(L, nret);
150 // return nret;
153 template<class C, class Policies BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
154 static int call(T(C::*f)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)) const, C* obj, lua_State* L, const Policies*)
156 int nargs = lua_gettop(L);
157 typedef typename find_conversion_policy<0, Policies>::type converter_policy_ret;
158 typename converter_policy_ret::template generate_converter<T, cpp_to_lua>::type converter_ret;
159 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_DECL, _)
160 converter_ret.apply(L, (obj->*f)
162 BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_PARAMS, _)
165 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POSTCALL, _)
166 int nret = lua_gettop(L) - nargs;
168 const int indices[] =
170 1 /* self */,
171 nargs + nret /* result */
172 BOOST_PP_ENUM_TRAILING(BOOST_PP_ITERATION(), LUABIND_INDEX_MAP, _)
175 policy_list_postcall<Policies>::apply(L, indices);
177 // return nret;
178 return maybe_yield<Policies>::apply(L, nret);
181 template<class C, class CL, class Policies BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
182 static int call(T(*f)(CL BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), C* obj, lua_State* L, const Policies*)
184 int nargs = lua_gettop(L);
185 typedef typename find_conversion_policy<0, Policies>::type converter_policy_ret;
186 typename converter_policy_ret::template generate_converter<T, cpp_to_lua>::type converter_ret;
187 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_DECL, _)
188 converter_ret.apply(L, f
190 dereference(obj, (CL(*)())0)
191 BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_PARAMS, _)
193 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POSTCALL, _)
195 int nret = lua_gettop(L) - nargs;
197 const int indices[] =
199 1 , // self
200 nargs + nret // result
201 BOOST_PP_ENUM_TRAILING(BOOST_PP_ITERATION(), LUABIND_INDEX_MAP, _)
204 policy_list_postcall<Policies>::apply(L, indices);
206 // return nret;
207 return maybe_yield<Policies>::apply(L, nret);
210 template<class C, class Policies BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
211 static int call(T(*f)(const C* obj BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), C* obj, lua_State* L, const Policies*)
213 int nargs = lua_gettop(L);
214 typedef typename find_conversion_policy<0, Policies>::type converter_policy_ret;
215 typename converter_policy_ret::template generate_converter<T, cpp_to_lua>::type converter_ret;
216 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_DECL, _)
217 converter_ret.apply(L, f
219 *obj BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_PARAMS, _)
221 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POSTCALL, _)
223 int nret = lua_gettop(L) - nargs;
225 const int indices[] =
227 1 , // self
228 nargs + nret // result
229 BOOST_PP_ENUM_TRAILING(BOOST_PP_ITERATION(), LUABIND_INDEX_MAP, _)
232 policy_list_postcall<Policies>::apply(L, indices);
234 // return nret;
235 return maybe_yield<Policies>::apply(L, nret);
239 template<class C, class Policies BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
240 static int call(T(*f)(C& obj BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), C* obj, lua_State* L, const Policies*)
242 int nargs = lua_gettop(L);
243 typedef typename find_conversion_policy<0, Policies>::type converter_policy_ret;
244 typename converter_policy_ret::template generate_converter<T, cpp_to_lua>::type converter_ret;
245 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_DECL, _)
246 converter_ret.apply(L, f
248 *obj BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_PARAMS, _)
250 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POSTCALL, _)
252 int nret = lua_gettop(L) - nargs;
254 const int indices[] =
256 1 ,// self
257 nargs + nret // result
258 BOOST_PP_ENUM_TRAILING(BOOST_PP_ITERATION(), LUABIND_INDEX_MAP, _)
261 policy_list_postcall<Policies>::apply(L, indices);
263 // return nret;
264 return maybe_yield<Policies>::apply(L, nret);
267 template<class C, class Policies BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
268 static int call(T(*f)(const C& obj BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), C* obj, lua_State* L, const Policies*)
270 int nargs = lua_gettop(L);
271 typedef typename find_conversion_policy<0, Policies>::type converter_policy_ret;
272 typename converter_policy_ret::template generate_converter<T, cpp_to_lua>::type converter_ret;
273 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_DECL, _)
274 converter_ret.apply(L, f
276 *obj BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_PARAMS, _)
278 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POSTCALL, _)
280 int nret = lua_gettop(L) - nargs;
282 const int indices[] =
284 1 , // self
285 nargs + nret // result
286 BOOST_PP_ENUM_TRAILING(BOOST_PP_ITERATION(), LUABIND_INDEX_MAP, _)
289 policy_list_postcall<Policies>::apply(L, indices);
291 // return nret;
292 return maybe_yield<Policies>::apply(L, nret);
295 #elif BOOST_PP_ITERATION_FLAGS() == 2
297 template<class C, class Policies BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
298 static int call(void(C::*f)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), C* obj, lua_State* L, const Policies*)
300 int nargs = lua_gettop(L);
301 L = L; // L is used, but metrowerks compiler seem to warn about it before expanding the macros
302 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_DECL, _)
303 (obj->*f)
305 BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_PARAMS, _)
307 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POSTCALL, _)
309 int nret = lua_gettop(L) - nargs;
311 const int indices[] =
313 1 /* self */,
314 nargs + nret /* result */
315 BOOST_PP_ENUM_TRAILING(BOOST_PP_ITERATION(), LUABIND_INDEX_MAP, _)
318 policy_list_postcall<Policies>::apply(L, indices);
320 // return nret;
321 return maybe_yield<Policies>::apply(L, nret);
324 template<class C, class Policies BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
325 static int call(void(C::*f)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)) const, C* obj, lua_State* L, const Policies*)
327 int nargs = lua_gettop(L);
328 L = L; // L is used, but metrowerks compiler seem to warn about it before expanding the macros
329 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_DECL, _)
330 (obj->*f)
332 BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_PARAMS, _)
334 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POSTCALL, _)
336 int nret = lua_gettop(L) - nargs;
338 const int indices[] =
340 1 /* self */,
341 nargs + nret /* result */
342 BOOST_PP_ENUM_TRAILING(BOOST_PP_ITERATION(), LUABIND_INDEX_MAP, _)
345 policy_list_postcall<Policies>::apply(L, indices);
347 // return nret;
348 return maybe_yield<Policies>::apply(L, nret);
351 template<class C, class CL, class Policies BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
352 static int call(void(*f)(CL BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), C* obj, lua_State* L, const Policies*)
354 int nargs = lua_gettop(L);
355 L = L; // L is used, but metrowerks compiler seem to warn about it before expanding the macros
356 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_DECL, _)
358 dereference(obj, (CL(*)())0)
359 BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_PARAMS, _)
362 int nret = lua_gettop(L) - nargs;
364 const int indices[] =
366 1 /* self */,
367 nargs + nret /* result */
368 BOOST_PP_ENUM_TRAILING(BOOST_PP_ITERATION(), LUABIND_INDEX_MAP, _)
370 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POSTCALL, _)
372 policy_list_postcall<Policies>::apply(L, indices);
374 // return nret;
375 return maybe_yield<Policies>::apply(L, nret);
378 template<class C, class Policies BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
379 static int call(void(*f)(C& obj BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), C* obj, lua_State* L, const Policies*)
381 int nargs = lua_gettop(L);
382 L = L; // L is used, but metrowerks compiler seem to warn about it before expanding the macros
383 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_DECL, _)
385 *obj BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_PARAMS, _)
388 int nret = lua_gettop(L) - nargs;
390 const int indices[] =
392 1 , // self
393 nargs + nret // result
394 BOOST_PP_ENUM_TRAILING(BOOST_PP_ITERATION(), LUABIND_INDEX_MAP, _)
396 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POSTCALL, _)
398 policy_list_postcall<Policies>::apply(L, indices);
400 // return nret;
401 return maybe_yield<Policies>::apply(L, nret);
404 template<class C, class Policies BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
405 static int call(void(*f)(const C& obj BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), C* obj, lua_State* L, const Policies*)
407 int nargs = lua_gettop(L);
408 L = L; // L is used, but metrowerks compiler seem to warn about it before expanding the macros
409 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_DECL, _)
411 *obj BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_PARAMS, _)
413 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POSTCALL, _)
415 int nret = lua_gettop(L) - nargs;
417 const int indices[] =
419 1 , // self
420 nargs + nret // result //
421 BOOST_PP_ENUM_TRAILING(BOOST_PP_ITERATION(), LUABIND_INDEX_MAP, _)
424 policy_list_postcall<Policies>::apply(L, indices);
426 // return nret;
427 return maybe_yield<Policies>::apply(L, nret);
430 #elif BOOST_PP_ITERATION_FLAGS() == 3
432 template<class T, class Policies, class R BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
433 int call(R(*f)(T& BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), T* obj, lua_State* L, const Policies* policies)
435 return returns<R>::call(f, obj, L, policies);
438 template<class T, class Policies, class R BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
439 int call(R(*f)(const T& BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), T* obj, lua_State* L, const Policies* policies)
441 return returns<R>::call(f, obj, L, policies);
444 template<class T, class Policies, class R BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
445 int call(R(*f)(T* BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), T* obj, lua_State* L, const Policies* policies)
447 return returns<R>::call(f, obj, L, policies);
450 template<class T, class Policies, class R BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
451 int call(R(*f)(const T* BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), T* obj, lua_State* L, const Policies* policies)
453 return returns<R>::call(f, obj, L, policies);
456 template<class CL, class T, class Policies, class R BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
457 int call(R(*f)(CL BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), T* obj, lua_State* L, const Policies* policies)
459 return returns<R>::call(f, obj, L, policies);
462 template<class T, class Policies, class R BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
463 int call(R(T::*f)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), T* obj, lua_State* L, const Policies* policies)
465 return returns<R>::call(f, obj, L, policies);
468 template<class T, class Policies, class R BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
469 int call(R(T::*f)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)) const, T* obj, lua_State* L, const Policies* policies)
471 return returns<R>::call(f, obj, L, policies);
474 #endif