From b0332dd2a930b5ea56c044c2ab09b11a800fa8f5 Mon Sep 17 00:00:00 2001
From: Florent Lamiraux <florent@laas.fr>
Date: Thu, 22 Jun 2023 17:36:09 +0200
Subject: [PATCH] Provide support for long int (and unsigned) for functions and
 signals.

---
 src/dynamic_graph/convert-dg-to-py.cc |  8 +++++
 src/dynamic_graph/signal-base-py.cc   | 42 ++++++++++++++++++++-------
 2 files changed, 39 insertions(+), 11 deletions(-)

diff --git a/src/dynamic_graph/convert-dg-to-py.cc b/src/dynamic_graph/convert-dg-to-py.cc
index 9df3a84..d4b1f50 100644
--- a/src/dynamic_graph/convert-dg-to-py.cc
+++ b/src/dynamic_graph/convert-dg-to-py.cc
@@ -29,8 +29,12 @@ command::Value toValue(bp::object o, const command::Value::Type& valueType) {
       return Value(bp::extract<bool>(o));
     case (Value::UNSIGNED):
       return Value(bp::extract<unsigned>(o));
+    case (Value::UNSIGNEDLONGINT):
+      return Value(bp::extract<unsigned long int>(o));
     case (Value::INT):
       return Value(bp::extract<int>(o));
+    case (Value::LONGINT):
+      return Value(bp::extract<long int>(o));
     case (Value::FLOAT):
       return Value(bp::extract<float>(o));
     case (Value::DOUBLE):
@@ -67,8 +71,12 @@ bp::object fromValue(const command::Value& value) {
       return bp::object(value.boolValue());
     case (Value::UNSIGNED):
       return bp::object(value.unsignedValue());
+    case (Value::UNSIGNEDLONGINT):
+      return bp::object(value.unsignedlongintValue());
     case (Value::INT):
       return bp::object(value.intValue());
+    case (Value::LONGINT):
+      return bp::object(value.longintValue());
     case (Value::FLOAT):
       return bp::object(value.floatValue());
     case (Value::DOUBLE):
diff --git a/src/dynamic_graph/signal-base-py.cc b/src/dynamic_graph/signal-base-py.cc
index 82b46d7..7214b04 100644
--- a/src/dynamic_graph/signal-base-py.cc
+++ b/src/dynamic_graph/signal-base-py.cc
@@ -77,9 +77,9 @@ void exposeSignalBase(const char* name) {
           })
       .def(
           "displayDependencies",
-          +[](const S_t& s, sigtime_t time) -> std::string {
+          +[](const S_t& s, int depth) -> std::string {
             std::ostringstream oss;
-            s.displayDependencies(oss, time);
+            s.displayDependencies(oss, depth);
             return oss.str();
           },
           "Print the signal dependencies in a string");
@@ -108,7 +108,10 @@ void exposeSignals() {
   exposeSignalBase<sigtime_t>("SignalBase");
 
   exposeSignalsOfType<bool, sigtime_t>("Bool");
+  exposeSignalsOfType<unsigned int, sigtime_t>("UInt");
   exposeSignalsOfType<int, sigtime_t>("Int");
+  exposeSignalsOfType<uint64_t, sigtime_t>("UInt64");
+  exposeSignalsOfType<int64_t, sigtime_t>("Int64");
   exposeSignalsOfType<double, sigtime_t>("Double");
 
   exposeSignalsOfType<Vector, sigtime_t>("Vector");
@@ -158,15 +161,32 @@ SignalBase<sigtime_t>* createSignalWrapper(const char* name, const char* type,
 
   SignalBase<sigtime_t>* obj = NULL;
   std::string error;
-  SIGNAL_WRAPPER_TYPE(if, BOOL, bool)
-  // SIGNAL_WRAPPER_TYPE(else if, UNSIGNED ,bool)
-  SIGNAL_WRAPPER_TYPE(else if, INT, int)
-  SIGNAL_WRAPPER_TYPE(else if, FLOAT, float)
-  SIGNAL_WRAPPER_TYPE(else if, DOUBLE, double)
-  // SIGNAL_WRAPPER_TYPE(else if, STRING   ,bool)
-  SIGNAL_WRAPPER_TYPE(else if, VECTOR, Vector)
-  // SIGNAL_WRAPPER_TYPE(else if, MATRIX   ,bool)
-  // SIGNAL_WRAPPER_TYPE(else if, MATRIX4D ,bool)
+  if(command::Value::typeName(command::Value::BOOL).compare(type) == 0) {
+    obj = createSignalWrapperTpl<bool>(name, object, error);
+  }
+  else if(command::Value::typeName(command::Value::UNSIGNED).compare(type) ==
+          0) {
+    obj = createSignalWrapperTpl<unsigned int>(name, object, error);
+  }
+  else if(command::Value::typeName(command::Value::INT).compare(type) == 0) {
+    obj = createSignalWrapperTpl<int>(name, object, error);
+  }
+  else if(command::Value::typeName(command::Value::UNSIGNEDLONGINT).
+          compare(type) == 0){
+    obj = createSignalWrapperTpl<uint64_t>(name, object, error);
+  }
+  else if(command::Value::typeName(command::Value::LONGINT).compare(type) == 0){
+    obj = createSignalWrapperTpl<int64_t>(name, object, error);
+  }
+  else if(command::Value::typeName(command::Value::FLOAT).compare(type) == 0){
+    obj = createSignalWrapperTpl<float>(name, object, error);
+  }
+  else if(command::Value::typeName(command::Value::DOUBLE).compare(type) == 0){
+    obj = createSignalWrapperTpl<double>(name, object, error);
+  }
+  else if(command::Value::typeName(command::Value::VECTOR).compare(type) == 0){
+    obj = createSignalWrapperTpl<Vector>(name, object, error);
+  }
   else {
     error = "Type not understood";
   }
-- 
GitLab