diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt index 644c655fab44881d28429b7fdd266b1d41e9a8e8..5e85729b15a7afbf8855a6eca1059062635df405 100644 --- a/source/RobotAPI/libraries/armem/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem/CMakeLists.txt @@ -28,7 +28,9 @@ set(LIB_FILES core/ice_conversions.cpp core/Memory.cpp core/ProviderSegment.cpp + core/detail/MemoryItem.cpp + core/detail/MaxHistorySize.cpp core/error/ArMemError.cpp @@ -88,6 +90,7 @@ set(LIB_HEADERS core/ProviderSegment.h core/detail/EntityContainer.h + core/detail/MaxHistorySize.h core/detail/MemoryContainer.h core/detail/MemoryItem.h core/detail/TypedEntityContainer.h diff --git a/source/RobotAPI/libraries/armem/core/CoreSegment.cpp b/source/RobotAPI/libraries/armem/core/CoreSegment.cpp index 16e3b4291608c5970c074f7ea89e4d59c0e44dba..34f73cbdf4f7845a8fc2ad0ab14bc7d9ffcb8775 100644 --- a/source/RobotAPI/libraries/armem/core/CoreSegment.cpp +++ b/source/RobotAPI/libraries/armem/core/CoreSegment.cpp @@ -126,11 +126,22 @@ namespace armarx::armem throw armem::error::ContainerEntryAlreadyExists( providerSegment.getLevelName(), providerSegment.name(), getLevelName(), this->name()); } + auto it = providerSegments.emplace(providerSegment.name(), std::move(providerSegment)).first; it->second.id().setCoreSegmentID(id()); + it->second.setMaxHistorySize(maxHistorySize); return it->second; } + void CoreSegment::setMaxHistorySize(long maxSize) + { + MaxHistorySize::setMaxHistorySize(maxSize); + for (auto& [name, seg] : providerSegments) + { + seg.setMaxHistorySize(maxSize); + } + } + std::string CoreSegment::getLevelName() const { return "core segment"; diff --git a/source/RobotAPI/libraries/armem/core/CoreSegment.h b/source/RobotAPI/libraries/armem/core/CoreSegment.h index 68bf7dc4ebf1d9a22d74728b6f4b4b2470dbe218..aed697fb00d5aaf4c3d1f8446be5b289fae97cb8 100644 --- a/source/RobotAPI/libraries/armem/core/CoreSegment.h +++ b/source/RobotAPI/libraries/armem/core/CoreSegment.h @@ -5,6 +5,7 @@ #include "ProviderSegment.h" #include "detail/TypedEntityContainer.h" +#include "detail/MaxHistorySize.h" namespace armarx::armem @@ -13,7 +14,9 @@ namespace armarx::armem /** * @brief Data of a core segment containing multiple provider segments. */ - class CoreSegment : public detail::TypedEntityContainer<ProviderSegment, CoreSegment> + class CoreSegment : + public detail::TypedEntityContainer<ProviderSegment, CoreSegment> + , public detail::MaxHistorySize { using Base = detail::TypedEntityContainer<ProviderSegment, CoreSegment>; @@ -59,6 +62,14 @@ namespace armarx::armem ProviderSegment& addProviderSegment(ProviderSegment&& providerSegment); + /** + * @brief Sets the maximum history size of entities in this segment. + * This affects all current entities as well as new ones. + * @see Entity::setMaxHistorySize() + */ + void setMaxHistorySize(long maxSize) override; + + bool equalsDeep(const CoreSegment& other) const; diff --git a/source/RobotAPI/libraries/armem/core/Entity.h b/source/RobotAPI/libraries/armem/core/Entity.h index 51d55aa4951af17e671417ab95c21bbbb3690e7b..b81ffe76199f7a978d822a4d91cc421b48537682 100644 --- a/source/RobotAPI/libraries/armem/core/Entity.h +++ b/source/RobotAPI/libraries/armem/core/Entity.h @@ -169,8 +169,6 @@ namespace armarx::armem // ToDo: Add max age; // ToDo in future: keep/remove predicate - - // MemoryItem interface public: std::string getKeyString() const override diff --git a/source/RobotAPI/libraries/armem/core/ProviderSegment.cpp b/source/RobotAPI/libraries/armem/core/ProviderSegment.cpp index 28010d765fd024f0b83442082d9daf636e7274e0..fb0ca8cc82a3cfcbf3f89251c87b2d79a7f4e357 100644 --- a/source/RobotAPI/libraries/armem/core/ProviderSegment.cpp +++ b/source/RobotAPI/libraries/armem/core/ProviderSegment.cpp @@ -154,7 +154,7 @@ namespace armarx::armem void ProviderSegment::setMaxHistorySize(long maxSize) { - this->maxHistorySize = maxSize; + MaxHistorySize::setMaxHistorySize(maxSize); for (auto& [name, entity] : entities) { entity.setMaxHistorySize(maxSize); diff --git a/source/RobotAPI/libraries/armem/core/ProviderSegment.h b/source/RobotAPI/libraries/armem/core/ProviderSegment.h index ecfa53be218d27cb9978009196aec93f68f475c7..384ee1b416c2dac48ae1dcccdc9fa3e984ff6700 100644 --- a/source/RobotAPI/libraries/armem/core/ProviderSegment.h +++ b/source/RobotAPI/libraries/armem/core/ProviderSegment.h @@ -5,6 +5,7 @@ #include "Entity.h" #include "detail/TypedEntityContainer.h" +#include "detail/MaxHistorySize.h" namespace armarx::armem @@ -13,7 +14,10 @@ namespace armarx::armem /** * @brief Data of a provider segment containing multiple entities. */ - class ProviderSegment : public detail::TypedEntityContainer<Entity, ProviderSegment> + class ProviderSegment : + public detail::TypedEntityContainer<Entity, ProviderSegment> + , public detail::MaxHistorySize + { using Base = detail::TypedEntityContainer<Entity, ProviderSegment>; @@ -66,7 +70,7 @@ namespace armarx::armem * This affects all current entities as well as new ones. * @see Entity::setMaxHistorySize() */ - void setMaxHistorySize(long maxSize); + void setMaxHistorySize(long maxSize) override; bool equalsDeep(const ProviderSegment& other) const; @@ -88,12 +92,6 @@ namespace armarx::armem /// The entities. std::map<std::string, Entity> entities; - /** - * @brief Maximum size of entity histories. - * @see Entity::maxHstorySize - */ - long maxHistorySize = -1; - }; } diff --git a/source/RobotAPI/libraries/armem/core/detail/MaxHistorySize.cpp b/source/RobotAPI/libraries/armem/core/detail/MaxHistorySize.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cdd34e3be26351bab89ad6b712026769057f8b0e --- /dev/null +++ b/source/RobotAPI/libraries/armem/core/detail/MaxHistorySize.cpp @@ -0,0 +1,19 @@ +#include "MaxHistorySize.h" + + +namespace armarx::armem::detail +{ + MaxHistorySize::~MaxHistorySize() + { + } + + void MaxHistorySize::setMaxHistorySize(long maxSize) + { + this->maxHistorySize = maxSize; + } + + long MaxHistorySize::getMaxHistorySize() const + { + return maxHistorySize; + } +} diff --git a/source/RobotAPI/libraries/armem/core/detail/MaxHistorySize.h b/source/RobotAPI/libraries/armem/core/detail/MaxHistorySize.h new file mode 100644 index 0000000000000000000000000000000000000000..d96e732964103c93987708e2b1d5dbaf9377640a --- /dev/null +++ b/source/RobotAPI/libraries/armem/core/detail/MaxHistorySize.h @@ -0,0 +1,31 @@ +#pragma once + + + +namespace armarx::armem::detail +{ + class MaxHistorySize + { + public: + + virtual ~MaxHistorySize(); + + /** + * @brief Sets the maximum history size of entities in this segment. + * This affects all current entities as well as new ones. + * @see Entity::setMaxHistorySize() + */ + virtual void setMaxHistorySize(long maxSize); + virtual long getMaxHistorySize() const; + + + protected: + + /** + * @brief Maximum size of entity histories. + * @see Entity::maxHstorySize + */ + long maxHistorySize = -1; + + }; +}