]>
Commit | Line | Data |
---|---|---|
1 | // Copyright Daniel Wallin 2005. Use, modification and distribution is | |
2 | // subject to the Boost Software License, Version 1.0. (See accompanying | |
3 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
4 | ||
5 | #ifndef BOOST_PARAMETER_INVOKER_051210_HPP | |
6 | # define BOOST_PARAMETER_INVOKER_051210_HPP | |
7 | ||
8 | # include <boost/mpl/begin.hpp> | |
9 | # include <boost/mpl/next.hpp> | |
10 | # include <boost/mpl/deref.hpp> | |
11 | # include <boost/mpl/size.hpp> | |
12 | # include <boost/parameter/keyword.hpp> | |
13 | # include <boost/preprocessor/iteration/iterate.hpp> | |
14 | ||
15 | namespace boost { namespace parameter { namespace python { namespace aux { | |
16 | ||
17 | template <long Arity, class M, class R, class Args> | |
18 | struct invoker; | |
19 | ||
20 | template <class M, class R> | |
21 | struct make_invoker | |
22 | { | |
23 | template <class Args> | |
24 | struct apply | |
25 | { | |
26 | typedef invoker< | |
27 | mpl::size<Args>::value, M, R, Args | |
28 | > type; | |
29 | }; | |
30 | }; | |
31 | ||
32 | template <long Arity, class M, class R, class T, class Args> | |
33 | struct member_invoker; | |
34 | ||
35 | template <class M, class R, class T> | |
36 | struct make_member_invoker | |
37 | { | |
38 | template <class Args> | |
39 | struct apply | |
40 | { | |
41 | typedef member_invoker< | |
42 | mpl::size<Args>::value, M, R, T, Args | |
43 | > type; | |
44 | }; | |
45 | }; | |
46 | ||
47 | template <long Arity, class T, class R, class Args> | |
48 | struct call_invoker; | |
49 | ||
50 | template <class T, class R> | |
51 | struct make_call_invoker | |
52 | { | |
53 | template <class Args> | |
54 | struct apply | |
55 | { | |
56 | typedef call_invoker< | |
57 | mpl::size<Args>::value, T, R, Args | |
58 | > type; | |
59 | }; | |
60 | }; | |
61 | ||
62 | template <long Arity, class T, class Args> | |
63 | struct init_invoker; | |
64 | ||
65 | template <class T> | |
66 | struct make_init_invoker | |
67 | { | |
68 | template <class Args> | |
69 | struct apply | |
70 | { | |
71 | typedef init_invoker< | |
72 | mpl::size<Args>::value, T, Args | |
73 | > type; | |
74 | }; | |
75 | }; | |
76 | ||
77 | template <class M, class R, class Args> | |
78 | struct invoker<0, M, R, Args> | |
79 | { | |
80 | static R execute() | |
81 | { | |
82 | return M()(boost::type<R>()); | |
83 | } | |
84 | }; | |
85 | ||
86 | template <class M, class R, class T, class Args> | |
87 | struct member_invoker<0, M, R, T, Args> | |
88 | { | |
89 | static R execute(T& self) | |
90 | { | |
91 | return M()(boost::type<R>(), self); | |
92 | } | |
93 | }; | |
94 | ||
95 | template <class T, class R, class Args> | |
96 | struct call_invoker<0, T, R, Args> | |
97 | { | |
98 | static R execute(T& self) | |
99 | { | |
100 | return self(); | |
101 | } | |
102 | }; | |
103 | ||
104 | template <class T, class Args> | |
105 | struct init_invoker<0, T, Args> | |
106 | { | |
107 | static T* execute(T& self) | |
108 | { | |
109 | return new T; | |
110 | } | |
111 | }; | |
112 | ||
113 | # define BOOST_PP_ITERATION_PARAMS_1 (4, \ | |
114 | (1, BOOST_PARAMETER_MAX_ARITY, <boost/parameter/aux_/python/invoker_iterate.hpp>, 1)) | |
115 | # include BOOST_PP_ITERATE() | |
116 | ||
117 | # define BOOST_PP_ITERATION_PARAMS_1 (4, \ | |
118 | (1, BOOST_PARAMETER_MAX_ARITY, <boost/parameter/aux_/python/invoker_iterate.hpp>, 2)) | |
119 | # include BOOST_PP_ITERATE() | |
120 | ||
121 | # define BOOST_PP_ITERATION_PARAMS_1 (4, \ | |
122 | (1, BOOST_PARAMETER_MAX_ARITY, <boost/parameter/aux_/python/invoker_iterate.hpp>, 3)) | |
123 | # include BOOST_PP_ITERATE() | |
124 | ||
125 | # define BOOST_PP_ITERATION_PARAMS_1 (4, \ | |
126 | (1, BOOST_PARAMETER_MAX_ARITY, <boost/parameter/aux_/python/invoker_iterate.hpp>, 4)) | |
127 | # include BOOST_PP_ITERATE() | |
128 | ||
129 | }}}} // namespace boost::parameter::python::aux | |
130 | ||
131 | #endif // BOOST_PARAMETER_INVOKER_051210_HPP | |
132 |