From 16a6f1bd3fa6c49d52abbbe3e506ea4ebcc18693 Mon Sep 17 00:00:00 2001 From: Rainer Kartmann <rainer.kartmann@kit.edu> Date: Thu, 5 Aug 2021 13:13:55 +0200 Subject: [PATCH] Update usages of iterations --- .../client/attachment/Reader.cpp | 62 +++++++++---------- .../armem_objects/server/instance/Segment.cpp | 17 +++-- .../client/laser_scans/Reader.cpp | 44 +++++++------ 3 files changed, 61 insertions(+), 62 deletions(-) diff --git a/source/RobotAPI/libraries/armem_objects/client/attachment/Reader.cpp b/source/RobotAPI/libraries/armem_objects/client/attachment/Reader.cpp index f723f30b2..e5e91c309 100644 --- a/source/RobotAPI/libraries/armem_objects/client/attachment/Reader.cpp +++ b/source/RobotAPI/libraries/armem_objects/client/attachment/Reader.cpp @@ -25,50 +25,42 @@ namespace armarx::armem::attachment namespace { - template<typename AronClass, typename ArmemClass> + template <typename AronClass, typename ArmemClass> auto getAttachments(const armarx::armem::wm::Memory& memory) { // using ArmemClass = decltype(fromAron(AronClass())); using ArmemClassVector = std::vector<ArmemClass>; ArmemClassVector attachments; - - for (const auto&[_, coreSegment] : memory.coreSegments()) + memory.forEachEntity([&attachments](const wm::Entity & entity) { - for (const auto& [providerName, providerSegment] : coreSegment.providerSegments()) + if (entity.empty()) { - for (const auto& [name, entity] : providerSegment.entities()) + ARMARX_WARNING << "No entity snapshot found"; + return true; + } + + const armem::wm::EntityInstance& instance = entity.getFirstSnapshot().getInstance(0); + try + { + AronClass aronAttachment; + aronAttachment.fromAron(instance.data()); + + ArmemClass attachment; + fromAron(aronAttachment, attachment); + + if (attachment.active) { - if (entity.empty()) - { - ARMARX_WARNING << "No entity found"; - continue; - } - - const auto entitySnapshots = simox::alg::get_values(entity.history()); - const armem::wm::EntityInstance& instance = entitySnapshots.front().getInstance(0); - - try - { - AronClass aronAttachment; - aronAttachment.fromAron(instance.data()); - - ArmemClass attachment; - fromAron(aronAttachment, attachment); - - if (attachment.active) - { - attachments.push_back(attachment); - } - - } - catch (const armarx::aron::error::AronException&) - { - continue; - } + attachments.push_back(attachment); } + } - } + catch (const armarx::aron::error::AronException&) + { + return true; + } + return true; + }); return attachments; } @@ -131,7 +123,9 @@ namespace armarx::armem::attachment return {}; } - return getAttachments<::armarx::armem::arondto::attachment::ObjectAttachment, ::armarx::armem::attachment::ObjectAttachment>(qResult.memory); + return getAttachments < + ::armarx::armem::arondto::attachment::ObjectAttachment, + ::armarx::armem::attachment::ObjectAttachment > (qResult.memory); } std::vector<ObjectAttachment> Reader::queryObjectAttachments(const armem::Time& timestamp, const std::string& providerName) const diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp index 09a412f4b..15a577619 100644 --- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp +++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp @@ -786,16 +786,23 @@ namespace armarx::armem::server::obj::instance const ObjectID classID = { objectID.dataset(), objectID.className() }; try { - for (const auto& [_, provSeg] : iceMemory.workingMemory->getCoreSegment("Class")) + std::optional<wm::EntityInstance> result; + iceMemory.workingMemory->getCoreSegment("Class").forEachProviderSegment( + [&classID, &result](const wm::ProviderSegment & provSeg) { if (provSeg.hasEntity(classID.str())) { - return provSeg.getEntity(classID.str()).getLatestSnapshot().getInstance(0); + result = provSeg.getEntity(classID.str()).getLatestSnapshot().getInstance(0); + return false; } - } + return true; + }); - ARMARX_WARNING << "No provider segment for classID " << classID.str() << " found"; - return std::nullopt; + if (not result.has_value()) + { + ARMARX_WARNING << "No provider segment for classID " << classID.str() << " found"; + } + return result; } catch (const armem::error::ArMemError& e) { diff --git a/source/RobotAPI/libraries/armem_vision/client/laser_scans/Reader.cpp b/source/RobotAPI/libraries/armem_vision/client/laser_scans/Reader.cpp index 9c46b0c47..61eeb6fff 100644 --- a/source/RobotAPI/libraries/armem_vision/client/laser_scans/Reader.cpp +++ b/source/RobotAPI/libraries/armem_vision/client/laser_scans/Reader.cpp @@ -124,11 +124,10 @@ namespace armarx::armem::vision::laser_scans::client } std::vector<LaserScanStamped> - asLaserScans(const std::map<std::string, wm::Entity>& entities) + asLaserScans(const wm::ProviderSegment& providerSegment) { std::vector<LaserScanStamped> outV; - - if (entities.empty()) + if (providerSegment.empty()) { ARMARX_WARNING << "No entities!"; } @@ -153,29 +152,25 @@ namespace armarx::armem::vision::laser_scans::client }; // loop over all entities and their snapshots - for (const auto& [s, entity] : entities) + providerSegment.forEachEntity([&outV, &convert](const wm::Entity & entity) { + // If we don't need this warning, we could directly iterate over the snapshots. if (entity.empty()) { - ARMARX_WARNING << "Empty history for " << s; + ARMARX_WARNING << "Empty history for " << entity.id(); } - ARMARX_DEBUG << "History size: " << entity.size(); - for (const auto& [ss, entitySnapshot] : entity) + entity.forEachInstance([&outV, &convert](const wm::EntityInstance & entityInstance) { - for (const auto& entityInstance : entitySnapshot.instances()) + if (const auto o = tryCast<arondto::LaserScanStamped>(entityInstance)) { - const auto o = - tryCast<arondto::LaserScanStamped>(entityInstance); - - if (o) - { - outV.push_back(convert(*o, entityInstance)); - } + outV.push_back(convert(*o, entityInstance)); } - } - } + return true; + }); + return true; + }); return outV; } @@ -202,13 +197,16 @@ namespace armarx::armem::vision::laser_scans::client } // now create result from memory - const auto& entities = - qResult.memory.getCoreSegment(properties.memoryName) - .getProviderSegment(query.agent) - .entities(); + const wm::ProviderSegment& providerSegment = + qResult.memory.getCoreSegment(properties.memoryName).getProviderSegment(query.agent); - const auto laserScans = asLaserScans(entities); - const auto sensors = simox::alg::get_keys(entities); + const auto laserScans = asLaserScans(providerSegment); + std::vector<std::string> sensors; + providerSegment.forEachEntity([&sensors](const wm::Entity & entity) + { + sensors.push_back(entity.name()); + return true; + }); return {.laserScans = laserScans, .sensors = sensors, -- GitLab