mirror of
https://github.com/boostorg/python.git
synced 2026-01-22 05:22:45 +00:00
Added call() function so that a regular python function (as opposed to method or
other function-as-attribute) can be called. Added newlines for readability. [SVN r8172]
This commit is contained in:
191
callback.h
191
callback.h
@@ -24,27 +24,110 @@ template <class R>
|
||||
struct Callback
|
||||
{
|
||||
static R call_method(PyObject* self, const char* name)
|
||||
{ return from_python(expect_non_null(PyEval_CallMethod(self, const_cast<char*>(name), const_cast<char*>("()"))), Type<R>()); }
|
||||
{
|
||||
return from_python(expect_non_null(PyEval_CallMethod(self, const_cast<char*>(name),
|
||||
const_cast<char*>("()"))), Type<R>());
|
||||
}
|
||||
|
||||
template <class A1>
|
||||
static R call_method(PyObject* self, const char* name, const A1& a1)
|
||||
{ return from_python(expect_non_null(PyEval_CallMethod(self, const_cast<char*>(name), const_cast<char*>("(N)"), to_python(a1))), Type<R>()); }
|
||||
{
|
||||
return from_python(expect_non_null(PyEval_CallMethod(self, const_cast<char*>(name),
|
||||
const_cast<char*>("(N)"),
|
||||
to_python(a1))), Type<R>());
|
||||
}
|
||||
|
||||
template <class A1, class A2>
|
||||
static R call_method(PyObject* self, const char* name, const A1& a1, const A2& a2)
|
||||
{ return from_python(expect_non_null(PyEval_CallMethod(self, const_cast<char*>(name), const_cast<char*>("(NN)"), to_python(a1), to_python(a2))), Type<R>()); }
|
||||
{
|
||||
return from_python(expect_non_null(PyEval_CallMethod(self, const_cast<char*>(name),
|
||||
const_cast<char*>("(NN)"),
|
||||
to_python(a1),
|
||||
to_python(a2))), Type<R>());
|
||||
}
|
||||
|
||||
template <class A1, class A2, class A3>
|
||||
static R call_method(PyObject* self, const char* name, const A1& a1, const A2& a2, const A3& a3)
|
||||
{ return from_python(expect_non_null(PyEval_CallMethod(self, const_cast<char*>(name), const_cast<char*>("(NNN)"), to_python(a1), to_python(a2), to_python(a3))), Type<R>()); }
|
||||
{
|
||||
return from_python(expect_non_null(PyEval_CallMethod(self, const_cast<char*>(name),
|
||||
const_cast<char*>("(NNN)"),
|
||||
to_python(a1),
|
||||
to_python(a2),
|
||||
to_python(a3))), Type<R>());
|
||||
}
|
||||
|
||||
template <class A1, class A2, class A3, class A4>
|
||||
static R call_method(PyObject* self, const char* name, const A1& a1, const A2& a2, const A3& a3, const A4& a4)
|
||||
{ return from_python(expect_non_null(PyEval_CallMethod(self, const_cast<char*>(name), const_cast<char*>("(NNNN)"), to_python(a1), to_python(a2), to_python(a3), to_python(a4))), Type<R>()); }
|
||||
{
|
||||
return from_python(expect_non_null(PyEval_CallMethod(self, const_cast<char*>(name),
|
||||
const_cast<char*>("(NNNN)"),
|
||||
to_python(a1),
|
||||
to_python(a2),
|
||||
to_python(a3),
|
||||
to_python(a4))), Type<R>());
|
||||
}
|
||||
|
||||
template <class A1, class A2, class A3, class A4, class A5>
|
||||
static R call_method(PyObject* self, const char* name, const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5)
|
||||
{ return from_python(expect_non_null(PyEval_CallMethod(self, const_cast<char*>(name), const_cast<char*>("(NNNNN)"), to_python(a1), to_python(a2), to_python(a3), to_python(a4), to_python(a5))), Type<R>()); }
|
||||
{
|
||||
return from_python(expect_non_null(PyEval_CallMethod(self, const_cast<char*>(name),
|
||||
const_cast<char*>("(NNNNN)"),
|
||||
to_python(a1),
|
||||
to_python(a2),
|
||||
to_python(a3),
|
||||
to_python(a4),
|
||||
to_python(a5))), Type<R>());
|
||||
}
|
||||
|
||||
static R call(PyObject* self)
|
||||
{
|
||||
return from_python(expect_non_null(PyEval_CallFunction(self, const_cast<char*>("()"))), Type<R>());
|
||||
}
|
||||
|
||||
template <class A1>
|
||||
static R call(PyObject* self, const A1& a1)
|
||||
{
|
||||
return from_python(expect_non_null(PyEval_CallFunction(self, const_cast<char*>("(N)"),
|
||||
to_python(a1))), Type<R>());
|
||||
}
|
||||
|
||||
template <class A1, class A2>
|
||||
static R call(PyObject* self, const A1& a1, const A2& a2)
|
||||
{
|
||||
return from_python(expect_non_null(PyEval_CallFunction(self, const_cast<char*>("(NN)"),
|
||||
to_python(a1),
|
||||
to_python(a2))), Type<R>());
|
||||
}
|
||||
|
||||
template <class A1, class A2, class A3>
|
||||
static R call(PyObject* self, const A1& a1, const A2& a2, const A3& a3)
|
||||
{
|
||||
return from_python(expect_non_null(PyEval_CallFunction(self, const_cast<char*>("(NNN)"),
|
||||
to_python(a1),
|
||||
to_python(a2),
|
||||
to_python(a3))), Type<R>());
|
||||
}
|
||||
|
||||
template <class A1, class A2, class A3, class A4>
|
||||
static R call(PyObject* self, const A1& a1, const A2& a2, const A3& a3, const A4& a4)
|
||||
{
|
||||
return from_python(expect_non_null(PyEval_CallFunction(self, const_cast<char*>("(NNNN)"),
|
||||
to_python(a1),
|
||||
to_python(a2),
|
||||
to_python(a3),
|
||||
to_python(a4))), Type<R>());
|
||||
}
|
||||
|
||||
template <class A1, class A2, class A3, class A4, class A5>
|
||||
static R call(PyObject* self, const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5)
|
||||
{
|
||||
return from_python(expect_non_null(PyEval_CallFunction(self, const_cast<char*>("(NNNNN)"),
|
||||
to_python(a1),
|
||||
to_python(a2),
|
||||
to_python(a3),
|
||||
to_python(a4),
|
||||
to_python(a5))), Type<R>());
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@@ -55,30 +138,114 @@ template <>
|
||||
struct Callback<void>
|
||||
{
|
||||
static void call_method(PyObject* self, const char* name)
|
||||
{ expect_and_absorb_non_null(PyEval_CallMethod(self, const_cast<char*>(name), const_cast<char*>("()"))); }
|
||||
{
|
||||
expect_and_absorb_non_null(PyEval_CallMethod(self, const_cast<char*>(name),
|
||||
const_cast<char*>("()")));
|
||||
}
|
||||
|
||||
template <class A1>
|
||||
static void call_method(PyObject* self, const char* name, const A1& a1)
|
||||
{ expect_and_absorb_non_null(PyEval_CallMethod(self, const_cast<char*>(name), const_cast<char*>("(N)"), to_python(a1))); }
|
||||
{
|
||||
expect_and_absorb_non_null(PyEval_CallMethod(self, const_cast<char*>(name),
|
||||
const_cast<char*>("(N)"),
|
||||
to_python(a1)));
|
||||
}
|
||||
|
||||
template <class A1, class A2>
|
||||
static void call_method(PyObject* self, const char* name, const A1& a1, const A2& a2)
|
||||
{ expect_and_absorb_non_null(PyEval_CallMethod(self, const_cast<char*>(name), const_cast<char*>("(NN)"), to_python(a1), to_python(a2))); }
|
||||
{
|
||||
expect_and_absorb_non_null(PyEval_CallMethod(self, const_cast<char*>(name),
|
||||
const_cast<char*>("(NN)"),
|
||||
to_python(a1),
|
||||
to_python(a2)));
|
||||
}
|
||||
|
||||
template <class A1, class A2, class A3>
|
||||
static void call_method(PyObject* self, const char* name, const A1& a1, const A2& a2, const A3& a3)
|
||||
{ expect_and_absorb_non_null(PyEval_CallMethod(self, const_cast<char*>(name), const_cast<char*>("(NNN)"), to_python(a1), to_python(a2), to_python(a3))); }
|
||||
{
|
||||
expect_and_absorb_non_null(PyEval_CallMethod(self, const_cast<char*>(name),
|
||||
const_cast<char*>("(NNN)"),
|
||||
to_python(a1),
|
||||
to_python(a2),
|
||||
to_python(a3)));
|
||||
}
|
||||
|
||||
template <class A1, class A2, class A3, class A4>
|
||||
static void call_method(PyObject* self, const char* name, const A1& a1, const A2& a2, const A3& a3, const A4& a4)
|
||||
{ expect_and_absorb_non_null(PyEval_CallMethod(self, const_cast<char*>(name), const_cast<char*>("(NNNN)"), to_python(a1), to_python(a2), to_python(a3), to_python(a4))); }
|
||||
{
|
||||
expect_and_absorb_non_null(PyEval_CallMethod(self, const_cast<char*>(name),
|
||||
const_cast<char*>("(NNNN)"),
|
||||
to_python(a1),
|
||||
to_python(a2),
|
||||
to_python(a3),
|
||||
to_python(a4)));
|
||||
}
|
||||
|
||||
template <class A1, class A2, class A3, class A4, class A5>
|
||||
static void call_method(PyObject* self, const char* name, const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5)
|
||||
{ expect_and_absorb_non_null(PyEval_CallMethod(self, const_cast<char*>(name), const_cast<char*>("(NNNNN)"), to_python(a1), to_python(a2), to_python(a3), to_python(a4), to_python(a5))); }
|
||||
{
|
||||
expect_and_absorb_non_null(PyEval_CallMethod(self, const_cast<char*>(name),
|
||||
const_cast<char*>("(NNNNN)"),
|
||||
to_python(a1),
|
||||
to_python(a2),
|
||||
to_python(a3),
|
||||
to_python(a4),
|
||||
to_python(a5)));
|
||||
}
|
||||
|
||||
static void call(PyObject* self)
|
||||
{
|
||||
expect_and_absorb_non_null(PyEval_CallFunction(self, const_cast<char*>("()")));
|
||||
}
|
||||
|
||||
template <class A1>
|
||||
static void call(PyObject* self, const A1& a1)
|
||||
{
|
||||
expect_and_absorb_non_null(PyEval_CallFunction(self, const_cast<char*>("(N)"),
|
||||
to_python(a1)));
|
||||
}
|
||||
|
||||
template <class A1, class A2>
|
||||
static void call(PyObject* self, const A1& a1, const A2& a2)
|
||||
{
|
||||
expect_and_absorb_non_null(PyEval_CallFunction(self, const_cast<char*>("(NN)"),
|
||||
to_python(a1),
|
||||
to_python(a2)));
|
||||
}
|
||||
|
||||
template <class A1, class A2, class A3>
|
||||
static void call(PyObject* self, const A1& a1, const A2& a2, const A3& a3)
|
||||
{
|
||||
expect_and_absorb_non_null(PyEval_CallFunction(self, const_cast<char*>("(NNN)"),
|
||||
to_python(a1),
|
||||
to_python(a2),
|
||||
to_python(a3)));
|
||||
}
|
||||
|
||||
template <class A1, class A2, class A3, class A4>
|
||||
static void call(PyObject* self, const A1& a1, const A2& a2, const A3& a3, const A4& a4)
|
||||
{
|
||||
expect_and_absorb_non_null(PyEval_CallFunction(self, const_cast<char*>("(NNNN)"),
|
||||
to_python(a1),
|
||||
to_python(a2),
|
||||
to_python(a3),
|
||||
to_python(a4)));
|
||||
}
|
||||
|
||||
template <class A1, class A2, class A3, class A4, class A5>
|
||||
static void call(PyObject* self, const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5)
|
||||
{
|
||||
expect_and_absorb_non_null(PyEval_CallFunction(self, const_cast<char*>("(NNNNN)"),
|
||||
to_python(a1),
|
||||
to_python(a2),
|
||||
to_python(a3),
|
||||
to_python(a4),
|
||||
to_python(a5)));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
} // namespace py
|
||||
|
||||
#endif // CALLBACK_DWA_052100_H_
|
||||
|
||||
|
||||
@@ -5,7 +5,20 @@ def gen_callback(args):
|
||||
# A template for the call_method function which we're going to generate
|
||||
call_method = '''%{ template <%(class A%n%:, %)>
|
||||
%} static %1 call_method(PyObject* self, const char* name%(, const A%n& a%n%))
|
||||
{ %2PyEval_CallMethod(self, const_cast<char*>(name), const_cast<char*>("(%(N%))")%(, to_python(a%n)%))%3; }
|
||||
{
|
||||
%2PyEval_CallMethod(self, const_cast<char*>(name),
|
||||
const_cast<char*>("(%(N%))")%(,
|
||||
to_python(a%n)%))%3;
|
||||
}
|
||||
|
||||
'''
|
||||
|
||||
call_function = '''%{ template <%(class A%n%:, %)>
|
||||
%} static %1 call(PyObject* self%(, const A%n& a%n%))
|
||||
{
|
||||
%2PyEval_CallFunction(self, const_cast<char*>("(%(N%))")%(,
|
||||
to_python(a%n)%))%3;
|
||||
}
|
||||
|
||||
'''
|
||||
non_void = ('R', 'return from_python(expect_non_null(', '), Type<R>())')
|
||||
@@ -39,6 +52,7 @@ struct Callback
|
||||
{
|
||||
""" % args
|
||||
+ gen_functions(call_method, args, 'R', 'return from_python(expect_non_null(', '), Type<R>())')
|
||||
+ gen_functions(call_function, args, 'R', 'return from_python(expect_non_null(', '), Type<R>())')
|
||||
+
|
||||
"""};
|
||||
|
||||
@@ -50,6 +64,7 @@ struct Callback<void>
|
||||
{
|
||||
"""
|
||||
+ gen_functions(call_method, args, 'void', 'expect_and_absorb_non_null(', ')')
|
||||
+ gen_functions(call_function, args, 'void', 'expect_and_absorb_non_null(', ')')
|
||||
+
|
||||
"""};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user