diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt index 81a6ad2cf8a0aa80879663411c0bfdf62f4ca717..2427d51f1b9c3184add7ffaa4817a75085c9d3bc 100644 --- a/source/RobotAPI/libraries/armem/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem/CMakeLists.txt @@ -51,6 +51,7 @@ set(LIB_FILES core/wm/ice_conversions.cpp core/wm/json_conversions.cpp core/wm/aron_conversions.cpp + core/wm/detail/data_lookup_mixins.cpp core/wm/visitor/Visitor.cpp core/wm/visitor/FunctionalVisitor.cpp @@ -141,6 +142,7 @@ set(LIB_HEADERS core/base/detail/MemoryItem.h core/base/detail/MemoryContainerBase.h core/base/detail/AronTyped.h + core/base/detail/derived.h core/base/detail/iteration_mixins.h core/base/detail/lookup_mixins.h core/base/detail/negative_index_semantics.h @@ -158,6 +160,7 @@ set(LIB_HEADERS core/wm/aron_conversions.h core/wm/ice_conversions.h core/wm/json_conversions.h + core/wm/detail/data_lookup_mixins.h core/wm/visitor/Visitor.h core/wm/visitor/FunctionalVisitor.h diff --git a/source/RobotAPI/libraries/armem/core/base/EntityBase.h b/source/RobotAPI/libraries/armem/core/base/EntityBase.h index 6f23cde7534cbd511e8519e6150c7f50da3f4d96..ce366164faff3df80e71fb4d0ba2114b35bcf385 100644 --- a/source/RobotAPI/libraries/armem/core/base/EntityBase.h +++ b/source/RobotAPI/libraries/armem/core/base/EntityBase.h @@ -188,7 +188,28 @@ namespace armarx::armem::base */ Time getLatestTimestamp() const { - return getLatestItem().first; + return this->getLatestSnapshot().time(); + } + /** + * @brief Get the oldest timestamp. + * @throw `armem::error::EntityHistoryEmpty` If the history is empty. + */ + Time getFirstTimestamp() const + { + return this->getFirstSnapshot().time(); + } + + /** + * @brief Return the snapshot with the most recent timestamp. + * @return The latest snapshot or nullptr if the entity is empty. + */ + EntitySnapshotT* findLatestSnapshot() + { + return this->empty() ? nullptr : &this->_container.rbegin()->second; + } + const EntitySnapshotT* findLatestSnapshot() const + { + return this->empty() ? nullptr : &this->_container.rbegin()->second; } /** @@ -202,12 +223,33 @@ namespace armarx::armem::base } const EntitySnapshotT& getLatestSnapshot() const { - return getLatestItem().second; + if (const EntitySnapshotT* snapshot = this->findLatestSnapshot()) + { + return *snapshot; + } + else + { + throw armem::error::EntityHistoryEmpty(name(), "when getting the latest snapshot."); + } } + /** - * @brief Return the snapshot with the most recent timestamp. - * @return The latest snapshot. + * @brief Return the snapshot with the least recent timestamp. + * @return The first snapshot or nullptr if the entity is empty. + */ + EntitySnapshotT* findFirstSnapshot() + { + return this->empty() ? nullptr : &this->_container.begin()->second; + } + const EntitySnapshotT* findFirstSnapshot() const + { + return this->empty() ? nullptr : &this->_container.begin()->second; + } + + /** + * @brief Return the snapshot with the least recent timestamp. + * @return The first snapshot. * @throw `armem::error::EntityHistoryEmpty` If the history is empty. */ EntitySnapshotT& getFirstSnapshot() @@ -216,22 +258,27 @@ namespace armarx::armem::base } const EntitySnapshotT& getFirstSnapshot() const { - return getFirstItem().second; + if (const EntitySnapshotT* snapshot = this->findFirstSnapshot()) + { + return *snapshot; + } + else + { + throw armem::error::EntityHistoryEmpty(name(), "when getting the first snapshot."); + } } /** * @brief Return the lastest snapshot before time. * @param time The time. - * @return The latest snapshot. - * @throw `armem::error::EntityHistoryEmpty` If the history is empty. - * @throw `armem::error::MissingEntry` If no such snapshot + * @return The latest snapshot < time or nullptr if none was found. */ - const EntitySnapshotT& getLatestSnapshotBefore(const Time& time) const + const EntitySnapshotT* findLatestSnapshotBefore(const Time& time) const { if (this->empty()) { - throw error::EntityHistoryEmpty(this->name()); + return nullptr; } // We want the rightmost element < time @@ -241,7 +288,7 @@ namespace armarx::armem::base // refIt = begin() => no element < time if (greaterEq == this->_container.begin()) { - throw error::MissingEntry::create<EntitySnapshotT>(toDateTimeMilliSeconds(time), *this); + return nullptr; } // end(): No element >= time, we can still have one < time (rbegin()) => std::prev(end()) @@ -251,29 +298,25 @@ namespace armarx::armem::base typename ContainerT::const_iterator less = std::prev(greaterEq); // we return the element before if possible - return less->second; + return &less->second; } /** - * @brief Return the lastest snapshot before or at time. + * @brief Return the latest snapshot before or at time. * @param time The time. - * @return The latest snapshot. - * @throw `armem::error::EntityHistoryEmpty` If the history is empty. - * @throw `armem::error::MissingEntry` If no such snapshot + * @return The latest snapshot <= time or nullptr if none was found. */ - const EntitySnapshotT& getLatestSnapshotBeforeOrAt(const Time& time) const + const EntitySnapshotT* findLatestSnapshotBeforeOrAt(const Time& time) const { - return getLatestSnapshotBefore(time + Time::microSeconds(1)); + return findLatestSnapshotBefore(time + Time::microSeconds(1)); } /** * @brief Return first snapshot after or at time. * @param time The time. - * @return The first snapshot. - * @throw `armem::error::EntityHistoryEmpty` If the history is empty. - * @throw `armem::error::MissingEntry` If no such snapshot + * @return The first snapshot >= time or nullptr if none was found. */ - const EntitySnapshotT& getFirstSnapshotAfterOrAt(const Time& time) const + const EntitySnapshotT* findFirstSnapshotAfterOrAt(const Time& time) const { // We want the leftmost element >= time. // That's lower bound. @@ -281,21 +324,19 @@ namespace armarx::armem::base if (greaterEq == this->_container.end()) { - throw error::MissingEntry::create<EntitySnapshotT>(toDateTimeMilliSeconds(time), *this); + return nullptr; } - return greaterEq->second; + return &greaterEq->second; } /** * @brief Return first snapshot after time. * @param time The time. - * @return The first snapshot. - * @throw `armem::error::EntityHistoryEmpty` If the history is empty. - * @throw `armem::error::MissingEntry` If no such snapshot + * @return The first snapshot >= time or nullptr if none was found. */ - const EntitySnapshotT& getFirstSnapshotAfter(const Time& time) const + const EntitySnapshotT* findFirstSnapshotAfter(const Time& time) const { - return getFirstSnapshotAfter(time - Time::microSeconds(1)); + return findFirstSnapshotAfter(time - Time::microSeconds(1)); } @@ -544,39 +585,6 @@ namespace armarx::armem::base return "entity"; } - - protected: - - /** - * @brief Return the snapshot with the most recent timestamp. - * @return The latest snapshot. - * @throw `armem::error::EntityHistoryEmpty` If the history is empty. - */ - const typename ContainerT::value_type& - getLatestItem() const - { - if (this->_container.empty()) - { - throw armem::error::EntityHistoryEmpty(name(), "when getting the latest snapshot."); - } - return *this->_container.rbegin(); - } - - /** - * @brief Return the snapshot with the least recent timestamp. - * @return The first snapshot. - * @throw `armem::error::EntityHistoryEmpty` If the history is empty. - */ - const typename ContainerT::value_type& - getFirstItem() const - { - if (this->_container.empty()) - { - throw armem::error::EntityHistoryEmpty(name(), "when getting the first snapshot."); - } - return *this->_container.begin(); - } - }; } diff --git a/source/RobotAPI/libraries/armem/core/base/detail/derived.h b/source/RobotAPI/libraries/armem/core/base/detail/derived.h new file mode 100644 index 0000000000000000000000000000000000000000..721becfa05e34e603f2c1bdb852cea191faf42a5 --- /dev/null +++ b/source/RobotAPI/libraries/armem/core/base/detail/derived.h @@ -0,0 +1,22 @@ +#pragma once + + +namespace armarx::armem::base::detail +{ + + template <class DerivedT, class ThisT> + DerivedT& + derived(ThisT* t) + { + return static_cast<DerivedT&>(*t); + } + + + template <class DerivedT, class ThisT> + const DerivedT& + derived(const ThisT* t) + { + return static_cast<const DerivedT&>(*t); + } + +} 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 8afbd71080cf56de14d2eb8c7e3fb14afba96f92..030db150d382a2f61d671c27ee017031fb06679b 100644 --- a/source/RobotAPI/libraries/armem/core/base/detail/lookup_mixins.h +++ b/source/RobotAPI/libraries/armem/core/base/detail/lookup_mixins.h @@ -1,5 +1,7 @@ #pragma once +#include "derived.h" + #include <RobotAPI/libraries/armem/core/MemoryID.h> #include <RobotAPI/libraries/armem/core/error/ArMemError.h> @@ -53,20 +55,6 @@ namespace armarx::armem::base::detail } - template <class DerivedT, class ThisT> - DerivedT& - derived(ThisT* t) - { - return static_cast<DerivedT&>(*t); - } - template <class DerivedT, class ThisT> - const DerivedT& - derived(const ThisT* t) - { - return static_cast<const DerivedT&>(*t); - } - - template <class DerivedT> struct GetFindInstanceMixin { @@ -158,6 +146,32 @@ namespace armarx::armem::base::detail { return derived<DerivedT>(this).getEntity(snapshotID).getSnapshot(snapshotID); } + + + // More elaborate cases + + auto* findLatestEntitySnapshot(const MemoryID& entityID) + { + auto* entity = derived<DerivedT>(this).findEntity(entityID); + return entity ? entity->findLatestSnapshot() : nullptr; + } + const auto* findLatestEntitySnapshot(const MemoryID& entityID) const + { + auto* entity = derived<DerivedT>(this).findEntity(entityID); + return entity ? entity->findLatestSnapshot() : nullptr; + } + + auto* findLatestInstance(const MemoryID& entityID, int instanceIndex = 0) + { + auto* snapshot = derived<DerivedT>(this).findLatestEntitySnapshot(entityID); + return snapshot ? snapshot->findInstance(instanceIndex) : nullptr; + } + const auto* findLatestInstance(const MemoryID& entityID, int instanceIndex = 0) const + { + auto* snapshot = derived<DerivedT>(this).findLatestEntitySnapshot(entityID); + return snapshot ? snapshot->findInstance(instanceIndex) : nullptr; + } + }; diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.cpp b/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.cpp index 6604c26e935cb4619fc7439d8e9a1f318a14ff63..334eca272ceaa8fd1ec4141465aaabdee6fef51f 100644 --- a/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.cpp +++ b/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.cpp @@ -142,10 +142,4 @@ namespace armarx::armem::ltm return Base::getSnapshot(time); } - auto Entity::getLatestItem() const -> const ContainerT::value_type& - { - // Directly query mongodb (cache cant know whether it is the latest or not) - // TODO - return Base::getLatestItem(); - } } diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.h b/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.h index 99bc3a736f0abe803ec101a81f4b1ac75b87d92e..3bbee7debd446de2e1bd47f401165544c6b5fe03 100644 --- a/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.h +++ b/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.h @@ -50,11 +50,6 @@ namespace armarx::armem::ltm std::vector<Time> getTimestamps() const; const EntitySnapshot& getSnapshot(const Time& time) const; - - protected: - // overrides for LTM storage - const ContainerT::value_type& getLatestItem() const; - public: MongoDBConnectionManager::MongoDBSettings dbsettings; diff --git a/source/RobotAPI/libraries/armem/core/wm/detail/data_lookup_mixins.cpp b/source/RobotAPI/libraries/armem/core/wm/detail/data_lookup_mixins.cpp new file mode 100644 index 0000000000000000000000000000000000000000..50fd63bf64dabfedbab4e980f9450563d301e02b --- /dev/null +++ b/source/RobotAPI/libraries/armem/core/wm/detail/data_lookup_mixins.cpp @@ -0,0 +1,7 @@ +#include "data_lookup_mixins.h" + + +namespace armarx::armem::base +{ + +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..7d20a4078328a2cf5221073c68d0a50c6ddc6cd5 --- /dev/null +++ b/source/RobotAPI/libraries/armem/core/wm/detail/data_lookup_mixins.h @@ -0,0 +1,45 @@ +#pragma once + +#include <RobotAPI/libraries/armem/core/forward_declarations.h> +#include <RobotAPI/libraries/armem/core/base/detail/derived.h> + +#include <RobotAPI/libraries/aron/core/navigator/data/forward_declarations.h> + +#include <optional> + + +namespace armarx::armem::wm::detail +{ + using base::detail::derived; + + + template <class DerivedT> + struct FindInstanceDataMixin + { + armarx::aron::datanavigator::DictNavigatorPtr + findLatestInstanceData(const MemoryID& entityID, int instanceIndex = 0) const + { + const auto* instance = derived<DerivedT>(*this).findLatestInstance(entityID, instanceIndex); + return instance ? instance->data() : nullptr; + } + + + template <class AronDtoT> + std::optional<AronDtoT> + findLatestInstanceDataAs(const MemoryID& entityID, int instanceIndex = 0) const + { + if (auto data = derived<DerivedT>(*this).findLatestInstanceData(entityID, instanceIndex)) + { + AronDtoT aron; + aron.fromAron(data); + return aron; + } + else + { + return std::nullopt; + } + } + + }; + +} diff --git a/source/RobotAPI/libraries/armem/core/wm/memory_definitions.cpp b/source/RobotAPI/libraries/armem/core/wm/memory_definitions.cpp index c9516fc3b74ce05797d7d8c39b12f83b0bdf740d..de5ad02c2e9e4f24304c2ae9b9eb97f0cd3e53ee 100644 --- a/source/RobotAPI/libraries/armem/core/wm/memory_definitions.cpp +++ b/source/RobotAPI/libraries/armem/core/wm/memory_definitions.cpp @@ -9,6 +9,7 @@ #include <vector> + namespace armarx::armem::wm { @@ -41,52 +42,4 @@ namespace armarx::armem::wm this->_metadata.timeArrived = update.timeArrived; } - - - std::optional<wm::EntitySnapshot> CoreSegment::getLatestEntitySnapshot(const MemoryID& entityID) const - { - const wm::Entity& entity = this->getEntity(entityID); - if (entity.empty()) - { - return std::nullopt; - } - else - { - return entity.getLatestSnapshot(); - } - } - - - std::optional<wm::EntityInstance> CoreSegment::getLatestEntityInstance( - const MemoryID& entityID, int instanceIndex) const - { - auto snapshot = getLatestEntitySnapshot(entityID); - if (snapshot.has_value() - and instanceIndex >= 0 - and static_cast<size_t>(instanceIndex) < snapshot->size()) - { - return snapshot->getInstance(instanceIndex); - } - else - { - return std::nullopt; - } - } - - - armarx::aron::datanavigator::DictNavigatorPtr - CoreSegment::getLatestEntityInstanceData(const MemoryID& entityID, int instanceIndex) const - { - auto instance = getLatestEntityInstance(entityID, instanceIndex); - if (instance.has_value()) - { - return instance->data(); - } - else - { - return nullptr; - } - } - - } diff --git a/source/RobotAPI/libraries/armem/core/wm/memory_definitions.h b/source/RobotAPI/libraries/armem/core/wm/memory_definitions.h index 679153b47809682fec38adb5baea609dd99c5c28..c4998b88908527a5459c0879e1a397edfea89e7e 100644 --- a/source/RobotAPI/libraries/armem/core/wm/memory_definitions.h +++ b/source/RobotAPI/libraries/armem/core/wm/memory_definitions.h @@ -7,7 +7,7 @@ #include <RobotAPI/libraries/armem/core/base/CoreSegmentBase.h> #include <RobotAPI/libraries/armem/core/base/MemoryBase.h> -#include <optional> +#include "detail/data_lookup_mixins.h" namespace armarx::armem::wm @@ -56,6 +56,7 @@ namespace armarx::armem::wm /// @see base::EntityBase class Entity : public base::EntityBase<EntitySnapshot, Entity> + , public detail::FindInstanceDataMixin<Entity> { public: @@ -68,10 +69,13 @@ namespace armarx::armem::wm /// @see base::ProviderSegmentBase class ProviderSegment : public base::ProviderSegmentBase<Entity, ProviderSegment> + , public detail::FindInstanceDataMixin<ProviderSegment> { + using Base = base::ProviderSegmentBase<Entity, ProviderSegment>; + public: - using base::ProviderSegmentBase<Entity, ProviderSegment>::ProviderSegmentBase; + using Base::ProviderSegmentBase; }; @@ -80,6 +84,7 @@ namespace armarx::armem::wm /// @see base::CoreSegmentBase class CoreSegment : public base::CoreSegmentBase<ProviderSegment, CoreSegment> + , public detail::FindInstanceDataMixin<CoreSegment> { using Base = base::CoreSegmentBase<ProviderSegment, CoreSegment>; @@ -87,34 +92,6 @@ namespace armarx::armem::wm using Base::CoreSegmentBase; - - // Non-locking interface - - std::optional<wm::EntitySnapshot> getLatestEntitySnapshot( - const MemoryID& entityID) const; - std::optional<wm::EntityInstance> getLatestEntityInstance( - const MemoryID& entityID, int instanceIndex = 0) const; - armarx::aron::datanavigator::DictNavigatorPtr getLatestEntityInstanceData( - const MemoryID& entityID, int instanceIndex = 0) const; - - - template <class AronDtoT> - std::optional<AronDtoT> getLatestEntityInstanceDataAs( - const MemoryID& entityID, int instanceIndex = 0) const - { - wm::EntityInstanceDataPtr data = getLatestEntityInstanceData(entityID, instanceIndex); - if (data) - { - AronDtoT aron; - aron.fromAron(data); - return aron; - } - else - { - return std::nullopt; - } - } - }; @@ -122,6 +99,7 @@ namespace armarx::armem::wm /// @see base::MemoryBase class Memory : public base::MemoryBase<CoreSegment, Memory> + , public detail::FindInstanceDataMixin<Memory> { using Base = base::MemoryBase<CoreSegment, Memory>; diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.h b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.h index 0c4a842fa2772ae18b475b9e28ad3b13077bb49d..f986c7a81c763e86d76cf1757275e82d9e328302 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.h @@ -184,14 +184,9 @@ namespace armarx::armem::server::query_proc::base const auto referenceTimestamp = fromIce<Time>(query.timestamp); ARMARX_CHECK(referenceTimestamp.toMicroSeconds() >= 0) << "Reference timestamp is negative!"; - try + if (auto* beforeOrAt = entity.findLatestSnapshotBeforeOrAt(referenceTimestamp)) { - auto beforeOrAt = entity.getLatestSnapshotBeforeOrAt(referenceTimestamp); - addResultSnapshot(result, beforeOrAt); - } - catch (const armem::error::MissingEntry&) - { - // Leave empty. + addResultSnapshot(result, *beforeOrAt); } } @@ -231,11 +226,11 @@ namespace armarx::armem::server::query_proc::base const armem::query::data::entity::TimeApprox& query, const EntityT& entity) const { - const auto referenceTimestamp = fromIce<Time>(query.timestamp); + const Time referenceTimestamp = fromIce<Time>(query.timestamp); ARMARX_CHECK(referenceTimestamp.toMicroSeconds() >= 0) << "Reference timestamp is negative!"; - const auto referenceTimestampMicroSeconds = referenceTimestamp.toMicroSeconds(); - const auto epsDuration = fromIce<Time>(query.eps).toMicroSeconds(); + const float referenceTimestampMicroSeconds = referenceTimestamp.toMicroSeconds(); + const float epsDuration = fromIce<Time>(query.eps).toMicroSeconds(); // elements have to be in range [t_ref - eps, t_ref + eps] if eps is positive const auto isInRange = [&](const Time & t) -> bool @@ -248,15 +243,14 @@ namespace armarx::armem::server::query_proc::base return std::abs(t.toMicroSeconds() - referenceTimestampMicroSeconds) <= epsDuration; }; - try + // last element before or at timestamp + if (auto* beforeOrAt = entity.findLatestSnapshotBeforeOrAt(referenceTimestamp)) { - // last element before or at timestamp - auto beforeOrAt = entity.getLatestSnapshotBeforeOrAt(referenceTimestamp); - const auto timestampOfMatchBefore = beforeOrAt.id().timestamp; + const auto timestampOfMatchBefore = beforeOrAt->id().timestamp; const auto isPerfectMatch = timestampOfMatchBefore == referenceTimestamp; if (isInRange(timestampOfMatchBefore)) { - addResultSnapshot(result, beforeOrAt); + addResultSnapshot(result, *beforeOrAt); } // earsly stop, not necessary to also get the next since the match is perfect @@ -266,16 +260,16 @@ namespace armarx::armem::server::query_proc::base } // first element after or at timestamp (or at because of fewer checks, we can assure that there is not element at) - const auto after = entity.getFirstSnapshotAfterOrAt(referenceTimestamp); - const auto timestampOfMatchAfter = after.id().timestamp; - if (isInRange(timestampOfMatchAfter)) + const auto* after = entity.findFirstSnapshotAfterOrAt(referenceTimestamp); + if (after) { - addResultSnapshot(result, after); + const auto timestampOfMatchAfter = after->id().timestamp; + if (isInRange(timestampOfMatchAfter)) + { + addResultSnapshot(result, *after); + } } } - catch (const armem::error::MissingEntry&) - { - } } diff --git a/source/RobotAPI/libraries/armem/server/wm/memory_definitions.cpp b/source/RobotAPI/libraries/armem/server/wm/memory_definitions.cpp index 58be8027db2561979d3510b7d481715678b61eae..7cf7d4e225f9cdd0d360f6d372e0d5d21cf01f30 100644 --- a/source/RobotAPI/libraries/armem/server/wm/memory_definitions.cpp +++ b/source/RobotAPI/libraries/armem/server/wm/memory_definitions.cpp @@ -44,74 +44,12 @@ namespace armarx::armem::server::wm - Entity& ProviderSegment::addEntity(Entity&& entity) - { - Entity& added = ProviderSegmentBase::addEntity(std::move(entity)); - added.setMaxHistorySize(this->getMaxHistorySize()); - return added; - } - - - std::mutex& CoreSegment::mutex() const { return _mutex; } - std::optional<wm::EntitySnapshot> CoreSegment::getLatestEntitySnapshot(const MemoryID& entityID) const - { - const wm::Entity& entity = this->getEntity(entityID); - if (entity.empty()) - { - return std::nullopt; - } - else - { - return entity.getLatestSnapshot(); - } - } - - - std::optional<wm::EntityInstance> CoreSegment::getLatestEntityInstance( - const MemoryID& entityID, int instanceIndex) const - { - auto snapshot = getLatestEntitySnapshot(entityID); - if (snapshot.has_value() - and instanceIndex >= 0 - and static_cast<size_t>(instanceIndex) < snapshot->size()) - { - return snapshot->getInstance(instanceIndex); - } - else - { - return std::nullopt; - } - } - - - armarx::aron::datanavigator::DictNavigatorPtr - CoreSegment::getLatestEntityInstanceData(const MemoryID& entityID, int instanceIndex) const - { - auto instance = getLatestEntityInstance(entityID, instanceIndex); - if (instance.has_value()) - { - return instance->data(); - } - else - { - return nullptr; - } - } - - - ProviderSegment& CoreSegment::addProviderSegment(ProviderSegment&& providerSegment) - { - ProviderSegmentT& added = CoreSegmentBase::addProviderSegment(std::move(providerSegment)); - added.setMaxHistorySize(this->getMaxHistorySize()); - return added; - } - std::optional<wm::EntitySnapshot> CoreSegment::getLatestEntitySnapshotLocking(const MemoryID& entityID) const