1 | // Copyright David Abrahams 2002. |
2 | // Distributed under the Boost Software License, Version 1.0. (See |
3 | // accompanying file LICENSE_1_0.txt or copy at |
4 | // http://www.boost.org/LICENSE_1_0.txt) |
5 | #ifndef DEF_DWA200292_HPP |
6 | # define DEF_DWA200292_HPP |
7 | |
8 | # include <boost/python/detail/prefix.hpp> |
9 | |
10 | # include <boost/python/object_fwd.hpp> |
11 | # include <boost/python/make_function.hpp> |
12 | # include <boost/python/detail/def_helper.hpp> |
13 | # include <boost/python/detail/overloads_fwd.hpp> |
14 | # include <boost/python/scope.hpp> |
15 | # include <boost/python/signature.hpp> |
16 | # include <boost/python/detail/scope.hpp> |
17 | |
18 | namespace boost { namespace python { |
19 | |
20 | namespace detail |
21 | { |
22 | namespace error |
23 | { |
24 | // Compile-time error messages |
25 | template <bool> struct multiple_functions_passed_to_def; |
26 | template <> struct multiple_functions_passed_to_def<false> { typedef char type; }; |
27 | } |
28 | |
29 | // |
30 | // def_from_helper -- |
31 | // |
32 | // Use a def_helper to define a regular wrapped function in the current scope. |
33 | template <class F, class Helper> |
34 | void def_from_helper( |
35 | char const* name, F const& fn, Helper const& helper) |
36 | { |
37 | // Must not try to use default implementations except with method definitions. |
38 | typedef typename error::multiple_functions_passed_to_def< |
39 | Helper::has_default_implementation |
40 | >::type assertion; |
41 | |
42 | detail::scope_setattr_doc( |
43 | name, obj: boost::python::make_function( |
44 | fn |
45 | , helper.policies() |
46 | , helper.keywords()) |
47 | , doc: helper.doc() |
48 | ); |
49 | } |
50 | |
51 | // |
52 | // These two overloads discriminate between def() as applied to |
53 | // regular functions and def() as applied to the result of |
54 | // BOOST_PYTHON_FUNCTION_OVERLOADS(). The final argument is used to |
55 | // discriminate. |
56 | // |
57 | template <class Fn, class A1> |
58 | void |
59 | def_maybe_overloads( |
60 | char const* name |
61 | , Fn fn |
62 | , A1 const& a1 |
63 | , ...) |
64 | { |
65 | detail::def_from_helper(name, fn, def_helper<A1>(a1)); |
66 | } |
67 | |
68 | template <class StubsT, class SigT> |
69 | void def_maybe_overloads( |
70 | char const* name |
71 | , SigT sig |
72 | , StubsT const& stubs |
73 | , detail::overloads_base const*) |
74 | { |
75 | scope current; |
76 | |
77 | detail::define_with_defaults( |
78 | name, stubs, current, detail::get_signature(sig)); |
79 | } |
80 | |
81 | template <class T> |
82 | object make_function1(T fn, ...) { return make_function(fn); } |
83 | |
84 | inline |
85 | object make_function1(object const& x, object const*) { return x; } |
86 | } |
87 | |
88 | template <class Fn> |
89 | void def(char const* name, Fn fn) |
90 | { |
91 | detail::scope_setattr_doc(name, obj: detail::make_function1(fn, &fn), doc: 0); |
92 | } |
93 | |
94 | template <class Arg1T, class Arg2T> |
95 | void def(char const* name, Arg1T arg1, Arg2T const& arg2) |
96 | { |
97 | detail::def_maybe_overloads(name, arg1, arg2, &arg2); |
98 | } |
99 | |
100 | template <class F, class A1, class A2> |
101 | void def(char const* name, F f, A1 const& a1, A2 const& a2) |
102 | { |
103 | detail::def_from_helper(name, f, detail::def_helper<A1,A2>(a1,a2)); |
104 | } |
105 | |
106 | template <class F, class A1, class A2, class A3> |
107 | void def(char const* name, F f, A1 const& a1, A2 const& a2, A3 const& a3) |
108 | { |
109 | detail::def_from_helper(name, f, detail::def_helper<A1,A2,A3>(a1,a2,a3)); |
110 | } |
111 | |
112 | }} // namespace boost::python |
113 | |
114 | #endif // DEF_DWA200292_HPP |
115 | |