From 3bc7c9159b0a710a41d28e58c58e2cda1850f697 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Wed, 21 Jul 2021 15:26:14 +0200
Subject: [PATCH] Derive from SpecializedSegment

---
 .../RobotAPI/libraries/armem/CMakeLists.txt   |  2 ++
 .../armem_objects/server/class/Segment.cpp    | 36 +++++++++----------
 .../armem_objects/server/class/Segment.h      | 24 +++++--------
 .../armem_objects/server/instance/Segment.cpp | 36 +++++++++----------
 .../armem_objects/server/instance/Segment.h   | 32 ++++++++---------
 5 files changed, 59 insertions(+), 71 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt
index ae63606b7..501500e67 100644
--- a/source/RobotAPI/libraries/armem/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem/CMakeLists.txt
@@ -105,6 +105,7 @@ set(LIB_FILES
     server/RemoteGuiAronDataVisitor.cpp
 
     server/segment/SpecializedSegment.cpp
+
     server/query_proc/base/BaseQueryProcessorBase.cpp
     server/query_proc/base/EntityQueryProcessorBase.cpp
     server/query_proc/base/ProviderSegmentQueryProcessorBase.cpp
@@ -227,6 +228,7 @@ set(LIB_HEADERS
     server/RemoteGuiAronDataVisitor.h
 
     server/segment/SpecializedSegment.h
+
     server/query_proc.h
     server/query_proc/base/BaseQueryProcessorBase.h
     server/query_proc/base/EntityQueryProcessorBase.h
diff --git a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
index a1f678d52..22608257c 100644
--- a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
@@ -3,9 +3,11 @@
 #include <RobotAPI/libraries/aron/core/Exception.h>
 #include <RobotAPI/libraries/aron/common/aron_conversions.h>
 #include <RobotAPI/libraries/ArmarXObjects/aron_conversions.h>
+#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
 #include <RobotAPI/libraries/armem_objects/aron_conversions.h>
+#include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h>
 
-#include <ArmarXCore/core/Component.h>
+#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
 #include <ArmarXCore/core/time/TimeUtil.h>
 
 #include <SimoxUtility/color/Color.h>
@@ -20,16 +22,20 @@ namespace armarx::armem::server::obj::clazz
 {
 
     Segment::Segment(armem::server::MemoryToIceAdapter& memoryToIceAdapter) :
-        iceMemory(memoryToIceAdapter)
+        SpecializedSegment(memoryToIceAdapter,
+                           arondto::ObjectClass::toAronType(), "Class", -1)
+    {
+    }
+
+
+    Segment::~Segment()
     {
-        Logging::setTag("ClassSegment");
     }
 
 
     void Segment::defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix)
     {
-        defs->optional(p.coreSegmentName, prefix + "CoreSegmentName", "Name of the object clazz core segment.");
-        defs->optional(p.maxHistorySize, prefix + "MaxHistorySize", "Maximal size of object poses history (-1 for infinite).");
+        SpecializedSegment::defineProperties(defs, prefix);
 
         defs->optional(p.objectsPackage, prefix + "ObjectsPackage", "Name of the objects package to load from.");
         defs->optional(p.loadFromObjectsPackage, prefix + "LoadFromObjectsPackage",
@@ -41,10 +47,7 @@ namespace armarx::armem::server::obj::clazz
 
     void Segment::init()
     {
-        ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory);
-
-        coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreSegmentName, arondto::ObjectClass::toAronType());
-        coreSegment->setMaxHistorySize(p.maxHistorySize);
+        SpecializedSegment::init();
 
         if (p.loadFromObjectsPackage)
         {
@@ -62,13 +65,6 @@ namespace armarx::armem::server::obj::clazz
     }
 
 
-    std::mutex& Segment::mutex() const
-    {
-        ARMARX_CHECK_NOT_NULL(coreSegment);
-        return coreSegment->mutex();
-    }
-
-
     void Segment::loadByObjectFinder(const std::string& objectsPackage)
     {
         loadByObjectFinder(ObjectFinder(objectsPackage));
@@ -244,9 +240,9 @@ namespace armarx::armem::server::obj::clazz
 
         reloadButton.setLabel("Reload");
 
-        maxHistorySize.setValue(std::max(1, int(segment.p.maxHistorySize)));
+        maxHistorySize.setValue(std::max(1, int(segment.properties.maxHistorySize)));
         maxHistorySize.setRange(1, 1e6);
-        infiniteHistory.setValue(segment.p.maxHistorySize == -1);
+        infiniteHistory.setValue(segment.properties.maxHistorySize == -1);
 
         GridLayout grid;
         int row = 0;
@@ -274,10 +270,10 @@ namespace armarx::armem::server::obj::clazz
         if (infiniteHistory.hasValueChanged() || maxHistorySize.hasValueChanged())
         {
             std::scoped_lock lock(segment.mutex());
-            segment.p.maxHistorySize = infiniteHistory.getValue() ? -1 : maxHistorySize.getValue();
+            segment.properties.maxHistorySize = infiniteHistory.getValue() ? -1 : maxHistorySize.getValue();
             if (segment.coreSegment)
             {
-                segment.coreSegment->setMaxHistorySize(long(segment.p.maxHistorySize));
+                segment.coreSegment->setMaxHistorySize(long(segment.properties.maxHistorySize));
             }
         }
     }
diff --git a/source/RobotAPI/libraries/armem_objects/server/class/Segment.h b/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
index 03dce0e9a..15c7c4f37 100644
--- a/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
+++ b/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
@@ -3,9 +3,6 @@
 #include <mutex>
 #include <string>
 
-#include <ArmarXCore/core/logging/Logging.h>
-#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
-
 #include <ArmarXGui/libraries/RemoteGui/Client/Widgets.h>
 
 #include <RobotAPI/components/ArViz/Client/Client.h>
@@ -13,26 +10,29 @@
 #include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h>
 
 #include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
-#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
-#include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h>
+#include <RobotAPI/libraries/armem/server/segment/SpecializedSegment.h>
 #include <RobotAPI/libraries/armem_objects/server/class/FloorVis.h>
 
 
+namespace armarx::armem::arondto
+{
+    class ObjectClass;
+}
 namespace armarx::armem::server::obj::clazz
 {
 
-    class Segment : public armarx::Logging
+    class Segment : public segment::SpecializedSegment
     {
     public:
 
         Segment(armem::server::MemoryToIceAdapter& iceMemory);
+        virtual ~Segment() override;
 
 
-        void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "");
-        void init();
+        void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "") override;
+        void init() override;
         void connect(viz::Client arviz);
 
-        std::mutex& mutex() const;
 
         void loadByObjectFinder(const std::string& objectsPackage);
         void loadByObjectFinder(const ObjectFinder& finder);
@@ -46,9 +46,6 @@ namespace armarx::armem::server::obj::clazz
 
     private:
 
-        armem::server::MemoryToIceAdapter& iceMemory;
-        armem::wm::CoreSegment* coreSegment = nullptr;
-
         ObjectFinder objectFinder;
 
         viz::Client arviz;
@@ -57,9 +54,6 @@ namespace armarx::armem::server::obj::clazz
 
         struct Properties
         {
-            std::string coreSegmentName = "Class";
-            long maxHistorySize = -1;
-
             std::string objectsPackage = ObjectFinder::DefaultObjectsPackageName;
             bool loadFromObjectsPackage = true;
         };
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
index 1a18f84a1..09a412f4b 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
@@ -1,6 +1,7 @@
 #include "Segment.h"
 
 #include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h>
+#include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h>
 #include <RobotAPI/libraries/armem_objects/aron_conversions.h>
 #include <RobotAPI/libraries/armem_objects/SceneSnapshot.h>
 
@@ -10,6 +11,7 @@
 #include <RobotAPI/libraries/armem/client/Writer.h>
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/client/query/query_fns.h>
+#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
 #include <RobotAPI/libraries/armem/util/util.h>
 
 #include <RobotAPI/libraries/aron/common/aron_conversions.h>
@@ -43,10 +45,9 @@ namespace armarx::armem::server::obj::instance
 {
 
     Segment::Segment(armem::server::MemoryToIceAdapter& memoryToIceAdapter) :
-        iceMemory(memoryToIceAdapter)
+        SpecializedSegment(memoryToIceAdapter,
+                           arondto::ObjectInstance::toAronType(), "Instance", 64)
     {
-        Logging::setTag("InstanceSegment");
-
         oobbCache.setFetchFn([this](const ObjectID & id) -> std::optional<simox::OrientedBoxf>
         {
             // Try to get OOBB from repository.
@@ -78,10 +79,15 @@ namespace armarx::armem::server::obj::instance
     }
 
 
+    Segment::~Segment()
+    {
+    }
+
+
     void Segment::defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix)
     {
-        defs->optional(p.coreSegmentName, prefix + "CoreSegmentName", "Name of the object instance core segment.");
-        defs->optional(p.maxHistorySize, prefix + "MaxHistorySize", "Maximal size of object poses history (-1 for infinite).");
+        SpecializedSegment::defineProperties(defs, prefix);
+
         defs->optional(p.discardSnapshotsWhileAttached, prefix + "DiscardSnapshotsWhileAttached",
                        "If true, no new snapshots are stored while an object is attached to a robot node.\n"
                        "If false, new snapshots are stored, but the attachment is kept in the new snapshots.");
@@ -101,10 +107,7 @@ namespace armarx::armem::server::obj::instance
 
     void Segment::init()
     {
-        ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory);
-
-        coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreSegmentName, arondto::ObjectInstance::toAronType());
-        coreSegment->setMaxHistorySize(p.maxHistorySize);
+        SpecializedSegment::init();
 
         if (not p.sceneSnapshotToLoad.empty())
         {
@@ -113,6 +116,7 @@ namespace armarx::armem::server::obj::instance
         }
     }
 
+
     void Segment::connect(viz::Client arviz)
     {
         (void) arviz;
@@ -122,12 +126,6 @@ namespace armarx::armem::server::obj::instance
     }
 
 
-    std::mutex& Segment::mutex() const
-    {
-        ARMARX_CHECK_NOT_NULL(coreSegment);
-        return coreSegment->mutex();
-    }
-
 
     Segment::CommitStats Segment::commitObjectPoses(
         const std::string& providerName,
@@ -994,9 +992,9 @@ namespace armarx::armem::server::obj::instance
     {
         using namespace armarx::RemoteGui::Client;
 
-        maxHistorySize.setValue(std::max(1, int(data.p.maxHistorySize)));
+        maxHistorySize.setValue(std::max(1, int(data.properties.maxHistorySize)));
         maxHistorySize.setRange(1, 1e6);
-        infiniteHistory.setValue(data.p.maxHistorySize == -1);
+        infiniteHistory.setValue(data.properties.maxHistorySize == -1);
         discardSnapshotsWhileAttached.setValue(data.p.discardSnapshotsWhileAttached);
 
         storeLoadLine.setValue("Scene_" + timestampPlaceholder);
@@ -1056,10 +1054,10 @@ namespace armarx::armem::server::obj::instance
 
             if (infiniteHistory.hasValueChanged() || maxHistorySize.hasValueChanged())
             {
-                segment.p.maxHistorySize = infiniteHistory.getValue() ? -1 : maxHistorySize.getValue();
+                segment.properties.maxHistorySize = infiniteHistory.getValue() ? -1 : maxHistorySize.getValue();
                 if (segment.coreSegment)
                 {
-                    segment.coreSegment->setMaxHistorySize(long(segment.p.maxHistorySize));
+                    segment.coreSegment->setMaxHistorySize(long(segment.properties.maxHistorySize));
                 }
             }
 
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
index 378cf02da..918a4efad 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
@@ -10,32 +10,35 @@
 
 #include <ArmarXCore/core/logging/Logging.h>
 
-#include "RobotAPI/components/ArViz/Client/Client.h"
 #include <RobotAPI/interface/core/RobotState.h>
 #include <RobotAPI/interface/objectpose/ObjectPoseStorageInterface.h>
 
+#include <RobotAPI/components/ArViz/Client/Client.h>
+
 #include <RobotAPI/libraries/ArmarXObjects/ObjectID.h>
 #include <RobotAPI/libraries/ArmarXObjects/ObjectPose.h>
 #include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h>
 
 #include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
-#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
-#include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h>
-
-#include "Decay.h"
+#include <RobotAPI/libraries/armem/server/segment/SpecializedSegment.h>
 
 #include "ArticulatedObjectVisu.h"
+#include "Decay.h"
 
 
 namespace armarx::armem::obj
 {
     struct SceneSnapshot;
 }
+namespace armarx::armem::arondto
+{
+    class ObjectInstance;
+}
 
 namespace armarx::armem::server::obj::instance
 {
 
-    class Segment : public armarx::Logging
+    class Segment : public segment::SpecializedSegment
     {
     public:
 
@@ -51,14 +54,13 @@ namespace armarx::armem::server::obj::instance
     public:
 
         Segment(server::MemoryToIceAdapter& iceMemory);
+        virtual ~Segment() override;
 
 
-        void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "");
-        void init();
+        void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "") override;
+        void init() override;
         void connect(viz::Client arviz);
 
-        std::mutex& mutex() const;
-
 
 
         CommitStats commitObjectPoses(
@@ -178,15 +180,8 @@ namespace armarx::armem::server::obj::instance
 
     private:
 
-        server::MemoryToIceAdapter& iceMemory;
-        wm::CoreSegment* coreSegment = nullptr;
-
-
         struct Properties
         {
-            std::string coreSegmentName = "Instance";
-            // -1 would be infinite, but this can let the RAM grow quickly.
-            long maxHistorySize = 25;
             bool discardSnapshotsWhileAttached = true;
 
             /// Package containing the scene snapshots
@@ -207,6 +202,7 @@ namespace armarx::armem::server::obj::instance
 
         static const std::string timestampPlaceholder;
 
+
     public:
 
         struct RemoteGui
@@ -225,7 +221,9 @@ namespace armarx::armem::server::obj::instance
             void update(Segment& data);
         };
 
+
     private:
+
         std::unique_ptr<ArticulatedObjectVisu> visu;
 
     };
-- 
GitLab