annotate DEPENDENCIES/generic/include/boost/python/make_function.hpp @ 133:4acb5d8d80b6 tip

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