From 2f5f50805c2b641a027fc3b00efc84423b52020b Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Mon, 8 Feb 2021 09:25:47 +0100
Subject: [PATCH] Refactor and fix MaxHistorySize, add to CoreSegment

---
 .../RobotAPI/libraries/armem/CMakeLists.txt   |  3 ++
 .../libraries/armem/core/CoreSegment.cpp      | 11 +++++++
 .../libraries/armem/core/CoreSegment.h        | 13 +++++++-
 source/RobotAPI/libraries/armem/core/Entity.h |  2 --
 .../libraries/armem/core/ProviderSegment.cpp  |  2 +-
 .../libraries/armem/core/ProviderSegment.h    | 14 ++++-----
 .../armem/core/detail/MaxHistorySize.cpp      | 19 ++++++++++++
 .../armem/core/detail/MaxHistorySize.h        | 31 +++++++++++++++++++
 8 files changed, 83 insertions(+), 12 deletions(-)
 create mode 100644 source/RobotAPI/libraries/armem/core/detail/MaxHistorySize.cpp
 create mode 100644 source/RobotAPI/libraries/armem/core/detail/MaxHistorySize.h

diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt
index 644c655fa..5e85729b1 100644
--- a/source/RobotAPI/libraries/armem/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem/CMakeLists.txt
@@ -28,7 +28,9 @@ set(LIB_FILES
     core/ice_conversions.cpp
     core/Memory.cpp
     core/ProviderSegment.cpp
+
     core/detail/MemoryItem.cpp
+    core/detail/MaxHistorySize.cpp
 
     core/error/ArMemError.cpp
 
@@ -88,6 +90,7 @@ set(LIB_HEADERS
     core/ProviderSegment.h
 
     core/detail/EntityContainer.h
+    core/detail/MaxHistorySize.h
     core/detail/MemoryContainer.h
     core/detail/MemoryItem.h
     core/detail/TypedEntityContainer.h
diff --git a/source/RobotAPI/libraries/armem/core/CoreSegment.cpp b/source/RobotAPI/libraries/armem/core/CoreSegment.cpp
index 16e3b4291..34f73cbdf 100644
--- a/source/RobotAPI/libraries/armem/core/CoreSegment.cpp
+++ b/source/RobotAPI/libraries/armem/core/CoreSegment.cpp
@@ -126,11 +126,22 @@ namespace armarx::armem
             throw armem::error::ContainerEntryAlreadyExists(
                 providerSegment.getLevelName(), providerSegment.name(), getLevelName(), this->name());
         }
+
         auto it = providerSegments.emplace(providerSegment.name(), std::move(providerSegment)).first;
         it->second.id().setCoreSegmentID(id());
+        it->second.setMaxHistorySize(maxHistorySize);
         return it->second;
     }
 
+    void CoreSegment::setMaxHistorySize(long maxSize)
+    {
+        MaxHistorySize::setMaxHistorySize(maxSize);
+        for (auto& [name, seg] : providerSegments)
+        {
+            seg.setMaxHistorySize(maxSize);
+        }
+    }
+
     std::string CoreSegment::getLevelName() const
     {
         return "core segment";
diff --git a/source/RobotAPI/libraries/armem/core/CoreSegment.h b/source/RobotAPI/libraries/armem/core/CoreSegment.h
index 68bf7dc4e..aed697fb0 100644
--- a/source/RobotAPI/libraries/armem/core/CoreSegment.h
+++ b/source/RobotAPI/libraries/armem/core/CoreSegment.h
@@ -5,6 +5,7 @@
 
 #include "ProviderSegment.h"
 #include "detail/TypedEntityContainer.h"
+#include "detail/MaxHistorySize.h"
 
 
 namespace armarx::armem
@@ -13,7 +14,9 @@ namespace armarx::armem
     /**
      * @brief Data of a core segment containing multiple provider segments.
      */
-    class CoreSegment : public detail::TypedEntityContainer<ProviderSegment, CoreSegment>
+    class CoreSegment :
+        public detail::TypedEntityContainer<ProviderSegment, CoreSegment>
+        , public detail::MaxHistorySize
     {
         using Base = detail::TypedEntityContainer<ProviderSegment, CoreSegment>;
 
@@ -59,6 +62,14 @@ namespace armarx::armem
         ProviderSegment& addProviderSegment(ProviderSegment&& providerSegment);
 
 
+        /**
+         * @brief Sets the maximum history size of entities in this segment.
+         * This affects all current entities as well as new ones.
+         * @see Entity::setMaxHistorySize()
+         */
+        void setMaxHistorySize(long maxSize) override;
+
+
         bool equalsDeep(const CoreSegment& other) const;
 
 
diff --git a/source/RobotAPI/libraries/armem/core/Entity.h b/source/RobotAPI/libraries/armem/core/Entity.h
index 51d55aa49..b81ffe761 100644
--- a/source/RobotAPI/libraries/armem/core/Entity.h
+++ b/source/RobotAPI/libraries/armem/core/Entity.h
@@ -169,8 +169,6 @@ namespace armarx::armem
         // ToDo: Add max age;
         // ToDo in future: keep/remove predicate
 
-
-
         // MemoryItem interface
     public:
         std::string getKeyString() const override
diff --git a/source/RobotAPI/libraries/armem/core/ProviderSegment.cpp b/source/RobotAPI/libraries/armem/core/ProviderSegment.cpp
index 28010d765..fb0ca8cc8 100644
--- a/source/RobotAPI/libraries/armem/core/ProviderSegment.cpp
+++ b/source/RobotAPI/libraries/armem/core/ProviderSegment.cpp
@@ -154,7 +154,7 @@ namespace armarx::armem
 
     void ProviderSegment::setMaxHistorySize(long maxSize)
     {
-        this->maxHistorySize = maxSize;
+        MaxHistorySize::setMaxHistorySize(maxSize);
         for (auto& [name, entity] : entities)
         {
             entity.setMaxHistorySize(maxSize);
diff --git a/source/RobotAPI/libraries/armem/core/ProviderSegment.h b/source/RobotAPI/libraries/armem/core/ProviderSegment.h
index ecfa53be2..384ee1b41 100644
--- a/source/RobotAPI/libraries/armem/core/ProviderSegment.h
+++ b/source/RobotAPI/libraries/armem/core/ProviderSegment.h
@@ -5,6 +5,7 @@
 
 #include "Entity.h"
 #include "detail/TypedEntityContainer.h"
+#include "detail/MaxHistorySize.h"
 
 
 namespace armarx::armem
@@ -13,7 +14,10 @@ namespace armarx::armem
     /**
      * @brief Data of a provider segment containing multiple entities.
      */
-    class ProviderSegment : public detail::TypedEntityContainer<Entity, ProviderSegment>
+    class ProviderSegment :
+        public detail::TypedEntityContainer<Entity, ProviderSegment>
+        , public detail::MaxHistorySize
+
     {
         using Base = detail::TypedEntityContainer<Entity, ProviderSegment>;
 
@@ -66,7 +70,7 @@ namespace armarx::armem
          * This affects all current entities as well as new ones.
          * @see Entity::setMaxHistorySize()
          */
-        void setMaxHistorySize(long maxSize);
+        void setMaxHistorySize(long maxSize) override;
 
 
         bool equalsDeep(const ProviderSegment& other) const;
@@ -88,12 +92,6 @@ namespace armarx::armem
         /// The entities.
         std::map<std::string, Entity> entities;
 
-        /**
-         * @brief Maximum size of entity histories.
-         * @see Entity::maxHstorySize
-         */
-        long maxHistorySize = -1;
-
     };
 
 }
diff --git a/source/RobotAPI/libraries/armem/core/detail/MaxHistorySize.cpp b/source/RobotAPI/libraries/armem/core/detail/MaxHistorySize.cpp
new file mode 100644
index 000000000..cdd34e3be
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/core/detail/MaxHistorySize.cpp
@@ -0,0 +1,19 @@
+#include "MaxHistorySize.h"
+
+
+namespace armarx::armem::detail
+{
+    MaxHistorySize::~MaxHistorySize()
+    {
+    }
+
+    void MaxHistorySize::setMaxHistorySize(long maxSize)
+    {
+        this->maxHistorySize = maxSize;
+    }
+
+    long MaxHistorySize::getMaxHistorySize() const
+    {
+        return maxHistorySize;
+    }
+}
diff --git a/source/RobotAPI/libraries/armem/core/detail/MaxHistorySize.h b/source/RobotAPI/libraries/armem/core/detail/MaxHistorySize.h
new file mode 100644
index 000000000..d96e73296
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/core/detail/MaxHistorySize.h
@@ -0,0 +1,31 @@
+#pragma once
+
+
+
+namespace armarx::armem::detail
+{
+    class MaxHistorySize
+    {
+    public:
+
+        virtual ~MaxHistorySize();
+
+        /**
+         * @brief Sets the maximum history size of entities in this segment.
+         * This affects all current entities as well as new ones.
+         * @see Entity::setMaxHistorySize()
+         */
+        virtual void setMaxHistorySize(long maxSize);
+        virtual long getMaxHistorySize() const;
+
+
+    protected:
+
+        /**
+         * @brief Maximum size of entity histories.
+         * @see Entity::maxHstorySize
+         */
+        long maxHistorySize = -1;
+
+    };
+}
-- 
GitLab