// (C) Copyright David Abrahams 2000. Permission to copy, use, modify, sell and // distribute this software is granted provided this copyright notice appears // in all copies. This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // // The author gratefully acknowleges the support of Dragon Systems, Inc., in // producing this work. // // This file was generated for 5-argument python callbacks by gen_callback.py #ifndef CALLBACK_DWA_052100_H_ # define CALLBACK_DWA_052100_H_ # include "pyconfig.h" # include "py.h" namespace py { namespace detail { template inline void callback_adjust_refcount(PyObject*, Type) {} inline void callback_adjust_refcount(PyObject* p, Type) { Py_INCREF(p); } } // Calling Python from C++ template struct Callback { static R call_method(PyObject* self, const char* name) { Ptr result(PyEval_CallMethod(self, const_cast(name), const_cast("()"))); detail::callback_adjust_refcount(result.get(), Type()); return from_python(result.get(), Type()); } static R call(PyObject* self) { Ptr result(PyEval_CallFunction(self, const_cast("()"))); detail::callback_adjust_refcount(result.get(), Type()); return from_python(result.get(), Type()); } template static R call_method(PyObject* self, const char* name, const A1& a1) { Ptr p1(to_python(a1)); Ptr result(PyEval_CallMethod(self, const_cast(name), const_cast("(O)"), p1.get())); detail::callback_adjust_refcount(result.get(), Type()); return from_python(result.get(), Type()); } template static R call(PyObject* self, const A1& a1) { Ptr p1(to_python(a1)); Ptr result(PyEval_CallFunction(self, const_cast("(O)"), p1.get())); detail::callback_adjust_refcount(result.get(), Type()); return from_python(result.get(), Type()); } template static R call_method(PyObject* self, const char* name, const A1& a1, const A2& a2) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr result(PyEval_CallMethod(self, const_cast(name), const_cast("(OO)"), p1.get(), p2.get())); detail::callback_adjust_refcount(result.get(), Type()); return from_python(result.get(), Type()); } template static R call(PyObject* self, const A1& a1, const A2& a2) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr result(PyEval_CallFunction(self, const_cast("(OO)"), p1.get(), p2.get())); detail::callback_adjust_refcount(result.get(), Type()); return from_python(result.get(), Type()); } template static R call_method(PyObject* self, const char* name, const A1& a1, const A2& a2, const A3& a3) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr p3(to_python(a3)); Ptr result(PyEval_CallMethod(self, const_cast(name), const_cast("(OOO)"), p1.get(), p2.get(), p3.get())); detail::callback_adjust_refcount(result.get(), Type()); return from_python(result.get(), Type()); } template static R call(PyObject* self, const A1& a1, const A2& a2, const A3& a3) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr p3(to_python(a3)); Ptr result(PyEval_CallFunction(self, const_cast("(OOO)"), p1.get(), p2.get(), p3.get())); detail::callback_adjust_refcount(result.get(), Type()); return from_python(result.get(), Type()); } template static R call_method(PyObject* self, const char* name, const A1& a1, const A2& a2, const A3& a3, const A4& a4) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr p3(to_python(a3)); Ptr p4(to_python(a4)); Ptr result(PyEval_CallMethod(self, const_cast(name), const_cast("(OOOO)"), p1.get(), p2.get(), p3.get(), p4.get())); detail::callback_adjust_refcount(result.get(), Type()); return from_python(result.get(), Type()); } template static R call(PyObject* self, const A1& a1, const A2& a2, const A3& a3, const A4& a4) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr p3(to_python(a3)); Ptr p4(to_python(a4)); Ptr result(PyEval_CallFunction(self, const_cast("(OOOO)"), p1.get(), p2.get(), p3.get(), p4.get())); detail::callback_adjust_refcount(result.get(), Type()); return from_python(result.get(), Type()); } template static R call_method(PyObject* self, const char* name, const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr p3(to_python(a3)); Ptr p4(to_python(a4)); Ptr p5(to_python(a5)); Ptr result(PyEval_CallMethod(self, const_cast(name), const_cast("(OOOOO)"), p1.get(), p2.get(), p3.get(), p4.get(), p5.get())); detail::callback_adjust_refcount(result.get(), Type()); return from_python(result.get(), Type()); } template static R call(PyObject* self, const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr p3(to_python(a3)); Ptr p4(to_python(a4)); Ptr p5(to_python(a5)); Ptr result(PyEval_CallFunction(self, const_cast("(OOOOO)"), p1.get(), p2.get(), p3.get(), p4.get(), p5.get())); detail::callback_adjust_refcount(result.get(), Type()); return from_python(result.get(), Type()); } }; // This specialization wouldn't be needed, but MSVC6 doesn't correctly allow the following: // void g(); // void f() { return g(); } template <> struct Callback { static void call_method(PyObject* self, const char* name) { Ptr result(PyEval_CallMethod(self, const_cast(name), const_cast("()"))); } static void call(PyObject* self) { Ptr result(PyEval_CallFunction(self, const_cast("()"))); } template static void call_method(PyObject* self, const char* name, const A1& a1) { Ptr p1(to_python(a1)); Ptr result(PyEval_CallMethod(self, const_cast(name), const_cast("(O)"), p1.get())); } template static void call(PyObject* self, const A1& a1) { Ptr p1(to_python(a1)); Ptr result(PyEval_CallFunction(self, const_cast("(O)"), p1.get())); } template static void call_method(PyObject* self, const char* name, const A1& a1, const A2& a2) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr result(PyEval_CallMethod(self, const_cast(name), const_cast("(OO)"), p1.get(), p2.get())); } template static void call(PyObject* self, const A1& a1, const A2& a2) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr result(PyEval_CallFunction(self, const_cast("(OO)"), p1.get(), p2.get())); } template static void call_method(PyObject* self, const char* name, const A1& a1, const A2& a2, const A3& a3) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr p3(to_python(a3)); Ptr result(PyEval_CallMethod(self, const_cast(name), const_cast("(OOO)"), p1.get(), p2.get(), p3.get())); } template static void call(PyObject* self, const A1& a1, const A2& a2, const A3& a3) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr p3(to_python(a3)); Ptr result(PyEval_CallFunction(self, const_cast("(OOO)"), p1.get(), p2.get(), p3.get())); } template static void call_method(PyObject* self, const char* name, const A1& a1, const A2& a2, const A3& a3, const A4& a4) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr p3(to_python(a3)); Ptr p4(to_python(a4)); Ptr result(PyEval_CallMethod(self, const_cast(name), const_cast("(OOOO)"), p1.get(), p2.get(), p3.get(), p4.get())); } template static void call(PyObject* self, const A1& a1, const A2& a2, const A3& a3, const A4& a4) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr p3(to_python(a3)); Ptr p4(to_python(a4)); Ptr result(PyEval_CallFunction(self, const_cast("(OOOO)"), p1.get(), p2.get(), p3.get(), p4.get())); } template static void call_method(PyObject* self, const char* name, const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr p3(to_python(a3)); Ptr p4(to_python(a4)); Ptr p5(to_python(a5)); Ptr result(PyEval_CallMethod(self, const_cast(name), const_cast("(OOOOO)"), p1.get(), p2.get(), p3.get(), p4.get(), p5.get())); } template static void call(PyObject* self, const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5) { Ptr p1(to_python(a1)); Ptr p2(to_python(a2)); Ptr p3(to_python(a3)); Ptr p4(to_python(a4)); Ptr p5(to_python(a5)); Ptr result(PyEval_CallFunction(self, const_cast("(OOOOO)"), p1.get(), p2.get(), p3.get(), p4.get(), p5.get())); } }; } // namespace py #endif // CALLBACK_DWA_052100_H_