// Copyright David Abrahams 2002.

// 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_KEYWORD_RANGE_FN_DWA2002927_HPP

# define MAKE_KEYWORD_RANGE_FN_DWA2002927_HPP



# include <boost/python/make_function.hpp>

# include <boost/python/args_fwd.hpp>



# include <boost/python/object/make_holder.hpp>



# include <boost/mpl/size.hpp>





namespace boost { namespace python { namespace detail { 



// Think of this as a version of make_function without a compile-time

// check that the size of kw is no greater than the expected arity of

// F. This version is needed when defining functions with default

// arguments, because compile-time information about the number of

// keywords is missing for all but the initial function definition.

//

// @group make_keyword_range_function {

template <class F, class Policies>

object make_keyword_range_function(

    F f

  , Policies const& policies

  , keyword_range const& kw)

{

    return detail::make_function_aux(

        f, policies, detail::get_signature(f), kw, mpl::int_<0>());

}



template <class F, class Policies, class Signature>

object make_keyword_range_function(

    F f

  , Policies const& policies

  , keyword_range const& kw

  , Signature const& sig)

{

    return detail::make_function_aux(

        f, policies, sig, kw, mpl::int_<0>());

}

// }



// Builds an '__init__' function which inserts the given Holder type

// in a wrapped C++ class instance. ArgList is an MPL type sequence

// describing the C++ argument types to be passed to Holder's

// constructor.

//

// Holder and ArgList are intended to be explicitly specified. 

template <class ArgList, class Arity, class Holder, class CallPolicies>

object make_keyword_range_constructor(

    CallPolicies const& policies        // The CallPolicies with which to invoke the Holder's constructor

    , detail::keyword_range const& kw   // The (possibly empty) set of associated argument keywords

    , Holder* = 0                       

    , ArgList* = 0, Arity* = 0)

{

#if !defined( BOOST_PYTHON_NO_PY_SIGNATURES) && defined( BOOST_PYTHON_PY_SYGNATURES_PROPER_INIT_SELF_TYPE)

    python_class<BOOST_DEDUCED_TYPENAME Holder::value_type>::register_();

#endif

    return detail::make_keyword_range_function(

        objects::make_holder<Arity::value>

            ::template apply<Holder,ArgList>::execute

        , policies

        , kw);

}



}}} // namespace boost::python::detail



#endif // MAKE_KEYWORD_RANGE_FN_DWA2002927_HPP

