|
3 | 3 | // copyright notice appears in all copies. This software is provided |
4 | 4 | // "as is" without express or implied warranty, and with no claim as |
5 | 5 | // to its suitability for any purpose. |
6 | | -#ifndef TARGET_DWA2002513_HPP |
7 | | -# define TARGET_DWA2002513_HPP |
8 | | - |
| 6 | +#ifndef TARGET_DWA2002521_HPP |
| 7 | +# define TARGET_DWA2002521_HPP |
| 8 | + |
| 9 | +# include <boost/python/detail/preprocessor.hpp> |
| 10 | +# include <boost/preprocessor/comma_if.hpp> |
| 11 | +# include <boost/mpl/aux_/preprocessor.hpp> |
| 12 | +# include <boost/preprocessor/comma_if.hpp> |
| 13 | +# include <boost/preprocessor/if.hpp> |
9 | 14 | # include <boost/type.hpp> |
10 | 15 |
|
11 | | -namespace boost { namespace python { namespace detail { |
12 | | - |
13 | | -// |
14 | | -// target(x) - deduce the type of the first argument when bind(x) is |
15 | | -// invoked. |
16 | | -// |
17 | | - |
18 | | -// functions |
19 | | -template <class Target, class R> |
20 | | -boost::type<Target>* target(R (*)(Target)) { return 0; } |
21 | | - |
22 | | -template <class Target, class R, class A1> |
23 | | -boost::type<Target>* target(R (*)(Target, A1)) { return 0; } |
24 | | - |
25 | | -template <class Target, class R, class A1, class A2> |
26 | | -boost::type<Target>* target(R (*)(Target, A1, A2)) { return 0; } |
27 | | - |
28 | | -template <class Target, class R, class A1, class A2, class A3> |
29 | | -boost::type<Target>* target(R (*)(Target, A1, A2, A3)) { return 0; } |
30 | | - |
31 | | -// data member pointers |
32 | | -template <class Target, class R> |
33 | | -boost::type<Target&>* target(R (Target::*)) { return 0; } |
34 | | - |
35 | | -// member Functions |
36 | | -template <class Target, class R> |
37 | | -boost::type<Target&>* target(R (Target::*)()) { return 0; } |
38 | | - |
39 | | -template <class Target, class R, class A1> |
40 | | -boost::type<Target&>* target(R (Target::*)(A1)) { return 0; } |
41 | | - |
42 | | -template <class Target, class R, class A1, class A2> |
43 | | -boost::type<Target&>* target(R (Target::*)(A1,A2)) { return 0; } |
44 | | - |
45 | | -template <class Target, class R, class A1, class A2, class A3> |
46 | | -boost::type<Target&>* target(R (Target::*)(A1,A2,A3)) { return 0; } |
47 | | - |
48 | | -// const member functions |
49 | | -template <class Target, class R> |
50 | | -boost::type<Target const&>* target(R (Target::*)() const) { return 0; } |
51 | | - |
52 | | -template <class Target, class R, class A1> |
53 | | -boost::type<Target const&>* target(R (Target::*)(A1) const) { return 0; } |
54 | | - |
55 | | -template <class Target, class R, class A1, class A2> |
56 | | -boost::type<Target const&>* target(R (Target::*)(A1,A2) const) { return 0; } |
57 | | - |
58 | | -template <class Target, class R, class A1, class A2, class A3> |
59 | | -boost::type<Target const&>* target(R (Target::*)(A1,A2,A3) const) { return 0; } |
60 | | - |
61 | | -// volatile member functions |
62 | | -template <class Target, class R> |
63 | | -boost::type<Target volatile&>* target(R (Target::*)() volatile) { return 0; } |
64 | | - |
65 | | -template <class Target, class R, class A1> |
66 | | -boost::type<Target volatile&>* target(R (Target::*)(A1) volatile) { return 0; } |
67 | | - |
68 | | -template <class Target, class R, class A1, class A2> |
69 | | -boost::type<Target volatile&>* target(R (Target::*)(A1,A2) volatile) { return 0; } |
| 16 | +namespace boost { namespace python { namespace detail { |
70 | 17 |
|
71 | | -template <class Target, class R, class A1, class A2, class A3> |
72 | | -boost::type<Target volatile&>* target(R (Target::*)(A1,A2,A3) volatile) { return 0; } |
| 18 | +# ifndef BOOST_PYTHON_GENERATE_CODE |
| 19 | +# include <boost/python/preprocessed/target.hpp> |
| 20 | +# endif |
73 | 21 |
|
74 | | -// const volatile member functions |
75 | | -template <class Target, class R> |
76 | | -boost::type<Target const volatile&>* target(R (Target::*)() const volatile) { return 0; } |
| 22 | +# define BOOST_PYTHON_FIRST_ARGUMENT_PF(args, ignored) \ |
| 23 | +template <class R BOOST_PP_COMMA_IF(args) BOOST_MPL_TEMPLATE_PARAMETERS(0, args, class A)> \ |
| 24 | +boost::type<BOOST_PP_IF(args, A0, void)>* target(BOOST_PYTHON_FN(*,0,args)) { return 0; } |
77 | 25 |
|
78 | | -template <class Target, class R, class A1> |
79 | | -boost::type<Target const volatile&>* target(R (Target::*)(A1) const volatile) { return 0; } |
| 26 | +# define BOOST_PYTHON_FIRST_ARGUMENT_PMF(args, cv) \ |
| 27 | +template <class R, BOOST_MPL_TEMPLATE_PARAMETERS(0, args, class A)> \ |
| 28 | +boost::type<A0 cv()*>* target(BOOST_PYTHON_FN(A0::*,1,args)cv()) { return 0; } |
80 | 29 |
|
81 | | -template <class Target, class R, class A1, class A2> |
82 | | -boost::type<Target const volatile&>* target(R (Target::*)(A1,A2) const volatile) { return 0; } |
| 30 | +BOOST_PYTHON_REPEAT_ARITY_2ND(BOOST_PYTHON_FIRST_ARGUMENT_PF, nil) |
| 31 | +BOOST_PYTHON_REPEAT_MF_CV_2ND(BOOST_PYTHON_FIRST_ARGUMENT_PMF) |
83 | 32 |
|
84 | | -template <class Target, class R, class A1, class A2, class A3> |
85 | | -boost::type<Target const volatile&>* target(R (Target::*)(A1,A2,A3) const volatile) { return 0; } |
| 33 | +template <class R, class T> |
| 34 | +boost::type<T*>* target(R (T::*)) { return 0; } |
86 | 35 |
|
87 | 36 | }}} // namespace boost::python::detail |
88 | 37 |
|
89 | | -#endif // TARGET_DWA2002513_HPP |
| 38 | +#endif // TARGET_DWA2002521_HPP |
0 commit comments