|
Petr Machata |
493985 |
Index: /trunk/boost/python/object_core.hpp
|
|
Petr Machata |
493985 |
===================================================================
|
|
Petr Machata |
493985 |
--- /trunk/boost/python/object_core.hpp (revision 45918)
|
|
Petr Machata |
493985 |
+++ /trunk/boost/python/object_core.hpp (revision 47846)
|
|
Petr Machata |
493985 |
@@ -42,4 +42,10 @@
|
|
Petr Machata |
493985 |
|
|
Petr Machata |
493985 |
namespace boost { namespace python {
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+namespace detail
|
|
Petr Machata |
493985 |
+{
|
|
Petr Machata |
493985 |
+ class kwds_proxy;
|
|
Petr Machata |
493985 |
+ class args_proxy;
|
|
Petr Machata |
493985 |
+}
|
|
Petr Machata |
493985 |
|
|
Petr Machata |
493985 |
namespace converter
|
|
Petr Machata |
493985 |
@@ -103,4 +109,9 @@
|
|
Petr Machata |
493985 |
# define BOOST_PP_ITERATION_PARAMS_1 (3, (1, BOOST_PYTHON_MAX_ARITY, <boost/python/object_call.hpp>))
|
|
Petr Machata |
493985 |
# include BOOST_PP_ITERATE()
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+ detail::args_proxy operator* () const;
|
|
Petr Machata |
493985 |
+ object operator()(detail::args_proxy const &args) const;
|
|
Petr Machata |
493985 |
+ object operator()(detail::args_proxy const &args,
|
|
Petr Machata |
493985 |
+ detail::kwds_proxy const &kwds) const;
|
|
Petr Machata |
493985 |
|
|
Petr Machata |
493985 |
// truth value testing
|
|
Petr Machata |
493985 |
@@ -417,4 +428,60 @@
|
|
Petr Machata |
493985 |
//
|
|
Petr Machata |
493985 |
|
|
Petr Machata |
493985 |
+namespace detail
|
|
Petr Machata |
493985 |
+{
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+class call_proxy
|
|
Petr Machata |
493985 |
+{
|
|
Petr Machata |
493985 |
+public:
|
|
Petr Machata |
493985 |
+ call_proxy(object target) : m_target(target) {}
|
|
Petr Machata |
493985 |
+ operator object() const { return m_target;}
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+ private:
|
|
Petr Machata |
493985 |
+ object m_target;
|
|
Petr Machata |
493985 |
+};
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+class kwds_proxy : public call_proxy
|
|
Petr Machata |
493985 |
+{
|
|
Petr Machata |
493985 |
+public:
|
|
Petr Machata |
493985 |
+ kwds_proxy(object o = object()) : call_proxy(o) {}
|
|
Petr Machata |
493985 |
+};
|
|
Petr Machata |
493985 |
+class args_proxy : public call_proxy
|
|
Petr Machata |
493985 |
+{
|
|
Petr Machata |
493985 |
+public:
|
|
Petr Machata |
493985 |
+ args_proxy(object o) : call_proxy(o) {}
|
|
Petr Machata |
493985 |
+ kwds_proxy operator* () const { return kwds_proxy(*this);}
|
|
Petr Machata |
493985 |
+};
|
|
Petr Machata |
493985 |
+}
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+template <typename U>
|
|
Petr Machata |
493985 |
+detail::args_proxy api::object_operators<U>::operator* () const
|
|
Petr Machata |
493985 |
+{
|
|
Petr Machata |
493985 |
+ object_cref2 x = *static_cast<U const*>(this);
|
|
Petr Machata |
493985 |
+ return detail::args_proxy(x);
|
|
Petr Machata |
493985 |
+}
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+template <typename U>
|
|
Petr Machata |
493985 |
+object api::object_operators<U>::operator()(detail::args_proxy const &args) const
|
|
Petr Machata |
493985 |
+{
|
|
Petr Machata |
493985 |
+ U const& self = *static_cast<U const*>(this);
|
|
Petr Machata |
493985 |
+ PyObject *result = PyObject_Call(get_managed_object(self, tag),
|
|
Petr Machata |
493985 |
+ args.operator object().ptr(),
|
|
Petr Machata |
493985 |
+ 0);
|
|
Petr Machata |
493985 |
+ return object(detail::new_reference(result));
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+}
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+template <typename U>
|
|
Petr Machata |
493985 |
+object api::object_operators<U>::operator()(detail::args_proxy const &args,
|
|
Petr Machata |
493985 |
+ detail::kwds_proxy const &kwds) const
|
|
Petr Machata |
493985 |
+{
|
|
Petr Machata |
493985 |
+ U const& self = *static_cast<U const*>(this);
|
|
Petr Machata |
493985 |
+ PyObject *result = PyObject_Call(get_managed_object(self, tag),
|
|
Petr Machata |
493985 |
+ args.operator object().ptr(),
|
|
Petr Machata |
493985 |
+ kwds.operator object().ptr());
|
|
Petr Machata |
493985 |
+ return object(detail::new_reference(result));
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+}
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
inline object::object()
|
|
Petr Machata |
493985 |
: object_base(python::incref(Py_None))
|
|
Petr Machata |
493985 |
Index: /trunk/libs/python/test/object.cpp
|
|
Petr Machata |
493985 |
===================================================================
|
|
Petr Machata |
493985 |
--- /trunk/libs/python/test/object.cpp (revision 45918)
|
|
Petr Machata |
493985 |
+++ /trunk/libs/python/test/object.cpp (revision 47846)
|
|
Petr Machata |
493985 |
@@ -187,4 +187,9 @@
|
|
Petr Machata |
493985 |
return s.slice(2,-1).slice(1,-1) == "lo, wor";
|
|
Petr Machata |
493985 |
}
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+object test_call(object c, object args, object kwds)
|
|
Petr Machata |
493985 |
+{
|
|
Petr Machata |
493985 |
+ return c(*args, **kwds);
|
|
Petr Machata |
493985 |
+}
|
|
Petr Machata |
493985 |
|
|
Petr Machata |
493985 |
bool check_binary_operators()
|
|
Petr Machata |
493985 |
@@ -378,4 +383,5 @@
|
|
Petr Machata |
493985 |
def("test_not_item", test_not_item);
|
|
Petr Machata |
493985 |
|
|
Petr Machata |
493985 |
+ def("test_call", test_call);
|
|
Petr Machata |
493985 |
def("check_binary_operators", check_binary_operators);
|
|
Petr Machata |
493985 |
def("check_inplace", check_inplace);
|
|
Petr Machata |
493985 |
Index: /trunk/libs/python/test/object.py
|
|
Petr Machata |
493985 |
===================================================================
|
|
Petr Machata |
493985 |
--- /trunk/libs/python/test/object.py (revision 45918)
|
|
Petr Machata |
493985 |
+++ /trunk/libs/python/test/object.py (revision 47846)
|
|
Petr Machata |
493985 |
@@ -135,5 +135,10 @@
|
|
Petr Machata |
493985 |
Operators
|
|
Petr Machata |
493985 |
|
|
Petr Machata |
493985 |
-
|
|
Petr Machata |
493985 |
+>>> def print_args(*args, **kwds):
|
|
Petr Machata |
493985 |
+... print args, kwds
|
|
Petr Machata |
493985 |
+>>> test_call(print_args, (0, 1, 2, 3), {'a':'A'})
|
|
Petr Machata |
493985 |
+(0, 1, 2, 3) {'a': 'A'}
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
>>> assert check_binary_operators()
|
|
Petr Machata |
493985 |
|
|
Petr Machata |
493985 |
Index: /trunk/libs/python/doc/v2/object.html
|
|
Petr Machata |
493985 |
===================================================================
|
|
Petr Machata |
493985 |
--- /trunk/libs/python/doc/v2/object.html (revision 45918)
|
|
Petr Machata |
493985 |
+++ /trunk/libs/python/doc/v2/object.html (revision 47846)
|
|
Petr Machata |
493985 |
@@ -656,4 +656,9 @@
|
|
Petr Machata |
493985 |
object operator()(A0 const&, A1 const&,...An const&) const;
|
|
Petr Machata |
493985 |
|
|
Petr Machata |
493985 |
+ detail::args_proxy operator* () const;
|
|
Petr Machata |
493985 |
+ object operator()(detail::args_proxy const &args) const;
|
|
Petr Machata |
493985 |
+ object operator()(detail::args_proxy const &args,
|
|
Petr Machata |
493985 |
+ detail::kwds_proxy const &kwds) const;
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
// truth value testing
|
|
Petr Machata |
493985 |
//
|
|
Petr Machata |
493985 |
@@ -705,4 +710,23 @@
|
|
Petr Machata |
493985 |
a2,...aN)
|
|
Petr Machata |
493985 |
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+object operator()(detail::args_proxy const &args) const;
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+ Effects:
|
|
Petr Machata |
493985 |
+ call object with arguments given by the tuple <varname>args</varname>
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+object operator()(detail::args_proxy const &args,
|
|
Petr Machata |
493985 |
+ detail::kwds_proxy const &kwds) const;
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+ Effects:
|
|
Petr Machata |
493985 |
+ call object with arguments given by the tuple <varname>args</varname>, and named
|
|
Petr Machata |
493985 |
+ arguments given by the dictionary <varname>kwds</varname>
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
+
|
|
Petr Machata |
493985 |
|
|
Petr Machata |
493985 |
operator bool_type() const;
|