From 1690b92595aada9a2b2968efc48331b9638b6b14 Mon Sep 17 00:00:00 2001
From: Mansard <nmansard@laas.fr>
Date: Thu, 27 Jan 2011 18:28:48 +0100
Subject: [PATCH] Added some specific convertion for vector, matrix and double
 signal, from C to Python (to avoid unnecessary convertion through strings.

---
 src/signal-base-py.cc | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/src/signal-base-py.cc b/src/signal-base-py.cc
index 7936987..dc5d5e1 100644
--- a/src/signal-base-py.cc
+++ b/src/signal-base-py.cc
@@ -18,7 +18,10 @@
 #include <sstream>
 
 #include <dynamic-graph/signal-base.h>
+#include <dynamic-graph/signal.h>
 #include <dynamic-graph/signal-caster.h>
+#include <dynamic-graph/linear-algebra.h>
+#include <../src/convert-dg-to-py.hh>
 
 using dynamicgraph::SignalBase;
 
@@ -26,6 +29,7 @@ namespace dynamicgraph {
   namespace python {
 
     extern PyObject* error;
+    using namespace convert;
 
     namespace signalBase {
 
@@ -107,6 +111,29 @@ namespace dynamicgraph {
 	pointer = PyCObject_AsVoidPtr(object);
 	SignalBase<int>* signal = (SignalBase<int>*)pointer;
 
+	/* Temptative for specific signal type. */
+	Signal<dynamicgraph::Vector,int> * sigvec
+	  = dynamic_cast< Signal<dynamicgraph::Vector,int>* >( signal );
+	if( NULL!= sigvec )
+	  {
+	    return vectorToPython( sigvec->accessCopy() );
+	  }
+
+	Signal<dynamicgraph::Matrix,int> * sigmat
+	  = dynamic_cast< Signal<dynamicgraph::Matrix,int>* >( signal );
+	if( NULL!= sigmat )
+	  {
+	    return matrixToPython( sigmat->accessCopy() );
+	  }
+
+	Signal<double,int> * sigdouble
+	  = dynamic_cast< Signal<double,int>* >( signal );
+	if( NULL!= sigdouble )
+	  {
+	    return Py_BuildValue("d", sigdouble->accessCopy() );
+	  }
+
+	/* Non specific signal: use a generic way. */
 	std::ostringstream value;
 	try {
 	  signal->get(value);
-- 
GitLab