#ifndef __lib_python_connections_h #define __lib_python_connections_h #include #include class PSignal { protected: ePyObject m_list; public: PSignal(); ~PSignal(); void callPython(SWIG_PYOBJECT(ePyObject) tuple); #ifndef SWIG PyObject *getSteal(bool clear=false); #endif PyObject *get(); }; inline PyObject *PyFrom(int v) { return PyInt_FromLong(v); } inline PyObject *PyFrom(const char *c) { return PyString_FromString(c); } template class PSignal0: public PSignal, public Signal0 { public: R operator()() { if (m_list) { PyObject *pArgs = PyTuple_New(0); callPython(pArgs); Org_Py_DECREF(pArgs); } return Signal0::operator()(); } }; template class PSignal1: public PSignal, public Signal1 { public: R operator()(V0 a0) { if (m_list) { PyObject *pArgs = PyTuple_New(1); PyTuple_SET_ITEM(pArgs, 0, PyFrom(a0)); callPython(pArgs); Org_Py_DECREF(pArgs); } return Signal1::operator()(a0); } }; template class PSignal2: public PSignal, public Signal2 { public: R operator()(V0 a0, V1 a1) { if (m_list) { PyObject *pArgs = PyTuple_New(2); PyTuple_SET_ITEM(pArgs, 0, PyFrom(a0)); PyTuple_SET_ITEM(pArgs, 1, PyFrom(a1)); callPython(pArgs); Org_Py_DECREF(pArgs); } return Signal2::operator()(a0, a1); } }; #endif