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, boost::python::make_function( |
---|
44 | fn |
---|
45 | , helper.policies() |
---|
46 | , helper.keywords()) |
---|
47 | , 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, detail::make_function1(fn, &fn), 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 |
---|