From 0b16ade389c964af25ea7b1474930197c9092cb7 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Mon, 19 Apr 2021 15:24:49 +0200
Subject: [PATCH] Add new ARON types to TypedDataVisitor

---
 .../navigator/visitors/TypedDataVisitor.cpp   | 24 +++++-
 .../navigator/visitors/TypedDataVisitor.h     | 84 +++++++++++++++++--
 2 files changed, 99 insertions(+), 9 deletions(-)

diff --git a/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.cpp b/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.cpp
index 263253c88..55a30cff9 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.cpp
+++ b/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.cpp
@@ -87,8 +87,20 @@ namespace armarx::aron::visitor
         {
             return visit(*t, key, dynamic_cast<StringDataNavigator&>(data));
         }
+        else if (auto t = dynamic_cast<TimeTypeNavigator*>(&type))
+        {
+            return visit(*t, key, dynamic_cast<LongDataNavigator&>(data));
+        }
 
-        if (auto t = dynamic_cast<EigenMatrixTypeNavigator*>(&type))
+        if (auto t = dynamic_cast<PCLPointCloudTypeNavigator*>(&type))
+        {
+            return visit(*t, key, dynamic_cast<NDArrayDataNavigator&>(data));
+        }
+        else if (auto t = dynamic_cast<EigenMatrixTypeNavigator*>(&type))
+        {
+            return visit(*t, key, dynamic_cast<NDArrayDataNavigator&>(data));
+        }
+        else if (auto t = dynamic_cast<EigenQuaternionTypeNavigator*>(&type))
         {
             return visit(*t, key, dynamic_cast<NDArrayDataNavigator&>(data));
         }
@@ -100,7 +112,15 @@ namespace armarx::aron::visitor
         {
             return visit(*t, key, dynamic_cast<NDArrayDataNavigator&>(data));
         }
-        else if (auto t = dynamic_cast<PCLPointCloudTypeNavigator*>(&type))
+        else if (auto t = dynamic_cast<PoseTypeNavigator*>(&type))
+        {
+            return visit(*t, key, dynamic_cast<NDArrayDataNavigator&>(data));
+        }
+        else if (auto t = dynamic_cast<PositionTypeNavigator*>(&type))
+        {
+            return visit(*t, key, dynamic_cast<NDArrayDataNavigator&>(data));
+        }
+        else if (auto t = dynamic_cast<OrientationTypeNavigator*>(&type))
         {
             return visit(*t, key, dynamic_cast<NDArrayDataNavigator&>(data));
         }
diff --git a/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h b/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h
index 13800fa67..77c73fe08 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h
+++ b/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h
@@ -29,8 +29,8 @@ namespace armarx::aron::visitor
      * To the the location of the passed navigator in the original `AronType`,
      * use `navigator.getPath()`.
      *
-     * @see  `aron::Type::AronTypePtr`
-     * @see  `aron::Typenavigator::Navigator`
+     * @see `aron::Type::AronTypePtr`
+     * @see `aron::Typenavigator::Navigator`
      * @see `std::stack` To manage Type with stack semantics.
      */
     class TypedDataVisitor
@@ -73,12 +73,18 @@ namespace armarx::aron::visitor
         using IntTypeNavigator = typenavigator::IntNavigator;
         using LongTypeNavigator = typenavigator::LongNavigator;
         using StringTypeNavigator = typenavigator::StringNavigator;
+        using TimeTypeNavigator = typenavigator::TimeNavigator;
+
 
         // Array-valued
         using EigenMatrixTypeNavigator = typenavigator::EigenMatrixNavigator;
+        using EigenQuaternionTypeNavigator = typenavigator::EigenQuaternionNavigator;
         using IVTCByteImageTypeNavigator = typenavigator::IVTCByteImageNavigator;
         using OpenCVMatTypeNavigator = typenavigator::OpenCVMatNavigator;
         using PCLPointCloudTypeNavigator = typenavigator::PCLPointCloudNavigator;
+        using PoseTypeNavigator = typenavigator::PoseNavigator;
+        using PositionTypeNavigator = typenavigator::PositionNavigator;
+        using OrientationTypeNavigator = typenavigator::OrientationNavigator;
 
 
     public:
@@ -166,26 +172,55 @@ namespace armarx::aron::visitor
             (void) type, (void) data;
             return true;
         }
+        virtual bool visit(TimeTypeNavigator& type, LongDataNavigator& data)
+        {
+            return visit(type, IceUtil::Time::microSeconds(data.getValue()));
+        }
+        virtual bool visit(TimeTypeNavigator& type, const IceUtil::Time& data)
+        {
+            (void) type, (void) data;
+            return true;
+        }
 
 
         virtual bool visit(EigenMatrixTypeNavigator& type, NDArrayDataNavigator& data)
         {
-            (void) type, (void) type, (void) data;
+            (void) type, (void) data;
+            return true;
+        }
+        virtual bool visit(EigenQuaternionTypeNavigator& type, NDArrayDataNavigator& data)
+        {
+            (void) type, (void) data;
             return true;
         }
         virtual bool visit(IVTCByteImageTypeNavigator& type, NDArrayDataNavigator& data)
         {
-            (void) type, (void) type, (void) data;
+            (void) type, (void) data;
             return true;
         }
         virtual bool visit(OpenCVMatTypeNavigator& type, NDArrayDataNavigator& data)
         {
-            (void) type, (void) type, (void) data;
+            (void) type, (void) data;
             return true;
         }
         virtual bool visit(PCLPointCloudTypeNavigator& type, NDArrayDataNavigator& data)
         {
-            (void) type, (void) type, (void) data;
+            (void) type, (void) data;
+            return true;
+        }
+        virtual bool visit(PoseTypeNavigator& type, NDArrayDataNavigator& data)
+        {
+            (void) type, (void) data;
+            return true;
+        }
+        virtual bool visit(PositionTypeNavigator& type, NDArrayDataNavigator& data)
+        {
+            (void) type, (void) data;
+            return true;
+        }
+        virtual bool visit(OrientationTypeNavigator& type, NDArrayDataNavigator& data)
+        {
+            (void) type, (void) data;
             return true;
         }
 
@@ -280,6 +315,18 @@ namespace armarx::aron::visitor
             visit(type, data);
             return true;
         }
+        virtual bool visit(TimeTypeNavigator& type, const std::string& key, LongDataNavigator& data)
+        {
+            (void) key;
+            visit(type, data);
+            return true;
+        }
+        virtual bool visit(TimeTypeNavigator& type, const std::string& key, const IceUtil::Time& data)
+        {
+            (void) key;
+            visit(type, data);
+            return true;
+        }
 
 
         virtual bool visit(EigenMatrixTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data)
@@ -288,6 +335,12 @@ namespace armarx::aron::visitor
             visit(type, data);
             return true;
         }
+        virtual bool visit(EigenQuaternionTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data)
+        {
+            (void) type, (void) key;
+            visit(type, data);
+            return true;
+        }
         virtual bool visit(IVTCByteImageTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data)
         {
             (void) type, (void) key;
@@ -306,7 +359,24 @@ namespace armarx::aron::visitor
             visit(type, data);
             return true;
         }
-
+        virtual bool visit(PoseTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data)
+        {
+            (void) type, (void) key;
+            visit(type, data);
+            return true;
+        }
+        virtual bool visit(PositionTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data)
+        {
+            (void) type, (void) key;
+            visit(type, data);
+            return true;
+        }
+        virtual bool visit(OrientationTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data)
+        {
+            (void) type, (void) key;
+            visit(type, data);
+            return true;
+        }
 
 
     private:
-- 
GitLab