From 0000bccd8336ab1ffebfd69cb82a8ed75e35457b Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Wed, 27 Oct 2021 09:46:43 +0200
Subject: [PATCH] Allow passing server memory to disk ltm

---
 .../armem/server/ltm/disk/CoreSegment.cpp     | 26 +++++++++++++-----
 .../armem/server/ltm/disk/CoreSegment.h       |  7 ++++-
 .../armem/server/ltm/disk/Entity.cpp          | 18 +++++++++++--
 .../libraries/armem/server/ltm/disk/Entity.h  |  5 ++++
 .../armem/server/ltm/disk/EntitySnapshot.h    |  1 +
 .../armem/server/ltm/disk/Memory.cpp          | 27 ++++++++++++++-----
 .../libraries/armem/server/ltm/disk/Memory.h  |  8 +++++-
 .../armem/server/ltm/disk/ProviderSegment.cpp | 25 +++++++++++++----
 .../armem/server/ltm/disk/ProviderSegment.h   |  6 +++++
 9 files changed, 100 insertions(+), 23 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp
index 5de81875d..b8715d2ad 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp
@@ -1,10 +1,11 @@
-// Header
 #include "CoreSegment.h"
 
-// ArmarX
 #include <ArmarXCore/core/time/TimeUtil.h>
 #include <ArmarXCore/core/logging/Logging.h>
 
+#include <RobotAPI/libraries/armem/server/wm/memory_definitions.h>
+
+
 namespace armarx::armem::server::ltm::disk
 {
     namespace
@@ -88,13 +89,24 @@ namespace armarx::armem::server::ltm::disk
         });
     }
 
-    void CoreSegment::store(const armem::wm::CoreSegment& c)
+    template <class CoreSegmentT>
+    void CoreSegment::_store(const CoreSegmentT& c)
     {
-        c.forEachProviderSegment([this](const armem::wm::ProviderSegment& e)
+        c.forEachProviderSegment([this](const auto& provSegment)
         {
-            util::ensureFolderExists(std::filesystem::path(path) / e.id().providerSegmentName);
-            ProviderSegment c(std::filesystem::path(path) / e.id().providerSegmentName);
-            c.store(e);
+            util::ensureFolderExists(std::filesystem::path(path) / provSegment.id().providerSegmentName);
+            ProviderSegment c(std::filesystem::path(path) / provSegment.id().providerSegmentName);
+            c.store(provSegment);
         });
     }
+
+    void CoreSegment::store(const armem::wm::CoreSegment& c)
+    {
+        this->_store(c);
+    }
+
+    void CoreSegment::store(const armem::server::wm::CoreSegment& c)
+    {
+        this->_store(c);
+    }
 }
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.h b/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.h
index a0d3872ce..5fe95ba66 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.h
@@ -20,7 +20,8 @@ namespace armarx::armem::server::ltm::disk
 
         armem::wm::CoreSegment loadAll() override;
         void convert(armem::wm::CoreSegment&) override;
-        void store(const armem::wm::CoreSegment&) override;
+        void store(const armem::wm::CoreSegment& coreSegment) override;
+        void store(const armem::server::wm::CoreSegment& coreSegment);
 
         bool forEachProviderSegment(std::function<void(ProviderSegment&)>&& func) const override;
 
@@ -28,6 +29,10 @@ namespace armarx::armem::server::ltm::disk
 
     protected:
         std::string getExpectedFolderName() const override;
+
+    private:
+        template <class CoreSegmentT> void _store(const CoreSegmentT& coreSegment);
+
     };
 
 } // namespace armarx::armem::server::ltm::disk
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/Entity.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/Entity.cpp
index 5ddabc38e..42acf001b 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/Entity.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/Entity.cpp
@@ -5,6 +5,9 @@
 #include <ArmarXCore/core/time/TimeUtil.h>
 #include <ArmarXCore/core/logging/Logging.h>
 
+#include <RobotAPI/libraries/armem/server/wm/memory_definitions.h>
+
+
 namespace armarx::armem::server::ltm::disk
 {
 
@@ -136,13 +139,24 @@ namespace armarx::armem::server::ltm::disk
         });
     }
 
-    void Entity::store(const armem::wm::Entity& c)
+    template <class EntityT>
+    void Entity::_store(const EntityT& entity)
     {
-        c.forEachSnapshot([this](armem::wm::EntitySnapshot& e)
+        entity.forEachSnapshot([this](armem::wm::EntitySnapshot& e)
         {
             util::ensureFolderExists(std::filesystem::path(path) / std::to_string(e.id().timestamp.toMicroSeconds()));
             EntitySnapshot c(std::filesystem::path(path) / std::to_string(e.id().timestamp.toMicroSeconds()));
             c.store(e);
         });
     }
+
+    void Entity::store(const armem::wm::Entity& c)
+    {
+        this->_store(c);
+    }
+    void Entity::store(const armem::server::wm::Entity& c)
+    {
+        this->_store(c);
+    }
+
 }
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/Entity.h b/source/RobotAPI/libraries/armem/server/ltm/disk/Entity.h
index 48b46c34e..e07e50b94 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/Entity.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/Entity.h
@@ -22,6 +22,7 @@ namespace armarx::armem::server::ltm::disk
         armem::wm::Entity loadAll() override;
         void convert(armem::wm::Entity&) override;
         void store(const armem::wm::Entity&) override;
+        void store(const armem::server::wm::Entity&);
 
         bool forEachSnapshot(std::function<void(EntitySnapshot&)>&& func) const override;
         bool forEachSnapshotInIndexRange(long first, long last, std::function<void(EntitySnapshot&)>&& func) const override;
@@ -38,6 +39,10 @@ namespace armarx::armem::server::ltm::disk
 
     protected:
         std::string getExpectedFolderName() const override;
+
+    private:
+        template <class EntityT> void _store(const EntityT& entity);
+
     };
 
 } // namespace armarx::armem::server::ltm::disk
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.h b/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.h
index d93a62c9c..eef8d674f 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.h
@@ -23,6 +23,7 @@ namespace armarx::armem::server::ltm::disk
 
     protected:
         std::string getExpectedFolderName() const override;
+
     };
 
 } // namespace armarx::armem::server::ltm::disk
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp
index b75a3f557..aef82fa5f 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp
@@ -1,10 +1,11 @@
-// Header
 #include "Memory.h"
 
-// ArmarX
 #include <ArmarXCore/core/time/TimeUtil.h>
 #include <ArmarXCore/core/logging/Logging.h>
 
+#include <RobotAPI/libraries/armem/server/wm/memory_definitions.h>
+
+
 namespace armarx::armem::server::ltm::disk
 {
     namespace
@@ -116,7 +117,8 @@ namespace armarx::armem::server::ltm::disk
         TIMING_END_STREAM(LTM_Memory_Convert, ARMARX_DEBUG);
     }
 
-    void Memory::store(const armem::wm::Memory& m)
+    template <class MemoryT>
+    void Memory::_store(const MemoryT& memory)
     {
         TIMING_START(LTM_Memory_Store);
 
@@ -127,11 +129,11 @@ namespace armarx::armem::server::ltm::disk
 
         std::lock_guard l(ltm_mutex);
 
-        m.forEachCoreSegment([this](const armem::wm::CoreSegment& e)
+        memory.forEachCoreSegment([this](const auto& core)
         {
-            util::ensureFolderExists(std::filesystem::path(path) / e.id().coreSegmentName);
-            CoreSegment c(std::filesystem::path(path) / e.id().coreSegmentName);
-            c.store(e);
+            util::ensureFolderExists(std::filesystem::path(path) / core.id().coreSegmentName);
+            CoreSegment c(std::filesystem::path(path) / core.id().coreSegmentName);
+            c.store(core);
         });
 
         // Finaly clear cache and put reference to lut
@@ -139,4 +141,15 @@ namespace armarx::armem::server::ltm::disk
 
         TIMING_END_STREAM(LTM_Memory_Store, ARMARX_DEBUG);
     }
+
+    void Memory::store(const armem::wm::Memory& m)
+    {
+        this->_store(m);
+    }
+
+    void Memory::store(const armem::server::wm::Memory& m)
+    {
+        this->_store(m);
+    }
+
 }
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.h b/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.h
index e9e422577..26ca95817 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.h
@@ -3,7 +3,7 @@
 #include <filesystem>
 
 // Base Class
-#include "../base/detail/BufferedMemoryBase.h"
+#include <RobotAPI/libraries/armem/server/ltm/base/detail/BufferedMemoryBase.h>
 #include "detail/DiskStorage.h"
 
 #include "CoreSegment.h"
@@ -22,7 +22,9 @@ namespace armarx::armem::server::ltm::disk
 
         armem::wm::Memory loadAll() override;
         void convert(armem::wm::Memory&) override;
+
         void store(const armem::wm::Memory&) override;
+        void store(const armem::server::wm::Memory&);
 
         bool forEachCoreSegment(std::function<void(CoreSegment&)>&& func) const override;
 
@@ -30,5 +32,9 @@ namespace armarx::armem::server::ltm::disk
 
     protected:
         std::string getExpectedFolderName() const override;
+
+    private:
+        template <class MemoryT> void _store(const MemoryT& memory);
+
     };
 } // namespace armarx::armem::server::ltm::disk
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp
index bc3310c11..d5690e359 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp
@@ -5,6 +5,9 @@
 #include <ArmarXCore/core/time/TimeUtil.h>
 #include <ArmarXCore/core/logging/Logging.h>
 
+#include <RobotAPI/libraries/armem/server/wm/memory_definitions.h>
+
+
 namespace armarx::armem::server::ltm::disk
 {
     namespace
@@ -89,13 +92,25 @@ namespace armarx::armem::server::ltm::disk
         });
     }
 
-    void ProviderSegment::store(const armem::wm::ProviderSegment& p)
+
+    template <class ProviderSegmentT>
+    void ProviderSegment::_store(const ProviderSegmentT& providerSegment)
     {
-        p.forEachEntity([this](const armem::wm::Entity& e)
+        providerSegment.forEachEntity([this](const auto& entity)
         {
-            util::ensureFolderExists(std::filesystem::path(path) / e.id().entityName);
-            Entity c(std::filesystem::path(path) / e.id().entityName);
-            c.store(e);
+            util::ensureFolderExists(std::filesystem::path(path) / entity.id().entityName);
+            Entity c(std::filesystem::path(path) / entity.id().entityName);
+            c.store(entity);
         });
     }
+
+    void ProviderSegment::store(const armem::wm::ProviderSegment& p)
+    {
+        this->_store(p);
+    }
+
+    void ProviderSegment::store(const armem::server::wm::ProviderSegment& p)
+    {
+        this->_store(p);
+    }
 }
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.h b/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.h
index 45ed5c8ac..52cef6f16 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.h
@@ -21,6 +21,7 @@ namespace armarx::armem::server::ltm::disk
         armem::wm::ProviderSegment loadAll() override;
         void convert(armem::wm::ProviderSegment&) override;
         void store(const armem::wm::ProviderSegment&) override;
+        void store(const armem::server::wm::ProviderSegment&);
 
         bool forEachEntity(std::function<void(Entity&)>&& func) const override;
 
@@ -28,6 +29,11 @@ namespace armarx::armem::server::ltm::disk
 
     protected:
         std::string getExpectedFolderName() const override;
+
+
+    private:
+        template <class ProviderSegmentT> void _store(const ProviderSegmentT& providerSegment);
+
     };
 
 } // namespace armarx::armem::server::ltm::disk
-- 
GitLab