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 PY_FUNCTION_DWA200286_HPP Chris@16: # define PY_FUNCTION_DWA200286_HPP Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: namespace boost { namespace python { namespace objects { Chris@16: Chris@16: // This type is used as a "generalized Python callback", wrapping the Chris@16: // function signature: Chris@16: // Chris@16: // PyObject* (PyObject* args, PyObject* keywords) Chris@16: Chris@16: struct BOOST_PYTHON_DECL py_function_impl_base Chris@16: { Chris@16: virtual ~py_function_impl_base(); Chris@16: virtual PyObject* operator()(PyObject*, PyObject*) = 0; Chris@16: virtual unsigned min_arity() const = 0; Chris@16: virtual unsigned max_arity() const; Chris@16: virtual python::detail::py_func_sig_info signature() const = 0; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct caller_py_function_impl : py_function_impl_base Chris@16: { Chris@16: caller_py_function_impl(Caller const& caller) Chris@16: : m_caller(caller) Chris@16: {} Chris@16: Chris@16: PyObject* operator()(PyObject* args, PyObject* kw) Chris@16: { Chris@16: return m_caller(args, kw); Chris@16: } Chris@16: Chris@16: virtual unsigned min_arity() const Chris@16: { Chris@16: return m_caller.min_arity(); Chris@16: } Chris@16: Chris@16: virtual python::detail::py_func_sig_info signature() const Chris@16: { Chris@16: return m_caller.signature(); Chris@16: } Chris@16: Chris@16: private: Chris@16: Caller m_caller; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct signature_py_function_impl : py_function_impl_base Chris@16: { Chris@16: signature_py_function_impl(Caller const& caller) Chris@16: : m_caller(caller) Chris@16: {} Chris@16: Chris@16: PyObject* operator()(PyObject* args, PyObject* kw) Chris@16: { Chris@16: return m_caller(args, kw); Chris@16: } Chris@16: Chris@16: virtual unsigned min_arity() const Chris@16: { Chris@16: return mpl::size::value - 1; Chris@16: } Chris@16: Chris@16: virtual python::detail::py_func_sig_info signature() const Chris@16: { Chris@16: python::detail::signature_element const* sig = python::detail::signature::elements(); Chris@16: python::detail::py_func_sig_info res = {sig, sig}; Chris@16: return res; Chris@16: } Chris@16: Chris@16: private: Chris@16: Caller m_caller; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct full_py_function_impl : py_function_impl_base Chris@16: { Chris@16: full_py_function_impl(Caller const& caller, unsigned min_arity, unsigned max_arity) Chris@16: : m_caller(caller) Chris@16: , m_min_arity(min_arity) Chris@16: , m_max_arity(max_arity > min_arity ? max_arity : min_arity) Chris@16: {} Chris@16: Chris@16: PyObject* operator()(PyObject* args, PyObject* kw) Chris@16: { Chris@16: return m_caller(args, kw); Chris@16: } Chris@16: Chris@16: virtual unsigned min_arity() const Chris@16: { Chris@16: return m_min_arity; Chris@16: } Chris@16: Chris@16: virtual unsigned max_arity() const Chris@16: { Chris@16: return m_max_arity; Chris@16: } Chris@16: Chris@16: virtual python::detail::py_func_sig_info signature() const Chris@16: { Chris@16: python::detail::signature_element const* sig = python::detail::signature::elements(); Chris@16: python::detail::py_func_sig_info res = {sig, sig}; Chris@16: return res; Chris@16: } Chris@16: Chris@16: private: Chris@16: Caller m_caller; Chris@16: unsigned m_min_arity; Chris@16: unsigned m_max_arity; Chris@16: }; Chris@16: Chris@16: struct py_function Chris@16: { Chris@16: template Chris@16: py_function(Caller const& caller) Chris@16: : m_impl(new caller_py_function_impl(caller)) Chris@16: {} Chris@16: Chris@16: template Chris@16: py_function(Caller const& caller, Sig) Chris@16: : m_impl(new signature_py_function_impl(caller)) Chris@16: {} Chris@16: Chris@16: template Chris@16: py_function(Caller const& caller, Sig, int min_arity, int max_arity = 0) Chris@16: : m_impl(new full_py_function_impl(caller, min_arity, max_arity)) Chris@16: {} Chris@16: Chris@16: py_function(py_function const& rhs) Chris@16: : m_impl(rhs.m_impl) Chris@16: {} Chris@16: Chris@16: PyObject* operator()(PyObject* args, PyObject* kw) const Chris@16: { Chris@16: return (*m_impl)(args, kw); Chris@16: } Chris@16: Chris@16: unsigned min_arity() const Chris@16: { Chris@16: return m_impl->min_arity(); Chris@16: } Chris@16: Chris@16: unsigned max_arity() const Chris@16: { Chris@16: return m_impl->max_arity(); Chris@16: } Chris@16: Chris@16: python::detail::signature_element const* signature() const Chris@16: { Chris@16: return m_impl->signature().signature; Chris@16: } Chris@16: Chris@16: python::detail::signature_element const& get_return_type() const Chris@16: { Chris@16: return *m_impl->signature().ret; Chris@16: } Chris@16: Chris@16: private: Chris@16: mutable std::auto_ptr m_impl; Chris@16: }; Chris@16: Chris@16: }}} // namespace boost::python::objects Chris@16: Chris@16: #endif // PY_FUNCTION_DWA200286_HPP