]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/parameter/aux_/python/invoker.hpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / boost / parameter / aux_ / python / invoker.hpp
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