From bbdd449cdb40c6a73daab97778ab2cad8d05aec9 Mon Sep 17 00:00:00 2001
From: Christoph Pohl <christoph.pohl@kit.edu>
Date: Thu, 23 Mar 2023 19:57:42 +0100
Subject: [PATCH] Make non-static reader and writer mathods virtual or final in
 case of inheritance

---
 .../codegenerator/codewriter/cpp/Writer.cpp           | 11 +++++++++++
 .../codewriter/cpp/generator/Generator.cpp            | 10 ++++++++--
 .../codegeneration/codegenerator/helper/ReaderInfo.h  |  1 +
 .../codegeneration/codegenerator/helper/WriterInfo.h  |  1 +
 4 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/Writer.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/Writer.cpp
index e6e6c075a..a597e8ecc 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/Writer.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/Writer.cpp
@@ -305,6 +305,11 @@ namespace armarx::aron::codegenerator::cpp
                 {
                     c->addInclude(info.include);
                 }
+
+                if (type->getExtends() != nullptr)
+                {
+                    info.extends = true;
+                }
                 CppMethodPtr convert = generator.toSpecializedDataWriterMethod(info);
                 c->addPublicMethod(convert);
             }
@@ -338,6 +343,11 @@ namespace armarx::aron::codegenerator::cpp
                 {
                     c->addInclude(info.include);
                 }
+
+                if (type->getExtends() != nullptr)
+                {
+                    info.extends = true;
+                }
                 CppMethodPtr convert = generator.toSpecializedDataReaderMethod(info);
                 c->addPublicMethod(convert);
             }
@@ -416,6 +426,7 @@ namespace armarx::aron::codegenerator::cpp
                 {
                     c->addInclude(info.include);
                 }
+
                 CppMethodPtr convert = generator.toSpecializedDataWriterMethod(info);
                 c->addPublicMethod(convert);
             }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp
index 18dd38f6e..a0715b220 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp
@@ -317,7 +317,10 @@ namespace armarx::aron::codegenerator::cpp
         doc << "@brief " << info.methodName << "() - This method returns a new data from the member data types using a writer implementation. \n";
         doc << "@return - the result of the writer implementation";
 
-        CppMethodPtr m = CppMethodPtr(new CppMethod(info.returnType + " " + info.methodName + "() const", doc.str()));
+        const std::string fin = info.extends ? " final" : "";
+        const std::string virt = info.extends ? "" : "virtual ";
+
+        CppMethodPtr m = CppMethodPtr(new CppMethod(virt + info.returnType + " " + info.methodName + "() const" + fin, doc.str()));
         m->addLine(info.writerClassType + " writer;");
         m->addLine("return " + info.enforceConversion + "(this->write(writer))" + info.enforceMemberAccess + ";");
 
@@ -331,7 +334,10 @@ namespace armarx::aron::codegenerator::cpp
         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("void " + info.methodName + "(const " + info.argumentType + "& input)", doc.str()));
+        const std::string fin = info.extends ? " final" : "";
+        const std::string virt = info.extends ? "" : "virtual ";
+
+        CppMethodPtr m = CppMethodPtr(new CppMethod(virt + "void " + info.methodName + "(const " + info.argumentType + "& input)" + fin, doc.str()));
         m->addLine(info.readerClassType + " reader;");
         m->addLine("this->read(reader, " + info.enforceConversion + "(input)" + info.enforceMemberAccess + ");");
 
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/helper/ReaderInfo.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/helper/ReaderInfo.h
index 3bda10de7..58dda6381 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/helper/ReaderInfo.h
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/helper/ReaderInfo.h
@@ -37,6 +37,7 @@ namespace armarx::aron::codegenerator
         std::string include;
         std::string enforceConversion = "";
         std::string enforceMemberAccess = "";
+        bool extends = false;
     };
 
 
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/helper/WriterInfo.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/helper/WriterInfo.h
index 1989ac5de..d3cff5ef8 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/helper/WriterInfo.h
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/helper/WriterInfo.h
@@ -37,5 +37,6 @@ namespace armarx::aron::codegenerator
         std::string include;
         std::string enforceConversion = "";
         std::string enforceMemberAccess = "";
+        bool extends = false;
     };
 }
-- 
GitLab