diff --git a/source/RobotAPI/libraries/armem/core/base/EntityBase.h b/source/RobotAPI/libraries/armem/core/base/EntityBase.h index ca9fdd8d63babff5ed51f7b731966b3ee91829df..f45018ff955fac99b7cf0824eaff7539eee9ac29 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 030db150d382a2f61d671c27ee017031fb06679b..006a5fbcef24dd6c3978d78546cd15dff03a72bc 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 280a465cbaac7408259e2c439c827bdbc0fc19e5..c2d240e2977e1a11df3d8959a4f4200382d8650c 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 5bfc4aa3ee3893b2b0086ffeb0a6dc03520e392b..b77ea3c6e9eb17b69ce3feb848951012a0ed0304 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 5d2036f054d287e90869de8c9d535dc694da9734..029d185c62445a5a83dd749d1b86f2393f95e6d2 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: