diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt index 84a5e312a9ef7502b9b3c22fcd7da4ab0f7e725b..6898b8e364aa449e87fdb7dac83735f933cb1e1d 100644 --- a/source/RobotAPI/libraries/armem/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem/CMakeLists.txt @@ -41,7 +41,7 @@ set(LIB_FILES # core/base/CoreSegmentBase.cpp core/base/EntityBase.cpp - # core/base/EntityInstanceBase.cpp + core/base/EntityInstanceBase.cpp core/base/EntitySnapshotBase.cpp # core/base/MemoryBase.cpp # core/base/ProviderSegmentBase.cpp diff --git a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp index a6cfc7103728d5a81fecefe4ade6c96efef2814e..1cc2e9544d00ce96d65658acaf853c670418bdce 100644 --- a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp +++ b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp @@ -1 +1,25 @@ #include "EntityInstanceBase.h" + + +namespace armarx::armem::base +{ + bool EntityInstanceMetadata::operator==(const EntityInstanceMetadata& other) const + { + return timeCreated == other.timeCreated + && timeSent == other.timeSent + && timeArrived == other.timeArrived + && std::abs(confidence - other.confidence) < 1e-6f; + } +} + + +std::ostream& armarx::armem::base::operator<<(std::ostream& os, const EntityInstanceMetadata& d) +{ + os << "EntityInstanceMetadata: " + << "\n- t_create = \t" << armem::toStringMicroSeconds(d.timeCreated) << " us" + << "\n- t_sent = \t" << armem::toStringMicroSeconds(d.timeSent) << " us" + << "\n- t_arrived = \t" << armem::toStringMicroSeconds(d.timeArrived) << " us" + << "\n- confidence = \t" << d.confidence << " us" + ; + return os; +} diff --git a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h index c9689c1822154c17d906132fbe95b46c9e214ed7..fcb1869f791d9094fd793ff3af721e5fb942f111 100644 --- a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h +++ b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h @@ -2,15 +2,52 @@ #include <RobotAPI/libraries/armem/core/Commit.h> #include <RobotAPI/libraries/armem/core/Time.h> + #include "detail/MemoryItem.h" namespace armarx::armem::base { + + /** + * @brief Default data of an entity instance (empty). + */ + struct NoData + { + }; + + + /** + * @brief Metadata of an entity instance. + */ + struct EntityInstanceMetadata + { + /// Time when this value was created. + Time timeCreated; + /// Time when this value was sent to the memory. + Time timeSent; + /// Time when this value has arrived at the memory. + Time timeArrived; + + /// An optional confidence, may be used for things like decay. + float confidence = 1.0; + + + bool operator==(const EntityInstanceMetadata& other) const; + inline bool operator!=(const EntityInstanceMetadata& other) const + { + return !(*this == other); + } + }; + + std::ostream& operator<<(std::ostream& os, const EntityInstanceMetadata& rhs); + + + /** * @brief Data of a single entity instance. */ - template <class _DerivedT> + template <class _DataT = NoData, class _MetadataT = EntityInstanceMetadata> class EntityInstanceBase : public detail::MemoryItem { @@ -18,10 +55,9 @@ namespace armarx::armem::base public: - using DerivedT = _DerivedT; - + using MetadataT = _MetadataT; + using DataT = _DataT; - public: EntityInstanceBase() { @@ -45,17 +81,28 @@ namespace armarx::armem::base return id().instanceIndex; } - /** - * @brief Fill `*this` with the update's values. - * @param update The update. - * @param index The instances index. - */ - virtual void update(const EntityUpdate& update) = 0; - virtual bool equalsDeep(const DerivedT& other) const = 0; + EntityInstanceMetadata& metadata() + { + return _metadata; + } + const EntityInstanceMetadata& metadata() const + { + return _metadata; + } + const DataT& data() const + { + return _data; + } - std::string getLevelName() const + DataT& data() + { + return _data; + } + + + static std::string getLevelName() { return "entity instance"; } @@ -65,6 +112,17 @@ namespace armarx::armem::base return std::to_string(index()); } + + + protected: + + /// The metadata. + MetadataT _metadata; + + /// The data. May be nullptr. + DataT _data; + + }; } diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.cpp b/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.cpp index f0afc6a703c1ac7d8fda6b8127c1ad4692ffb946..63fe18145c561e9efda0ba2a14cb07175b029d1c 100644 --- a/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.cpp +++ b/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.cpp @@ -6,14 +6,6 @@ namespace armarx::armem::ltm { - bool EntityInstanceMetadata::operator==(const EntityInstanceMetadata& other) const - { - return timeCreated == other.timeCreated - && timeSent == other.timeSent - && timeArrived == other.timeArrived - && std::abs(confidence - other.confidence) < 1e-6f; - } - bool EntityInstance::equalsDeep(const EntityInstance& other) const { return id() == other.id() && _metadata == other.metadata(); diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h b/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h index c8d28b8e59136f04f38cb6795b5d06f2bfbf104a..ba72d68bf6e758f4770b5215754a6c73f2fa3e66 100644 --- a/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h +++ b/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h @@ -6,36 +6,16 @@ namespace armarx::armem::ltm { - /** - * @brief Metadata of an entity instance. - */ - struct EntityInstanceMetadata - { - /// Time when this value was created. - Time timeCreated; - /// Time when this value was sent to the memory. - Time timeSent; - /// Time when this value has arrived at the memory. - Time timeArrived; + using EntityInstanceMetadata = base::EntityInstanceMetadata; - /// An optional confidence, may be used for things like decay. - float confidence = 1.0; - - - bool operator==(const EntityInstanceMetadata& other) const; - inline bool operator!=(const EntityInstanceMetadata& other) const - { - return !(*this == other); - } - }; /** * @brief Data of a single entity instance. */ class EntityInstance : - public base::EntityInstanceBase<EntityInstance> + public base::EntityInstanceBase<base::NoData, EntityInstanceMetadata> { - using Base = base::EntityInstanceBase<EntityInstance>; + using Base = base::EntityInstanceBase<base::NoData, EntityInstanceMetadata>; public: @@ -47,16 +27,6 @@ namespace armarx::armem::ltm EntityInstance& operator=(EntityInstance&& other) = default; - EntityInstanceMetadata& metadata() - { - return _metadata; - } - inline const EntityInstanceMetadata& metadata() const - { - return _metadata; - } - - /** * @brief Fill `*this` with the update's values. * @param update The update. @@ -65,10 +35,6 @@ namespace armarx::armem::ltm void update(const EntityUpdate& update); bool equalsDeep(const EntityInstance& other) const; - private: - - /// The metadata. - EntityInstanceMetadata _metadata; }; } diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp index 1be40a13108fc30ac615a3ed08ec1a64f3245b5f..8cda21f290bdae1b7fc837fc1559fdf821bb0f2f 100644 --- a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp +++ b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp @@ -5,29 +5,9 @@ #include <ArmarXCore/core/exceptions/local/ExpressionException.h> -std::ostream& armarx::armem::wm::operator<<(std::ostream& os, const EntityInstanceMetadata& d) -{ - os << "EntityInstanceMetadata: " - << "\n- t_create = \t" << armem::toStringMicroSeconds(d.timeCreated) << " us" - << "\n- t_sent = \t" << armem::toStringMicroSeconds(d.timeSent) << " us" - << "\n- t_arrived = \t" << armem::toStringMicroSeconds(d.timeArrived) << " us" - << "\n- confidence = \t" << d.confidence << " us" - ; - return os; -} - namespace armarx::armem::wm { - bool EntityInstanceMetadata::operator==(const EntityInstanceMetadata& other) const - { - return timeCreated == other.timeCreated - && timeSent == other.timeSent - && timeArrived == other.timeArrived - && std::abs(confidence - other.confidence) < 1e-6f; - } - - bool EntityInstance::equalsDeep(const EntityInstance& other) const { if (_data and other.data()) @@ -48,7 +28,7 @@ namespace armarx::armem::wm { ARMARX_CHECK_FITS_SIZE(this->index(), update.instancesData.size()); - setData(update.instancesData.at(size_t(this->index()))); + this->data() = update.instancesData.at(size_t(this->index())); this->_metadata.confidence = update.confidence; diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h index fbeb3f19f93e594604fd9de94da6975584b12745..18d744c59731331e010d8ebea257e7d51aa5ed0b 100644 --- a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h +++ b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h @@ -6,43 +6,18 @@ namespace armarx::armem::wm { + using EntityInstanceMetadata = base::EntityInstanceMetadata; using EntityInstanceData = armarx::aron::datanavigator::DictNavigator; using EntityInstanceDataPtr = armarx::aron::datanavigator::DictNavigatorPtr; - /** - * @brief Metadata of an entity instance. - */ - struct EntityInstanceMetadata - { - /// Time when this value was created. - Time timeCreated; - /// Time when this value was sent to the memory. - Time timeSent; - /// Time when this value has arrived at the memory. - Time timeArrived; - - /// An optional confidence, may be used for things like decay. - float confidence = 1.0; - - - bool operator==(const EntityInstanceMetadata& other) const; - inline bool operator!=(const EntityInstanceMetadata& other) const - { - return !(*this == other); - } - }; - - std::ostream& operator<<(std::ostream& os, const EntityInstanceMetadata& rhs); - - /** * @brief Data of a single entity instance. */ class EntityInstance : - public base::EntityInstanceBase<EntityInstance> + public base::EntityInstanceBase<EntityInstanceDataPtr, EntityInstanceMetadata> { - using Base = base::EntityInstanceBase<EntityInstance>; + using Base = base::EntityInstanceBase<EntityInstanceDataPtr, EntityInstanceMetadata>; public: @@ -54,43 +29,14 @@ namespace armarx::armem::wm EntityInstance& operator=(EntityInstance&& other) = default; - EntityInstanceMetadata& metadata() - { - return _metadata; - } - inline const EntityInstanceMetadata& metadata() const - { - return _metadata; - } - - inline EntityInstanceDataPtr data() const - { - return _data; - } - - void setData(const aron::datanavigator::DictNavigatorPtr& data) - { - this->_data = data; - } - - /** * @brief Fill `*this` with the update's values. * @param update The update. * @param index The instances index. */ - virtual void update(const EntityUpdate& update) override; - - virtual bool equalsDeep(const EntityInstance& other) const override; - - - private: - - /// The metadata. - EntityInstanceMetadata _metadata; + void update(const EntityUpdate& update); - /// The data. May be nullptr. - EntityInstanceDataPtr _data; + bool equalsDeep(const EntityInstance& other) const; }; } diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.cpp index 31538f8d8e2f1eeaf932ed16e50b7040520f0a99..0d9344be877417264f27c9370052b7fb4d098604 100644 --- a/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.cpp +++ b/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.cpp @@ -16,8 +16,7 @@ namespace armarx::armem if (dataWrapped->hasElement(DATA_WRAPPER_DATA_FIELD)) { - aron::datanavigator::DictNavigatorPtr data = aron::datanavigator::DictNavigator::DynamicCastAndCheck(dataWrapped->getElement(DATA_WRAPPER_DATA_FIELD)); - e.setData(data); + e.data() = aron::datanavigator::DictNavigator::DynamicCastAndCheck(dataWrapped->getElement(DATA_WRAPPER_DATA_FIELD)); } auto timeCreated = aron::datanavigator::LongNavigator::DynamicCastAndCheck(dataWrapped->getElement(DATA_WRAPPER_TIME_CREATED_FIELD)); diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.h b/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.h index f3b25566f110dca844e24dcac4c997f724c74548..ab9ab27c4e361b6faad31c8063ed175316d960b0 100644 --- a/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.h +++ b/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.h @@ -1,6 +1,6 @@ #pragma once -#include "Memory.h" +#include "EntityInstance.h" namespace armarx::armem { diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/ice_conversions.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/ice_conversions.cpp index 58db49b16deda95182a9307d8866b3d9f2326b40..8509ed5ea641028af0ab60c27af0f947acbf8a58 100644 --- a/source/RobotAPI/libraries/armem/core/workingmemory/ice_conversions.cpp +++ b/source/RobotAPI/libraries/armem/core/workingmemory/ice_conversions.cpp @@ -37,7 +37,7 @@ namespace armarx::armem if (ice.data) { - data.setData(aron::datanavigator::DictNavigator::FromAronDictPtr(ice.data)); + data.data() = aron::datanavigator::DictNavigator::FromAronDictPtr(ice.data); } fromIce(ice.metadata, data.metadata()); } diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp index a4945405e752f32cd8d5b9836650fc92e5cdd7ea..b8d97d2d06958e5a49bee86447de23aa1c665f9f 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp @@ -25,7 +25,7 @@ namespace armarx::armem::wm::query_proc wm::EntitySnapshot copy = snapshot; copy.forEachInstance([](EntityInstance & i) { - i.setData(nullptr); + i.data() = nullptr; return true; }); result.addSnapshot(std::move(copy));