annotate DEPENDENCIES/generic/include/boost/python/object/py_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 2002.
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 PY_FUNCTION_DWA200286_HPP
Chris@16 6 # define PY_FUNCTION_DWA200286_HPP
Chris@16 7
Chris@16 8 # include <boost/python/detail/signature.hpp>
Chris@16 9 # include <boost/detail/workaround.hpp>
Chris@16 10 # include <boost/mpl/size.hpp>
Chris@16 11 # include <memory>
Chris@16 12
Chris@16 13 namespace boost { namespace python { namespace objects {
Chris@16 14
Chris@16 15 // This type is used as a "generalized Python callback", wrapping the
Chris@16 16 // function signature:
Chris@16 17 //
Chris@16 18 // PyObject* (PyObject* args, PyObject* keywords)
Chris@16 19
Chris@16 20 struct BOOST_PYTHON_DECL py_function_impl_base
Chris@16 21 {
Chris@16 22 virtual ~py_function_impl_base();
Chris@16 23 virtual PyObject* operator()(PyObject*, PyObject*) = 0;
Chris@16 24 virtual unsigned min_arity() const = 0;
Chris@16 25 virtual unsigned max_arity() const;
Chris@16 26 virtual python::detail::py_func_sig_info signature() const = 0;
Chris@16 27 };
Chris@16 28
Chris@16 29 template <class Caller>
Chris@16 30 struct caller_py_function_impl : py_function_impl_base
Chris@16 31 {
Chris@16 32 caller_py_function_impl(Caller const& caller)
Chris@16 33 : m_caller(caller)
Chris@16 34 {}
Chris@16 35
Chris@16 36 PyObject* operator()(PyObject* args, PyObject* kw)
Chris@16 37 {
Chris@16 38 return m_caller(args, kw);
Chris@16 39 }
Chris@16 40
Chris@16 41 virtual unsigned min_arity() const
Chris@16 42 {
Chris@16 43 return m_caller.min_arity();
Chris@16 44 }
Chris@16 45
Chris@16 46 virtual python::detail::py_func_sig_info signature() const
Chris@16 47 {
Chris@16 48 return m_caller.signature();
Chris@16 49 }
Chris@16 50
Chris@16 51 private:
Chris@16 52 Caller m_caller;
Chris@16 53 };
Chris@16 54
Chris@16 55 template <class Caller, class Sig>
Chris@16 56 struct signature_py_function_impl : py_function_impl_base
Chris@16 57 {
Chris@16 58 signature_py_function_impl(Caller const& caller)
Chris@16 59 : m_caller(caller)
Chris@16 60 {}
Chris@16 61
Chris@16 62 PyObject* operator()(PyObject* args, PyObject* kw)
Chris@16 63 {
Chris@16 64 return m_caller(args, kw);
Chris@16 65 }
Chris@16 66
Chris@16 67 virtual unsigned min_arity() const
Chris@16 68 {
Chris@16 69 return mpl::size<Sig>::value - 1;
Chris@16 70 }
Chris@16 71
Chris@16 72 virtual python::detail::py_func_sig_info signature() const
Chris@16 73 {
Chris@16 74 python::detail::signature_element const* sig = python::detail::signature<Sig>::elements();
Chris@16 75 python::detail::py_func_sig_info res = {sig, sig};
Chris@16 76 return res;
Chris@16 77 }
Chris@16 78
Chris@16 79 private:
Chris@16 80 Caller m_caller;
Chris@16 81 };
Chris@16 82
Chris@16 83 template <class Caller, class Sig>
Chris@16 84 struct full_py_function_impl : py_function_impl_base
Chris@16 85 {
Chris@16 86 full_py_function_impl(Caller const& caller, unsigned min_arity, unsigned max_arity)
Chris@16 87 : m_caller(caller)
Chris@16 88 , m_min_arity(min_arity)
Chris@16 89 , m_max_arity(max_arity > min_arity ? max_arity : min_arity)
Chris@16 90 {}
Chris@16 91
Chris@16 92 PyObject* operator()(PyObject* args, PyObject* kw)
Chris@16 93 {
Chris@16 94 return m_caller(args, kw);
Chris@16 95 }
Chris@16 96
Chris@16 97 virtual unsigned min_arity() const
Chris@16 98 {
Chris@16 99 return m_min_arity;
Chris@16 100 }
Chris@16 101
Chris@16 102 virtual unsigned max_arity() const
Chris@16 103 {
Chris@16 104 return m_max_arity;
Chris@16 105 }
Chris@16 106
Chris@16 107 virtual python::detail::py_func_sig_info signature() const
Chris@16 108 {
Chris@16 109 python::detail::signature_element const* sig = python::detail::signature<Sig>::elements();
Chris@16 110 python::detail::py_func_sig_info res = {sig, sig};
Chris@16 111 return res;
Chris@16 112 }
Chris@16 113
Chris@16 114 private:
Chris@16 115 Caller m_caller;
Chris@16 116 unsigned m_min_arity;
Chris@16 117 unsigned m_max_arity;
Chris@16 118 };
Chris@16 119
Chris@16 120 struct py_function
Chris@16 121 {
Chris@16 122 template <class Caller>
Chris@16 123 py_function(Caller const& caller)
Chris@16 124 : m_impl(new caller_py_function_impl<Caller>(caller))
Chris@16 125 {}
Chris@16 126
Chris@16 127 template <class Caller, class Sig>
Chris@16 128 py_function(Caller const& caller, Sig)
Chris@16 129 : m_impl(new signature_py_function_impl<Caller, Sig>(caller))
Chris@16 130 {}
Chris@16 131
Chris@16 132 template <class Caller, class Sig>
Chris@16 133 py_function(Caller const& caller, Sig, int min_arity, int max_arity = 0)
Chris@16 134 : m_impl(new full_py_function_impl<Caller, Sig>(caller, min_arity, max_arity))
Chris@16 135 {}
Chris@16 136
Chris@16 137 py_function(py_function const& rhs)
Chris@16 138 : m_impl(rhs.m_impl)
Chris@16 139 {}
Chris@16 140
Chris@16 141 PyObject* operator()(PyObject* args, PyObject* kw) const
Chris@16 142 {
Chris@16 143 return (*m_impl)(args, kw);
Chris@16 144 }
Chris@16 145
Chris@16 146 unsigned min_arity() const
Chris@16 147 {
Chris@16 148 return m_impl->min_arity();
Chris@16 149 }
Chris@16 150
Chris@16 151 unsigned max_arity() const
Chris@16 152 {
Chris@16 153 return m_impl->max_arity();
Chris@16 154 }
Chris@16 155
Chris@16 156 python::detail::signature_element const* signature() const
Chris@16 157 {
Chris@16 158 return m_impl->signature().signature;
Chris@16 159 }
Chris@16 160
Chris@16 161 python::detail::signature_element const& get_return_type() const
Chris@16 162 {
Chris@16 163 return *m_impl->signature().ret;
Chris@16 164 }
Chris@16 165
Chris@16 166 private:
Chris@16 167 mutable std::auto_ptr<py_function_impl_base> m_impl;
Chris@16 168 };
Chris@16 169
Chris@16 170 }}} // namespace boost::python::objects
Chris@16 171
Chris@16 172 #endif // PY_FUNCTION_DWA200286_HPP