// Copyright David Abrahams 2001. | |
// Distributed under the Boost Software License, Version 1.0. (See | |
// accompanying file LICENSE_1_0.txt or copy at | |
// http://www.boost.org/LICENSE_1_0.txt) | |
#ifndef MAKE_FUNCTION_DWA20011221_HPP | |
# define MAKE_FUNCTION_DWA20011221_HPP | |
# include <boost/python/detail/prefix.hpp> | |
# include <boost/python/default_call_policies.hpp> | |
# include <boost/python/args.hpp> | |
# include <boost/python/detail/caller.hpp> | |
# include <boost/python/object/function_object.hpp> | |
# include <boost/mpl/size.hpp> | |
# include <boost/mpl/int.hpp> | |
namespace boost { namespace python { | |
namespace detail | |
{ | |
// make_function_aux -- | |
// | |
// These helper functions for make_function (below) do the raw work | |
// of constructing a Python object from some invokable entity. See | |
// <boost/python/detail/caller.hpp> for more information about how | |
// the Sig arguments is used. | |
template <class F, class CallPolicies, class Sig> | |
object make_function_aux( | |
F f // An object that can be invoked by detail::invoke() | |
, CallPolicies const& p // CallPolicies to use in the invocation | |
, Sig const& // An MPL sequence of argument types expected by F | |
) | |
{ | |
return objects::function_object( | |
detail::caller<F,CallPolicies,Sig>(f, p) | |
); | |
} | |
// As above, except that it accepts argument keywords. NumKeywords | |
// is used only for a compile-time assertion to make sure the user | |
// doesn't pass more keywords than the function can accept. To | |
// disable all checking, pass mpl::int_<0> for NumKeywords. | |
template <class F, class CallPolicies, class Sig, class NumKeywords> | |
object make_function_aux( | |
F f | |
, CallPolicies const& p | |
, Sig const& | |
, detail::keyword_range const& kw // a [begin,end) pair of iterators over keyword names | |
, NumKeywords // An MPL integral type wrapper: the size of kw | |
) | |
{ | |
enum { arity = mpl::size<Sig>::value - 1 }; | |
typedef typename detail::error::more_keywords_than_function_arguments< | |
NumKeywords::value, arity | |
>::too_many_keywords assertion; | |
return objects::function_object( | |
detail::caller<F,CallPolicies,Sig>(f, p) | |
, kw); | |
} | |
// Helpers for make_function when called with 3 arguments. These | |
// dispatch functions are used to discriminate between the cases | |
// when the 3rd argument is keywords or when it is a signature. | |
// | |
// @group { | |
template <class F, class CallPolicies, class Keywords> | |
object make_function_dispatch(F f, CallPolicies const& policies, Keywords const& kw, mpl::true_) | |
{ | |
return detail::make_function_aux( | |
f | |
, policies | |
, detail::get_signature(f) | |
, kw.range() | |
, mpl::int_<Keywords::size>() | |
); | |
} | |
template <class F, class CallPolicies, class Signature> | |
object make_function_dispatch(F f, CallPolicies const& policies, Signature const& sig, mpl::false_) | |
{ | |
return detail::make_function_aux( | |
f | |
, policies | |
, sig | |
); | |
} | |
// } | |
} | |
// These overloaded functions wrap a function or member function | |
// pointer as a Python object, using optional CallPolicies, | |
// Keywords, and/or Signature. | |
// | |
// @group { | |
template <class F> | |
object make_function(F f) | |
{ | |
return detail::make_function_aux( | |
f,default_call_policies(), detail::get_signature(f)); | |
} | |
template <class F, class CallPolicies> | |
object make_function(F f, CallPolicies const& policies) | |
{ | |
return detail::make_function_aux( | |
f, policies, detail::get_signature(f)); | |
} | |
template <class F, class CallPolicies, class KeywordsOrSignature> | |
object make_function( | |
F f | |
, CallPolicies const& policies | |
, KeywordsOrSignature const& keywords_or_signature) | |
{ | |
typedef typename | |
detail::is_reference_to_keywords<KeywordsOrSignature&>::type | |
is_kw; | |
return detail::make_function_dispatch( | |
f | |
, policies | |
, keywords_or_signature | |
, is_kw() | |
); | |
} | |
template <class F, class CallPolicies, class Keywords, class Signature> | |
object make_function( | |
F f | |
, CallPolicies const& policies | |
, Keywords const& kw | |
, Signature const& sig | |
) | |
{ | |
return detail::make_function_aux( | |
f | |
, policies | |
, sig | |
, kw.range() | |
, mpl::int_<Keywords::size>() | |
); | |
} | |
// } | |
}} | |
#endif // MAKE_FUNCTION_DWA20011221_HPP |