From 58a91dccff6c4590119f927b95361b7f924b5b16 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Wed, 11 Aug 2021 18:46:38 +0200
Subject: [PATCH] Fix deprecation warning

---
 .../libraries/armem/core/operations.h         | 21 +++++-
 .../armem/core/wm/memory_definitions.h        |  4 +-
 .../client/articulated_object/Writer.cpp      | 67 ++++++-------------
 .../client/articulated_object/Writer.h        |  5 +-
 4 files changed, 47 insertions(+), 50 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/core/operations.h b/source/RobotAPI/libraries/armem/core/operations.h
index 2245262f4..775b6dd07 100644
--- a/source/RobotAPI/libraries/armem/core/operations.h
+++ b/source/RobotAPI/libraries/armem/core/operations.h
@@ -17,11 +17,14 @@ namespace armarx::armem
     std::vector<aron::datanavigator::DictNavigatorPtr>
     getAronData(const wm::EntitySnapshot& snapshot);
 
-    EntityUpdate toEntityUpdate(const wm::EntitySnapshot& snapshot);
+
+    EntityUpdate
+    toEntityUpdate(const wm::EntitySnapshot& snapshot);
 
 
     template <class ContainerT>
-    Commit toCommit(const ContainerT& container)
+    Commit
+    toCommit(const ContainerT& container)
     {
         Commit commit;
         container.forEachSnapshot([&commit](const wm::EntitySnapshot & snapshot)
@@ -33,6 +36,20 @@ namespace armarx::armem
     }
 
 
+    template <class ContainerT>
+    const typename ContainerT::EntityInstanceT*
+    findFirstInstance(const ContainerT& container)
+    {
+        const typename ContainerT::EntityInstanceT* instance = nullptr;
+        container.forEachInstance([&instance](const wm::EntityInstance & i)
+        {
+            instance = &i;
+            return false;
+        });
+        return instance;
+    }
+
+
     std::string print(const wm::Memory& data, int maxDepth = -1, int depth = 0);
     std::string print(const wm::CoreSegment& data, int maxDepth = -1, int depth = 0);
     std::string print(const wm::ProviderSegment& data, int maxDepth = -1, int depth = 0);
diff --git a/source/RobotAPI/libraries/armem/core/wm/memory_definitions.h b/source/RobotAPI/libraries/armem/core/wm/memory_definitions.h
index c4998b889..5bfc4aa3e 100644
--- a/source/RobotAPI/libraries/armem/core/wm/memory_definitions.h
+++ b/source/RobotAPI/libraries/armem/core/wm/memory_definitions.h
@@ -1,5 +1,7 @@
 #pragma once
 
+#include "detail/data_lookup_mixins.h"
+
 #include <RobotAPI/libraries/armem/core/base/EntityInstanceBase.h>
 #include <RobotAPI/libraries/armem/core/base/EntitySnapshotBase.h>
 #include <RobotAPI/libraries/armem/core/base/EntityBase.h>
@@ -7,7 +9,7 @@
 #include <RobotAPI/libraries/armem/core/base/CoreSegmentBase.h>
 #include <RobotAPI/libraries/armem/core/base/MemoryBase.h>
 
-#include "detail/data_lookup_mixins.h"
+#include <RobotAPI/libraries/aron/core/navigator/data/forward_declarations.h>
 
 
 namespace armarx::armem::wm
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
index 237bc31cc..d1cb1e008 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
@@ -1,25 +1,20 @@
 #include "Writer.h"
 
-#include <mutex>
-#include <optional>
-
-#include <IceUtil/Time.h>
-
 #include <SimoxUtility/algorithm/get_map_keys_values.h>
 
-#include "ArmarXCore/core/exceptions/LocalException.h"
+#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
 #include <ArmarXCore/core/logging/Logging.h>
 
-#include "RobotAPI/libraries/ArmarXObjects/ObjectID.h"
-#include "RobotAPI/libraries/ArmarXObjects/ObjectInfo.h"
+#include <RobotAPI/libraries/ArmarXObjects/ObjectID.h>
+#include <RobotAPI/libraries/ArmarXObjects/ObjectInfo.h>
 #include <RobotAPI/libraries/ArmarXObjects/aron/ObjectID.aron.generated.h>
 #include <RobotAPI/libraries/armem/client/query.h>
 #include <RobotAPI/libraries/armem/core/MemoryID.h>
 #include <RobotAPI/libraries/armem/core/aron_conversions.h>
 #include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/operations.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_robot/aron/Robot.aron.generated.h>
 #include <RobotAPI/libraries/armem_robot/aron/RobotDescription.aron.generated.h>
 #include <RobotAPI/libraries/armem_robot/aron_conversions.h>
@@ -27,6 +22,7 @@
 
 #include "utils.h"
 
+
 namespace armarx::armem::articulated_object
 {
     Writer::Writer(armem::client::MemoryNameSystem& memoryNameSystem) :
@@ -86,7 +82,6 @@ namespace armarx::armem::articulated_object
 
     void Writer::updateKnownObject(const armem::MemoryID& snapshotId)
     {
-
         arondto::RobotDescription aronArticulatedObjectDescription;
         // aronArticulatedObjectDescription.fromAron(snapshotId.ent);
 
@@ -269,59 +264,41 @@ namespace armarx::armem::articulated_object
                 .getCoreSegment(properties.coreClassSegmentName)
                 .getProviderSegment(properties.providerName); // TODO(fabian.reister): all
         // clang-format on
-        const auto entities = simox::alg::get_values(providerSegment.entities());
 
-        if (entities.empty())
+        if (const armem::wm::EntityInstance* instance = findFirstInstance(providerSegment))
         {
-            ARMARX_WARNING << "No entity found";
-            return std::nullopt;
+            return convertRobotDescription(*instance);
         }
-
-        const auto entitySnapshots = simox::alg::get_values(entities.front().history());
-
-        if (entitySnapshots.empty())
+        else
         {
             ARMARX_WARNING << "No entity snapshots found";
             return std::nullopt;
         }
-
-        // TODO(fabian.reister): check if 0 available
-        const armem::wm::EntityInstance& instance = entitySnapshots.front().getInstance(0);
-
-        return convertRobotDescription(instance);
     }
 
     std::unordered_map<std::string, armem::MemoryID>
     Writer::getRobotDescriptions(const armarx::armem::wm::Memory& memory) const
     {
-        std::unordered_map<std::string, armem::MemoryID> descriptions;
-
         const armem::wm::CoreSegment& coreSegment =
             memory.getCoreSegment(properties.coreClassSegmentName);
 
-        for (const auto& [providerName, providerSegment] : coreSegment.providerSegments())
+        std::unordered_map<std::string, armem::MemoryID> descriptions;
+        coreSegment.forEachEntity([&descriptions](const wm::Entity & entity)
         {
-            for (const auto& [name, entity] : providerSegment.entities())
+            if (entity.empty())
             {
-                if (entity.empty())
-                {
-                    ARMARX_WARNING << "No entity found";
-                    continue;
-                }
-
-                const auto entitySnapshots          = simox::alg::get_values(entity.history());
-                const armem::wm::EntitySnapshot& sn = entitySnapshots.front();
-                const armem::wm::EntityInstance& instance = sn.getInstance(0);
-
-                const auto robotDescription = convertRobotDescription(instance);
-
-                if (robotDescription)
-                {
-                    const armem::MemoryID snapshotID(sn.id());
-                    descriptions.insert({robotDescription->name, snapshotID});
-                }
+                ARMARX_WARNING << "No entity found";
+                return true;
             }
-        }
+
+            const armem::wm::EntitySnapshot& sn = entity.getFirstSnapshot();
+            if (const auto robotDescription = convertRobotDescription(sn.getInstance(0)))
+            {
+                const armem::MemoryID snapshotID(sn.id());
+                descriptions.insert({robotDescription->name, snapshotID});
+            }
+            return true;
+        });
 
         return descriptions;
     }
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h
index 954952207..3e827d66a 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h
@@ -22,8 +22,9 @@
 #pragma once
 
 #include <mutex>
+#include <optional>
 
-#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
+#include <ArmarXCore/core/application/properties/forward_declarations.h>
 
 #include <RobotAPI/libraries/armem/client/MemoryNameSystem.h>
 #include <RobotAPI/libraries/armem/client/Reader.h>
@@ -39,7 +40,7 @@ namespace armarx::armem::articulated_object
         virtual public WriterInterface
     {
     public:
-        Writer(armem::client::MemoryNameSystem& memoryNameSystem);
+        Writer(armem::client::MemoryNameSystem& memoryNameSystemopti);
         virtual ~Writer() = default;
 
         void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def);
-- 
GitLab