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