From b7b31fb383fd5b4719f50422f23e3c74364c38f0 Mon Sep 17 00:00:00 2001
From: Fabian Peller-Konrad <fabian.peller-konrad@kit.edu>
Date: Wed, 10 Nov 2021 14:53:57 +0100
Subject: [PATCH] updated aron visitors (no key anymore, use path instead)

---
 .../armem/server/MemoryRemoteGui.cpp          |   3 +-
 .../armem/server/RemoteGuiAronDataVisitor.h   |  31 +--
 .../imageExtractor/ImageExtractor.cpp         |  34 ++--
 .../extractor/imageExtractor/ImageExtractor.h |   4 +-
 .../aron/core/data/visitor/RecursiveVisitor.h | 178 +++++++++---------
 .../aron/core/type/visitor/RecursiveVisitor.h | 124 ++++++------
 6 files changed, 187 insertions(+), 187 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/server/MemoryRemoteGui.cpp b/source/RobotAPI/libraries/armem/server/MemoryRemoteGui.cpp
index 8c76449e7..1f0014207 100644
--- a/source/RobotAPI/libraries/armem/server/MemoryRemoteGui.cpp
+++ b/source/RobotAPI/libraries/armem/server/MemoryRemoteGui.cpp
@@ -195,8 +195,7 @@ namespace armarx::armem::server
         if (instance.data())
         {
             RemoteGuiAronDataVisitor v;
-            aron::data::VariantPtr p;
-            aron::data::visitRecursive(v, instance.data(), "", p);
+            aron::data::visitRecursive(v, instance.data());
             group = v.result;
         }
         else
diff --git a/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h b/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h
index a38c3d50d..081a5f9ef 100644
--- a/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h
+++ b/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h
@@ -35,22 +35,24 @@ namespace armarx::armem::server
 
         virtual ~RemoteGuiAronDataVisitor() = default;
 
-        void visitDictOnEnter(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& n) override
+        void visitDictOnEnter(const aron::data::VariantPtr& n) override
         {
             ARMARX_CHECK_NOT_NULL(n);
+            const std::string key = n->getPath().getLastElement();
             visitEnter(key, "dict", n->childrenSize());
         }
-        void visitDictOnExit(const std::string&, const aron::data::VariantPtr&, const aron::data::VariantPtr&) override
+        void visitDictOnExit(const aron::data::VariantPtr&) override
         {
             visitExit();
         }
 
-        void visitListOnEnter(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& n) override
+        void visitListOnEnter(const aron::data::VariantPtr& n) override
         {
             ARMARX_CHECK_NOT_NULL(n);
+            const std::string key = n->getPath().getLastElement();
             visitEnter(key, "list", n->childrenSize());
         }
-        void visitListOnExit(const std::string&, const aron::data::VariantPtr&, const aron::data::VariantPtr&) override
+        void visitListOnExit(const aron::data::VariantPtr&) override
         {
             visitExit();
         }
@@ -59,40 +61,47 @@ namespace armarx::armem::server
         bool visitEnter(const std::string& key, const std::string& type, size_t size);
         bool visitExit();
 
-        void visitBool(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& b) override
+        void visitBool(const aron::data::VariantPtr& b) override
         {
             ARMARX_CHECK_NOT_NULL(b);
+            const std::string key = b->getPath().getLastElement();
             this->addValueLabel(key, *aron::data::Bool::DynamicCastAndCheck(b), "bool");
         }
-        void visitDouble(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& d) override
+        void visitDouble(const aron::data::VariantPtr& d) override
         {
             ARMARX_CHECK_NOT_NULL(d);
+            const std::string key = d->getPath().getLastElement();
             this->addValueLabel(key, *aron::data::Double::DynamicCastAndCheck(d), "double");
         }
-        void visitFloat(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& f) override
+        void visitFloat(const aron::data::VariantPtr& f) override
         {
             ARMARX_CHECK_NOT_NULL(f);
+            const std::string key = f->getPath().getLastElement();
             this->addValueLabel(key, *aron::data::Float::DynamicCastAndCheck(f), "float");
         }
-        void visitInt(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& i) override
+        void visitInt(const aron::data::VariantPtr& i) override
         {
             ARMARX_CHECK_NOT_NULL(i);
+            const std::string key = i->getPath().getLastElement();
             this->addValueLabel(key, *aron::data::Int::DynamicCastAndCheck(i), "int");
         }
-        void visitLong(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& l) override
+        void visitLong(const aron::data::VariantPtr& l) override
         {
             ARMARX_CHECK_NOT_NULL(l);
+            const std::string key = l->getPath().getLastElement();
             this->addValueLabel(key, *aron::data::Long::DynamicCastAndCheck(l), "long");
         }
-        void visitString(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& string) override
+        void visitString(const aron::data::VariantPtr& string) override
         {
             ARMARX_CHECK_NOT_NULL(string);
+            const std::string key = string->getPath().getLastElement();
             this->addValueLabel(key, *aron::data::String::DynamicCastAndCheck(string), "string");
         }
 
-        void visitNDArray(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& array) override
+        void visitNDArray(const aron::data::VariantPtr& array) override
         {
             ARMARX_CHECK_NOT_NULL(array);
+            const std::string key = array->getPath().getLastElement();
             this->addValueLabel(key, *aron::data::NDArray::DynamicCastAndCheck(array), "ND Array");
         }
 
diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/extractor/imageExtractor/ImageExtractor.cpp b/source/RobotAPI/libraries/armem/server/ltm/base/extractor/imageExtractor/ImageExtractor.cpp
index 71e689f9d..a48b54ca4 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/base/extractor/imageExtractor/ImageExtractor.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/base/extractor/imageExtractor/ImageExtractor.cpp
@@ -3,39 +3,27 @@
 
 namespace armarx::armem::server::ltm::extractor
 {
-    void ImageExtractorVisitor::visitNDArray(const std::string& key, Input& parent, Input& variant)
+    void ImageExtractorVisitor::visitDictOnEnter(Input& data)
     {
-        ARMARX_CHECK_NOT_NULL(parent);
-        ARMARX_CHECK_NOT_NULL(variant);
+        ARMARX_CHECK_NOT_NULL(data);
 
-        auto ndarray = aron::data::NDArray::DynamicCastAndCheck(variant);
-        auto shape = ndarray->getShape();
-        if (shape.size() == 3 && std::accumulate(std::begin(shape), std::end(shape), 1, std::multiplies<int>()) > 1000) // must be big enough to assume an image (instead of 4x4x4 poses)
+        auto dict = aron::data::Dict::DynamicCastAndCheck(data);
+        for (const auto& [key, child] : dict->getElements())
         {
-            images[key] = ndarray;
-            switch (parent->getDescriptor())
+            if (child && child->getDescriptor() == aron::data::Descriptor::eNDArray)
             {
-                case aron::data::Descriptor::eDict:
+                auto ndarray = aron::data::NDArray::DynamicCastAndCheck(child);
+                auto shape = ndarray->getShape();
+                if (shape.size() == 3 && std::accumulate(std::begin(shape), std::end(shape), 1, std::multiplies<int>()) > 200) // must be big enough to assume an image (instead of 4x4x4 poses)
                 {
-                    auto dict = aron::data::Dict::DynamicCastAndCheck(parent);
+                    images[key] = ndarray;
                     dict->setElement(key, nullptr);
-                    break;
-                }
-                case aron::data::Descriptor::eList:
-                {
-                    auto list = aron::data::List::DynamicCastAndCheck(parent);
-                    list->setElement(std::stoi(key), nullptr);
-                    break;
-                }
-                default:
-                {
-                    throw aron::error::AronException(__PRETTY_FUNCTION__, "Found invalid parent in visitor.");
                 }
             }
         }
     }
 
-    void ImageExtractorVisitor::visitUnknown(const std::string& key, Input& parent, Input& data)
+    void ImageExtractorVisitor::visitUnknown(Input& data)
     {
         // A member is null. Simply ignore...
     }
@@ -45,7 +33,7 @@ namespace armarx::armem::server::ltm::extractor
         ImageExtractorVisitor visitor;
         aron::data::VariantPtr var = std::static_pointer_cast<aron::data::Variant>(data);
         aron::data::VariantPtr p;
-        aron::data::visitRecursive(visitor, var, "", p);
+        aron::data::visitRecursive(visitor, var);
 
         Extraction encoding;
         encoding.data = data;
diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/extractor/imageExtractor/ImageExtractor.h b/source/RobotAPI/libraries/armem/server/ltm/base/extractor/imageExtractor/ImageExtractor.h
index 8c5fd2447..14c3fd4b7 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/base/extractor/imageExtractor/ImageExtractor.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/base/extractor/imageExtractor/ImageExtractor.h
@@ -15,8 +15,8 @@ namespace armarx::armem::server::ltm::extractor
     public:
         std::map<std::string, aron::data::NDArrayPtr> images;
 
-        void visitNDArray(const std::string& key, Input& parent, Input& data);
-        void visitUnknown(const std::string& key, Input& parent, Input& data);
+        void visitDictOnEnter(Input& data);
+        void visitUnknown(Input& data);
     };
 
     class ImageExtractor : public Extractor
diff --git a/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h b/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h
index a46373175..2cb8658db 100644
--- a/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h
+++ b/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h
@@ -34,49 +34,49 @@ namespace armarx::aron::data
      * @see type/visitor/RecursiveVisitor.h
      */
     template <class RecursiveVisitorImplementation>
-    void visitRecursive(RecursiveVisitorImplementation& v, typename RecursiveVisitorImplementation::Input& o, const std::string& key, typename RecursiveVisitorImplementation::Input& po)
+    void visitRecursive(RecursiveVisitorImplementation& v, typename RecursiveVisitorImplementation::Input& o)
     {
         data::Descriptor descriptor = v.getDescriptor(o);
         switch (descriptor)
         {
             case data::Descriptor::eList:
             {
-                v.visitListOnEnter(key, po, o);
+                v.visitListOnEnter(o);
                 unsigned int i = 0;
                 for (auto& value : v.getListElements(o))
                 {
-                    visitRecursive(v, value, std::to_string(i), o);
+                    visitRecursive(v, value);
                     i++;
                 }
-                v.visitListOnExit(key, po, o);
+                v.visitListOnExit(o);
                 return;
             }
             case data::Descriptor::eDict:
             {
-                v.visitDictOnEnter(key, po, o);
+                v.visitDictOnEnter(o);
                 for (auto& [key, value] : v.getDictElements(o))
                 {
-                    visitRecursive(v, value, key, o);
+                    visitRecursive(v, value);
                 }
-                v.visitDictOnExit(key, po, o);
+                v.visitDictOnExit(o);
                 return;
             }
             case data::Descriptor::eNDArray:
-                return v.visitNDArray(key, po, o);
+                return v.visitNDArray(o);
             case data::Descriptor::eInt:
-                return v.visitInt(key, po, o);
+                return v.visitInt(o);
             case data::Descriptor::eLong:
-                return v.visitLong(key, po, o);
+                return v.visitLong(o);
             case data::Descriptor::eFloat:
-                return v.visitFloat(key, po, o);
+                return v.visitFloat(o);
             case data::Descriptor::eDouble:
-                return v.visitDouble(key, po, o);
+                return v.visitDouble(o);
             case data::Descriptor::eString:
-                return v.visitString(key, po, o);
+                return v.visitString(o);
             case data::Descriptor::eBool:
-                return v.visitBool(key, po, o);
+                return v.visitBool(o);
             case data::Descriptor::eUnknown:
-                return v.visitUnknown(key, po, o);
+                return v.visitUnknown(o);
         }
     }
 
@@ -85,100 +85,100 @@ namespace armarx::aron::data
      * @see data/visitor/Visitor.h
      */
     template <class RecursiveVisitorImplementation>
-    void visitRecursive(RecursiveVisitorImplementation& v, typename RecursiveVisitorImplementation::DataInput& o, typename RecursiveVisitorImplementation::TypeInput& t, const std::string& key, typename RecursiveVisitorImplementation::DataInput& po, typename RecursiveVisitorImplementation::TypeInput& pt)
+    void visitRecursive(RecursiveVisitorImplementation& v, typename RecursiveVisitorImplementation::DataInput& o, typename RecursiveVisitorImplementation::TypeInput& t)
     {
         type::Descriptor descriptor = v.getDescriptor(t);
         switch (descriptor)
         {
             case type::Descriptor::eList:
             {
-                v.visitListOnEnter(key, po, pt, o, t);
+                v.visitListOnEnter(o, t);
                 unsigned int i = 0;
                 for (auto& [value, acceptedType] : v.getListElements(o, t))
                 {
-                    visitRecursive(v, value, acceptedType, std::to_string(i), o, t);
+                    visitRecursive(v, value, acceptedType);
                     i++;
                 }
-                v.visitListOnExit(key, po, pt, o, t);
+                v.visitListOnExit(o, t);
                 return;
             }
             case type::Descriptor::ePair:
             {
-                v.visitPairOnEnter(key, po, pt, o, t);
+                v.visitPairOnEnter(o, t);
                 auto pair = v.getPairElements(o, t);
                 auto first = pair.first;
                 auto second = pair.second;
-                visitRecursive(v, first.first, first.second, "1", o, t);
-                visitRecursive(v, second.first, second.second, "2", o, t);
-                v.visitPairOnExit(key, po, pt, o, t);
+                visitRecursive(v, first.first, first.second);
+                visitRecursive(v, second.first, second.second);
+                v.visitPairOnExit(o, t);
                 return;
             }
             case type::Descriptor::eTuple:
             {
-                v.visitTupleOnEnter(key, po, pt, o, t);
+                v.visitTupleOnEnter(o, t);
                 unsigned int i = 0;
                 for (auto& [value, acceptedType] : v.getTupleElements(o, t))
                 {
-                    visitRecursive(v, value, acceptedType, std::to_string(i), o, t);
+                    visitRecursive(v, value, acceptedType);
                     i++;
                 }
-                v.visitTupleOnExit(key, po, pt, o, t);
+                v.visitTupleOnExit(o, t);
                 return;
             }
             case type::Descriptor::eDict:
             {
-                    v.visitDictOnEnter(key, po, pt, o, t);
+                    v.visitDictOnEnter(o, t);
                     for (auto& [key, value, acceptedType] : v.getDictElements(o, t))
                     {
-                        visitRecursive(v, value, acceptedType, key, o, t);
+                        visitRecursive(v, value, acceptedType);
                     }
-                    v.visitDictOnExit(key, po, pt, o, t);
+                    v.visitDictOnExit(o, t);
                     return;
             }
             case type::Descriptor::eObject:
             {
-                v.visitObjectOnEnter(key, po, pt, o, t);
+                v.visitObjectOnEnter(o, t);
                 for (auto& [key, value, acceptedType] : v.getObjectElements(o, t))
                 {
-                    visitRecursive(v, value, acceptedType, key, o, t);
+                    visitRecursive(v, value, acceptedType);
                 }
-                v.visitObjectOnExit(key, po, pt, o, t);
+                v.visitObjectOnExit(o, t);
                 return;
             }
             case type::Descriptor::eNDArray:
-                return v.visitNDArray(key, po, pt, o, t);
+                return v.visitNDArray(o, t);
             case type::Descriptor::eMatrix:
-                return v.visitMatrix(key, po, pt, o, t);
+                return v.visitMatrix(o, t);
             case type::Descriptor::eOrientation:
-                return v.visitOrientation(key, po, pt, o, t);
+                return v.visitOrientation(o, t);
             case type::Descriptor::eImage:
-                return v.visitImage(key, po, pt, o, t);
+                return v.visitImage(o, t);
             case type::Descriptor::ePointCloud:
-                return v.visitPointCloud(key, po, pt, o, t);
+                return v.visitPointCloud(o, t);
             case type::Descriptor::ePosition:
-                return v.visitPosition(key, po, pt, o, t);
+                return v.visitPosition(o, t);
             case type::Descriptor::ePose:
-                return v.visitPose(key, po, pt, o, t);
+                return v.visitPose(o, t);
             case type::Descriptor::eQuaternion:
-                return v.visitQuaternion(key, po, pt, o, t);
+                return v.visitQuaternion(o, t);
             case type::Descriptor::eInt:
-                return v.visitInt(key, po, pt, o, t);
+                return v.visitInt(o, t);
             case type::Descriptor::eLong:
-                return v.visitLong(key, po, pt, o, t);
+                return v.visitLong(o, t);
             case type::Descriptor::eFloat:
-                return v.visitFloat(key, po, pt, o, t);
+                return v.visitFloat(o, t);
             case type::Descriptor::eDouble:
-                return v.visitDouble(key, po, pt, o, t);
+                return v.visitDouble(o, t);
             case type::Descriptor::eString:
-                return v.visitString(key, po, pt, o, t);
+                return v.visitString(o, t);
             case type::Descriptor::eBool:
-                return v.visitBool(key, po, pt, o, t);
+                return v.visitBool(o, t);
             case type::Descriptor::eTime:
-                return v.visitTime(key, po, pt, o, t);
+                return v.visitTime(o, t);
             case type::Descriptor::eIntEnum:
-                return v.visitIntEnum(key, po, pt, o, t);
+                return v.visitIntEnum(o, t);
             case type::Descriptor::eUnknown:
-                return v.visitUnknown(key, po, pt, o, t);
+                return v.visitUnknown(o, t);
         }
     }
 
@@ -194,19 +194,19 @@ namespace armarx::aron::data
         virtual std::map<std::string, InputNonConst> getDictElements(Input&) = 0;
         virtual std::vector<InputNonConst> getListElements(Input&) = 0;
 
-        virtual void visitDictOnEnter(const std::string& key, Input& parent, Input& element) {};
-        virtual void visitDictOnExit(const std::string& key, Input& parent, Input& element) {};
-        virtual void visitListOnEnter(const std::string& key, Input& parent, Input& element) {};
-        virtual void visitListOnExit(const std::string& key, Input& parent, Input& element) {};
+        virtual void visitDictOnEnter(Input& element) {};
+        virtual void visitDictOnExit(Input& element) {};
+        virtual void visitListOnEnter(Input& element) {};
+        virtual void visitListOnExit(Input& element) {};
 
-        virtual void visitNDArray(const std::string& key, Input& parent, Input& element) {};
-        virtual void visitInt(const std::string& key, Input& parent, Input& element) {};
-        virtual void visitLong(const std::string& key, Input& parent, Input& element) {};
-        virtual void visitFloat(const std::string& key, Input& parent, Input& element) {};
-        virtual void visitDouble(const std::string& key, Input& parent, Input& element) {};
-        virtual void visitBool(const std::string& key, Input& parent, Input& element) {};
-        virtual void visitString(const std::string& key, Input& parent, Input& element) {};
-        virtual void visitUnknown(const std::string& key, Input& parent, Input& element) { throw error::AronException(__PRETTY_FUNCTION__, "Unknown type in visitor."); }
+        virtual void visitNDArray(Input& element) {};
+        virtual void visitInt(Input& element) {};
+        virtual void visitLong(Input& element) {};
+        virtual void visitFloat(Input& element) {};
+        virtual void visitDouble(Input& element) {};
+        virtual void visitBool(Input& element) {};
+        virtual void visitString(Input& element) {};
+        virtual void visitUnknown(Input& element) { throw error::AronException(__PRETTY_FUNCTION__, "Unknown type in visitor."); }
         virtual ~RecursiveVisitor() = default;
     };
 
@@ -228,34 +228,36 @@ namespace armarx::aron::data
         virtual std::pair<std::pair<DataInputNonConst, TypeInputNonConst>, std::pair<DataInputNonConst, TypeInputNonConst>> getPairElements(DataInput&, TypeInput&) = 0;
         virtual std::vector<std::pair<DataInputNonConst, TypeInputNonConst>> getTupleElements(DataInput&, TypeInput&) = 0;
 
-        virtual void visitObjectOnEnter(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitObjectOnExit(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitDictOnEnter(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitDictOnExit(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitPairOnEnter(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitPairOnExit(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitTupleOnEnter(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitTupleOnExit(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitListOnEnter(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitListOnExit(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitObjectOnEnter(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitObjectOnExit(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitDictOnEnter(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitDictOnExit(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitPairOnEnter(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitPairOnExit(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitTupleOnEnter(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitTupleOnExit(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitListOnEnter(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitListOnExit(DataInput& elementData, TypeInput& elementType) {};
 
-        virtual void visitMatrix(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitNDArray(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitQuaternion(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitOrientation(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitPosition(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitPose(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitImage(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitPointCloud(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitIntEnum(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitInt(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitLong(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitFloat(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitDouble(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitBool(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitString(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitTime(const std::string& key, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) {};
-        virtual void visitUnknown(const std::string&, DataInput& parentData, TypeInput& parentType, DataInput& elementData, TypeInput& elementType) { throw error::AronException(__PRETTY_FUNCTION__, "Unknown type in visitor."); }
+        virtual void visitMatrix(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitNDArray(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitQuaternion(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitOrientation(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitPosition(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitPose(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitImage(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitPointCloud(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitIntEnum(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitInt(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitLong(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitFloat(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitDouble(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitBool(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitString(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitTime(DataInput& elementData, TypeInput& elementType) {};
+        virtual void visitUnknown(DataInput& elementData, TypeInput& elementType) {
+            throw error::AronException(__PRETTY_FUNCTION__, "Unknown type in visitor.");
+        }
         virtual ~RecursiveTypedVisitor() = default;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/visitor/RecursiveVisitor.h b/source/RobotAPI/libraries/aron/core/type/visitor/RecursiveVisitor.h
index 887aa211a..a49b0751e 100644
--- a/source/RobotAPI/libraries/aron/core/type/visitor/RecursiveVisitor.h
+++ b/source/RobotAPI/libraries/aron/core/type/visitor/RecursiveVisitor.h
@@ -34,92 +34,92 @@ namespace armarx::aron::type
      * @brief The visitRecursive function. Calls visitX of a RecursiveVisitorImplementation recursively. For more information please see Visitor.h
      */
     template <class RecursiveVisitorImplementation>
-    void visitRecursive(RecursiveVisitorImplementation& v, const std::string& key, typename RecursiveVisitorImplementation::Input& t)
+    void visitRecursive(RecursiveVisitorImplementation& v, typename RecursiveVisitorImplementation::Input& t)
     {
         auto descriptor = v.getDescriptor(t);
         switch (descriptor)
         {
             case type::Descriptor::eList:
             {
-                v.visitListOnEnter(key, t);
+                v.visitListOnEnter(t);
                 auto acceptedType = v.getListAcceptedType(t);
-                visitRecursive(v, "acceptedType", acceptedType);
-                v.visitListOnExit(key, t);
+                visitRecursive(v, acceptedType);
+                v.visitListOnExit(t);
                 return;
             }
             case type::Descriptor::ePair:
             {
-                v.visitPairOnEnter(key, t);
+                v.visitPairOnEnter(t);
                 auto acceptedTypes = v.getPairAcceptedTypes(t);
-                visitRecursive(v, "acceptedType1", acceptedTypes.first);
-                visitRecursive(v, "acceptedType2", acceptedTypes.second);
-                v.visitPairOnExit(key, t);
+                visitRecursive(v, acceptedTypes.first);
+                visitRecursive(v, acceptedTypes.second);
+                v.visitPairOnExit(t);
                 return;
             }
             case type::Descriptor::eTuple:
             {
-                v.visitTupleOnEnter(key, t);
+                v.visitTupleOnEnter(t);
                 unsigned int i = 0;
                 for (const auto& acceptedType : v.getTupleAcceptedTypes(t))
                 {
-                    visitRecursive(v, "acceptedType"+std::to_string(i), acceptedType);
+                    visitRecursive(v, acceptedType);
                     i++;
                 }
-                v.visitTupleOnExit(key, t);
+                v.visitTupleOnExit(t);
                 return;
             }
             case type::Descriptor::eDict:
             {
-                v.visitDictOnEnter(key, t);
+                v.visitDictOnEnter(t);
                 auto acceptedType = v.getDictAcceptedType(t);
-                visitRecursive(v, "acceptedType", acceptedType);
-                v.visitDictOnExit(key, t);
+                visitRecursive(v, acceptedType);
+                v.visitDictOnExit(t);
                 return;
             }
             case type::Descriptor::eObject:
             {
-                v.visitObjectOnEnter(key, t);
+                v.visitObjectOnEnter(t);
                 for (const auto& [key, acceptedType] : v.getObjectElements(t))
                 {
-                    visitRecursive(v, key, acceptedType);
+                    visitRecursive(v, acceptedType);
                 }
-                v.visitObjectOnExit(key, t);
+                v.visitObjectOnExit(t);
                 return;
             }
             case type::Descriptor::eNDArray:
-                return v.visitNDArray(key, t);
+                return v.visitNDArray(t);
             case type::Descriptor::eMatrix:
-                return v.visitMatrix(key, t);
+                return v.visitMatrix(t);
             case type::Descriptor::eOrientation:
-                return v.visitOrientation(key, t);
+                return v.visitOrientation(t);
             case type::Descriptor::eImage:
-                return v.visitImage(key, t);
+                return v.visitImage(t);
             case type::Descriptor::ePointCloud:
-                return v.visitPointCloud(key, t);
+                return v.visitPointCloud(t);
             case type::Descriptor::ePosition:
-                return v.visitPosition(key, t);
+                return v.visitPosition(t);
             case type::Descriptor::ePose:
-                return v.visitPose(key, t);
+                return v.visitPose(t);
             case type::Descriptor::eQuaternion:
-                return v.visitQuaternion(key, t);
+                return v.visitQuaternion(t);
             case type::Descriptor::eInt:
-                return v.visitInt(key, t);
+                return v.visitInt(t);
             case type::Descriptor::eLong:
-                return v.visitLong(key, t);
+                return v.visitLong(t);
             case type::Descriptor::eFloat:
-                return v.visitFloat(key, t);
+                return v.visitFloat(t);
             case type::Descriptor::eDouble:
-                return v.visitDouble(key, t);
+                return v.visitDouble(t);
             case type::Descriptor::eString:
-                return v.visitString(key, t);
+                return v.visitString(t);
             case type::Descriptor::eBool:
-                return v.visitBool(key, t);
+                return v.visitBool(t);
             case type::Descriptor::eTime:
-                return v.visitTime(key, t);
+                return v.visitTime(t);
             case type::Descriptor::eIntEnum:
-                return v.visitIntEnum(key, t);
+                return v.visitIntEnum(t);
             case type::Descriptor::eUnknown:
-                return v.visitUnknown(key, t);
+                return v.visitUnknown(t);
         }
     }
 
@@ -139,34 +139,36 @@ namespace armarx::aron::type
         virtual std::pair<InputNonConst, InputNonConst> getPairAcceptedTypes(Input&) = 0;
         virtual std::vector<InputNonConst> getTupleAcceptedTypes(Input&) = 0;
 
-        virtual void visitObjectOnEnter(const std::string& key, Input&) {};
-        virtual void visitObjectOnExit(const std::string& key, Input&) {};
-        virtual void visitDictOnEnter(const std::string& key, Input&) {};
-        virtual void visitDictOnExit(const std::string& key, Input&) {};
-        virtual void visitPairOnEnter(const std::string& key, Input&) {};
-        virtual void visitPairOnExit(const std::string& key, Input&) {};
-        virtual void visitTupleOnEnter(const std::string& key, Input&) {};
-        virtual void visitTupleOnExit(const std::string& key, Input&) {};
-        virtual void visitListOnEnter(const std::string& key, Input&) {};
-        virtual void visitListOnExit(const std::string& key, Input&) {};
+        virtual void visitObjectOnEnter(Input&) {};
+        virtual void visitObjectOnExit(Input&) {};
+        virtual void visitDictOnEnter(Input&) {};
+        virtual void visitDictOnExit(Input&) {};
+        virtual void visitPairOnEnter(Input&) {};
+        virtual void visitPairOnExit(Input&) {};
+        virtual void visitTupleOnEnter(Input&) {};
+        virtual void visitTupleOnExit(Input&) {};
+        virtual void visitListOnEnter(Input&) {};
+        virtual void visitListOnExit(Input&) {};
 
-        virtual void visitMatrix(const std::string& key, Input&) {};
-        virtual void visitNDArray(const std::string& key, Input&) {};
-        virtual void visitQuaternion(const std::string& key, Input&) {};
-        virtual void visitOrientation(const std::string& key, Input&) {};
-        virtual void visitPosition(const std::string& key, Input&) {};
-        virtual void visitPose(const std::string& key, Input&) {};
-        virtual void visitImage(const std::string& key, Input&) {};
-        virtual void visitPointCloud(const std::string& key, Input&) {};
-        virtual void visitIntEnum(const std::string& key, Input&) {};
-        virtual void visitInt(const std::string& key, Input&) {};
-        virtual void visitLong(const std::string& key, Input&) {};
-        virtual void visitFloat(const std::string& key, Input&) {};
-        virtual void visitDouble(const std::string& key, Input&) {};
-        virtual void visitBool(const std::string& key, Input&) {};
-        virtual void visitString(const std::string& key, Input&) {};
-        virtual void visitTime(const std::string& key, Input&) {};
-        virtual void visitUnknown(const std::string&, Input&) { throw error::AronException(__PRETTY_FUNCTION__, "Unknown type in visitor."); }
+        virtual void visitMatrix(Input&) {};
+        virtual void visitNDArray(Input&) {};
+        virtual void visitQuaternion(Input&) {};
+        virtual void visitOrientation(Input&) {};
+        virtual void visitPosition(Input&) {};
+        virtual void visitPose(Input&) {};
+        virtual void visitImage(Input&) {};
+        virtual void visitPointCloud(Input&) {};
+        virtual void visitIntEnum(Input&) {};
+        virtual void visitInt(Input&) {};
+        virtual void visitLong(Input&) {};
+        virtual void visitFloat(Input&) {};
+        virtual void visitDouble(Input&) {};
+        virtual void visitBool(Input&) {};
+        virtual void visitString(Input&) {};
+        virtual void visitTime(Input&) {};
+        virtual void visitUnknown(Input&) {
+            throw error::AronException(__PRETTY_FUNCTION__, "Unknown type in visitor.");
+        }
         virtual ~RecursiveVisitor() = default;
     };
 }
-- 
GitLab