Commits

Anonymous committed 146ca48

add ability to steer the classes from python too

Comments (0)

Files changed (7)

+# use glob syntax.
+syntax: glob
+*.elc
+*.pyc
+*~
+*.waf-*
 
 ::
 
-  $ ./waf configure clean build && (cd __build__; PYTHON=`which python2` LD_LIBRARY_PATH=`pwd` PYTHONPATH=.:${PYTHONPATH} ./test-app)
+  $ ./waf configure clean build && (cd __build__; PYTHON=`which python2` LD_LIBRARY_PATH=`pwd` PYTHONPATH=.:${PYTHONPATH} ./test-app && PYTHON=`which python2` LD_LIBRARY_PATH=`pwd` PYTHONPATH=.:${PYTHONPATH} ../test.py)
 
 
 
    --> cy_run_fct...[done]
    === bye.
 
+   === py-app ===
+   ==> cyfwk module imported
+   --> AlgBase.init
+   SubAlg.run ==> 666
+   === bye.
 cdef extern from "lib.h":
     cdef cppclass IAlg:
         void run()
+        void run_impl()
 
     cdef IAlg* create_cy_alg()
 
         CyAlgBase(PyObject *obj, RunFct fct)
         void set_cy_state(void* obj, RunFct fct)
         void run()
+        void run_impl()
         
 cdef public api IAlg* cy_create_alg()
 
 #cimport cpython.cobject as cpy_cobj
 
 cdef class AlgBase:
-    cdef void run(self):
+    cdef CyAlgBase* alg
+    def __init__(self):
+        print("--> AlgBase.init")
+        self.alg = new CyAlgBase(
+            <cpy_ref.PyObject*>self,
+            <RunFct>cy_run_fct)
+    def run(self):
+        self.alg.run()
+        pass
+    def run_impl(self):
         pass
 
 cdef void cy_run_fct(void *ptr):
     cdef AlgBase alg = <AlgBase>(ptr)
     print("--> cy_run_fct...")
-    alg.run()
+    alg.run_impl()
     print("--> cy_run_fct...[done]")
 
-cdef class myalg(AlgBase):
+cdef class MyAlg(AlgBase):
     cdef int i
     def __init__(self, i=-1):
         self.i = i
+        AlgBase.__init__(self)
         print("--- self.i: %i" % self.i)
-    cdef void run(self):
+    cdef void run_impl(self):
         print("--- myalg.run => %i" % self.i)
 
 cdef public api IAlg* cy_create_alg():
-    cdef AlgBase cyalg = myalg(42)
-    cdef CyAlgBase* alg = new CyAlgBase(
-        <cpy_ref.PyObject*>cyalg,
-        <RunFct>cy_run_fct)
-    return <IAlg*>(alg)
-
-def create_alg():
-    print "==="
-    cy_create_alg()
-    print "==="
+    cdef AlgBase cyalg = MyAlg(42)
+    return <IAlg*>(cyalg.alg)
 
 print("==> cyfwk module imported")
 
 IAlg::IAlg()
 {}
 
+void
+IAlg::run()
+{
+  std::cout << ":: IAlg::run()...\n";
+  this->run_impl();
+}
+
 class Alg : public IAlg
 {
 public:
   Alg();
   ~Alg();
 
-  void run();
+  void run_impl();
 };
 
 Alg::Alg()
 }
 
 void
-Alg::run()
+Alg::run_impl()
 {
   std::cout << ":: Alg::run()...\n";
 }
 }
 
 void
-CyAlgBase::run()
+CyAlgBase::run_impl()
 {
   std::cout << "::CyAlgBase::run()...\n";
   if (this->obj && this->fct) {
   IAlg();
   virtual ~IAlg();
 
-  virtual void run() =0;
+  virtual void run();
+  virtual void run_impl() =0;
 
 };
 
 
   CyAlgBase(PyObject *obj, RunFct fct);
   virtual ~CyAlgBase();
-  virtual void run();
+  virtual void run_impl();
 };
 
 #endif // !FWK_LIB_H
+#!/usr/bin/env python2
+print "=== py-app ==="
+import sys
+sys.path.append('__build__')
+
+import os
+_ld = os.environ['LD_LIBRARY_PATH']
+os.environ['LD_LIBRARY_PATH'] = os.pathsep.join(['./__build__',_ld])
+
+import cyfwk
+
+class SubAlg(cyfwk.AlgBase):
+    def __init__(self, i):
+        cyfwk.AlgBase.__init__(self)
+        self.i = i
+    def run(self):
+        print('SubAlg.run ==> %i' % (self.i,))
+
+alg = SubAlg(666)
+alg.run()
+print "=== bye."
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.