From aa0b8ef098bcc5900fd82963f4f6ed39e0bc9176 Mon Sep 17 00:00:00 2001
From: Jonathan Lambrechts <jonathan.lambrechts@uclouvain.be>
Date: Thu, 6 Oct 2011 14:51:50 +0000
Subject: [PATCH] function python constructor to access discontinuous function

---
 Solver/functionPython.h | 44 +++++++++++++++++++++++++++++------------
 1 file changed, 31 insertions(+), 13 deletions(-)

diff --git a/Solver/functionPython.h b/Solver/functionPython.h
index 0a87f75379..60b61f4229 100644
--- a/Solver/functionPython.h
+++ b/Solver/functionPython.h
@@ -15,6 +15,26 @@ class functionPython : public function {
   std::string _luaFunctionName;
   std::vector<fullMatrix<double> > args;
   functionPythonReturnMatrix R;
+  void _init() {
+    _swigA.resize(args.size());
+    _swigR = SWIG_NewPointerObj((void*)&R,SWIGTYPE_p_functionPythonReturnMatrix, 0);
+    for (int i = 0; i < args.size(); i++) {
+      _swigA[i] = SWIG_NewPointerObj((void*)&args[i],SWIGTYPE_p_fullMatrixT_double_t, 0);
+    }
+    switch(args.size()) {
+      case 0 : _pyargs = Py_BuildValue("(O)", _swigR); break;
+      case 1 : _pyargs = Py_BuildValue("(OO)", _swigR, _swigA[0]); break;
+      case 2 : _pyargs = Py_BuildValue("(OOO)", _swigR, _swigA[0], _swigA[1]); break;
+      case 3 : _pyargs = Py_BuildValue("(OOOO)", _swigR, _swigA[0], _swigA[1], _swigA[2]); break;
+      case 4 : _pyargs = Py_BuildValue("(OOOOO)", _swigR, _swigA[0], _swigA[1], _swigA[2], _swigA[3]); break;
+      case 5 : _pyargs = Py_BuildValue("(OOOOOO)", _swigR, _swigA[0], _swigA[1], _swigA[2], _swigA[3], _swigA[4]); break;
+      case 6 : _pyargs = Py_BuildValue("(OOOOOOO)", _swigR, _swigA[0], _swigA[1], _swigA[2], _swigA[3], _swigA[4], _swigA[5]); break;
+      case 7 : _pyargs = Py_BuildValue("(OOOOOOOO)", _swigR, _swigA[0], _swigA[1], _swigA[2], _swigA[3], _swigA[4], _swigA[5], _swigA[6]); break;
+      case 8 : _pyargs = Py_BuildValue("(OOOOOOOOO)", _swigR, _swigA[0], _swigA[1], _swigA[2], _swigA[3], _swigA[4], _swigA[5], _swigA[6], _swigA[7]); break;
+      default:Msg::Error("python function not implemented for more than 8 arguments");
+    }
+    
+  }
  public:
   void call (dataCacheMap *m, fullMatrix<double> &res) 
   {
@@ -34,23 +54,21 @@ class functionPython : public function {
   {
     args.resize(dependencies.size());
     _swigA.resize(args.size());
-    _swigR = SWIG_NewPointerObj((void*)&R,SWIGTYPE_p_functionPythonReturnMatrix, 0);
     for (int i = 0; i < dependencies.size(); i++) {
       setArgument(args[i], dependencies[i]);
-      _swigA[i] = SWIG_NewPointerObj((void*)&args[i],SWIGTYPE_p_fullMatrixT_double_t, 0);
     }
-    switch(args.size()) {
-      case 0 : _pyargs = Py_BuildValue("(O)", _swigR); break;
-      case 1 : _pyargs = Py_BuildValue("(OO)", _swigR, _swigA[0]); break;
-      case 2 : _pyargs = Py_BuildValue("(OOO)", _swigR, _swigA[0], _swigA[1]); break;
-      case 3 : _pyargs = Py_BuildValue("(OOOO)", _swigR, _swigA[0], _swigA[1], _swigA[2]); break;
-      case 4 : _pyargs = Py_BuildValue("(OOOOO)", _swigR, _swigA[0], _swigA[1], _swigA[2], _swigA[3]); break;
-      case 5 : _pyargs = Py_BuildValue("(OOOOOO)", _swigR, _swigA[0], _swigA[1], _swigA[2], _swigA[3], _swigA[4]); break;
-      case 6 : _pyargs = Py_BuildValue("(OOOOOOO)", _swigR, _swigA[0], _swigA[1], _swigA[2], _swigA[3], _swigA[4], _swigA[5]); break;
-      case 7 : _pyargs = Py_BuildValue("(OOOOOOOO)", _swigR, _swigA[0], _swigA[1], _swigA[2], _swigA[3], _swigA[4], _swigA[5], _swigA[6]); break;
-      case 8 : _pyargs = Py_BuildValue("(OOOOOOOOO)", _swigR, _swigA[0], _swigA[1], _swigA[2], _swigA[3], _swigA[4], _swigA[5], _swigA[6], _swigA[7]); break;
-      default:Msg::Error("python function not implemented for more than 8 arguments");
+    _init();
+  }
+  functionPython (int nbCol, PyObject *callback, std::vector<std::pair<const function*, int> > dependencies)
+    : function(nbCol), _pycallback(callback)
+  {
+    args.resize(dependencies.size());
+    _swigA.resize(args.size());
+    for (int i = 0; i < dependencies.size(); i++) {
+      printf("%p %i\n", dependencies[i].first, dependencies[i].second);
+      setArgument(args[i], dependencies[i].first, dependencies[i].second);
     }
+    _init();
   }
 };
 #endif
-- 
GitLab