Search
j0ke.net Open Build Service
>
Projects
>
home:jg
:
playground
>
boost
> boost-python_call_operator.patch
Sign Up
|
Log In
Username
Password
Cancel
Overview
Repositories
Revisions
Requests
Users
Advanced
Attributes
Meta
File boost-python_call_operator.patch of Package boost
Index: /trunk/boost/python/object_core.hpp =================================================================== --- /trunk/boost/python/object_core.hpp (revision 45918) +++ /trunk/boost/python/object_core.hpp (revision 47846) @@ -42,4 +42,10 @@ namespace boost { namespace python { + +namespace detail +{ + class kwds_proxy; + class args_proxy; +} namespace converter @@ -103,4 +109,9 @@ # define BOOST_PP_ITERATION_PARAMS_1 (3, (1, BOOST_PYTHON_MAX_ARITY, <boost/python/object_call.hpp>)) # include BOOST_PP_ITERATE() + + detail::args_proxy operator* () const; + object operator()(detail::args_proxy const &args) const; + object operator()(detail::args_proxy const &args, + detail::kwds_proxy const &kwds) const; // truth value testing @@ -417,4 +428,60 @@ // +namespace detail +{ + +class call_proxy +{ +public: + call_proxy(object target) : m_target(target) {} + operator object() const { return m_target;} + + private: + object m_target; +}; + +class kwds_proxy : public call_proxy +{ +public: + kwds_proxy(object o = object()) : call_proxy(o) {} +}; +class args_proxy : public call_proxy +{ +public: + args_proxy(object o) : call_proxy(o) {} + kwds_proxy operator* () const { return kwds_proxy(*this);} +}; +} + +template <typename U> +detail::args_proxy api::object_operators<U>::operator* () const +{ + object_cref2 x = *static_cast<U const*>(this); + return detail::args_proxy(x); +} + +template <typename U> +object api::object_operators<U>::operator()(detail::args_proxy const &args) const +{ + U const& self = *static_cast<U const*>(this); + PyObject *result = PyObject_Call(get_managed_object(self, tag), + args.operator object().ptr(), + 0); + return object(detail::new_reference(result)); + +} + +template <typename U> +object api::object_operators<U>::operator()(detail::args_proxy const &args, + detail::kwds_proxy const &kwds) const +{ + U const& self = *static_cast<U const*>(this); + PyObject *result = PyObject_Call(get_managed_object(self, tag), + args.operator object().ptr(), + kwds.operator object().ptr()); + return object(detail::new_reference(result)); + +} + inline object::object() : object_base(python::incref(Py_None)) Index: /trunk/libs/python/test/object.cpp =================================================================== --- /trunk/libs/python/test/object.cpp (revision 45918) +++ /trunk/libs/python/test/object.cpp (revision 47846) @@ -187,4 +187,9 @@ return s.slice(2,-1).slice(1,-1) == "lo, wor"; } + +object test_call(object c, object args, object kwds) +{ + return c(*args, **kwds); +} bool check_binary_operators() @@ -378,4 +383,5 @@ def("test_not_item", test_not_item); + def("test_call", test_call); def("check_binary_operators", check_binary_operators); def("check_inplace", check_inplace); Index: /trunk/libs/python/test/object.py =================================================================== --- /trunk/libs/python/test/object.py (revision 45918) +++ /trunk/libs/python/test/object.py (revision 47846) @@ -135,5 +135,10 @@ Operators - +>>> def print_args(*args, **kwds): +... print args, kwds +>>> test_call(print_args, (0, 1, 2, 3), {'a':'A'}) +(0, 1, 2, 3) {'a': 'A'} + + >>> assert check_binary_operators() Index: /trunk/libs/python/doc/v2/object.html =================================================================== --- /trunk/libs/python/doc/v2/object.html (revision 45918) +++ /trunk/libs/python/doc/v2/object.html (revision 47846) @@ -656,4 +656,9 @@ object operator()(A0 const&, A1 const&,...An const&) const; + detail::args_proxy operator* () const; + object operator()(detail::args_proxy const &args) const; + object operator()(detail::args_proxy const &args, + detail::kwds_proxy const &kwds) const; + // truth value testing // @@ -705,4 +710,23 @@ a2,...aN)</dt> </dl> + +<pre> +object operator()(detail::args_proxy const &args) const; +</pre> +<dl class="function-semantics"> + <dt><b>Effects:</b> + call object with arguments given by the tuple <varname>args</varname></dt> +</dl> +<pre> +object operator()(detail::args_proxy const &args, + detail::kwds_proxy const &kwds) const; +</pre> +<dl class="function-semantics"> + <dt><b>Effects:</b> + call object with arguments given by the tuple <varname>args</varname>, and named + arguments given by the dictionary <varname>kwds</varname></dt> +</dl> + + <pre> operator bool_type() const;