Skip to content
Snippets Groups Projects
Commit 69b81532 authored by Rainer Kartmann's avatar Rainer Kartmann
Browse files

Add locking and non-locking getters

parent 9d012852
No related branches found
No related tags found
No related merge requests found
......@@ -65,4 +65,72 @@ namespace armarx::armem::wm
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;
}
}
std::optional<wm::EntitySnapshot>
CoreSegment::getLatestEntitySnapshotLocking(const MemoryID& entityID) const
{
std::scoped_lock lock(_mutex);
return getLatestEntitySnapshot(entityID);
}
std::optional<wm::EntityInstance>
CoreSegment::getLatestEntityInstanceLocking(const MemoryID& entityID, int instanceIndex) const
{
std::scoped_lock lock(_mutex);
return getLatestEntityInstance(entityID, instanceIndex);
}
armarx::aron::datanavigator::DictNavigatorPtr
CoreSegment::getLatestEntityInstanceDataLocking(const MemoryID& entityID, int instanceIndex) const
{
std::scoped_lock lock(_mutex);
return getLatestEntityInstanceData(entityID, instanceIndex);
}
}
#pragma once
#include <mutex>
#include <optional>
#include "../base/CoreSegmentBase.h"
......@@ -38,6 +39,67 @@ namespace armarx::armem::wm
std::mutex& mutex() const;
// 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;
}
}
// Locking interface
std::optional<wm::EntitySnapshot> getLatestEntitySnapshotLocking(
const MemoryID& entityID) const;
std::optional<wm::EntityInstance> getLatestEntityInstanceLocking(
const MemoryID& entityID, int instanceIndex = 0) const;
armarx::aron::datanavigator::DictNavigatorPtr getLatestEntityInstanceDataLocking(
const MemoryID& entityID, int instanceIndex = 0) const;
template <class AronDtoT>
std::optional<AronDtoT> getLatestEntityInstanceDataLockingAs(
const MemoryID& entityID, int instanceIndex = 0) const
{
// Keep lock to a minimum.
wm::EntityInstanceDataPtr data = nullptr;
{
std::scoped_lock lock(_mutex);
data = getLatestEntityInstanceData(entityID, instanceIndex);
}
if (data)
{
AronDtoT aron;
aron.fromAron(data);
return aron;
}
else
{
return std::nullopt;
}
}
protected:
virtual void _copySelfWithoutData(CoreSegment& other) const override;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment