diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt index c4ad28ab1f6880f59adb4ca7eda5e4e8a8a65007..30525916e26ba1f2568ea9dfceef89f2fded353f 100644 --- a/source/RobotAPI/libraries/armem/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem/CMakeLists.txt @@ -40,8 +40,9 @@ set(LIB_FILES core/workingmemory/EntitySnapshot.cpp core/workingmemory/Memory.cpp core/workingmemory/ProviderSegment.cpp - core/workingmemory/Visitor.cpp core/workingmemory/ice_conversions.cpp + core/workingmemory/visitor/Visitor.cpp + core/workingmemory/visitor/FunctionalVisitor.cpp core/longtermmemory/CoreSegment.cpp core/longtermmemory/Entity.cpp @@ -137,8 +138,10 @@ set(LIB_HEADERS core/workingmemory/EntitySnapshot.h core/workingmemory/Memory.h core/workingmemory/ProviderSegment.h - core/workingmemory/Visitor.h core/workingmemory/ice_conversions.h + core/workingmemory/visitor.h + core/workingmemory/visitor/Visitor.h + core/workingmemory/visitor/FunctionalVisitor.h core/longtermmemory/CoreSegment.h core/longtermmemory/Entity.h diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/visitor.h b/source/RobotAPI/libraries/armem/core/workingmemory/visitor.h new file mode 100644 index 0000000000000000000000000000000000000000..815ee1b34908dc5916e7d909e709bc735409f63c --- /dev/null +++ b/source/RobotAPI/libraries/armem/core/workingmemory/visitor.h @@ -0,0 +1,4 @@ +#pragma once + +#include "visitor/FunctionalVisitor.h" +#include "visitor/Visitor.h" diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/Visitor.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/FunctionalVisitor.cpp similarity index 100% rename from source/RobotAPI/libraries/armem/core/workingmemory/Visitor.cpp rename to source/RobotAPI/libraries/armem/core/workingmemory/visitor/FunctionalVisitor.cpp diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/visitor/FunctionalVisitor.h b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/FunctionalVisitor.h new file mode 100644 index 0000000000000000000000000000000000000000..ba0fd3d6ff3879210b7933c3eea62c6a87762172 --- /dev/null +++ b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/FunctionalVisitor.h @@ -0,0 +1,107 @@ +#pragma once + +#include <functional> + +#include "Visitor.h" + + +namespace armarx::armem::wm +{ + + /** + * @brief A `Visitor` which can be parametrized by `std::function` + * instead of inheriting and overriding. + */ + class FunctionalVisitor : public Visitor + { + public: + + FunctionalVisitor(); + virtual ~FunctionalVisitor() override; + + bool visitEnter(Memory& memory) override + { + return memoryFn ? memoryFn(memory) : Visitor::visitEnter(memory); + } + bool visitEnter(CoreSegment& coreSegment) override + { + return coreSegmentFn ? coreSegmentFn(coreSegment) : Visitor::visitEnter(coreSegment); + } + bool visitEnter(ProviderSegment& providerSegment) override + { + return providerSegmentFn ? providerSegmentFn(providerSegment) : Visitor::visitEnter(providerSegment); + } + bool visitEnter(Entity& entity) override + { + return entityFn ? entityFn(entity) : Visitor::visitEnter(entity); + } + bool visitEnter(EntitySnapshot& snapshot) override + { + return snapshotFn ? snapshotFn(snapshot) : Visitor::visitEnter(snapshot); + } + + bool visit(EntityInstance& instance) override + { + return instanceFn ? instanceFn(instance) : Visitor::visit(instance); + } + + + + // Const versions + + bool applyTo(const Memory& memory); + bool applyTo(const CoreSegment& coreSegment); + bool applyTo(const ProviderSegment& providerSegment); + bool applyTo(const Entity& entity); + bool applyTo(const EntitySnapshot& snapshot); + bool applyTo(const EntityInstance& instance); + + + bool visitEnter(const Memory& memory) override + { + return memoryFn ? constMemoryFn(memory) : Visitor::visitEnter(memory); + } + bool visitEnter(const CoreSegment& coreSegment) override + { + return coreSegmentFn ? constCoreSegmentFn(coreSegment) : Visitor::visitEnter(coreSegment); + } + bool visitEnter(const ProviderSegment& providerSegment) override + { + return providerSegmentFn ? constProviderSegmentFn(providerSegment) : Visitor::visitEnter(providerSegment); + } + bool visitEnter(const Entity& entity) override + { + return entityFn ? constEntityFn(entity) : Visitor::visitEnter(entity); + } + bool visitEnter(const EntitySnapshot& snapshot) override + { + return memoryFn ? constSnapshotFn(snapshot) : Visitor::visitEnter(snapshot); + } + + bool visit(const EntityInstance& instance) override + { + return instanceFn ? constInstanceFn(instance) : Visitor::visit(instance); + } + + + std::function<bool(Memory& memory)> memoryFn; + std::function<bool(const Memory& memory)> constMemoryFn; + + std::function<bool(CoreSegment& coreSegment)> coreSegmentFn; + std::function<bool(const CoreSegment& coreSegment)> constCoreSegmentFn; + + std::function<bool(ProviderSegment& providerSegment)> providerSegmentFn; + std::function<bool(const ProviderSegment& providerSegment)> constProviderSegmentFn; + + std::function<bool(Entity& entity)> entityFn; + std::function<bool(const Entity& entity)> constEntityFn; + + std::function<bool(EntitySnapshot& snapshot)> snapshotFn; + std::function<bool(const EntitySnapshot& snapshot)> constSnapshotFn; + + std::function<bool(EntityInstance& instance)> instanceFn; + std::function<bool(const EntityInstance& instance)> constInstanceFn; + + }; + +} diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/visitor/Visitor.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/Visitor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ede63a494a7aff26c54ba1d7149200c91be7d987 --- /dev/null +++ b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/Visitor.cpp @@ -0,0 +1,191 @@ +#include "Visitor.h" + +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h> +#include <RobotAPI/libraries/armem/core/error.h> + + +namespace armarx::armem::wm +{ + + Visitor::Visitor() + { + } + + Visitor::~Visitor() + { + } + + bool Visitor::applyTo(Memory& memory) + { + bool cont = true; + visitEnter(memory); + for (auto& [_, coreSeg] : memory) + { + if (!applyTo(coreSeg)) + { + cont = false; + break; + } + } + visitExit(memory); + return cont; + } + + bool Visitor::applyTo(CoreSegment& coreSegment) + { + bool cont = true; + visitEnter(coreSegment); + for (auto& [_, provSeg] : coreSegment) + { + if (!applyTo(provSeg)) + { + cont = false; + break; + } + } + visitExit(coreSegment); + return cont; + } + + bool Visitor::applyTo(ProviderSegment& providerSegment) + { + bool cont = true; + visitEnter(providerSegment); + for (auto& [_, entity] : providerSegment) + { + if (!applyTo(entity)) + { + cont = false; + break; + } + } + visitExit(providerSegment); + return cont; + } + + bool Visitor::applyTo(Entity& entity) + { + bool cont = true; + visitEnter(entity); + for (auto& [_, snapshot] : entity) + { + if (!applyTo(snapshot)) + { + cont = false; + break; + } + } + visitExit(entity); + return cont; + } + + bool Visitor::applyTo(EntitySnapshot& snapshot) + { + bool cont = true; + visitEnter(snapshot); + for (auto& instance : snapshot) + { + if (!applyTo(instance)) + { + cont = false; + break; + } + } + visitExit(snapshot); + return cont; + } + + bool Visitor::applyTo(EntityInstance& instance) + { + return visit(instance); + } + + + bool Visitor::applyTo(const Memory& memory) + { + bool cont = true; + visitEnter(memory); + for (const auto& [_, coreSeg] : memory) + { + if (!applyTo(coreSeg)) + { + cont = false; + break; + } + } + visitExit(memory); + return cont; + } + + bool Visitor::applyTo(const CoreSegment& coreSegment) + { + bool cont = true; + visitEnter(coreSegment); + for (const auto& [_, provSeg] : coreSegment) + { + if (!applyTo(provSeg)) + { + cont = false; + break; + } + } + visitExit(coreSegment); + return cont; + } + + bool Visitor::applyTo(const ProviderSegment& providerSegment) + { + bool cont = true; + visitEnter(providerSegment); + for (const auto& [_, entity] : providerSegment) + { + if (!applyTo(entity)) + { + cont = false; + break; + } + } + visitExit(providerSegment); + return cont; + } + + bool Visitor::applyTo(const Entity& entity) + { + bool cont = true; + visitEnter(entity); + for (const auto& [_, snapshot] : entity) + { + if (!applyTo(snapshot)) + { + cont = false; + break; + } + } + visitExit(entity); + return cont; + } + + bool Visitor::applyTo(const EntitySnapshot& snapshot) + { + bool cont = true; + visitEnter(snapshot); + for (const auto& instance : snapshot) + { + if (!applyTo(instance)) + { + cont = false; + break; + } + } + visitExit(snapshot); + return cont; + } + + bool Visitor::applyTo(const EntityInstance& instance) + { + return visit(instance); + } + +} diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/Visitor.h b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/Visitor.h similarity index 98% rename from source/RobotAPI/libraries/armem/core/workingmemory/Visitor.h rename to source/RobotAPI/libraries/armem/core/workingmemory/visitor/Visitor.h index c0a3854a242c030113eeb46409c172563660294a..fa789fcf0b6876ec5d9fa0ff1a3944b4e3bf3fd3 100644 --- a/source/RobotAPI/libraries/armem/core/workingmemory/Visitor.h +++ b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/Visitor.h @@ -12,7 +12,7 @@ namespace armarx::armem::wm /** - * @brief A visitor for the hierarchical Memory data structure. + * @brief A visitor for the hierarchical memory data structure. */ class Visitor {