1// Copyright David Abrahams 2001.
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 MAKE_FUNCTION_DWA20011221_HPP
6# define MAKE_FUNCTION_DWA20011221_HPP
7
8# include <boost/python/detail/prefix.hpp>
9
10# include <boost/python/default_call_policies.hpp>
11# include <boost/python/args.hpp>
12# include <boost/python/detail/caller.hpp>
13
14# include <boost/python/object/function_object.hpp>
15
16# include <boost/mpl/size.hpp>
17# include <boost/mpl/int.hpp>
18
19namespace boost { namespace python {
20
21namespace detail
22{
23 // make_function_aux --
24 //
25 // These helper functions for make_function (below) do the raw work
26 // of constructing a Python object from some invokable entity. See
27 // <boost/python/detail/caller.hpp> for more information about how
28 // the Sig arguments is used.
29 template <class F, class CallPolicies, class Sig>
30 object make_function_aux(
31 F f // An object that can be invoked by detail::invoke()
32 , CallPolicies const& p // CallPolicies to use in the invocation
33 , Sig const& // An MPL sequence of argument types expected by F
34 )
35 {
36 return objects::function_object(
37 detail::caller<F,CallPolicies,Sig>(f, p)
38 );
39 }
40
41 // As above, except that it accepts argument keywords. NumKeywords
42 // is used only for a compile-time assertion to make sure the user
43 // doesn't pass more keywords than the function can accept. To
44 // disable all checking, pass mpl::int_<0> for NumKeywords.
45 template <class F, class CallPolicies, class Sig, class NumKeywords>
46 object make_function_aux(
47 F f
48 , CallPolicies const& p
49 , Sig const&
50 , detail::keyword_range const& kw // a [begin,end) pair of iterators over keyword names
51 , NumKeywords // An MPL integral type wrapper: the size of kw
52 )
53 {
54 enum { arity = mpl::size<Sig>::value - 1 };
55
56 typedef typename detail::error::more_keywords_than_function_arguments<
57 NumKeywords::value, arity
58 >::too_many_keywords assertion;
59
60 return objects::function_object(
61 detail::caller<F,CallPolicies,Sig>(f, p)
62 , kw);
63 }
64
65 // Helpers for make_function when called with 3 arguments. These
66 // dispatch functions are used to discriminate between the cases
67 // when the 3rd argument is keywords or when it is a signature.
68 //
69 // @group {
70 template <class F, class CallPolicies, class Keywords>
71 object make_function_dispatch(F f, CallPolicies const& policies, Keywords const& kw, mpl::true_)
72 {
73 return detail::make_function_aux(
74 f
75 , policies
76 , detail::get_signature(f)
77 , kw.range()
78 , mpl::int_<Keywords::size>()
79 );
80 }
81
82 template <class F, class CallPolicies, class Signature>
83 object make_function_dispatch(F f, CallPolicies const& policies, Signature const& sig, mpl::false_)
84 {
85 return detail::make_function_aux(
86 f
87 , policies
88 , sig
89 );
90 }
91 // }
92
93 }
94
95// These overloaded functions wrap a function or member function
96// pointer as a Python object, using optional CallPolicies,
97// Keywords, and/or Signature.
98//
99// @group {
100template <class F>
101object make_function(F f)
102{
103 return detail::make_function_aux(
104 f,default_call_policies(), detail::get_signature(f));
105}
106
107template <class F, class CallPolicies>
108object make_function(F f, CallPolicies const& policies)
109{
110 return detail::make_function_aux(
111 f, policies, detail::get_signature(f));
112}
113
114template <class F, class CallPolicies, class KeywordsOrSignature>
115object make_function(
116 F f
117 , CallPolicies const& policies
118 , KeywordsOrSignature const& keywords_or_signature)
119{
120 typedef typename
121 detail::is_reference_to_keywords<KeywordsOrSignature&>::type
122 is_kw;
123
124 return detail::make_function_dispatch(
125 f
126 , policies
127 , keywords_or_signature
128 , is_kw()
129 );
130}
131
132template <class F, class CallPolicies, class Keywords, class Signature>
133object make_function(
134 F f
135 , CallPolicies const& policies
136 , Keywords const& kw
137 , Signature const& sig
138 )
139{
140 return detail::make_function_aux(
141 f
142 , policies
143 , sig
144 , kw.range()
145 , mpl::int_<Keywords::size>()
146 );
147}
148// }
149
150}}
151
152
153#endif // MAKE_FUNCTION_DWA20011221_HPP
154

source code of boost/boost/python/make_function.hpp