From 7e216a3965a940f9f5f6739bf36c7fd76cc4c63c Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Thu, 2 Sep 2021 09:08:35 +0200
Subject: [PATCH] Improve resets of eigen stuff

---
 .../cpp/serializer/ndarray/EigenMatrix.cpp    | 12 +++++++++++
 .../cpp/serializer/ndarray/EigenMatrix.h      |  4 ++--
 .../serializer/ndarray/EigenQuaternion.cpp    | 12 +++++++++++
 .../cpp/serializer/ndarray/EigenQuaternion.h  |  7 +++----
 .../cpp/serializer/ndarray/Orientation.cpp    | 20 +++++++++++++++----
 .../cpp/serializer/ndarray/Orientation.h      |  7 ++++---
 .../cpp/serializer/ndarray/Pose.cpp           | 20 +++++++++++++++----
 .../codeWriter/cpp/serializer/ndarray/Pose.h  |  7 +++----
 .../cpp/serializer/ndarray/Position.cpp       | 20 +++++++++++++++----
 .../cpp/serializer/ndarray/Position.h         |  6 +++---
 10 files changed, 87 insertions(+), 28 deletions(-)

diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp
index 32576d212..54a466881 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp
@@ -52,6 +52,18 @@ namespace armarx::aron::cppserializer::serializer
         ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
+    CppBlockPtr EigenMatrixSerializer::getResetHardBlock(const std::string& accessor) const
+    {
+        CppBlockPtr block = std::make_shared<CppBlock>();
+        block->addLine(accessor + ".setZero();");
+        return this->ResolveMaybeResetHardBlock(accessor, block, this->typenavigator);
+    }
+
+    CppBlockPtr EigenMatrixSerializer::getResetSoftBlock(const std::string& accessor) const
+    {
+        return getResetHardBlock(accessor);
+    }
+
     CppBlockPtr EigenMatrixSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.h
index 51b74e651..1885efb76 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.h
@@ -31,8 +31,6 @@
 
 namespace armarx::aron::cppserializer::serializer
 {
-    class EigenMatrixSerializer;
-    typedef std::shared_ptr<EigenMatrixSerializer> EigenMatrixSerializerPtr;
 
     class EigenMatrixSerializer :
         virtual public detail::NDArraySerializerBase<typenavigator::EigenMatrixNavigator, EigenMatrixSerializer>
@@ -42,6 +40,8 @@ namespace armarx::aron::cppserializer::serializer
         EigenMatrixSerializer(const typenavigator::EigenMatrixNavigatorPtr&);
 
         // virtual implementations
+        virtual CppBlockPtr getResetHardBlock(const std::string&) const override;
+        virtual CppBlockPtr getResetSoftBlock(const std::string&) const override;
         virtual CppBlockPtr getWriteTypeBlock(const std::string&) const override;
         virtual CppBlockPtr getWriteBlock(const std::string&) const override;
         virtual CppBlockPtr getReadBlock(const std::string&) const override;
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp
index e8457f0aa..41e3faf1b 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp
@@ -47,6 +47,18 @@ namespace armarx::aron::cppserializer::serializer
         ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
+    CppBlockPtr EigenQuaternionSerializer::getResetHardBlock(const std::string& accessor) const
+    {
+        CppBlockPtr block = std::make_shared<CppBlock>();
+        block->addLine(accessor + ".setIdentity();");
+        return this->ResolveMaybeResetHardBlock(accessor, block, this->typenavigator);
+    }
+
+    CppBlockPtr EigenQuaternionSerializer::getResetSoftBlock(const std::string& accessor) const
+    {
+        return getResetHardBlock(accessor);
+    }
+
     CppBlockPtr EigenQuaternionSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.h
index 039d20fac..8f471d8f3 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.h
@@ -33,20 +33,19 @@
 namespace armarx::aron::cppserializer::serializer
 {
 
-    class EigenQuaternionSerializer;
-    typedef std::shared_ptr<EigenQuaternionSerializer> EigenQuaternionSerializerPtr;
-
     class EigenQuaternionSerializer :
         virtual public detail::NDArraySerializerBase<typenavigator::EigenQuaternionNavigator, EigenQuaternionSerializer>
     {
     public:
-        using PointerType = EigenQuaternionSerializerPtr;
+        using PointerType = std::shared_ptr<EigenQuaternionSerializer>;
 
     public:
         // constructors
         EigenQuaternionSerializer(const typenavigator::EigenQuaternionNavigatorPtr&);
 
         // virtual implementations
+        virtual CppBlockPtr getResetHardBlock(const std::string&) const override;
+        virtual CppBlockPtr getResetSoftBlock(const std::string&) const override;
         virtual CppBlockPtr getWriteTypeBlock(const std::string&) const override;
         virtual CppBlockPtr getWriteBlock(const std::string&) const override;
         virtual CppBlockPtr getReadBlock(const std::string&) const override;
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp
index c2c1a5aaa..1bd39c73c 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp
@@ -40,16 +40,28 @@ namespace armarx::aron::cppserializer::serializer
         ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
+    CppBlockPtr OrientationSerializer::getResetHardBlock(const std::string& accessor) const
+    {
+        CppBlockPtr block = std::make_shared<CppBlock>();
+        block->addLine(accessor + ".setIdentity();");
+        return this->ResolveMaybeResetHardBlock(accessor, block, this->typenavigator);
+    }
+
+    CppBlockPtr OrientationSerializer::getResetSoftBlock(const std::string& accessor) const
+    {
+        return getResetHardBlock(accessor);
+    }
+
     CppBlockPtr OrientationSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        CppBlockPtr b = std::make_shared<CppBlock>();
         b->addLine("w.writeOrientation({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 
     CppBlockPtr OrientationSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", 4}, \"" + typenavigator->ACCEPTED_TYPE + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "coeffs().data())); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
@@ -57,14 +69,14 @@ namespace armarx::aron::cppserializer::serializer
 
     CppBlockPtr OrientationSerializer::getReadBlock(const std::string& accessor) const
     {
-        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "coeffs().data())); // of " + accessor);
         return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr OrientationSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         block_if_data->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))");
         block_if_data->addLineAsBlock("return false;");
         return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.h
index 088b4d1c4..b4851e4bc 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.h
@@ -29,14 +29,12 @@
 
 namespace armarx::aron::cppserializer::serializer
 {
-    class OrientationSerializer;
-    typedef std::shared_ptr<OrientationSerializer> AronOrientationTypeCppSerializerPtr;
 
     class OrientationSerializer :
         virtual public detail::NDArraySerializerBase<typenavigator::OrientationNavigator, OrientationSerializer>
     {
     public:
-        using PointerType = AronOrientationTypeCppSerializerPtr;
+        using PointerType = std::shared_ptr<class OrientationSerializer>;
 
     public:
 
@@ -44,10 +42,13 @@ namespace armarx::aron::cppserializer::serializer
         OrientationSerializer(const typenavigator::OrientationNavigatorPtr&);
 
         // virtual implementations
+        virtual CppBlockPtr getResetHardBlock(const std::string&) const override;
+        virtual CppBlockPtr getResetSoftBlock(const std::string&) const override;
         virtual CppBlockPtr getWriteTypeBlock(const std::string&) const override;
         virtual CppBlockPtr getWriteBlock(const std::string&) const override;
         virtual CppBlockPtr getReadBlock(const std::string&) const override;
         virtual CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override;
 
     };
+
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp
index 9bf5f3074..b6be09e9f 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp
@@ -40,16 +40,28 @@ namespace armarx::aron::cppserializer::serializer
         ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
+    CppBlockPtr PoseSerializer::getResetHardBlock(const std::string& accessor) const
+    {
+        CppBlockPtr block = std::make_shared<CppBlock>();
+        block->addLine(accessor + ".setIdentity();");
+        return this->ResolveMaybeResetHardBlock(accessor, block, this->typenavigator);
+    }
+
+    CppBlockPtr PoseSerializer::getResetSoftBlock(const std::string& accessor) const
+    {
+        return getResetHardBlock(accessor);
+    }
+
     CppBlockPtr PoseSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        CppBlockPtr b = std::make_shared<CppBlock>();
         b->addLine("w.writePose({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 
     CppBlockPtr PoseSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", 4}, \"" + typenavigator->ACCEPTED_TYPE + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
@@ -57,14 +69,14 @@ namespace armarx::aron::cppserializer::serializer
 
     CppBlockPtr PoseSerializer::getReadBlock(const std::string& accessor) const
     {
-        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor);
         return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr PoseSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         block_if_data->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))");
         block_if_data->addLineAsBlock("return false;");
         return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.h
index 131a73e72..195a04015 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.h
@@ -29,20 +29,19 @@
 
 namespace armarx::aron::cppserializer::serializer
 {
-    class PoseSerializer;
-    typedef std::shared_ptr<PoseSerializer> AronPoseTypeCppSerializerPtr;
-
     class PoseSerializer :
         virtual public detail::NDArraySerializerBase<typenavigator::PoseNavigator, PoseSerializer>
     {
     public:
-        using PointerType = AronPoseTypeCppSerializerPtr;
+        using PointerType = std::shared_ptr<PoseSerializer>;
 
     public:
         // constructors
         PoseSerializer(const typenavigator::PoseNavigatorPtr&);
 
         // virtual implementations
+        virtual CppBlockPtr getResetHardBlock(const std::string&) const override;
+        virtual CppBlockPtr getResetSoftBlock(const std::string&) const override;
         virtual CppBlockPtr getWriteTypeBlock(const std::string&) const override;
         virtual CppBlockPtr getWriteBlock(const std::string&) const override;
         virtual CppBlockPtr getReadBlock(const std::string&) const override;
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp
index 60089f7c7..6c9e54ecd 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp
@@ -40,16 +40,28 @@ namespace armarx::aron::cppserializer::serializer
         ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
+    CppBlockPtr PositionSerializer::getResetHardBlock(const std::string& accessor) const
+    {
+        CppBlockPtr block = std::make_shared<CppBlock>();
+        block->addLine(accessor + ".setZero();");
+        return this->ResolveMaybeResetHardBlock(accessor, block, this->typenavigator);
+    }
+
+    CppBlockPtr PositionSerializer::getResetSoftBlock(const std::string& accessor) const
+    {
+        return getResetHardBlock(accessor);
+    }
+
     CppBlockPtr PositionSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        CppBlockPtr b = std::make_shared<CppBlock>();
         b->addLine("w.writePosition({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 
     CppBlockPtr PositionSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", 4}, \"" + typenavigator->ACCEPTED_TYPE + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
@@ -57,14 +69,14 @@ namespace armarx::aron::cppserializer::serializer
 
     CppBlockPtr PositionSerializer::getReadBlock(const std::string& accessor) const
     {
-        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor);
         return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr PositionSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         block_if_data->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))");
         block_if_data->addLineAsBlock("return false;");
         return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.h
index 7a234106d..61026f461 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.h
@@ -29,20 +29,20 @@
 
 namespace armarx::aron::cppserializer::serializer
 {
-    class PositionSerializer;
-    typedef std::shared_ptr<PositionSerializer> AronPositionTypeCppSerializerPtr;
 
     class PositionSerializer :
         virtual public detail::NDArraySerializerBase<typenavigator::PositionNavigator, PositionSerializer>
     {
     public:
-        using PointerType = AronPositionTypeCppSerializerPtr;
+        using PointerType = std::shared_ptr<PositionSerializer>;
 
     public:
         // constructors
         PositionSerializer(const typenavigator::PositionNavigatorPtr&);
 
         // virtual implementations
+        virtual CppBlockPtr getResetHardBlock(const std::string&) const override;
+        virtual CppBlockPtr getResetSoftBlock(const std::string&) const override;
         virtual CppBlockPtr getWriteTypeBlock(const std::string&) const override;
         virtual CppBlockPtr getWriteBlock(const std::string&) const override;
         virtual CppBlockPtr getReadBlock(const std::string&) const override;
-- 
GitLab