From 1c3940154afb7223c85def51dc4258a4dd4a08f6 Mon Sep 17 00:00:00 2001 From: Daniel Wallin Date: Thu, 9 Mar 2006 08:20:20 +0000 Subject: [PATCH] Missing files added. [SVN r33278] --- .../boost/parameter/aux_/python/invoker.hpp | 131 ++++++++++++++++++ .../parameter/aux_/python/invoker_iterate.hpp | 93 +++++++++++++ 2 files changed, 224 insertions(+) create mode 100755 include/boost/parameter/aux_/python/invoker.hpp create mode 100755 include/boost/parameter/aux_/python/invoker_iterate.hpp diff --git a/include/boost/parameter/aux_/python/invoker.hpp b/include/boost/parameter/aux_/python/invoker.hpp new file mode 100755 index 0000000..d90ad7d --- /dev/null +++ b/include/boost/parameter/aux_/python/invoker.hpp @@ -0,0 +1,131 @@ +// Copyright Daniel Wallin 2005. Use, modification and distribution is +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PARAMETER_INVOKER_051210_HPP +# define BOOST_PARAMETER_INVOKER_051210_HPP + +# include +# include +# include +# include +# include + +namespace boost { namespace parameter { namespace python { namespace aux { + +template +struct invoker; + +template +struct make_invoker +{ + template + struct apply + { + typedef invoker< + mpl::size::value, M, R, Args + > type; + }; +}; + +template +struct member_invoker; + +template +struct make_member_invoker +{ + template + struct apply + { + typedef member_invoker< + mpl::size::value, M, R, T, Args + > type; + }; +}; + +template +struct call_invoker; + +template +struct make_call_invoker +{ + template + struct apply + { + typedef call_invoker< + mpl::size::value, T, R, Args + > type; + }; +}; + +template +struct init_invoker; + +template +struct make_init_invoker +{ + template + struct apply + { + typedef init_invoker< + mpl::size::value, T, Args + > type; + }; +}; + +template +struct invoker<0, M, R, Args> +{ + static R execute() + { + return M()(boost::type()); + } +}; + +template +struct member_invoker<0, M, R, T, Args> +{ + static R execute() + { + return M()(boost::type()); + } +}; + +template +struct call_invoker<0, T, R, Args> +{ + static R execute(T& self) + { + return self(); + } +}; + +template +struct init_invoker<0, T, Args> +{ + static T* execute(T& self) + { + return new T; + } +}; + +# define BOOST_PP_ITERATION_PARAMS_1 (4, \ + (1, BOOST_PARAMETER_MAX_ARITY, , 1)) +# include BOOST_PP_ITERATE() + +# define BOOST_PP_ITERATION_PARAMS_1 (4, \ + (1, BOOST_PARAMETER_MAX_ARITY, , 2)) +# include BOOST_PP_ITERATE() + +# define BOOST_PP_ITERATION_PARAMS_1 (4, \ + (1, BOOST_PARAMETER_MAX_ARITY, , 3)) +# include BOOST_PP_ITERATE() + +# define BOOST_PP_ITERATION_PARAMS_1 (4, \ + (1, BOOST_PARAMETER_MAX_ARITY, , 4)) +# include BOOST_PP_ITERATE() + +}}}} // namespace boost::parameter::python::aux + +#endif // BOOST_PARAMETER_INVOKER_051210_HPP + diff --git a/include/boost/parameter/aux_/python/invoker_iterate.hpp b/include/boost/parameter/aux_/python/invoker_iterate.hpp new file mode 100755 index 0000000..c18f6d0 --- /dev/null +++ b/include/boost/parameter/aux_/python/invoker_iterate.hpp @@ -0,0 +1,93 @@ +// Copyright Daniel Wallin 2005. Use, modification and distribution is +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include +#include +#include +#include + +#define N BOOST_PP_ITERATION() + +#define BOOST_PARAMETER_PY_ARG_TYPES(z, n, _) \ + typedef typename mpl::next< \ + BOOST_PP_CAT(iter,BOOST_PP_DEC(n)) \ + >::type BOOST_PP_CAT(iter,n); \ + \ + typedef typename mpl::deref::type BOOST_PP_CAT(spec,n); \ + typedef typename mpl::if_< \ + mpl::and_< \ + mpl::not_ \ + , typename BOOST_PP_CAT(spec,n)::optimized_default \ + > \ + , parameter::aux::maybe \ + , typename BOOST_PP_CAT(spec,n)::type \ + >::type BOOST_PP_CAT(arg,n); \ + typedef typename BOOST_PP_CAT(spec,n)::keyword BOOST_PP_CAT(kw,n); + +#if BOOST_PP_ITERATION_FLAGS() == 1 +template +struct invoker +#elif BOOST_PP_ITERATION_FLAGS() == 2 +template +struct call_invoker +#elif BOOST_PP_ITERATION_FLAGS() == 3 +template +struct init_invoker +#elif BOOST_PP_ITERATION_FLAGS() == 4 +template +struct member_invoker +#endif +{ + typedef typename mpl::begin::type iter0; + typedef typename mpl::deref::type spec0; + typedef typename mpl::if_< + mpl::and_< + mpl::not_ + , typename spec0::optimized_default + > + , parameter::aux::maybe + , typename spec0::type + >::type arg0; + typedef typename spec0::keyword kw0; + + BOOST_PP_REPEAT_FROM_TO(1, N, BOOST_PARAMETER_PY_ARG_TYPES, ~) + + static +#if BOOST_PP_ITERATION_FLAGS() == 3 + T* +#else + R +#endif + execute( +#if BOOST_PP_ITERATION_FLAGS() == 2 || BOOST_PP_ITERATION_FLAGS() == 4 + T& self + , +#endif + BOOST_PP_ENUM_BINARY_PARAMS(N, arg, a) + ) + { + return +#if BOOST_PP_ITERATION_FLAGS() == 1 || BOOST_PP_ITERATION_FLAGS() == 4 + M()( + boost::type() +# if BOOST_PP_ITERATION_FLAGS() == 4 + , self +# endif + , BOOST_PP_ENUM_BINARY_PARAMS(N, parameter::keyword::get() = a) + ); +#elif BOOST_PP_ITERATION_FLAGS() == 2 + self( + BOOST_PP_ENUM_BINARY_PARAMS(N, parameter::keyword::get() = a) + ); +#elif BOOST_PP_ITERATION_FLAGS() == 3 + new T( + BOOST_PP_ENUM_BINARY_PARAMS(N, parameter::keyword::get() = a) + ); +#endif + } +}; + +#undef BOOST_PARAMETER_PY_ARG_TYPES +#undef N +