From e869278a650f06076f73f5210123067b3c7b9d91 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Tue, 26 Oct 2021 16:32:33 +0200
Subject: [PATCH] Add static AronClass::FromAron(data)

---
 .../codegenerator/codewriter/CodeWriter.h     |  1 +
 .../codegenerator/codewriter/cpp/Writer.cpp   | 20 ++++++++++++++++++-
 .../codegenerator/codewriter/cpp/Writer.h     |  2 ++
 .../codewriter/cpp/generator/Generator.cpp    | 13 ++++++++++++
 .../codewriter/cpp/generator/Generator.h      |  1 +
 .../core/codegenerator/helper/ReaderInfo.h    |  8 ++++++++
 6 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/CodeWriter.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/CodeWriter.h
index 006713e3d..0bbf6ca52 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/CodeWriter.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/CodeWriter.h
@@ -71,6 +71,7 @@ namespace armarx::aron::codegenerator
         std::string producerName;
         std::vector<codegenerator::WriterInfo> dataWriters;
         std::vector<codegenerator::ReaderInfo> dataReaders;
+        std::vector<codegenerator::StaticReaderInfo> staticDataReaders;
         std::vector<codegenerator::WriterInfo> initialTypeWriters;
         std::vector<std::string> additionalIncludes;
     };
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/Writer.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/Writer.cpp
index 751ee665e..452424150 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/Writer.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/Writer.cpp
@@ -78,7 +78,16 @@ namespace armarx::aron::codegenerator::cpp
 
     void Writer::addSpecificReaderMethods()
     {
-        // The toAron Serializer is visible by default
+        // The static FromAron Deserializer
+        {
+            codegenerator::StaticReaderInfo fromAron;
+            fromAron.methodName = "FromAron";
+            fromAron.argumentType = "armarx::aron::data::DictPtr";
+            fromAron.returnType = OWN_TYPE_NAME;
+            staticDataReaders.push_back(fromAron);
+        }
+
+        // The fromAron Deserializer is visible by default
         {
             codegenerator::ReaderInfo fromAron;
             fromAron.methodName = "fromAron";
@@ -151,6 +160,13 @@ namespace armarx::aron::codegenerator::cpp
                 c->addMethod(convert);
             }
 
+            // Add methods to set the member variables
+            for (const codegenerator::StaticReaderInfo& info : staticDataReaders)
+            {
+                CppMethodPtr convert = generator.toSpecializedStaticDataReaderMethod(info);
+                c->addMethod(convert);
+            }
+
             // Add methods to set the member variables
             for (const codegenerator::ReaderInfo& info : dataReaders)
             {
@@ -257,6 +273,8 @@ namespace armarx::aron::codegenerator::cpp
         c->addInclude("<map>");
         c->addInclude("<RobotAPI/interface/aron.h>");
 
+        c->addPublicField(std::string("using ") + OWN_TYPE_NAME + " = " + cppTypename + ";");
+
         // ctor
         c->addCtor(gen.toCtor(c->getName()));
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/Writer.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/Writer.h
index 7c4d3eb5d..2e6cc994c 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/Writer.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/Writer.h
@@ -63,5 +63,7 @@ namespace armarx::aron::codegenerator::cpp
         void setupMemberFields(CppClassPtr&, const std::map<std::string, std::string>& doc_members, const generator::IntEnumClass&) const;
 
     private:
+        static const constexpr char* OWN_TYPE_NAME = "This";
+
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.cpp
index 89801e0fc..911555fea 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.cpp
@@ -227,9 +227,22 @@ namespace armarx::aron::codegenerator::cpp
         return m;
     }
 
+    CppMethodPtr Generator::toSpecializedStaticDataReaderMethod(const StaticReaderInfo& info) const
     {
         std::stringstream doc;
+        doc << "@brief " << info.methodName << "() - This method sets the struct members to new values given in a reader implementation. \n";
+        doc << "@return - nothing";
+
+        CppMethodPtr m = CppMethodPtr(new CppMethod("static " + info.returnType + " " + info.methodName + "(const " + info.argumentType + "& input)", doc.str()));
+        m->addLine("This t;");
+        m->addLine("t.fromAron(input);");
+        m->addLine("return t;");
+        return m;
+    }
+
     CppMethodPtr Generator::toSpecializedTypeWriterMethod(const WriterInfo& info) const
+    {
+        std::stringstream doc;
         doc << "@brief " << info.methodName << "() - This method returns a new type from the member data types using a writer implementation. \n";
         doc << "@return - the result of the writer implementation";
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.h
index dddc73d51..3978677fd 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.h
@@ -111,6 +111,7 @@ namespace armarx::aron::codegenerator::cpp
 
         CppMethodPtr toSpecializedDataWriterMethod(const WriterInfo& info) const;
         CppMethodPtr toSpecializedDataReaderMethod(const ReaderInfo& info) const;
+        CppMethodPtr toSpecializedStaticDataReaderMethod(const StaticReaderInfo& info) const;
         CppMethodPtr toSpecializedTypeWriterMethod(const WriterInfo& info) const;
 
         // virtual override definitions
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/helper/ReaderInfo.h b/source/RobotAPI/libraries/aron/core/codegenerator/helper/ReaderInfo.h
index 71cbc0ff0..a025da99a 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/helper/ReaderInfo.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/helper/ReaderInfo.h
@@ -37,4 +37,12 @@ namespace armarx::aron::codegenerator
         std::string include;
         std::string enforceConversion = "";
     };
+
+
+    struct StaticReaderInfo
+    {
+        std::string methodName;
+        std::string argumentType;
+        std::string returnType;
+    };
 }
-- 
GitLab