From 4096f771df2248cd4d96a31010b4855912e0506e Mon Sep 17 00:00:00 2001
From: "fabian.peller-konrad@kit.edu" <fabian.peller-konrad@kit.edu>
Date: Thu, 18 Mar 2021 10:24:10 +0100
Subject: [PATCH] Aron now generates an EnumClass

---
 source/RobotAPI/interface/CMakeLists.txt      |  2 +
 source/RobotAPI/interface/armem/io.ice        | 50 +++++++++++++++++++
 .../armem/server/LongTermMemoryInterface.ice  | 19 +++++++
 .../armem/server/MemoryInterface.ice          |  1 +
 .../codegenerator/codeWriter/cpp/Writer.cpp   |  1 +
 .../cpp/serializer/toplevel/IntEnumClass.cpp  | 21 ++++++--
 .../cpp/serializer/toplevel/IntEnumClass.h    |  1 +
 7 files changed, 90 insertions(+), 5 deletions(-)
 create mode 100644 source/RobotAPI/interface/armem/io.ice
 create mode 100644 source/RobotAPI/interface/armem/server/LongTermMemoryInterface.ice

diff --git a/source/RobotAPI/interface/CMakeLists.txt b/source/RobotAPI/interface/CMakeLists.txt
index 7ee210481..547fb0833 100644
--- a/source/RobotAPI/interface/CMakeLists.txt
+++ b/source/RobotAPI/interface/CMakeLists.txt
@@ -104,6 +104,7 @@ set(SLICE_FILES
 
 
     armem.ice
+    armem/io.ice
     armem/commit.ice
     armem/memory.ice
     armem/query.ice
@@ -112,6 +113,7 @@ set(SLICE_FILES
     armem/client/MemoryListenerInterface.ice
 
     armem/server.ice
+    armem/server/LongTermMemoryInterface.ice
     armem/server/MemoryInterface.ice
     armem/server/MemoryPredictorInterface.ice
     armem/server/ReadingMemoryInterface.ice
diff --git a/source/RobotAPI/interface/armem/io.ice b/source/RobotAPI/interface/armem/io.ice
new file mode 100644
index 000000000..51c5f42b2
--- /dev/null
+++ b/source/RobotAPI/interface/armem/io.ice
@@ -0,0 +1,50 @@
+#pragma once
+
+#include <ArmarXCore/interface/core/PackagePath.ice>
+
+module armarx
+{
+    module armem
+    {
+        module data
+        {
+            struct LoadInput
+            {
+                armarx::data::PackagePath path;
+            };
+
+            struct LoadResult
+            {
+                bool success = false;
+                long timeStartedMicroSeconds;
+                long timeFinishedMicroSeconds;
+
+                long numLoadedCoreSegments;
+                long numLoadedProviderSegments;
+                long numLoadedEntities;
+                long numLoadedEntitySnapshots;
+
+                string errorMessage;
+            };
+
+            struct StoreInput
+            {
+                armarx::data::PackagePath path;
+            };
+
+            struct StoreResult
+            {
+                bool success = false;
+                long timeStartedMicroSeconds;
+                long timeFinishedMicroSeconds;
+
+                long numStoredCoreSegments;
+                long numStoredLoadedProviderSegments;
+                long numStoredLoadedEntities;
+                long numStoredLoadedEntitySnapshots;
+
+                string errorMessage;
+            };
+        };
+    };
+};
diff --git a/source/RobotAPI/interface/armem/server/LongTermMemoryInterface.ice b/source/RobotAPI/interface/armem/server/LongTermMemoryInterface.ice
new file mode 100644
index 000000000..ba64d626c
--- /dev/null
+++ b/source/RobotAPI/interface/armem/server/LongTermMemoryInterface.ice
@@ -0,0 +1,19 @@
+#pragma once
+
+#include <RobotAPI/interface/armem/io.ice>
+
+
+module armarx
+{
+    module armem
+    {        
+        module server
+        {
+            interface LongTermMemoryInterface
+            {
+                data::LoadResult load(data::LoadInput input);
+                data::StoreResult store(data::StoreInput input);
+            };
+        };
+    };
+};
diff --git a/source/RobotAPI/interface/armem/server/MemoryInterface.ice b/source/RobotAPI/interface/armem/server/MemoryInterface.ice
index 2764998e2..93213eed1 100644
--- a/source/RobotAPI/interface/armem/server/MemoryInterface.ice
+++ b/source/RobotAPI/interface/armem/server/MemoryInterface.ice
@@ -3,6 +3,7 @@
 #include <RobotAPI/interface/armem/server/ReadingMemoryInterface.ice>
 #include <RobotAPI/interface/armem/server/WritingMemoryInterface.ice>
 
+#include <RobotAPI/interface/armem/server/LongTermMemoryInterface.ice>
 
 module armarx
 {
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 d7df863de..e1481de91 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp
@@ -264,6 +264,7 @@ namespace armarx::aron::cppcodegenerator
 
             // ctor
             c->addCtor(serializer->toCtor(c->getName()));
+            c->addCtor(serializer->toInnerEnumCtor(c->getName()));
 
             // Specific methods
             CppEnumPtr enumrepresentation = serializer->toInnerEnumDefinition();
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp
index 416d8c613..975086d44 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp
@@ -30,7 +30,7 @@ namespace armarx::aron::cppcodegenerator::serializer
     IntEnumClassSerializer::IntEnumClassSerializer(const typenavigator::IntEnumNavigatorPtr& n) :
         Serializer(n->getEnumName(), simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronIntEnum))),
         navigator(n),
-        enumName(navigator->getEnumName() + "Enum")
+        enumName("__ImplEnum")
     {
     }
 
@@ -48,11 +48,14 @@ namespace armarx::aron::cppcodegenerator::serializer
         value_to_enum << "{" << std::endl;
         for (const auto& [key, value] : navigator->getAcceptedValues())
         {
-            enum_to_name << "\t\t{" << key << ", \"" << key << "\"}," << std::endl;
-            name_to_enum << "\t\t{\"" << key << "\", " << key << "}," << std::endl;
+            std::string enumKeyWithNamespace = enumName + "::" + key;
+            fields.push_back(std::make_shared<CppField>("const static " + enumName, key + " = " + enumKeyWithNamespace));
 
-            enum_to_value << "\t\t{" << key << ", " << value << "}," << std::endl;
-            value_to_enum << "\t\t{" << value << ", " << key << "}," << std::endl;
+            enum_to_name << "\t\t{" << enumKeyWithNamespace << ", \"" << key << "\"}," << std::endl;
+            name_to_enum << "\t\t{\"" << key << "\", " << enumKeyWithNamespace << "}," << std::endl;
+
+            enum_to_value << "\t\t{" << enumKeyWithNamespace << ", " << value << "}," << std::endl;
+            value_to_enum << "\t\t{" << value << ", " << enumKeyWithNamespace << "}," << std::endl;
         }
 
         enum_to_name << "\t}";
@@ -133,6 +136,14 @@ namespace armarx::aron::cppcodegenerator::serializer
         return b;
     }
 
+    CppCtorPtr IntEnumClassSerializer::toInnerEnumCtor(const std::string& name) const
+    {
+        CppCtorPtr c = std::make_shared<CppCtor>(name + "(const " + enumName + " e)");
+        std::vector<std::pair<std::string, std::string>> initList = {{"value", "e"}};
+        c->addInitListEntries(initList);
+        return c;
+    }
+
     CppEnumPtr IntEnumClassSerializer::toInnerEnumDefinition() const
     {
         CppEnumPtr e = std::make_shared<CppEnum>(enumName, "The internal enum definition of the enum of this autogenerated class.");
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h
index ba64400af..a199fe4fe 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h
@@ -61,6 +61,7 @@ namespace armarx::aron::cppcodegenerator::serializer
         virtual CppBlockPtr getReadBlock(const std::string&) const override;
         virtual CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override;
 
+        CppCtorPtr toInnerEnumCtor(const std::string&) const;
         CppEnumPtr toInnerEnumDefinition() const;
         CppMethodPtr toIntMethod() const;
         CppMethodPtr toEnumAssignmentMethod() const;
-- 
GitLab