From 82dd3d75bf0650b163aa0730b567bfecbe394ce4 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Tue, 3 Aug 2021 18:52:15 +0200
Subject: [PATCH] Revise segment::Segment(). (put code and includes into cpp
 etc...)

---
 .../armem/server/segment/Segment.cpp          | 108 ++++++++++++
 .../libraries/armem/server/segment/Segment.h  | 157 ++++++++----------
 .../MotionDatabase/MDBMotions/Segment.h       |   2 +-
 .../server/description/Segment.cpp            |   2 -
 .../server/localization/Segment.cpp           |  40 +++--
 .../server/localization/Segment.h             |   4 +-
 .../server/proprioception/Segment.cpp         |   2 -
 7 files changed, 202 insertions(+), 113 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/server/segment/Segment.cpp b/source/RobotAPI/libraries/armem/server/segment/Segment.cpp
index ec25ce784..050e77d39 100644
--- a/source/RobotAPI/libraries/armem/server/segment/Segment.cpp
+++ b/source/RobotAPI/libraries/armem/server/segment/Segment.cpp
@@ -1 +1,109 @@
 #include "Segment.h"
+
+#include <ArmarXCore/core/application/properties/PluginAll.h>
+#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
+
+#include <RobotAPI/libraries/aron/core/navigator/type/container/Object.h>
+#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
+
+
+namespace armarx::armem::server::segment
+{
+
+    wm::CoreSegmentBase::CoreSegmentBase(
+        armem::server::MemoryToIceAdapter& iceMemory,
+        const std::string& defaultCoreSegmentName,
+        aron::typenavigator::ObjectNavigatorPtr coreSegmentAronType,
+        int defaultMaxHistorySize) :
+        Base(iceMemory),
+        p({defaultCoreSegmentName, defaultMaxHistorySize}),
+    coreSegmentAronType(coreSegmentAronType)
+    {
+        Logging::setTag("armarx::armem::wm::Segment");
+    }
+
+
+    wm::CoreSegmentBase::~CoreSegmentBase()
+    {
+    }
+
+
+    void wm::CoreSegmentBase::defineProperties(
+        armarx::PropertyDefinitionsPtr defs,
+        const std::string& prefix)
+    {
+        ARMARX_CHECK_NOT_NULL(defs);
+
+        defs->optional(p.coreSegmentName, prefix + "CoreSegmentName", "Name of the '" + p.coreSegmentName + "' core segment.");
+        defs->optional(p.maxHistorySize, prefix + "MaxHistorySize", "Maximal size of '" + p.coreSegmentName + "' history (-1 for infinite).");
+    }
+
+
+    void wm::CoreSegmentBase::onInit()
+    {
+        ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory);
+
+        segment = &iceMemory.workingMemory->addCoreSegment(p.coreSegmentName, coreSegmentAronType);
+        segment->setMaxHistorySize(p.maxHistorySize);
+    }
+
+
+    std::mutex& wm::CoreSegmentBase::mutex() const
+    {
+        ARMARX_CHECK_NOT_NULL(segment);
+        return segment->mutex();
+    }
+
+
+
+    wm::ProviderSegmentBase::ProviderSegmentBase(
+        armem::server::MemoryToIceAdapter& iceMemory,
+        const std::string& defaultProviderSegmentName,
+        aron::typenavigator::ObjectNavigatorPtr providerSegmentAronType,
+        const std::string& defaultCoreSegmentName,
+        aron::typenavigator::ObjectNavigatorPtr coreSegmentAronType,
+        int defaultMaxHistorySize) :
+
+        Base(iceMemory),
+        p({defaultCoreSegmentName, defaultProviderSegmentName, defaultMaxHistorySize}),
+    coreSegmentAronType(coreSegmentAronType),
+    providerSegmentAronType(providerSegmentAronType)
+    {
+        Logging::setTag("armarx::armem::wm::Segment");
+    }
+
+
+    wm::ProviderSegmentBase::~ProviderSegmentBase()
+    {
+    }
+
+
+    void wm::ProviderSegmentBase::defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix)
+    {
+        ARMARX_CHECK_NOT_NULL(defs);
+
+        defs->optional(p.coreSegmentName, prefix + "CoreSegmentName", "Name of the '" + p.coreSegmentName + "' core segment.");
+        defs->optional(p.providerSegmentName, prefix + "ProviderSegmentName", "Name of the '" + p.providerSegmentName + "' provider segment.");
+        defs->optional(p.maxHistorySize, prefix + "MaxHistorySize", "Maximal size of '" + p.providerSegmentName + "' history (-1 for infinite).");
+    }
+
+
+    void wm::ProviderSegmentBase::onInit()
+    {
+        ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory);
+
+        if (!iceMemory.workingMemory->hasCoreSegment(p.coreSegmentName))
+        {
+            coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreSegmentName, coreSegmentAronType);
+            coreSegment->setMaxHistorySize(p.maxHistorySize);
+        }
+        else
+        {
+            coreSegment = &iceMemory.workingMemory->getCoreSegment(p.coreSegmentName);
+        }
+
+        segment = &coreSegment->addProviderSegment(p.providerSegmentName, providerSegmentAronType);
+        segment->setMaxHistorySize(p.maxHistorySize);
+    }
+
+}
diff --git a/source/RobotAPI/libraries/armem/server/segment/Segment.h b/source/RobotAPI/libraries/armem/server/segment/Segment.h
index 6cd9761f8..e59b63fc3 100644
--- a/source/RobotAPI/libraries/armem/server/segment/Segment.h
+++ b/source/RobotAPI/libraries/armem/server/segment/Segment.h
@@ -6,12 +6,25 @@
 
 // ArmarX
 #include <ArmarXCore/core/logging/Logging.h>
-#include <ArmarXCore/core/application/properties/PluginAll.h>
-#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
-
-#include "../MemoryToIceAdapter.h"
+#include <ArmarXCore/core/application/properties/forward_declarations.h>
 
 
+namespace armarx::aron::typenavigator
+{
+    using ObjectNavigatorPtr = std::shared_ptr<class ObjectNavigator>;
+}
+namespace armarx::armem
+{
+    namespace server
+    {
+        class MemoryToIceAdapter;
+    }
+    namespace wm
+    {
+        class CoreSegment;
+        class ProviderSegment;
+    }
+}
 namespace armarx::armem::server::segment
 {
     namespace detail
@@ -25,8 +38,9 @@ namespace armarx::armem::server::segment
         class SegmentBase : public armarx::Logging
         {
         public:
+
             SegmentBase() = delete;
-            SegmentBase(armem::server::MemoryToIceAdapter& iceMemory) :
+            SegmentBase(MemoryToIceAdapter& iceMemory) :
                 iceMemory(iceMemory)
             {
                 Logging::setTag("armarx::armem::Segment");
@@ -36,18 +50,20 @@ namespace armarx::armem::server::segment
 
             virtual void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "") = 0;
             virtual void onInit() = 0;
-            virtual void onConnect() = 0;
+            // virtual void onConnect() = 0;
+
 
         protected:
+
             // Memory connection
-            armem::server::MemoryToIceAdapter& iceMemory;
+            MemoryToIceAdapter& iceMemory;
 
             SegmentType* segment;
 
-        private:
         };
     }
 
+
     namespace wm
     {
         /**
@@ -58,47 +74,26 @@ namespace armarx::armem::server::segment
             using Base = detail::SegmentBase<armarx::armem::wm::CoreSegment>;
 
         public:
-            CoreSegmentBase(armem::server::MemoryToIceAdapter& iceMemory,
-                            const std::string& defaultCoreSegmentName = "",
-                            aron::typenavigator::ObjectNavigatorPtr coreSegmentAronType = nullptr,
-                            int defaultMaxHistorySize = -1):
-                Base(iceMemory),
-                p({defaultCoreSegmentName, defaultMaxHistorySize}),
-            coreSegmentAronType(coreSegmentAronType)
-            {
-                Logging::setTag("armarx::armem::wm::Segment");
-            }
 
-            virtual ~CoreSegmentBase() = default;
+            CoreSegmentBase(
+                MemoryToIceAdapter& iceMemory,
+                const std::string& defaultCoreSegmentName = "",
+                aron::typenavigator::ObjectNavigatorPtr coreSegmentAronType = nullptr,
+                int defaultMaxHistorySize = -1);
 
-            virtual void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "") override
-            {
-                ARMARX_CHECK_NOT_NULL(defs);
+            virtual ~CoreSegmentBase() override;
 
-                defs->optional(p.coreSegmentName, prefix + "CoreSegmentName", "Name of the '" + p.coreSegmentName + "' core segment.");
-                defs->optional(p.maxHistorySize, prefix + "MaxHistorySize", "Maximal size of '" + p.coreSegmentName + "' history (-1 for infinite).");
-            }
 
-            virtual void onInit() override
-            {
-                ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory);
-
-                segment = &iceMemory.workingMemory->addCoreSegment(p.coreSegmentName, coreSegmentAronType);
-                segment->setMaxHistorySize(p.maxHistorySize);
-            }
+            virtual void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "") override;
+            virtual void onInit() override;
+            // virtual void onConnect() override;
 
-            virtual void onConnect() override
-            {
 
-            }
+            std::mutex& mutex() const;
 
-            std::mutex& mutex() const
-            {
-                ARMARX_CHECK_NOT_NULL(segment);
-                return segment->mutex();
-            }
 
         protected:
+
             struct Properties
             {
                 std::string coreSegmentName;
@@ -107,6 +102,7 @@ namespace armarx::armem::server::segment
             Properties p;
 
             aron::typenavigator::ObjectNavigatorPtr coreSegmentAronType;
+
         };
 
 
@@ -118,55 +114,25 @@ namespace armarx::armem::server::segment
             using Base = detail::SegmentBase<armarx::armem::wm::ProviderSegment>;
 
         public:
-            ProviderSegmentBase(armem::server::MemoryToIceAdapter& iceMemory,
-                                const std::string& defaultProviderSegmentName = "",
-                                aron::typenavigator::ObjectNavigatorPtr providerSegmentAronType = nullptr,
-                                const std::string& defaultCoreSegmentName = "",
-                                aron::typenavigator::ObjectNavigatorPtr coreSegmentAronType = nullptr,
-                                int defaultMaxHistorySize = -1):
-                Base(iceMemory),
-                p({defaultCoreSegmentName, defaultProviderSegmentName, defaultMaxHistorySize}),
-            coreSegmentAronType(coreSegmentAronType),
-            providerSegmentAronType(providerSegmentAronType)
-            {
-                Logging::setTag("armarx::armem::wm::Segment");
-            }
 
-            virtual ~ProviderSegmentBase() = default;
+            ProviderSegmentBase(
+                MemoryToIceAdapter& iceMemory,
+                const std::string& defaultProviderSegmentName = "",
+                aron::typenavigator::ObjectNavigatorPtr providerSegmentAronType = nullptr,
+                const std::string& defaultCoreSegmentName = "",
+                aron::typenavigator::ObjectNavigatorPtr coreSegmentAronType = nullptr,
+                int defaultMaxHistorySize = -1);
 
-            virtual void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "") override
-            {
-                ARMARX_CHECK_NOT_NULL(defs);
+            virtual ~ProviderSegmentBase() override;
 
-                defs->optional(p.coreSegmentName, prefix + "CoreSegmentName", "Name of the '" + p.coreSegmentName + "' core segment.");
-                defs->optional(p.providerSegmentName, prefix + "ProviderSegmentName", "Name of the '" + p.providerSegmentName + "' provider segment.");
-                defs->optional(p.maxHistorySize, prefix + "MaxHistorySize", "Maximal size of '" + p.providerSegmentName + "' history (-1 for infinite).");
-            }
 
-            virtual void onInit() override
-            {
-                ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory);
-
-                if (!iceMemory.workingMemory->hasCoreSegment(p.coreSegmentName))
-                {
-                    coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreSegmentName, coreSegmentAronType);
-                    coreSegment->setMaxHistorySize(p.maxHistorySize);
-                }
-                else
-                {
-                    coreSegment = &iceMemory.workingMemory->getCoreSegment(p.coreSegmentName);
-                }
-
-                segment = &coreSegment->addProviderSegment(p.providerSegmentName, providerSegmentAronType);
-                segment->setMaxHistorySize(p.maxHistorySize);
-            }
+            virtual void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "") override;
+            virtual void onInit() override;
+            // virtual void onConnect() override;
 
-            virtual void onConnect() override
-            {
-
-            }
 
         protected:
+
             struct Properties
             {
                 std::string coreSegmentName;
@@ -182,6 +148,7 @@ namespace armarx::armem::server::segment
         };
 
 
+
         /**
          * @brief A base class for provider segments with an aron business object
          */
@@ -191,10 +158,13 @@ namespace armarx::armem::server::segment
             using Base = CoreSegmentBase;
 
         public:
-            AronTypedCoreSegmentBase(armem::server::MemoryToIceAdapter& iceMemory,
-                                     const std::string& defaultCoreSegmentName = "",
-                                     int defaultMaxHistorySize = -1):
-                Base(iceMemory, defaultCoreSegmentName, BusinessClassObject::toAronType(), defaultMaxHistorySize)
+
+            AronTypedCoreSegmentBase(
+                MemoryToIceAdapter& iceMemory,
+                const std::string& defaultCoreSegmentName = "",
+                int defaultMaxHistorySize = -1) :
+                Base(iceMemory, defaultCoreSegmentName, BusinessClassObject::toAronType(),
+                     defaultMaxHistorySize)
             {
             }
 
@@ -202,6 +172,7 @@ namespace armarx::armem::server::segment
         };
 
 
+
         /**
          * @brief A base class for provider segments with an aron business object
          */
@@ -211,15 +182,19 @@ namespace armarx::armem::server::segment
             using Base = ProviderSegmentBase;
 
         public:
-            AronTypedProviderSegmentBase(armem::server::MemoryToIceAdapter& iceMemory,
-                                         const std::string& defaultProviderSegmentName = "",
-                                         const std::string& defaultCoreSegmentName = "",
-                                         int defaultMaxHistorySize = -1):
-                Base(iceMemory, defaultProviderSegmentName, BusinessClassObject::toAronType(), defaultCoreSegmentName, nullptr, defaultMaxHistorySize)
+
+            AronTypedProviderSegmentBase(
+                MemoryToIceAdapter& iceMemory,
+                const std::string& defaultProviderSegmentName = "",
+                const std::string& defaultCoreSegmentName = "",
+                int defaultMaxHistorySize = -1) :
+                Base(iceMemory, defaultProviderSegmentName, BusinessClassObject::toAronType(),
+                     defaultCoreSegmentName, nullptr, defaultMaxHistorySize)
             {
             }
 
             virtual ~AronTypedProviderSegmentBase() = default;
+
         };
     }
 }
diff --git a/source/RobotAPI/libraries/armem_motions/server/MotionDatabase/MDBMotions/Segment.h b/source/RobotAPI/libraries/armem_motions/server/MotionDatabase/MDBMotions/Segment.h
index 66e55f410..f0dc4d726 100644
--- a/source/RobotAPI/libraries/armem_motions/server/MotionDatabase/MDBMotions/Segment.h
+++ b/source/RobotAPI/libraries/armem_motions/server/MotionDatabase/MDBMotions/Segment.h
@@ -22,7 +22,7 @@ namespace armarx::armem::server::motions::mdb
 
         virtual void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "") override;
         virtual void onInit() override;
-        virtual void onConnect() override;
+        virtual void onConnect();
 
     private:
         int loadByMotionFinder(const std::string&);
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
index bd1e9c4fc..fc4eef76e 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
@@ -41,8 +41,6 @@ namespace armarx::armem::server::robot_state::description
 
     void Segment::onConnect(const RobotUnitInterfacePrx& robotUnitPrx)
     {
-        Base::onConnect();
-
         robotUnit = robotUnitPrx;
 
         // store the robot description linked to the robot unit in this segment
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp
index ce82f0afa..604795dd4 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp
@@ -48,6 +48,10 @@ namespace armarx::armem::server::robot_state::localization
 
     Segment::~Segment() = default;
 
+    void Segment::onConnect()
+    {
+    }
+
 
     Segment::RobotFramePoseMap
     Segment::getRobotFramePosesLocking(const armem::Time& timestamp) const
@@ -64,14 +68,17 @@ namespace armarx::armem::server::robot_state::localization
         using common::robot_state::localization::TransformQuery;
 
         RobotFramePoseMap frames;
-
-        const auto knownRobots = simox::alg::get_keys(*segment);
-        for (const auto& robotName : knownRobots)
+        for (const auto& [robotName, _] : *segment)
         {
-            TransformQuery query{.header{.parentFrame = GlobalFrame,
-                                         .frame       = "root", // TODO, FIXME
-                                         .agent       = robotName,
-                                         .timestamp   = timestamp}};
+            TransformQuery query
+            {
+                .header{
+                    .parentFrame = GlobalFrame,
+                    .frame       = "root", // TODO, FIXME
+                    .agent       = robotName,
+                    .timestamp   = timestamp
+                }
+            };
 
             const auto result = TransformHelper::lookupTransformChain(*segment, query);
             if (not result)
@@ -105,16 +112,17 @@ namespace armarx::armem::server::robot_state::localization
         using common::robot_state::localization::TransformQuery;
 
         RobotPoseMap robotGlobalPoses;
-
-        const std::vector<std::string> knownRobots = simox::alg::get_keys(*segment);
-
-        for (const std::string& robotName : knownRobots)
+        for (const auto& [robotName, _] : *segment)
         {
-
-            TransformQuery query{.header{.parentFrame = GlobalFrame,
-                                         .frame       = "root", // TODO, FIXME
-                                         .agent       = robotName,
-                                         .timestamp   = timestamp}};
+            TransformQuery query
+            {
+                .header{
+                    .parentFrame = GlobalFrame,
+                    .frame       = "root", // TODO, FIXME
+                    .agent       = robotName,
+                    .timestamp   = timestamp
+                }
+            };
 
             const auto result = TransformHelper::lookupTransform(*segment, query);
             if (not result)
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.h b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.h
index 53d112362..31fffb420 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.h
+++ b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.h
@@ -41,7 +41,7 @@
 
 namespace armarx::armem
 {
-    class EntityUpdate;
+    struct EntityUpdate;
 }  // namespace armarx::armem
 
 namespace armarx::armem::server::robot_state::localization
@@ -61,6 +61,8 @@ namespace armarx::armem::server::robot_state::localization
         Segment(server::MemoryToIceAdapter& iceMemory);
         virtual ~Segment() override;
 
+        void onConnect();
+
         RobotPoseMap getRobotGlobalPoses(const armem::Time& timestamp) const;
         RobotPoseMap getRobotGlobalPosesLocking(const armem::Time& timestamp) const;
 
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/Segment.cpp
index 9f2fadcf5..e94fc83e2 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/Segment.cpp
@@ -40,8 +40,6 @@ namespace armarx::armem::server::robot_state::proprioception
 
     void Segment::onConnect(RobotUnitInterfacePrx robotUnitPrx)
     {
-        Base::onConnect();
-
         this->robotUnit = robotUnitPrx;
 
         std::string providerSegmentName = "Robot";
-- 
GitLab