You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
132 lines
3.0 KiB
132 lines
3.0 KiB
// 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 <boost/mpl/begin.hpp> |
|
# include <boost/mpl/next.hpp> |
|
# include <boost/mpl/deref.hpp> |
|
# include <boost/mpl/size.hpp> |
|
# include <boost/parameter/keyword.hpp> |
|
# include <boost/preprocessor/iteration/iterate.hpp> |
|
|
|
namespace boost { namespace parameter { namespace python { namespace aux { |
|
|
|
template <long Arity, class M, class R, class Args> |
|
struct invoker; |
|
|
|
template <class M, class R> |
|
struct make_invoker |
|
{ |
|
template <class Args> |
|
struct apply |
|
{ |
|
typedef invoker< |
|
mpl::size<Args>::value, M, R, Args |
|
> type; |
|
}; |
|
}; |
|
|
|
template <long Arity, class M, class R, class T, class Args> |
|
struct member_invoker; |
|
|
|
template <class M, class R, class T> |
|
struct make_member_invoker |
|
{ |
|
template <class Args> |
|
struct apply |
|
{ |
|
typedef member_invoker< |
|
mpl::size<Args>::value, M, R, T, Args |
|
> type; |
|
}; |
|
}; |
|
|
|
template <long Arity, class T, class R, class Args> |
|
struct call_invoker; |
|
|
|
template <class T, class R> |
|
struct make_call_invoker |
|
{ |
|
template <class Args> |
|
struct apply |
|
{ |
|
typedef call_invoker< |
|
mpl::size<Args>::value, T, R, Args |
|
> type; |
|
}; |
|
}; |
|
|
|
template <long Arity, class T, class Args> |
|
struct init_invoker; |
|
|
|
template <class T> |
|
struct make_init_invoker |
|
{ |
|
template <class Args> |
|
struct apply |
|
{ |
|
typedef init_invoker< |
|
mpl::size<Args>::value, T, Args |
|
> type; |
|
}; |
|
}; |
|
|
|
template <class M, class R, class Args> |
|
struct invoker<0, M, R, Args> |
|
{ |
|
static R execute() |
|
{ |
|
return M()(boost::type<R>()); |
|
} |
|
}; |
|
|
|
template <class M, class R, class T, class Args> |
|
struct member_invoker<0, M, R, T, Args> |
|
{ |
|
static R execute(T& self) |
|
{ |
|
return M()(boost::type<R>(), self); |
|
} |
|
}; |
|
|
|
template <class T, class R, class Args> |
|
struct call_invoker<0, T, R, Args> |
|
{ |
|
static R execute(T& self) |
|
{ |
|
return self(); |
|
} |
|
}; |
|
|
|
template <class T, class Args> |
|
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, <boost/parameter/aux_/python/invoker_iterate.hpp>, 1)) |
|
# include BOOST_PP_ITERATE() |
|
|
|
# define BOOST_PP_ITERATION_PARAMS_1 (4, \ |
|
(1, BOOST_PARAMETER_MAX_ARITY, <boost/parameter/aux_/python/invoker_iterate.hpp>, 2)) |
|
# include BOOST_PP_ITERATE() |
|
|
|
# define BOOST_PP_ITERATION_PARAMS_1 (4, \ |
|
(1, BOOST_PARAMETER_MAX_ARITY, <boost/parameter/aux_/python/invoker_iterate.hpp>, 3)) |
|
# include BOOST_PP_ITERATE() |
|
|
|
# define BOOST_PP_ITERATION_PARAMS_1 (4, \ |
|
(1, BOOST_PARAMETER_MAX_ARITY, <boost/parameter/aux_/python/invoker_iterate.hpp>, 4)) |
|
# include BOOST_PP_ITERATE() |
|
|
|
}}}} // namespace boost::parameter::python::aux |
|
|
|
#endif // BOOST_PARAMETER_INVOKER_051210_HPP |
|
|
|
|