Chris@16: // Copyright David Abrahams 2002. Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: #ifndef DEF_DWA200292_HPP Chris@16: # define DEF_DWA200292_HPP Chris@16: Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: namespace boost { namespace python { Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: namespace error Chris@16: { Chris@16: // Compile-time error messages Chris@16: template struct multiple_functions_passed_to_def; Chris@16: template <> struct multiple_functions_passed_to_def { typedef char type; }; Chris@16: } Chris@16: Chris@16: // Chris@16: // def_from_helper -- Chris@16: // Chris@16: // Use a def_helper to define a regular wrapped function in the current scope. Chris@16: template Chris@16: void def_from_helper( Chris@16: char const* name, F const& fn, Helper const& helper) Chris@16: { Chris@16: // Must not try to use default implementations except with method definitions. Chris@16: typedef typename error::multiple_functions_passed_to_def< Chris@16: Helper::has_default_implementation Chris@16: >::type assertion; Chris@16: Chris@16: detail::scope_setattr_doc( Chris@16: name, boost::python::make_function( Chris@16: fn Chris@16: , helper.policies() Chris@16: , helper.keywords()) Chris@16: , helper.doc() Chris@16: ); Chris@16: } Chris@16: Chris@16: // Chris@16: // These two overloads discriminate between def() as applied to Chris@16: // regular functions and def() as applied to the result of Chris@16: // BOOST_PYTHON_FUNCTION_OVERLOADS(). The final argument is used to Chris@16: // discriminate. Chris@16: // Chris@16: template Chris@16: void Chris@16: def_maybe_overloads( Chris@16: char const* name Chris@16: , Fn fn Chris@16: , A1 const& a1 Chris@16: , ...) Chris@16: { Chris@16: detail::def_from_helper(name, fn, def_helper(a1)); Chris@16: } Chris@16: Chris@16: template Chris@16: void def_maybe_overloads( Chris@16: char const* name Chris@16: , SigT sig Chris@16: , StubsT const& stubs Chris@16: , detail::overloads_base const*) Chris@16: { Chris@16: scope current; Chris@16: Chris@16: detail::define_with_defaults( Chris@16: name, stubs, current, detail::get_signature(sig)); Chris@16: } Chris@16: Chris@16: template Chris@16: object make_function1(T fn, ...) { return make_function(fn); } Chris@16: Chris@16: inline Chris@16: object make_function1(object const& x, object const*) { return x; } Chris@16: } Chris@16: Chris@16: template Chris@16: void def(char const* name, Fn fn) Chris@16: { Chris@16: detail::scope_setattr_doc(name, detail::make_function1(fn, &fn), 0); Chris@16: } Chris@16: Chris@16: template Chris@16: void def(char const* name, Arg1T arg1, Arg2T const& arg2) Chris@16: { Chris@16: detail::def_maybe_overloads(name, arg1, arg2, &arg2); Chris@16: } Chris@16: Chris@16: template Chris@16: void def(char const* name, F f, A1 const& a1, A2 const& a2) Chris@16: { Chris@16: detail::def_from_helper(name, f, detail::def_helper(a1,a2)); Chris@16: } Chris@16: Chris@16: template Chris@16: void def(char const* name, F f, A1 const& a1, A2 const& a2, A3 const& a3) Chris@16: { Chris@16: detail::def_from_helper(name, f, detail::def_helper(a1,a2,a3)); Chris@16: } Chris@16: Chris@16: }} // namespace boost::python Chris@16: Chris@16: #endif // DEF_DWA200292_HPP