add python connections
authorFelix Domke <tmbinc@elitedvb.net>
Mon, 24 Jan 2005 18:16:22 +0000 (18:16 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Mon, 24 Jan 2005 18:16:22 +0000 (18:16 +0000)
lib/python/connections.cpp [new file with mode: 0644]
lib/python/connections.h [new file with mode: 0644]

diff --git a/lib/python/connections.cpp b/lib/python/connections.cpp
new file mode 100644 (file)
index 0000000..c24c939
--- /dev/null
@@ -0,0 +1,9 @@
+#include <lib/python/connections.h>
+
+PSignal1<void,int> testsignal;
+
+void connect(Slot1<void, int> &slot, PyObject *fnc)
+{
+       printf("CONNECT !\n");
+}
+
diff --git a/lib/python/connections.h b/lib/python/connections.h
new file mode 100644 (file)
index 0000000..9b4abdd
--- /dev/null
@@ -0,0 +1,90 @@
+#ifndef __lib_python_connections_h
+#define __lib_python_connections_h
+
+#include <libsig_comp.h>
+
+               /* avoid warnigs :) */
+#include <features.h>
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 200112L
+#include <Python.h>
+#include <lib/python/python.h>
+
+class PSignal
+{
+public:
+       PyObject *m_list;
+public:
+       PSignal()
+       {
+               m_list = PyList_New(0);
+               Py_INCREF(m_list);
+       }
+       ~PSignal()
+       {
+               Py_DECREF(m_list);
+       }
+       
+       void callPython(PyObject *tuple)
+       {
+               int size = PyList_Size(m_list);
+               int i;
+               for (i=0; i<size; ++i)
+               {
+                       PyObject *b = PyList_GetItem(m_list, i);
+                       ePython::call(b, tuple);
+               }
+       }
+       
+       
+       PyObject *get() { Py_INCREF(m_list); return m_list; }
+};
+
+inline PyObject *PyFrom(int v)
+{
+       return PyInt_FromLong(v);
+}
+
+template <class R>
+class PSignal0: public PSignal, public Signal0<R>
+{
+public:
+       R operator()()
+       {
+               PyObject *pArgs = PyTuple_New(0);
+               callPython(pArgs);
+               Py_DECREF(pArgs);
+               return Signal0<R>::operator()();
+       }
+};
+
+template <class R, class V0>
+class PSignal1: public PSignal, public Signal1<R,V0>
+{
+public:
+       R operator()(V0 a0)
+       {
+               PyObject *pArgs = PyTuple_New(1);
+               PyTuple_SetItem(pArgs, 0, PyFrom(a0));
+               callPython(pArgs);
+               Py_DECREF(pArgs);
+               return Signal1<R,V0>::operator()(a0);
+       }
+};
+
+template <class R, class V0, class V1>
+class PSignal2: public PSignal, public Signal2<R,V0,V1>
+{
+public:
+       R operator()(V0 a0, V1 a1)
+       {
+               PyObject *pArgs = PyTuple_New(2);
+               PyTuple_SetItem(pArgs, 0, PyFrom(a0));
+               PyTuple_SetItem(pArgs, 1, PyFrom(a1));
+               callPython(pArgs);
+               Py_DECREF(pArgs);
+               return Signal2<R,V0,V1>::operator()(a0, a1);
+       }
+};
+
+#endif