From ce9a2b88c8bb1d5684d6a98eb4a7b391182e194a Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Tue, 17 Aug 2021 09:18:44 +0200
Subject: [PATCH] Add getLatestInstance() methods

---
 .../libraries/armem/core/base/EntityBase.h    | 25 ++++++
 .../armem/core/base/detail/lookup_mixins.h    |  8 +-
 .../armem/core/wm/detail/data_lookup_mixins.h | 77 ++++++++++++++++---
 .../armem/core/wm/memory_definitions.h        |  3 +-
 .../armem/server/wm/memory_definitions.h      |  2 +-
 5 files changed, 98 insertions(+), 17 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/core/base/EntityBase.h b/source/RobotAPI/libraries/armem/core/base/EntityBase.h
index ca9fdd8d6..f45018ff9 100644
--- a/source/RobotAPI/libraries/armem/core/base/EntityBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/EntityBase.h
@@ -340,6 +340,31 @@ namespace armarx::armem::base
         }
 
 
+        auto* findLatestInstance(int instanceIndex = 0)
+        {
+            auto* snapshot = this->findLatestSnapshot();
+            return snapshot ? snapshot->findInstance(instanceIndex) : nullptr;
+        }
+        const auto* findLatestInstance(int instanceIndex = 0) const
+        {
+            auto* snapshot = this->findLatestSnapshot();
+            return snapshot ? snapshot->findInstance(instanceIndex) : nullptr;
+        }
+
+#if 0  // Do not offer this yet.
+        auto* findLatestInstanceData(int instanceIndex = 0)
+        {
+            auto* instance = this->findLatestInstance(instanceIndex);
+            return instance ? &instance->data() : nullptr;
+        }
+        const auto* findLatestInstanceData(int instanceIndex = 0) const
+        {
+            auto* instance = this->findLatestInstance(instanceIndex);
+            return instance ? &instance->data() : nullptr;
+        }
+#endif
+
+
         // ITERATION
 
         /**
diff --git a/source/RobotAPI/libraries/armem/core/base/detail/lookup_mixins.h b/source/RobotAPI/libraries/armem/core/base/detail/lookup_mixins.h
index 030db150d..006a5fbce 100644
--- a/source/RobotAPI/libraries/armem/core/base/detail/lookup_mixins.h
+++ b/source/RobotAPI/libraries/armem/core/base/detail/lookup_mixins.h
@@ -150,12 +150,12 @@ namespace armarx::armem::base::detail
 
         // More elaborate cases
 
-        auto* findLatestEntitySnapshot(const MemoryID& entityID)
+        auto* findLatestSnapshot(const MemoryID& entityID)
         {
             auto* entity = derived<DerivedT>(this).findEntity(entityID);
             return entity ? entity->findLatestSnapshot() : nullptr;
         }
-        const auto* findLatestEntitySnapshot(const MemoryID& entityID) const
+        const auto* findLatestSnapshot(const MemoryID& entityID) const
         {
             auto* entity = derived<DerivedT>(this).findEntity(entityID);
             return entity ? entity->findLatestSnapshot() : nullptr;
@@ -163,12 +163,12 @@ namespace armarx::armem::base::detail
 
         auto* findLatestInstance(const MemoryID& entityID, int instanceIndex = 0)
         {
-            auto* snapshot = derived<DerivedT>(this).findLatestEntitySnapshot(entityID);
+            auto* snapshot = derived<DerivedT>(this).findLatestSnapshot(entityID);
             return snapshot ? snapshot->findInstance(instanceIndex) : nullptr;
         }
         const auto* findLatestInstance(const MemoryID& entityID, int instanceIndex = 0) const
         {
-            auto* snapshot = derived<DerivedT>(this).findLatestEntitySnapshot(entityID);
+            auto* snapshot = derived<DerivedT>(this).findLatestSnapshot(entityID);
             return snapshot ? snapshot->findInstance(instanceIndex) : nullptr;
         }
 
diff --git a/source/RobotAPI/libraries/armem/core/wm/detail/data_lookup_mixins.h b/source/RobotAPI/libraries/armem/core/wm/detail/data_lookup_mixins.h
index 280a465cb..c2d240e29 100644
--- a/source/RobotAPI/libraries/armem/core/wm/detail/data_lookup_mixins.h
+++ b/source/RobotAPI/libraries/armem/core/wm/detail/data_lookup_mixins.h
@@ -13,9 +13,74 @@ namespace armarx::armem::wm::detail
     using base::detail::derived;
 
 
+    template <class AronDtoT>
+    std::optional<AronDtoT>
+    getInstanceDataAs(aron::datanavigator::DictNavigatorPtr data)
+    {
+        if (data)
+        {
+            AronDtoT aron;
+            aron.fromAron(data);
+            return aron;
+        }
+        else
+        {
+            return std::nullopt;
+        }
+    }
+
+
+
+    template <class DerivedT>
+    struct FindInstanceDataMixinForSnapshot
+    {
+
+        aron::datanavigator::DictNavigatorPtr
+        findInstanceData(int instanceIndex = 0) const
+        {
+            const auto* instance = derived<DerivedT>(this).findInstance(instanceIndex);
+            return instance ? instance->data() : nullptr;
+        }
+
+
+        template <class AronDtoT>
+        std::optional<AronDtoT>
+        findInstanceDataAs(int instanceIndex = 0) const
+        {
+            return getInstanceDataAs<AronDtoT>(derived<DerivedT>(this).findInstanceData(instanceIndex));
+        }
+
+    };
+
+
+
+    template <class DerivedT>
+    struct FindInstanceDataMixinForEntity
+    {
+
+        aron::datanavigator::DictNavigatorPtr
+        findLatestInstanceData(int instanceIndex = 0) const
+        {
+            const auto* instance = derived<DerivedT>(this).findLatestInstance(instanceIndex);
+            return instance ? instance->data() : nullptr;
+        }
+
+
+        template <class AronDtoT>
+        std::optional<AronDtoT>
+        findLatestInstanceDataAs(int instanceIndex = 0) const
+        {
+            return getInstanceDataAs<AronDtoT>(derived<DerivedT>(this).findLatestInstanceData(instanceIndex));
+        }
+
+    };
+
+
+
     template <class DerivedT>
     struct FindInstanceDataMixin
     {
+
         aron::datanavigator::DictNavigatorPtr
         findLatestInstanceData(const MemoryID& entityID, int instanceIndex = 0) const
         {
@@ -23,21 +88,11 @@ namespace armarx::armem::wm::detail
             return instance ? instance->data() : nullptr;
         }
 
-
         template <class AronDtoT>
         std::optional<AronDtoT>
         findLatestInstanceDataAs(const MemoryID& entityID, int instanceIndex = 0) const
         {
-            if (aron::datanavigator::DictNavigatorPtr data = derived<DerivedT>(this).findLatestInstanceData(entityID, instanceIndex))
-            {
-                AronDtoT aron;
-                aron.fromAron(data);
-                return aron;
-            }
-            else
-            {
-                return std::nullopt;
-            }
+            return getInstanceDataAs<AronDtoT>(derived<DerivedT>(this).findLatestInstanceData(entityID, instanceIndex));
         }
 
     };
diff --git a/source/RobotAPI/libraries/armem/core/wm/memory_definitions.h b/source/RobotAPI/libraries/armem/core/wm/memory_definitions.h
index 5bfc4aa3e..b77ea3c6e 100644
--- a/source/RobotAPI/libraries/armem/core/wm/memory_definitions.h
+++ b/source/RobotAPI/libraries/armem/core/wm/memory_definitions.h
@@ -47,6 +47,7 @@ namespace armarx::armem::wm
     /// @see base::EntitySnapshotBase
     class EntitySnapshot :
         public base::EntitySnapshotBase<EntityInstance, EntitySnapshot>
+        , public detail::FindInstanceDataMixinForSnapshot<EntitySnapshot>
     {
     public:
 
@@ -58,7 +59,7 @@ namespace armarx::armem::wm
     /// @see base::EntityBase
     class Entity :
         public base::EntityBase<EntitySnapshot, Entity>
-        , public detail::FindInstanceDataMixin<Entity>
+        , public detail::FindInstanceDataMixinForEntity<Entity>
     {
     public:
 
diff --git a/source/RobotAPI/libraries/armem/server/wm/memory_definitions.h b/source/RobotAPI/libraries/armem/server/wm/memory_definitions.h
index 5d2036f05..029d185c6 100644
--- a/source/RobotAPI/libraries/armem/server/wm/memory_definitions.h
+++ b/source/RobotAPI/libraries/armem/server/wm/memory_definitions.h
@@ -29,7 +29,7 @@ namespace armarx::armem::server::wm
     class Entity :
         public base::EntityBase<EntitySnapshot, Entity>
         , public detail::MaxHistorySize
-        , public armem::wm::detail::FindInstanceDataMixin<Entity>
+        , public armem::wm::detail::FindInstanceDataMixinForEntity<Entity>
     {
     public:
 
-- 
GitLab