Chris@16: // Copyright Daniel Wallin 2005. Use, modification and distribution is Chris@16: // subject to the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #define N BOOST_PP_ITERATION() Chris@16: Chris@16: #define BOOST_PARAMETER_PY_ARG_TYPES(z, n, _) \ Chris@16: typedef typename mpl::next< \ Chris@16: BOOST_PP_CAT(iter,BOOST_PP_DEC(n)) \ Chris@16: >::type BOOST_PP_CAT(iter,n); \ Chris@16: \ Chris@16: typedef typename mpl::deref::type BOOST_PP_CAT(spec,n); \ Chris@16: typedef typename mpl::if_< \ Chris@16: mpl::and_< \ Chris@16: mpl::not_ \ Chris@16: , typename BOOST_PP_CAT(spec,n)::optimized_default \ Chris@16: > \ Chris@16: , parameter::aux::maybe \ Chris@16: , typename BOOST_PP_CAT(spec,n)::type \ Chris@16: >::type BOOST_PP_CAT(arg,n); \ Chris@16: typedef typename BOOST_PP_CAT(spec,n)::keyword BOOST_PP_CAT(kw,n); Chris@16: Chris@16: #if BOOST_PP_ITERATION_FLAGS() == 1 Chris@16: template Chris@16: struct invoker Chris@16: #elif BOOST_PP_ITERATION_FLAGS() == 2 Chris@16: template Chris@16: struct call_invoker Chris@16: #elif BOOST_PP_ITERATION_FLAGS() == 3 Chris@16: template Chris@16: struct init_invoker Chris@16: #elif BOOST_PP_ITERATION_FLAGS() == 4 Chris@16: template Chris@16: struct member_invoker Chris@16: #endif Chris@16: { Chris@16: typedef typename mpl::begin::type iter0; Chris@16: typedef typename mpl::deref::type spec0; Chris@16: typedef typename mpl::if_< Chris@16: mpl::and_< Chris@16: mpl::not_ Chris@16: , typename spec0::optimized_default Chris@16: > Chris@16: , parameter::aux::maybe Chris@16: , typename spec0::type Chris@16: >::type arg0; Chris@16: typedef typename spec0::keyword kw0; Chris@16: Chris@16: BOOST_PP_REPEAT_FROM_TO(1, N, BOOST_PARAMETER_PY_ARG_TYPES, ~) Chris@16: Chris@16: static Chris@16: #if BOOST_PP_ITERATION_FLAGS() == 3 Chris@16: T* Chris@16: #else Chris@16: R Chris@16: #endif Chris@16: execute( Chris@16: #if BOOST_PP_ITERATION_FLAGS() == 2 || BOOST_PP_ITERATION_FLAGS() == 4 Chris@16: T& self Chris@16: , Chris@16: #endif Chris@16: BOOST_PP_ENUM_BINARY_PARAMS(N, arg, a) Chris@16: ) Chris@16: { Chris@16: return Chris@16: #if BOOST_PP_ITERATION_FLAGS() == 1 || BOOST_PP_ITERATION_FLAGS() == 4 Chris@16: M()( Chris@16: boost::type() Chris@16: # if BOOST_PP_ITERATION_FLAGS() == 4 Chris@16: , self Chris@16: # endif Chris@16: , BOOST_PP_ENUM_BINARY_PARAMS(N, parameter::keyword::get() = a) Chris@16: ); Chris@16: #elif BOOST_PP_ITERATION_FLAGS() == 2 Chris@16: self( Chris@16: BOOST_PP_ENUM_BINARY_PARAMS(N, parameter::keyword::get() = a) Chris@16: ); Chris@16: #elif BOOST_PP_ITERATION_FLAGS() == 3 Chris@16: new T( Chris@16: BOOST_PP_ENUM_BINARY_PARAMS(N, parameter::keyword::get() = a) Chris@16: ); Chris@16: #endif Chris@16: } Chris@16: }; Chris@16: Chris@16: #undef BOOST_PARAMETER_PY_ARG_TYPES Chris@16: #undef N Chris@16: