From 50fd26ffae9e0f7831b7eae9355e8fdf90b9b942 Mon Sep 17 00:00:00 2001 From: Fabian Peller-Konrad <fabian.peller-konrad@kit.edu> Date: Tue, 7 Dec 2021 17:06:29 +0100 Subject: [PATCH] updates to code generation and readers and writers to correctly generate the path --- .../SkillProviderExample.cpp | 11 +-- .../server/SkillsMemory/SkillsMemory.cpp | 47 ++++++++++- .../armem/server/RemoteGuiAronDataVisitor.h | 3 +- .../armem_gui/instance/serialize_path.cpp | 4 +- .../libraries/armem_skills/aron/Skill.xml | 20 ++++- .../client/SkillProviderComponentPlugin.cpp | 34 ++++++-- .../client/SkillProviderComponentPlugin.h | 15 ++-- .../segment/ExecutableSkillLibrarySegment.cpp | 25 ++++-- .../segment/ExecutableSkillLibrarySegment.h | 8 +- .../segment/SkillExecutionRequestSegment.cpp | 5 +- .../segment/SkillExecutionRequestSegment.h | 2 + source/RobotAPI/libraries/aron/core/Path.cpp | 77 +++++++++++-------- source/RobotAPI/libraries/aron/core/Path.h | 18 ++--- .../codewriter/cpp/generator/Generator.cpp | 13 ++-- .../codewriter/cpp/generator/Generator.h | 8 +- .../cpp/generator/container/Dict.cpp | 22 ++++-- .../codewriter/cpp/generator/container/Dict.h | 6 +- .../cpp/generator/container/List.cpp | 24 ++++-- .../codewriter/cpp/generator/container/List.h | 6 +- .../cpp/generator/container/Object.cpp | 9 ++- .../cpp/generator/container/Object.h | 6 +- .../cpp/generator/container/Pair.cpp | 28 ++++--- .../codewriter/cpp/generator/container/Pair.h | 6 +- .../cpp/generator/container/Tuple.cpp | 19 +++-- .../cpp/generator/container/Tuple.h | 6 +- .../cpp/generator/detail/PrimitiveGenerator.h | 7 +- .../codewriter/cpp/generator/enum/IntEnum.cpp | 9 ++- .../codewriter/cpp/generator/enum/IntEnum.h | 6 +- .../cpp/generator/ndarray/Image.cpp | 12 ++- .../codewriter/cpp/generator/ndarray/Image.h | 6 +- .../cpp/generator/ndarray/Matrix.cpp | 18 +++-- .../codewriter/cpp/generator/ndarray/Matrix.h | 6 +- .../cpp/generator/ndarray/NDArray.cpp | 6 +- .../cpp/generator/ndarray/NDArray.h | 6 +- .../cpp/generator/ndarray/Orientation.cpp | 11 ++- .../cpp/generator/ndarray/Orientation.h | 6 +- .../cpp/generator/ndarray/PointCloud.cpp | 11 ++- .../cpp/generator/ndarray/PointCloud.h | 6 +- .../codewriter/cpp/generator/ndarray/Pose.cpp | 11 ++- .../codewriter/cpp/generator/ndarray/Pose.h | 6 +- .../cpp/generator/ndarray/Position.cpp | 11 ++- .../cpp/generator/ndarray/Position.h | 6 +- .../cpp/generator/ndarray/Quaternion.cpp | 11 ++- .../cpp/generator/ndarray/Quaternion.h | 6 +- .../cpp/generator/primitive/Bool.cpp | 2 +- .../codewriter/cpp/generator/primitive/Bool.h | 2 +- .../cpp/generator/primitive/Double.cpp | 2 +- .../cpp/generator/primitive/Double.h | 2 +- .../cpp/generator/primitive/Float.cpp | 2 +- .../cpp/generator/primitive/Float.h | 2 +- .../cpp/generator/primitive/Int.cpp | 2 +- .../codewriter/cpp/generator/primitive/Int.h | 2 +- .../cpp/generator/primitive/Long.cpp | 2 +- .../codewriter/cpp/generator/primitive/Long.h | 2 +- .../cpp/generator/primitive/String.cpp | 2 +- .../cpp/generator/primitive/String.h | 2 +- .../cpp/generator/primitive/Time.cpp | 9 ++- .../codewriter/cpp/generator/primitive/Time.h | 6 +- .../cpp/generator/toplevel/IntEnumClass.cpp | 10 ++- .../cpp/generator/toplevel/IntEnumClass.h | 6 +- .../cpp/generator/toplevel/ObjectClass.cpp | 20 +++-- .../cpp/generator/toplevel/ObjectClass.h | 6 +- .../libraries/aron/core/data/rw/Writer.h | 44 +++++------ .../nlohmannJSON/NlohmannJSONWriter.cpp | 18 ++--- .../writer/nlohmannJSON/NlohmannJSONWriter.h | 18 ++--- .../data/rw/writer/variant/VariantWriter.cpp | 36 ++++----- .../data/rw/writer/variant/VariantWriter.h | 18 ++--- .../aron/core/data/variant/container/Dict.cpp | 11 ++- .../aron/core/data/variant/container/Dict.h | 2 + .../aron/core/data/variant/container/List.cpp | 2 +- .../aron/core/test/aronNavigateTest.cpp | 22 +++--- .../aron/core/typereader/xml/Factory.cpp | 12 +-- 72 files changed, 513 insertions(+), 334 deletions(-) diff --git a/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp b/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp index 57056f83a..3404a3312 100644 --- a/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp +++ b/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp @@ -28,10 +28,7 @@ namespace armarx::skills::example std::string SkillProviderExample::getDefaultName() const { - // If you want to use the memory, it must contain the core segment name - // common means that all robots can execute this skill - // the later packages (armar6, armar3) may add other skill providers with robot specific skills - return "CommonSkill/SkillProviderExample"; + return "SkillProviderExample"; } void SkillProviderExample::onInitComponent() @@ -39,17 +36,17 @@ namespace armarx::skills::example // Add example skill { skills::SkillDescription helloWorldDesc; - helloWorldDesc.acceptedType = nullptr; + helloWorldDesc.acceptedType = nullptr; // accept everything helloWorldDesc.documentation = "This skill logs a message on ARMARX_IMPORTANT"; helloWorldDesc.name = "HelloWorld"; - addSkill(HelloWorldSkill(), helloWorldDesc); + addSkill(std::make_shared<HelloWorldSkill>(), helloWorldDesc); } // Add another example skill { skills::SkillDescription fooDesc; fooDesc.acceptedType = nullptr; - fooDesc.documentation = "This skill does nothing."; + fooDesc.documentation = "This skill does exactly nothing."; fooDesc.name = "Foo"; addSkill([](const aron::data::DictPtr&){ return true; }, fooDesc); } diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp index f5396f815..dbeb06e78 100644 --- a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp +++ b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp @@ -61,6 +61,8 @@ namespace armarx const std::string prefix = "mem."; statechartListenerProviderSegment.defineProperties(defs, prefix + "statechartlistener."); + executableSkillCoreSegment.defineProperties(defs, prefix + "executableskill."); + skillExecutionRequestCoreSegment.defineProperties(defs, prefix + "executionrequest."); setMemoryName("Skill"); return defs; @@ -76,6 +78,8 @@ namespace armarx void SkillsMemory::onInitComponent() { statechartListenerProviderSegment.init(); + executableSkillCoreSegment.init(); + skillExecutionRequestCoreSegment.init(); } @@ -107,8 +111,31 @@ namespace armarx armem::data::CommitResult SkillsMemory::commit(const armem::data::Commit& commit, const Ice::Current&) { - // This function is overloaded to trigger the remote gui rebuild. + // This function is overloaded to trigger the remote gui rebuild and to check for skill executions armem::data::CommitResult result = ReadWritePluginUser::commit(commit); + + for (const auto& up : commit.updates) + { + if (up.entityID.coreSegmentName == skills::segment::SkillExecutionRequestCoreSegment::CoreSegmentName) + { + for (const auto& instance : up.instancesData) + { + ARMARX_CHECK_NOT_NULL(instance); + + auto aron = aron::data::Variant::FromAronDTO(instance); + auto dict = aron::data::Dict::DynamicCastAndCheck(aron); + + // we got a skill execution request + skills::arondto::SkillExecutionRequest request; + request.fromAron(dict); + + auto params = aron::data::Dict::DynamicCastAndCheck(dict->at("params")); // ToDo remov and add to request + + executableSkillCoreSegment.directlyExecuteSkill(request, params); + } + } + } + tab.rebuild = true; return result; } @@ -129,7 +156,23 @@ namespace armarx void SkillsMemory::executeSkill(const std::string& skillProviderName, const skills::SkillParametrization& params, const Ice::Current ¤t) { - executableSkillCoreSegment.directlyExecuteSkill(skillProviderName, params); + // override directly execution to add a request to the memory + armem::Commit comm; + auto& entityUpdate = comm.add(); + + skills::arondto::SkillExecutionRequest request; + request.clientId = ""; + request.providerName = skillProviderName; + request.skillName = params.name; + + auto aron = request.toAron(); + aron->addElement("params", aron::data::Variant::FromAronDTO(params.params)); + + entityUpdate.instancesData = { aron }; + entityUpdate.confidence = 1.0; + entityUpdate.timeCreated = armem::Time::now(); + + iceAdapter().commit(comm); // commit and notify } void SkillsMemory::reportStatechartTransitionWithParameters(const ProfilerStatechartTransitionWithParameters& x, const Ice::Current&) diff --git a/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h b/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h index 093fca38a..dfe5299f7 100644 --- a/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h +++ b/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h @@ -94,8 +94,9 @@ namespace armarx::armem::server void visitString(const aron::data::VariantPtr& string) override { ARMARX_CHECK_NOT_NULL(string); + auto s = aron::data::String::DynamicCastAndCheck(string); const std::string key = string->getPath().getLastElement(); - this->addValueLabel(key, *aron::data::String::DynamicCastAndCheck(string), "string"); + this->addValueLabel(key, *s, "string"); } void visitNDArray(const aron::data::VariantPtr& array) override diff --git a/source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp b/source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp index a01b0b462..3141eb165 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp @@ -30,6 +30,8 @@ armarx::aron::Path armarx::armem::gui::instance::deserializePath(const QStringLi { pathItems.push_back(qpath.at(i).toStdString()); } - aron::Path path(qpath.at(0).toStdString(), qpath.at(1).toStdString(), pathItems); + aron::Path path(pathItems); + path.setRootIdentifier(qpath.at(0).toStdString()); + path.setDelimeter(qpath.at(1).toStdString()); return path; } diff --git a/source/RobotAPI/libraries/armem_skills/aron/Skill.xml b/source/RobotAPI/libraries/armem_skills/aron/Skill.xml index 398a5b682..46af4143e 100644 --- a/source/RobotAPI/libraries/armem_skills/aron/Skill.xml +++ b/source/RobotAPI/libraries/armem_skills/aron/Skill.xml @@ -24,14 +24,30 @@ The memory should look like the following: <String /> </ObjectChild> - <ObjectChild key='ice_info'> + <ObjectChild key='iceInfo'> <String /> </ObjectChild> - <ObjectChild key='accepted_type_json'> + <ObjectChild key='acceptedTypeJson'> + <String /> + </ObjectChild> + </Object> + + <Object name='armarx::skills::arondto::SkillExecutionRequest'> + <ObjectChild key='providerName'> <String /> </ObjectChild> + <ObjectChild key='skillName'> + <String /> + </ObjectChild> + + <ObjectChild key='clientId'> + <String /> + </ObjectChild> + + <!-- ToDo: add params wih any type --> </Object> + </GenerateTypes> </AronTypeDefinition> diff --git a/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp b/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp index ca0129810..d47ca065f 100644 --- a/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp +++ b/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp @@ -37,7 +37,7 @@ namespace armarx addPlugin(plugin); } - void SkillProviderComponentPluginUser::addSkill(const skills::SkillImplementation& fun, const skills::SkillDescription& desc) + void SkillProviderComponentPluginUser::addSkill(const skills::SkillImplementationPtr& fun, const skills::SkillDescription& desc) { std::lock_guard l(skillsMutex); std::string skillName = desc.name; @@ -55,7 +55,7 @@ namespace armarx void SkillProviderComponentPluginUser::addSkill(const skills::LambdaSkillImplementation::FunT& f, const skills::SkillDescription& desc) { - skills::LambdaSkillImplementation lmbda(f); + auto lmbda = std::make_shared<skills::LambdaSkillImplementation>(f); addSkill(lmbda, desc); } @@ -90,9 +90,17 @@ namespace armarx auto& impl = skillImplementations.at(skillName); - impl.task->join(); + if (impl.task.joinable()) + { + impl.task.join(); + } + + // update input params impl.status.usedParams = params.params; - impl.task->start(); + + // recreate thread and execute skill + impl.stop = false; + impl.task = std::thread{ [&] { impl.execute(); } }; } skills::SkillStatus SkillProviderComponentPluginUser::abortSkill(const std::string& skillName, const Ice::Current ¤t) @@ -101,13 +109,15 @@ namespace armarx if (skillImplementations.count(skillName)) { auto& impl = skillImplementations.at(skillName); - if (impl.task->isRunning()) + impl.stop = true; + if (impl.task.joinable()) { - impl.task->stop(); + impl.task.join(); std::lock_guard l(impl.skillStatusMutex); impl.status.status = skills::Execution::Aborted; } + return skillImplementations.at(skillName).status; } return {}; @@ -115,6 +125,7 @@ namespace armarx void SkillProviderComponentPluginUser::SkillImplementationWrapper::execute() { + ARMARX_INFO_S << "Executing skill: " << description.name; try { // wait for dependencies @@ -122,7 +133,10 @@ namespace armarx std::lock_guard l(skillStatusMutex); status.status = skills::Execution::RunningButWaitingForDependencies; } - auto initialized = skill.init(); + + if (stop) return; + auto initialized = skill->init(); + if (stop) return; if (initialized != skills::SkillImplementation::Status::Succeeded) { @@ -138,8 +152,12 @@ namespace armarx std::lock_guard l(skillStatusMutex); status.status = skills::Execution::Running; } + + if (stop) return; auto params = std::make_shared<aron::data::Dict>(status.usedParams); - auto result = skill.execute(params); + auto result = skill->execute(params); + if (stop) return; + { std::lock_guard l(skillStatusMutex); status.status = ((result == skills::SkillImplementation::Status::Succeeded) ? skills::Execution::Succeeded : skills::Execution::Failed); diff --git a/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.h b/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.h index b3fa26531..666ee05e1 100644 --- a/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.h +++ b/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.h @@ -2,6 +2,7 @@ #include <mutex> #include <queue> +#include <thread> #include <functional> #include <ArmarXCore/core/ComponentPlugin.h> @@ -53,6 +54,7 @@ namespace armarx virtual Status execute(const aron::data::DictPtr&) { + ARMARX_WARNING_S << "You have to override this method!"; return Status::Succeeded; } @@ -97,6 +99,9 @@ namespace armarx private: FunT fun; }; + + using SkillImplementationPtr = std::shared_ptr<SkillImplementation>; + using LambdaSkillImplementationPtr = std::shared_ptr<LambdaSkillImplementation>; } @@ -108,20 +113,20 @@ namespace armarx struct SkillImplementationWrapper { skills::SkillDescription description; - skills::SkillImplementation skill; + skills::SkillImplementationPtr skill; // Current execution status skills::SkillStatus status; // Task mutable std::mutex skillStatusMutex; - RunningTask<SkillImplementationWrapper>::pointer_type task; + std::atomic_bool stop = false; + std::thread task; - SkillImplementationWrapper(const skills::SkillImplementation& fun, const skills::SkillDescription& desc) : + SkillImplementationWrapper(const skills::SkillImplementationPtr& fun, const skills::SkillDescription& desc) : description(desc), skill(fun) { status.status = skills::Execution::Status::Idle; - task = new RunningTask<SkillImplementationWrapper>(this, &SkillImplementationWrapper::execute, description.documentation); } SkillImplementationWrapper(const SkillImplementationWrapper& s) : @@ -140,7 +145,7 @@ namespace armarx protected: void addSkill(const skills::LambdaSkillImplementation::FunT&, const skills::SkillDescription&); - void addSkill(const skills::SkillImplementation&, const skills::SkillDescription&); + void addSkill(const skills::SkillImplementationPtr&, const skills::SkillDescription&); private: armarx::plugins::SkillProviderComponentPlugin* plugin = nullptr; diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp index 10914c7da..8b9d00133 100644 --- a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp +++ b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp @@ -10,10 +10,8 @@ namespace armarx::skills::segment { - std::string ExecutableSkillCoreSegmentName = "ExecutableSkill"; - ExecutableSkillLibraryProviderSegment::ExecutableSkillLibraryProviderSegment(const std::string& provName, const SkillProviderInterfacePrx& prx, armem::server::MemoryToIceAdapter& iceMemory): - Base(iceMemory, provName, ExecutableSkillCoreSegmentName, skills::arondto::SkillDescription::toAronType()), + Base(iceMemory, provName, ExecutableSkillLibraryCoreSegment::CoreSegmentName, skills::arondto::SkillDescription::toAronType()), skillProvider(prx) { } @@ -36,12 +34,12 @@ namespace armarx::skills::segment skills::arondto::SkillDescription skillDescription; skillDescription.name = desc.name; skillDescription.documentation = desc.documentation; - skillDescription.ice_info = "TODO"; + skillDescription.iceInfo = skillProvider->ice_toString(); skillDescription.robot = desc.robot; if (desc.acceptedType) { aron::type::VariantPtr t = aron::type::Variant::FromAronDTO(*desc.acceptedType); - skillDescription.accepted_type_json = aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(t).dump(2); + skillDescription.acceptedTypeJson = aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(t).dump(2); } armem::Commit commit; @@ -56,8 +54,16 @@ namespace armarx::skills::segment } } + void ExecutableSkillLibraryProviderSegment::directlyExecuteSkill(const skills::arondto::SkillExecutionRequest& req, const aron::data::DictPtr& params) + { + skills::SkillParametrization parameterization; + parameterization.name = req.skillName; + parameterization.params = params->toAronDictPtr(); + skillProvider->executeSkill(parameterization); // ToDo: put in thread? + } + ExecutableSkillLibraryCoreSegment::ExecutableSkillLibraryCoreSegment(armem::server::MemoryToIceAdapter& iceMemory): - Base(iceMemory, ExecutableSkillCoreSegmentName, skills::arondto::SkillDescription::toAronType()) + Base(iceMemory, CoreSegmentName, skills::arondto::SkillDescription::toAronType()) { } @@ -89,9 +95,12 @@ namespace armarx::skills::segment providerSegments.erase(providerName); } - void ExecutableSkillLibraryCoreSegment::directlyExecuteSkill(const std::string& providerName, const skills::SkillParametrization& params) + void ExecutableSkillLibraryCoreSegment::directlyExecuteSkill(const skills::arondto::SkillExecutionRequest& req, const aron::data::DictPtr& params) { - + if (const auto& it = providerSegments.find(req.providerName); it != providerSegments.end()) + { + it->second.directlyExecuteSkill(req, params); + } } size_t ExecutableSkillLibraryCoreSegment::size() const diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h index 7e4a5dcb1..2f8652067 100644 --- a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h +++ b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h @@ -10,6 +10,8 @@ #include <RobotAPI/interface/skills/SkillProviderInterface.h> +#include <RobotAPI/libraries/armem_skills/aron/Skill.aron.generated.h> + namespace armarx::skills::segment { class ExecutableSkillLibraryProviderSegment : @@ -23,6 +25,8 @@ namespace armarx::skills::segment void defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix); void init(); + void directlyExecuteSkill(const skills::arondto::SkillExecutionRequest&, const aron::data::DictPtr& params); + private: SkillProviderInterfacePrx skillProvider; }; @@ -33,6 +37,8 @@ namespace armarx::skills::segment using Base = armem::server::segment::SpecializedCoreSegment; public: + static constexpr const char* CoreSegmentName = "ExecutableSkill"; + ExecutableSkillLibraryCoreSegment(armem::server::MemoryToIceAdapter& iceMemory); void defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix); @@ -40,7 +46,7 @@ namespace armarx::skills::segment void addSkillProvider(const std::string& providerName, const SkillProviderInterfacePrx& provider); void removeSkillProvider(const std::string& providerName); - void directlyExecuteSkill(const std::string& providerName, const skills::SkillParametrization& params); + void directlyExecuteSkill(const skills::arondto::SkillExecutionRequest&, const aron::data::DictPtr& params); size_t size() const; diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp index f4b656230..158e8c5e1 100644 --- a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp +++ b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp @@ -10,10 +10,9 @@ namespace armarx::skills::segment { - std::string StringExecutionRequestCoreSegmentName = "SkillExecutionRequest"; SkillExecutionRequestProviderSegment::SkillExecutionRequestProviderSegment(const std::string& provName, const SkillProviderInterfacePrx& prx, armem::server::MemoryToIceAdapter& iceMemory): - Base(iceMemory, provName, StringExecutionRequestCoreSegmentName) + Base(iceMemory, provName, SkillExecutionRequestCoreSegment::CoreSegmentName, skills::arondto::SkillExecutionRequest::toAronType()) { } @@ -28,7 +27,7 @@ namespace armarx::skills::segment } SkillExecutionRequestCoreSegment::SkillExecutionRequestCoreSegment(armem::server::MemoryToIceAdapter& iceMemory): - Base(iceMemory, StringExecutionRequestCoreSegmentName) + Base(iceMemory, CoreSegmentName, skills::arondto::SkillExecutionRequest::toAronType()) { } diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h index 9f9b38486..d4e8ba98f 100644 --- a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h +++ b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h @@ -30,6 +30,8 @@ namespace armarx::skills::segment using Base = armem::server::segment::SpecializedCoreSegment; public: + static constexpr const char* CoreSegmentName = "SkillExecutionRequest"; + SkillExecutionRequestCoreSegment(armem::server::MemoryToIceAdapter& iceMemory); void defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix); diff --git a/source/RobotAPI/libraries/aron/core/Path.cpp b/source/RobotAPI/libraries/aron/core/Path.cpp index 98d3a574b..c1a0ef6b6 100644 --- a/source/RobotAPI/libraries/aron/core/Path.cpp +++ b/source/RobotAPI/libraries/aron/core/Path.cpp @@ -30,7 +30,7 @@ namespace armarx::aron { Path::Path() : - rootIdentifier("\\"), + rootIdentifier("_ARON"), delimeter("->") { @@ -39,22 +39,6 @@ namespace armarx::aron Path::Path(const std::vector<std::string>& p) : path(p) { - - } - - Path::Path(const std::string& s, const std::string& d): - rootIdentifier(s), - delimeter(d) - { - - } - - Path::Path(const std::string& s, const std::string& d, const std::vector<std::string>& p) : - rootIdentifier(s), - delimeter(d), - path(p) - { - } Path::Path(const Path& p) : @@ -65,19 +49,6 @@ namespace armarx::aron } - Path::Path(const Path& p, const std::string& s) : - Path(p) - { - append(s); - } - - Path::Path(const Path& p, const std::string& s, const std::string& s2) : - Path(p) - { - append(s); - append(s2); - } - Path::Path(const Path& pa, const std::vector<std::string>& p) : Path(pa) { @@ -156,18 +127,54 @@ namespace armarx::aron return ss.str(); } + Path Path::FromString(const std::string& s, const std::string& rootIdentifier, const std::string& delimeter) + { + std::vector<std::string> elements = simox::alg::split(s, delimeter); + if (elements.size()) + { + elements[0] = simox::alg::remove_prefix(elements[0], rootIdentifier); + } + return Path(elements); + } + + Path Path::withIndex(int i) const + { + return Path(*this, {std::to_string(i)}); + } + + Path Path::withElement(const std::string& s) const + { + return Path(*this, {s}); + } + + Path Path::withAcceptedType() const + { + return Path(*this, {"::accepted_type"}); + } + + Path Path::withAcceptedTypeIndex(int i) const + { + return Path(*this, {"::accepted_type_" + std::to_string(i)}); + } + Path Path::withDetachedLastElement() const { std::vector<std::string> p = path; p.pop_back(); - return Path(rootIdentifier, delimeter, p); + auto ret = Path(p); + ret.setRootIdentifier(rootIdentifier); + ret.setDelimeter(delimeter); + return ret; } Path Path::withDetachedFirstElement() const { std::vector<std::string> p = path; p.erase(p.begin()); - return Path(rootIdentifier, delimeter, p); + auto ret = Path(p); + ret.setRootIdentifier(rootIdentifier); + ret.setDelimeter(delimeter); + return ret; } Path Path::getWithoutPrefix(const Path& pref) const @@ -185,6 +192,10 @@ namespace armarx::aron } } std::vector<std::string> elementsWithoutPrefix(path.begin() + firstWithoutMatch, path.end()); - return Path(rootIdentifier, delimeter, elementsWithoutPrefix); + + auto ret = Path(elementsWithoutPrefix); + ret.setRootIdentifier(rootIdentifier); + ret.setDelimeter(delimeter); + return ret; } } diff --git a/source/RobotAPI/libraries/aron/core/Path.h b/source/RobotAPI/libraries/aron/core/Path.h index ab96e3fb8..941345a75 100644 --- a/source/RobotAPI/libraries/aron/core/Path.h +++ b/source/RobotAPI/libraries/aron/core/Path.h @@ -42,21 +42,9 @@ namespace armarx::aron /// constructor, taking a list of strings (a path) Path(const std::vector<std::string>&); - /// constructor for setting the root identifier and the delimeter - Path(const std::string&, const std::string&); - - /// constructor for setting the root identifier and the delimeter and the path - Path(const std::string&, const std::string&, const std::vector<std::string>&); - /// copy constructor Path(const Path&); - /// append constructor - Path(const Path&, const std::string&); - - /// append constructor - Path(const Path&, const std::string&, const std::string&); - /// append constructor Path(const Path&, const std::vector<std::string>&); @@ -69,6 +57,11 @@ namespace armarx::aron bool hasElement() const; size_t size() const; + Path withIndex(int) const; + Path withElement(const std::string&) const; + Path withAcceptedType() const; + Path withAcceptedTypeIndex(int) const; + void setRootIdentifier(const std::string&); std::string getRootIdentifier() const; @@ -76,6 +69,7 @@ namespace armarx::aron std::string getDelimeter() const; std::string toString() const; + static Path FromString(const std::string&, const std::string& rootIdentifier = "_ARON", const std::string& delimeter = "->"); Path withDetachedFirstElement() const; Path withDetachedLastElement() const; diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.cpp index e54134fba..ca25e51b7 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.cpp @@ -39,6 +39,7 @@ namespace armarx::aron::codegenerator::cpp const std::string Generator::ARON_READER_ACCESSOR = Generator::ARON_VARIABLE_PREFIX + "_r"; const std::string Generator::ARON_WRITER_ACCESSOR = Generator::ARON_VARIABLE_PREFIX + "_w"; const std::string Generator::ARON_VARIANT_RETURN_ACCESSOR = Generator::ARON_VARIABLE_PREFIX + "_variant"; + const std::string Generator::ARON_PATH_ACCESSOR = Generator::ARON_VARIABLE_PREFIX + "_p"; const SerializerFactoryPtr Generator::FACTORY = SerializerFactoryPtr(new GeneratorFactory()); @@ -163,9 +164,9 @@ namespace armarx::aron::codegenerator::cpp doc << "@brief writeType() - This method returns a new type from the class structure using a type writer implementation. This function is static. \n"; doc << "@return - the result of the writer implementation"; - CppMethodPtr m = CppMethodPtr(new CppMethod("template<class T>\nstatic T writeType(armarx::aron::type::WriterInterface<T>& " + ARON_WRITER_ACCESSOR + ", armarx::aron::type::Maybe "+ ARON_MAYBE_TYPE_ACCESSOR +" = armarx::aron::type::Maybe::eNone)", doc.str())); + CppMethodPtr m = CppMethodPtr(new CppMethod("template<class T>\nstatic T writeType(armarx::aron::type::WriterInterface<T>& " + ARON_WRITER_ACCESSOR + ", armarx::aron::type::Maybe "+ ARON_MAYBE_TYPE_ACCESSOR +" = armarx::aron::type::Maybe::eNone, const armarx::aron::Path& "+ARON_PATH_ACCESSOR+" = armarx::aron::Path())", doc.str())); std::string dummy; - CppBlockPtr b = this->getWriteTypeBlock("", "", dummy); + CppBlockPtr b = this->getWriteTypeBlock("", "", Path(), dummy); m->setBlock(b); return m; } @@ -177,10 +178,10 @@ namespace armarx::aron::codegenerator::cpp doc << "@param w - The writer implementation\n"; doc << "@return - the result of the writer implementation"; - CppMethodPtr m = CppMethodPtr(new CppMethod("template<class T>\nT write(armarx::aron::data::WriterInterface<T>& " + ARON_WRITER_ACCESSOR + ") const", doc.str())); + CppMethodPtr m = CppMethodPtr(new CppMethod("template<class T>\nT write(armarx::aron::data::WriterInterface<T>& " + ARON_WRITER_ACCESSOR + ", const armarx::aron::Path& "+ARON_PATH_ACCESSOR+" = armarx::aron::Path()) const", doc.str())); std::string dummy; CppBlockPtr b = std::make_shared<CppBlock>(); - b->appendBlock(this->getWriteBlock("", dummy)); + b->appendBlock(this->getWriteBlock("", Path(), dummy)); m->setBlock(b); return m; } @@ -192,7 +193,7 @@ namespace armarx::aron::codegenerator::cpp doc << "@param r - The reader implementation\n"; doc << "@return - nothing"; - CppMethodPtr m = CppMethodPtr(new CppMethod("template<class T>\nvoid read(armarx::aron::data::ReaderInterface<T>& " + ARON_READER_ACCESSOR + ", T& input)", doc.str())); + CppMethodPtr m = CppMethodPtr(new CppMethod("template<class T>\nvoid read(armarx::aron::data::ReaderInterface<T>& " + ARON_READER_ACCESSOR + ", T& input, const armarx::aron::Path& "+ARON_PATH_ACCESSOR+" = armarx::aron::Path())", doc.str())); CppBlockPtr b = std::make_shared<CppBlock>(); b->addLine("using TNonConst = typename std::remove_const<T>::type;"); @@ -208,7 +209,7 @@ namespace armarx::aron::codegenerator::cpp b->addLine("this->resetSoft();"); b->addLine("if (" + ARON_READER_ACCESSOR + ".readNull(input))"); b->addLineAsBlock("throw armarx::aron::error::AronException(__PRETTY_FUNCTION__, \"The input to the read method must not be null.\");"); - b->appendBlock(this->getReadBlock("", "input")); + b->appendBlock(this->getReadBlock("", Path(), "input")); m->setBlock(b); return m; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.h index 3978677fd..e200e3157 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.h @@ -128,13 +128,13 @@ namespace armarx::aron::codegenerator::cpp virtual CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const; CppMethodPtr toWriteTypeMethod() const; - virtual CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const = 0; + virtual CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const = 0; CppMethodPtr toWriteMethod() const; - virtual CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const = 0; + virtual CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const = 0; CppMethodPtr toReadMethod() const; - virtual CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const = 0; + virtual CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const = 0; CppMethodPtr toEqualsMethod() const; virtual CppBlockPtr getEqualsBlock(const std::string& cppAccessorThis, const std::string& cppAccessorOther) const; @@ -143,7 +143,6 @@ namespace armarx::aron::codegenerator::cpp // static methods static std::string EscapeAccessor(const std::string&); - static std::string UnescapeAccessor(const std::string&); static std::string ExtractCppTypename(const type::Variant&); static std::vector<std::string> ExtractCppTypenames(const std::vector<type::VariantPtr>&); @@ -167,6 +166,7 @@ namespace armarx::aron::codegenerator::cpp static const std::string ARON_VARIABLE_PREFIX; static const std::string ARON_MAYBE_TYPE_ACCESSOR; + static const std::string ARON_PATH_ACCESSOR; static const std::string ARON_READER_ACCESSOR; static const std::string ARON_WRITER_ACCESSOR; static const std::string ARON_VARIANT_RETURN_ACCESSOR; diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.cpp index 96d978cb6..1579bf11f 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.cpp @@ -43,7 +43,7 @@ namespace armarx::aron::codegenerator::cpp::generator return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); } - CppBlockPtr Dict::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Dict::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -51,15 +51,15 @@ namespace armarx::aron::codegenerator::cpp::generator auto type_s = FromAronType(*type.getAcceptedType()); std::string nextVariantAccessor; - b->appendBlock(type_s->getWriteTypeBlock(type_s->getCoreCppTypename(), cppAccessor + nextEl() + "accepted_type", nextVariantAccessor)); + Path nextPath = p.withAcceptedType(); + b->appendBlock(type_s->getWriteTypeBlock(type_s->getCoreCppTypename(), cppAccessor + nextEl() + "accepted_type", nextPath, nextVariantAccessor)); - //block_if_data->addLine("auto " + variantAccessor + ) b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeDict(" + conversion::Maybe2CppString.at(type.getMaybe()) + ", " + nextVariantAccessor + "); // of " + cppAccessor); return b; } - CppBlockPtr Dict::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Dict::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -77,18 +77,23 @@ namespace armarx::aron::codegenerator::cpp::generator auto type_s = FromAronType(*type.getAcceptedType()); CppBlockPtr for_loop = std::make_shared<CppBlock>(); std::string nextVariantAccessor; - auto child_b = type_s->getWriteBlock(accessor_iterator_val, nextVariantAccessor); + Path nextPath = p.withElement(accessor_iterator_key); + auto child_b = type_s->getWriteBlock(accessor_iterator_val, nextPath, nextVariantAccessor); for_loop->addLine("auto " + nextVariantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNull();"); for_loop->appendBlock(child_b); for_loop->addLine(elementsAccessor + ".emplace(" + accessor_iterator_key + ", " + nextVariantAccessor + ");"); block_if_data->addBlock(for_loop); } - block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeDict(" + elementsAccessor + "); // of " + cppAccessor); + + block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + + ".writeDict(" + elementsAccessor + ", " + + "std::nullopt, " + + "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ",")+"})); // of " + cppAccessor); return resolveMaybeWriteBlock(block_if_data, cppAccessor); } - CppBlockPtr Dict::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const + CppBlockPtr Dict::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -103,8 +108,9 @@ namespace armarx::aron::codegenerator::cpp::generator auto type_s = FromAronType(*type.getAcceptedType()); CppBlockPtr for_loop = std::make_shared<CppBlock>(); std::string accessor_iterator_tmp = ARON_VARIABLE_PREFIX + "_" + escaped_accessor + "_dictTmp"; + Path nextPath = p.withElement(accessor_iterator_key); for_loop->addLine(type_s->getFullCppTypename() + " " + accessor_iterator_tmp +";"); - for_loop->appendBlock(type_s->getReadBlock(accessor_iterator_tmp, accessor_iterator_value)); + for_loop->appendBlock(type_s->getReadBlock(accessor_iterator_tmp, nextPath, accessor_iterator_value)); for_loop->addLine(cppAccessor + nextEl() + "insert({" + accessor_iterator_key + ", " + accessor_iterator_tmp + "});"); block_if_data->addBlock(for_loop); } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.h index b20b13a3d..d503a291e 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.h @@ -38,8 +38,8 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.cpp index 36d5c73e9..0b9de6d85 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.cpp @@ -42,7 +42,7 @@ namespace armarx::aron::codegenerator::cpp::generator return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); } - CppBlockPtr List::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr List::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -50,14 +50,15 @@ namespace armarx::aron::codegenerator::cpp::generator auto type_s = FromAronType(*type.getAcceptedType()); std::string nextVariantAccessor; - CppBlockPtr b2 = type_s->getWriteTypeBlock(type_s->getCoreCppTypename(), cppAccessor + nextEl() + "accepted_type", nextVariantAccessor); + Path nextPath = p.withAcceptedType(); + CppBlockPtr b2 = type_s->getWriteTypeBlock(type_s->getCoreCppTypename(), cppAccessor + nextEl() + "accepted_type", nextPath, nextVariantAccessor); b->appendBlock(b2); b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeList(" + conversion::Maybe2CppString.at(type.getMaybe()) + ", " + nextVariantAccessor + "); // of " + cppAccessor); return b; } - CppBlockPtr List::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr List::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -73,35 +74,44 @@ namespace armarx::aron::codegenerator::cpp::generator { std::string nextVariantAccessor; auto for_loop = std::make_shared<CppBlock>(); - auto child_b = type_s->getWriteBlock(cppAccessor + nextEl() + "at(" + accessor_iterator + ")", nextVariantAccessor); + Path nextPath = p.withElement("std::to_string(" + accessor_iterator + ")"); + auto child_b = type_s->getWriteBlock(cppAccessor + nextEl() + "at(" + accessor_iterator + ")", nextPath, nextVariantAccessor); for_loop->addLine("auto " + nextVariantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNull();"); for_loop->appendBlock(child_b); for_loop->addLine(elementsAccessor + ".push_back(" + nextVariantAccessor + ");"); block_if_data->addBlock(for_loop); } - block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeList(" + elementsAccessor + "); // of " + cppAccessor); + + Path path = this->type.getPath(); + block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeList(" + elementsAccessor + ", " + + "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor); return resolveMaybeWriteBlock(block_if_data, cppAccessor); } - CppBlockPtr List::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const + CppBlockPtr List::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); std::string elements_accessor = ARON_VARIABLE_PREFIX + "_" + escaped_accessor + "_listElements"; std::string accessor_iterator_value = ARON_VARIABLE_PREFIX + "_" + escaped_accessor + "_listValue"; + std::string accessor_iterator = ARON_VARIABLE_PREFIX + "_" + escaped_accessor + "_it"; block_if_data->addLine("std::vector<TNonConst> " + elements_accessor + ";"); block_if_data->addLine("" + ARON_READER_ACCESSOR + ".readList(" + variantAccessor + ", " + elements_accessor + ");"); + block_if_data->addLine("unsigned int " + accessor_iterator + " = 0;"); block_if_data->addLine("for (const auto& " + accessor_iterator_value + " : " + elements_accessor + ")"); { CppBlockPtr for_loop = std::make_shared<CppBlock>(); + auto type_s = FromAronType(*type.getAcceptedType()); std::string accessor_iterator_tmp = ARON_VARIABLE_PREFIX + "_" + escaped_accessor + "_listTmp"; + Path nextPath = p.withElement("std::to_string(" + accessor_iterator + ")"); for_loop->addLine(type_s->getFullCppTypename() + " " + accessor_iterator_tmp + ";"); - for_loop->appendBlock(type_s->getReadBlock(accessor_iterator_tmp, accessor_iterator_value)); + for_loop->appendBlock(type_s->getReadBlock(accessor_iterator_tmp, nextPath, accessor_iterator_value)); for_loop->addLine(cppAccessor + nextEl() + "push_back(" + accessor_iterator_tmp + ");"); + for_loop->addLine(accessor_iterator + "++;"); block_if_data->addBlock(for_loop); } return resolveMaybeReadBlock(block_if_data, cppAccessor, variantAccessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.h index 79867c9ff..149c10c52 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.h @@ -39,8 +39,8 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.cpp index 2a2d784bd..838db5b0d 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.cpp @@ -43,7 +43,7 @@ namespace armarx::aron::codegenerator::cpp::generator return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); } - CppBlockPtr Object::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Object::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -53,17 +53,18 @@ namespace armarx::aron::codegenerator::cpp::generator return b; } - CppBlockPtr Object::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Object::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor; - block_if_data->addLine(variantAccessor + " = " + cppAccessor + nextEl() + "write(" + ARON_WRITER_ACCESSOR + "); // of " + cppAccessor); + block_if_data->addLine(variantAccessor + " = " + cppAccessor + nextEl() + "write(" + ARON_WRITER_ACCESSOR + ", "+ + "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor); return resolveMaybeWriteBlock(block_if_data, cppAccessor); } - CppBlockPtr Object::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const + CppBlockPtr Object::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); if (const auto reset = resolveMaybeGenerator(cppAccessor); !reset.empty()) diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.h index 274106676..63296a643 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.h @@ -39,8 +39,8 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.cpp index 9ca8dab0d..c258ddc8a 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.cpp @@ -49,7 +49,7 @@ namespace armarx::aron::codegenerator::cpp::generator return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); } - CppBlockPtr Pair::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Pair::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -58,20 +58,22 @@ namespace armarx::aron::codegenerator::cpp::generator auto child_s1 = FromAronType(*type.getFirstAcceptedType()); std::string accessor_iterator1 = cppAccessor + nextEl() + "first"; std::string firstVariantAccessor; - CppBlockPtr b21 = child_s1->getWriteTypeBlock(child_s1->getCoreCppTypename(), accessor_iterator1, firstVariantAccessor); + Path firstPath = p.withAcceptedTypeIndex(0); + CppBlockPtr b21 = child_s1->getWriteTypeBlock(child_s1->getCoreCppTypename(), accessor_iterator1, firstPath, firstVariantAccessor); block_if_data->appendBlock(b21); auto child_s2 = FromAronType(*type.getSecondAcceptedType()); std::string accessor_iterator2 = cppAccessor + nextEl() + "second"; std::string secondVariantAccessor; - CppBlockPtr b22 = child_s2->getWriteTypeBlock(child_s2->getCoreCppTypename(), accessor_iterator2, secondVariantAccessor); + Path secondPath = p.withAcceptedTypeIndex(1); + CppBlockPtr b22 = child_s2->getWriteTypeBlock(child_s2->getCoreCppTypename(), accessor_iterator2, secondPath, secondVariantAccessor); block_if_data->appendBlock(b22); block_if_data->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePair("+conversion::Maybe2CppString.at(type.getMaybe())+", "+firstVariantAccessor+", "+secondVariantAccessor+"); // of " + cppAccessor); return block_if_data; } - CppBlockPtr Pair::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Pair::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -80,22 +82,26 @@ namespace armarx::aron::codegenerator::cpp::generator auto child_s1 = FromAronType(*type.getFirstAcceptedType()); std::string accessor_iterator1 = cppAccessor + nextEl() + "first"; std::string firstVariantAccessor; - CppBlockPtr b21 = child_s1->getWriteBlock(accessor_iterator1, firstVariantAccessor); + Path firstPath = p.withElement("\"0\""); + CppBlockPtr b21 = child_s1->getWriteBlock(accessor_iterator1, firstPath, firstVariantAccessor); block_if_data->addLine("auto " + firstVariantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNull();"); block_if_data->appendBlock(b21); auto child_s2 = FromAronType(*type.getSecondAcceptedType()); std::string accessor_iterator2 = cppAccessor + nextEl() + "second"; std::string secondVariantAccessor; - CppBlockPtr b22 = child_s2->getWriteBlock(accessor_iterator2, secondVariantAccessor); + Path secondPath = p.withElement("\"1\""); + CppBlockPtr b22 = child_s2->getWriteBlock(accessor_iterator2, secondPath, secondVariantAccessor); block_if_data->addLine("auto " + secondVariantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNull();"); block_if_data->appendBlock(b22); - block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePair("+firstVariantAccessor+", "+secondVariantAccessor+"); // of " + cppAccessor); + block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePair("+firstVariantAccessor+", "+ + secondVariantAccessor+", " + + "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor); return resolveMaybeWriteBlock(block_if_data, cppAccessor); } - CppBlockPtr Pair::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const + CppBlockPtr Pair::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -105,11 +111,13 @@ namespace armarx::aron::codegenerator::cpp::generator block_if_data->addLine("" + ARON_READER_ACCESSOR + ".readList("+elements_accessor+"); // of " + cppAccessor); auto child_s1 = FromAronType(*type.getFirstAcceptedType()); - CppBlockPtr b21 = child_s1->getReadBlock(cppAccessor + nextEl() + "first", elements_accessor+"[0]"); + Path firstPath = p.withElement("\"0\""); + CppBlockPtr b21 = child_s1->getReadBlock(cppAccessor + nextEl() + "first", firstPath, elements_accessor+"[0]"); block_if_data->appendBlock(b21); auto child_s2 = FromAronType(*type.getSecondAcceptedType()); - CppBlockPtr b22 = child_s2->getReadBlock(cppAccessor + nextEl() + "second", elements_accessor+"[1]"); + Path secondPath = p.withElement("\"1\""); + CppBlockPtr b22 = child_s2->getReadBlock(cppAccessor + nextEl() + "second", secondPath, elements_accessor+"[1]"); block_if_data->appendBlock(b22); return resolveMaybeReadBlock(block_if_data, cppAccessor, variantAccessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.h index 196ce6f51..04cccc506 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.h @@ -39,8 +39,8 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.cpp index 61f992774..dce8fcf23 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.cpp @@ -48,7 +48,7 @@ namespace armarx::aron::codegenerator::cpp::generator return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); } - CppBlockPtr Tuple::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Tuple::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string resolved_accessor = resolveMaybeAccessor(cppAccessor); @@ -64,7 +64,8 @@ namespace armarx::aron::codegenerator::cpp::generator std::string accessor_iterator = "std::get<" + std::to_string(i) + ">("+resolved_accessor+");"; auto type_s = FromAronType(*type); std::string nextVariantAccessor; - CppBlockPtr b2 = type_s->getWriteTypeBlock(type_s->getCoreCppTypename(), accessor_iterator, nextVariantAccessor); + Path nextPath = p.withAcceptedTypeIndex(i++); + CppBlockPtr b2 = type_s->getWriteTypeBlock(type_s->getCoreCppTypename(), accessor_iterator, nextPath, nextVariantAccessor); block_if_data->appendBlock(b2); block_if_data->addLine(acceptedTypesAccessor + ".push_back(" + nextVariantAccessor + ");"); } @@ -72,7 +73,7 @@ namespace armarx::aron::codegenerator::cpp::generator return block_if_data; } - CppBlockPtr Tuple::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Tuple::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string resolved_accessor = resolveMaybeAccessor(cppAccessor); @@ -88,16 +89,19 @@ namespace armarx::aron::codegenerator::cpp::generator std::string accessor_iterator = "std::get<" + std::to_string(i) + ">("+resolved_accessor+");"; auto type_s = FromAronType(*type); std::string nextVariantAccessor; - CppBlockPtr b2 = type_s->getWriteBlock(accessor_iterator, nextVariantAccessor); + Path nextPath = p.withElement("\"" + std::to_string(i++) + "\""); + CppBlockPtr b2 = type_s->getWriteBlock(accessor_iterator, nextPath, nextVariantAccessor); block_if_data->addLine("auto " + nextVariantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNull();"); block_if_data->appendBlock(b2); block_if_data->addLine(elementsAccessor + ".push_back(" + nextVariantAccessor + ");"); } - block_if_data->addLine(variantAccessor+ " = " + ARON_WRITER_ACCESSOR + ".writeTuple("+elementsAccessor+"); // of " + cppAccessor); + + block_if_data->addLine(variantAccessor+ " = " + ARON_WRITER_ACCESSOR + ".writeTuple("+elementsAccessor+", "+ + "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor); return resolveMaybeWriteBlock(block_if_data, cppAccessor); } - CppBlockPtr Tuple::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const + CppBlockPtr Tuple::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -111,7 +115,8 @@ namespace armarx::aron::codegenerator::cpp::generator for (const auto& type : type.getAcceptedTypes()) { auto type_s = FromAronType(*type); - CppBlockPtr b2 = type_s->getReadBlock("std::get<" + std::to_string(i) + ">(" + resolved_accessor + ")", elements_accessor+"[" + std::to_string(i) + "]"); + Path nextPath = p.withElement("\"" + std::to_string(i) + "\""); + CppBlockPtr b2 = type_s->getReadBlock("std::get<" + std::to_string(i) + ">(" + resolved_accessor + ")", nextPath, elements_accessor+"[" + std::to_string(i) + "]"); block_if_data->appendBlock(b2); i++; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.h index 55d03d174..2ed85c206 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.h @@ -39,8 +39,8 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/detail/PrimitiveGenerator.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/detail/PrimitiveGenerator.h index b617536e1..273813374 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/detail/PrimitiveGenerator.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/detail/PrimitiveGenerator.h @@ -38,19 +38,20 @@ namespace armarx::aron::codegenerator::cpp::generator::detail using SpecializedGeneratorBase<typeT, DerivedT>::SpecializedGeneratorBase; virtual ~PrimitiveGenerator() = default; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const override { auto block_if_data = std::make_shared<CppBlock>(); std::string resolved_accessor = this->resolveMaybeAccessor(cppAccessor); std::string escaped_accessor = this->EscapeAccessor(cppAccessor); variantAccessor = Generator::ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor; - block_if_data->addLine(variantAccessor + " = " + this->ARON_WRITER_ACCESSOR + ".writePrimitive(" + resolved_accessor + "); // of " + cppAccessor); + block_if_data->addLine(variantAccessor + " = " + this->ARON_WRITER_ACCESSOR + ".writePrimitive(" + resolved_accessor + ", "+ + "armarx::aron::Path("+this->ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor); return this->resolveMaybeWriteBlock(block_if_data, cppAccessor); } - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override { auto block_if_data = std::make_shared<CppBlock>(); std::string resolved_accessor = this->resolveMaybeAccessor(cppAccessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp index ee638f0ab..9547f5ff5 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp @@ -56,7 +56,7 @@ namespace armarx::aron::codegenerator::cpp::generator return b; } - CppBlockPtr IntEnum::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr IntEnum::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -66,18 +66,19 @@ namespace armarx::aron::codegenerator::cpp::generator return b; } - CppBlockPtr IntEnum::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr IntEnum::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor; - block_if_data->addLine(variantAccessor+" = " + cppAccessor + nextEl() + "write(" + ARON_WRITER_ACCESSOR + ");"); + block_if_data->addLine(variantAccessor+" = " + cppAccessor + nextEl() + "write(" + ARON_WRITER_ACCESSOR + ", "+ + "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor); return resolveMaybeWriteBlock(block_if_data, cppAccessor); } - CppBlockPtr IntEnum::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const + CppBlockPtr IntEnum::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); if (const auto reset = resolveMaybeGenerator(cppAccessor); !reset.empty()) diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.h index 1d0e35b09..694cb7dc1 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.h @@ -46,8 +46,8 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const override; CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.cpp index d0d5043c2..f6d6ba2c7 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.cpp @@ -59,7 +59,7 @@ namespace armarx::aron::codegenerator::cpp::generator } - CppBlockPtr Image::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Image::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -70,7 +70,7 @@ namespace armarx::aron::codegenerator::cpp::generator } - CppBlockPtr Image::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Image::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -78,12 +78,16 @@ namespace armarx::aron::codegenerator::cpp::generator const std::string shape_vec = ARON_VARIABLE_PREFIX + "_" + escaped_accessor + "_imageShape"; block_if_data->addLine("std::vector<int> " + shape_vec + "(" + cppAccessor + nextEl() + "size.p, " + cppAccessor + nextEl() + "size.p + " + cppAccessor + nextEl() + "dims);"); block_if_data->addLine(shape_vec+".push_back(" + cppAccessor + nextEl() + "elemSize());"); - block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray(" + shape_vec + ", std::to_string(" + cppAccessor + nextEl() + "type()), reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "data)); // of " + cppAccessor); + + block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray(" + shape_vec + ", "+ + "std::to_string(" + cppAccessor + nextEl() + "type()), "+ + "reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "data), "+ + "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor); return resolveMaybeWriteBlock(block_if_data, cppAccessor); } - CppBlockPtr Image::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const + CppBlockPtr Image::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.h index 8c56ead46..027dfba2e 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.h @@ -44,9 +44,9 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const override; CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override; public: diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.cpp index 547522026..4c2b71fa8 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.cpp @@ -52,7 +52,7 @@ namespace armarx::aron::codegenerator::cpp::generator return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); } - CppBlockPtr Matrix::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Matrix::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -63,21 +63,23 @@ namespace armarx::aron::codegenerator::cpp::generator return b; } - CppBlockPtr Matrix::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Matrix::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor; - const std::string line_if_data = "" + ARON_WRITER_ACCESSOR + ".writeNDArray({(int) " + cppAccessor + nextEl() + "rows(), (int) " + cppAccessor + nextEl() + - "cols(), " + std::to_string(ElementType2Cpp.at(type.getElementType()).second) + "}, \"" + - ElementType2Cpp.at(type.getElementType()).first + "\", reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + - "data()));"; - block_if_data->addLine(variantAccessor + " = " + line_if_data + " // of " + cppAccessor); + block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({(int) " + cppAccessor + nextEl() + "rows(), "+ + "(int) " + cppAccessor + nextEl() + "cols(), " + + std::to_string(ElementType2Cpp.at(type.getElementType()).second) + "}, "+ + "\"" + ElementType2Cpp.at(type.getElementType()).first + "\", "+ + "reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "data()), " + + "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor); + return resolveMaybeWriteBlock(block_if_data, cppAccessor); } - CppBlockPtr Matrix::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const + CppBlockPtr Matrix::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.h index 44a78d9ed..f4c6c1e66 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.h @@ -42,9 +42,9 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override; public: diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.cpp index ae7db10ce..5981ba326 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.cpp @@ -42,19 +42,19 @@ namespace armarx::aron::codegenerator::cpp::generator return resolveMaybeResetSoftBlock(block_if_data, cppAccessor); } - CppBlockPtr NDArray::getWriteTypeBlock(const std::string&, const std::string&, std::string&) const + CppBlockPtr NDArray::getWriteTypeBlock(const std::string&, const std::string&, const Path& p, std::string&) const { CppBlockPtr b = std::make_shared<CppBlock>(); return b; } - CppBlockPtr NDArray::getWriteBlock(const std::string& cppAccessor, std::string&) const + CppBlockPtr NDArray::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string&) const { CppBlockPtr b = std::make_shared<CppBlock>(); return b; } - CppBlockPtr NDArray::getReadBlock(const std::string& cppAccessor, const std::string&) const + CppBlockPtr NDArray::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string&) const { CppBlockPtr b = std::make_shared<CppBlock>(); return b; diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.h index 8127f2c6b..9adc6be06 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.h @@ -42,8 +42,8 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.cpp index 47f8a30c2..829fb7483 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.cpp @@ -42,7 +42,7 @@ namespace armarx::aron::codegenerator::cpp::generator return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); } - CppBlockPtr Orientation::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Orientation::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -52,18 +52,21 @@ namespace armarx::aron::codegenerator::cpp::generator return b; } - CppBlockPtr Orientation::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Orientation::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor; - block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({1, 4, 4}, \"float\", reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "coeffs().data())); // of " + cppAccessor); + block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({1, 4, 4}, "+ + "\"float\", "+ + "reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "coeffs().data()), "+ + "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor); return resolveMaybeWriteBlock(block_if_data, cppAccessor); } - CppBlockPtr Orientation::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const + CppBlockPtr Orientation::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.h index d7f5f6586..5b3b7d4cf 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.h @@ -40,9 +40,9 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations CppBlockPtr getResetSoftBlock(const std::string&) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; CppBlockPtr getEqualsBlock(const std::string& cppAccessor, const std::string&) const override; }; diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.cpp index c0fbed112..f0e6448b1 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.cpp @@ -59,7 +59,7 @@ namespace armarx::aron::codegenerator::cpp::generator return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); } - CppBlockPtr PointCloud::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr PointCloud::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -69,18 +69,21 @@ namespace armarx::aron::codegenerator::cpp::generator return b; } - CppBlockPtr PointCloud::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr PointCloud::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor; - block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({" + cppAccessor + nextEl() + "width, " + cppAccessor + nextEl() + "height, " + std::to_string(VoxelType2Cpp.at(type.getVoxelType()).second) + "}, \"" + VoxelType2Cpp.at(type.getVoxelType()).first + "\", reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "points.data())); // of " + cppAccessor); + block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({" + cppAccessor + nextEl() + "width, " + cppAccessor + nextEl() + "height, " + std::to_string(VoxelType2Cpp.at(type.getVoxelType()).second) + "}, "+ + "\"" + VoxelType2Cpp.at(type.getVoxelType()).first + "\", "+ + "reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "points.data()), "+ + "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor); return resolveMaybeWriteBlock(block_if_data, cppAccessor); } - CppBlockPtr PointCloud::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const + CppBlockPtr PointCloud::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.h index fb267a966..302e9114b 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.h @@ -41,9 +41,9 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; CppBlockPtr getEqualsBlock(const std::string& cppAccessor, const std::string&) const override; public: diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.cpp index b377dde0f..029ce0348 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.cpp @@ -46,7 +46,7 @@ namespace armarx::aron::codegenerator::cpp::generator return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); } - CppBlockPtr Pose::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Pose::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -56,18 +56,21 @@ namespace armarx::aron::codegenerator::cpp::generator return b; } - CppBlockPtr Pose::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Pose::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor; - block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({4, 4, 4}, \"float\", reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "data())); // of " + cppAccessor); + block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({4, 4, 4}, "+ + "\"float\", "+ + "reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "data()), "+ + "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor); return resolveMaybeWriteBlock(block_if_data, cppAccessor); } - CppBlockPtr Pose::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const + CppBlockPtr Pose::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.h index b684debf1..dc142f3ee 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.h @@ -39,9 +39,9 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; CppBlockPtr getEqualsBlock(const std::string& cppAccessor, const std::string&) const override; }; diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.cpp index 37c38e8af..1cdddae37 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.cpp @@ -46,7 +46,7 @@ namespace armarx::aron::codegenerator::cpp::generator return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); } - CppBlockPtr Position::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Position::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -56,18 +56,21 @@ namespace armarx::aron::codegenerator::cpp::generator return b; } - CppBlockPtr Position::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Position::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor; - block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({3, 1, 4}, \"float\", reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "data())); // of " + cppAccessor); + block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({3, 1, 4}, "+ + "\"float\", "+ + "reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "data()), "+ + "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor); return resolveMaybeWriteBlock(block_if_data, cppAccessor); } - CppBlockPtr Position::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const + CppBlockPtr Position::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.h index 28021af44..251b27c7c 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.h @@ -39,9 +39,9 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; CppBlockPtr getEqualsBlock(const std::string& cppAccessor, const std::string&) const override; }; diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.cpp index 3a207ab39..7bdc3fd6a 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.cpp @@ -53,7 +53,7 @@ namespace armarx::aron::codegenerator::cpp::generator return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); } - CppBlockPtr Quaternion::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Quaternion::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); @@ -63,18 +63,21 @@ namespace armarx::aron::codegenerator::cpp::generator return b; } - CppBlockPtr Quaternion::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Quaternion::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor; - block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({1, 4, " + std::to_string(ElementType2Cpp.at(type.getElementType()).second) + "}, \"" + ElementType2Cpp.at(type.getElementType()).first + "\", reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "coeffs().data())); // of " + cppAccessor); + block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({1, 4, " + std::to_string(ElementType2Cpp.at(type.getElementType()).second) + "}, "+ + "\"" + ElementType2Cpp.at(type.getElementType()).first + "\", "+ + "reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "coeffs().data()), "+ + "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor); return resolveMaybeWriteBlock(block_if_data, cppAccessor); } - CppBlockPtr Quaternion::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const + CppBlockPtr Quaternion::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.h index c552274d3..af1ff9aa9 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.h @@ -42,9 +42,9 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override; public: diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp index ccd49acd0..5cc283fc2 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp @@ -35,7 +35,7 @@ namespace armarx::aron::codegenerator::cpp::generator } /* virtual implementations */ - CppBlockPtr Bool::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, std::string& variantAccessor) const + CppBlockPtr Bool::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(accessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.h index 6d6681083..082859e00 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.h @@ -39,6 +39,6 @@ namespace armarx::aron::codegenerator::cpp::generator virtual ~Bool() = default; /* virtual implementations */ - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.cpp index 72f7a79c1..ee262c12b 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.cpp @@ -39,7 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator } /* virtual implementations */ - CppBlockPtr Double::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, std::string& variantAccessor) const + CppBlockPtr Double::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(accessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.h index 6e7f57589..dc65d42d9 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.h @@ -38,6 +38,6 @@ namespace armarx::aron::codegenerator::cpp::generator virtual ~Double() = default; /* virtual implementations */ - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.cpp index 7b7667321..ba009be59 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.cpp @@ -39,7 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator } /* virtual implementations */ - CppBlockPtr Float::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, std::string& variantAccessor) const + CppBlockPtr Float::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(accessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.h index c2fd86a8e..3e4381262 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.h @@ -38,6 +38,6 @@ namespace armarx::aron::codegenerator::cpp::generator virtual ~Float() = default; /* virtual implementations */ - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.cpp index 4688a18cc..a7d815f15 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.cpp @@ -39,7 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator } /* virtual implementations */ - CppBlockPtr Int::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, std::string& variantAccessor) const + CppBlockPtr Int::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(accessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.h index de61c2786..a57193e00 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.h @@ -38,6 +38,6 @@ namespace armarx::aron::codegenerator::cpp::generator virtual ~Int() = default; /* virtual implementations */ - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.cpp index a2463ffa6..cfc6d86c5 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.cpp @@ -39,7 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator } /* virtual implementations */ - CppBlockPtr Long::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, std::string& variantAccessor) const + CppBlockPtr Long::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(accessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.h index 265f1c1ce..c16b8c439 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.h @@ -38,6 +38,6 @@ namespace armarx::aron::codegenerator::cpp::generator virtual ~Long() = default; /* virtual implementations */ - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.cpp index 75e3314fa..f2c48085d 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.cpp @@ -39,7 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator } /* virtual implementations */ - CppBlockPtr String::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, std::string& variantAccessor) const + CppBlockPtr String::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(accessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.h index 0e795d06e..254cd4e84 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.h @@ -38,6 +38,6 @@ namespace armarx::aron::codegenerator::cpp::generator virtual ~String() = default; /* virtual implementations */ - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.cpp index befc258ee..bfbacd208 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.cpp @@ -39,7 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator } /* virtual implementations */ - CppBlockPtr Time::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, std::string& variantAccessor) const + CppBlockPtr Time::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr b = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(accessor); @@ -49,18 +49,19 @@ namespace armarx::aron::codegenerator::cpp::generator return b; } - CppBlockPtr Time::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const + CppBlockPtr Time::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor; - block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePrimitive(" + cppAccessor + nextEl() + "toMicroSeconds()); // of " + cppAccessor); + block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePrimitive(" + cppAccessor + nextEl() + "toMicroSeconds(), "+ + "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor); return resolveMaybeWriteBlock(block_if_data, cppAccessor); } - CppBlockPtr Time::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const + CppBlockPtr Time::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); std::string escaped_accessor = EscapeAccessor(cppAccessor); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.h index a56233e1a..caa92b1bf 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.h @@ -38,8 +38,8 @@ namespace armarx::aron::codegenerator::cpp::generator virtual ~Time() = default; /* virtual implementations */ - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp index 7c2bfead4..8853abb33 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp @@ -96,7 +96,7 @@ namespace armarx::aron::codegenerator::cpp::generator return block_if_data; } - CppBlockPtr IntEnumClass::getWriteTypeBlock(const std::string&, const std::string&, std::string&) const + CppBlockPtr IntEnumClass::getWriteTypeBlock(const std::string&, const std::string&, const Path& p, std::string&) const { static const std::string INT_ENUM_VALUE_MAP = ARON_VARIABLE_PREFIX + "_str2ValueMap"; @@ -110,14 +110,16 @@ namespace armarx::aron::codegenerator::cpp::generator return b; } - CppBlockPtr IntEnumClass::getWriteBlock(const std::string&, std::string&) const + CppBlockPtr IntEnumClass::getWriteBlock(const std::string&, const Path& p, std::string&) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); - block_if_data->addLine("return " + ARON_WRITER_ACCESSOR + ".writePrimitive(EnumToValueMap.at(value)); // of top level enum " + getCoreCppTypename()); + + block_if_data->addLine("return " + ARON_WRITER_ACCESSOR + ".writePrimitive(EnumToValueMap.at(value), "+ + ARON_PATH_ACCESSOR + "); // of top level enum " + getCoreCppTypename()); return block_if_data; } - CppBlockPtr IntEnumClass::getReadBlock(const std::string&, const std::string& variantAccessor) const + CppBlockPtr IntEnumClass::getReadBlock(const std::string&, const Path& p, const std::string& variantAccessor) const { static const std::string INT_ENUM_TMP_VALUE = ARON_VARIABLE_PREFIX + "_tmpValue"; diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h index ce3ac5c96..ec4617d2c 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h @@ -44,9 +44,9 @@ namespace armarx::aron::codegenerator::cpp::generator std::vector<CppFieldPtr> getPublicVariableDeclarations(const std::string&) const override; CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const override; CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override; CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override; // TODO: Move some of those methods to upper class for enums (if we want to support multiple enums) diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp index e46d4272f..bde9b45c3 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp @@ -87,7 +87,7 @@ namespace armarx::aron::codegenerator::cpp::generator return block_if_data; } - CppBlockPtr ObjectClass::getWriteTypeBlock(const std::string&, const std::string&, std::string&) const + CppBlockPtr ObjectClass::getWriteTypeBlock(const std::string&, const std::string&, const Path& p, std::string&) const { static const std::string OBJECT_MEMBERS_ACCESSOR = ARON_VARIABLE_PREFIX + "_objectMembers"; static const std::string OBJECT_EXTENDS_ACCESSOR = ARON_VARIABLE_PREFIX + "_objectExtends"; @@ -107,7 +107,8 @@ namespace armarx::aron::codegenerator::cpp::generator { const auto child_s = FromAronType(*child); std::string child_return_variant; - CppBlockPtr child_b = child_s->getWriteTypeBlock(child_s->getFullCppTypename(), key, child_return_variant); + Path nextPath = p.withElement("\"" + key + "\""); + CppBlockPtr child_b = child_s->getWriteTypeBlock(child_s->getFullCppTypename(), key, nextPath, child_return_variant); b->appendBlock(child_b); b->addLine(OBJECT_MEMBERS_ACCESSOR + ".emplace(\"" + key + "\", " + child_return_variant + ");"); } @@ -124,7 +125,7 @@ namespace armarx::aron::codegenerator::cpp::generator return b; } - CppBlockPtr ObjectClass::getWriteBlock(const std::string&, std::string&) const + CppBlockPtr ObjectClass::getWriteBlock(const std::string&, const Path& p, std::string&) const { static const std::string OBJECT_MEMBERS_ACCESSOR = ARON_VARIABLE_PREFIX + "_objectMembers"; static const std::string OBJECT_EXTENDS_ACCESSOR = ARON_VARIABLE_PREFIX + "_objectExtends"; @@ -146,17 +147,21 @@ namespace armarx::aron::codegenerator::cpp::generator { const auto child_s = FromAronType(*child); std::string child_return_variant; - CppBlockPtr child_b = child_s->getWriteBlock(key, child_return_variant); + + Path nextPath = p.withElement("\"" + key + "\""); + CppBlockPtr child_b = child_s->getWriteBlock(key, nextPath, child_return_variant); block_if_data->addLine("auto " + child_return_variant + " = " + ARON_WRITER_ACCESSOR + ".writeNull();"); block_if_data->appendBlock(child_b); block_if_data->addLine(OBJECT_MEMBERS_ACCESSOR + ".emplace(\"" + key + "\", " + child_return_variant + ");"); } - block_if_data->addLine("return " + ARON_WRITER_ACCESSOR + ".writeDict("+OBJECT_MEMBERS_ACCESSOR+", " + OBJECT_EXTENDS_ACCESSOR + "); // of top level object " + getCoreCppTypename()); + block_if_data->addLine("return " + ARON_WRITER_ACCESSOR + ".writeDict("+OBJECT_MEMBERS_ACCESSOR+", " + + OBJECT_EXTENDS_ACCESSOR + ", "+ + ARON_PATH_ACCESSOR + "); // of top level object " + getCoreCppTypename()); return block_if_data; } - CppBlockPtr ObjectClass::getReadBlock(const std::string&, const std::string& variantAccessor) const + CppBlockPtr ObjectClass::getReadBlock(const std::string&, const Path& p, const std::string& variantAccessor) const { static const std::string OBJECT_MEMBERS_ACCESSOR = ARON_VARIABLE_PREFIX + "_objectMembers"; static const std::string OBJECT_EXTENDS_ACCESSOR = ARON_VARIABLE_PREFIX + "_objectExtends"; @@ -176,7 +181,8 @@ namespace armarx::aron::codegenerator::cpp::generator { const auto child_s = FromAronType(*child); const std::string child_variant_accessor = OBJECT_MEMBERS_ACCESSOR + ".at(\"" + key + "\")"; - block_if_data->appendBlock(child_s->getReadBlock(key, child_variant_accessor)); + Path nextPath = p.withElement("\"" + key + "\""); + block_if_data->appendBlock(child_s->getReadBlock(key, nextPath, child_variant_accessor)); } return block_if_data; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h index 56ccc97a8..27fd14a7b 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h @@ -41,9 +41,9 @@ namespace armarx::aron::codegenerator::cpp::generator std::vector<CppFieldPtr> getPublicVariableDeclarations(const std::string&) const override; CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const override; CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override; - CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override; - CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string&) const override; - CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string&) const override; + CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override; + CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string&) const override; + CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string&) const override; CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/data/rw/Writer.h b/source/RobotAPI/libraries/aron/core/data/rw/Writer.h index edd43903f..f75438b52 100644 --- a/source/RobotAPI/libraries/aron/core/data/rw/Writer.h +++ b/source/RobotAPI/libraries/aron/core/data/rw/Writer.h @@ -38,52 +38,52 @@ namespace armarx::aron::data virtual ~WriterInterface() = default; - virtual ReturnType writeList(const std::vector<ReturnType>& elements) = 0; - virtual ReturnType writeDict(const std::map<std::string, ReturnType>& elements, const std::optional<ReturnType>& extends = std::nullopt) = 0; + virtual ReturnType writeList(const std::vector<ReturnType>& elements, const Path& p) = 0; + virtual ReturnType writeDict(const std::map<std::string, ReturnType>& elements, const std::optional<ReturnType>& extends, const Path& p) = 0; - virtual ReturnType writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data) = 0; + virtual ReturnType writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data, const Path& p) = 0; - virtual ReturnType writeInt(const int i) = 0; - virtual ReturnType writeLong(const long i) = 0; - virtual ReturnType writeFloat(const float i) = 0; - virtual ReturnType writeDouble(const double i) = 0; - virtual ReturnType writeString(const std::string& i) = 0; - virtual ReturnType writeBool(const bool i) = 0; + virtual ReturnType writeInt(const int i, const Path& p) = 0; + virtual ReturnType writeLong(const long i, const Path& p) = 0; + virtual ReturnType writeFloat(const float i, const Path& p) = 0; + virtual ReturnType writeDouble(const double i, const Path& p) = 0; + virtual ReturnType writeString(const std::string& i, const Path& p) = 0; + virtual ReturnType writeBool(const bool i, const Path& p) = 0; - virtual ReturnType writeNull() // defaulted implementation + virtual ReturnType writeNull(const Path& p = Path()) // defaulted implementation { return {}; } // Convenience methods - ReturnType writePrimitive(const int i) + ReturnType writePrimitive(const int i, const Path& p = Path()) { - return writeInt(i); + return writeInt(i, p); } - ReturnType writePrimitive(const long i) + ReturnType writePrimitive(const long i, const Path& p = Path()) { - return writeLong(i); + return writeLong(i, p); } - ReturnType writePrimitive(const float i) + ReturnType writePrimitive(const float i, const Path& p = Path()) { - return writeFloat(i); + return writeFloat(i, p); } - ReturnType writePrimitive(const double i) + ReturnType writePrimitive(const double i, const Path& p = Path()) { - return writeDouble(i); + return writeDouble(i, p); } - ReturnType writePrimitive(const std::string& i) + ReturnType writePrimitive(const std::string& i, const Path& p = Path()) { - return writeString(i); + return writeString(i, p); } - ReturnType writePrimitive(const bool i) + ReturnType writePrimitive(const bool i, const Path& p = Path()) { - return writeBool(i); + return writeBool(i, p); } }; diff --git a/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.cpp b/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.cpp index 6a119999a..bfd75e274 100644 --- a/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.cpp +++ b/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.cpp @@ -40,7 +40,7 @@ namespace armarx::aron::data::writer } } - nlohmann::json NlohmannJSONWriter::writeList(const std::vector<nlohmann::json>& elements) + nlohmann::json NlohmannJSONWriter::writeList(const std::vector<nlohmann::json>& elements, const Path&) { nlohmann::json o; setupAronInformationForType(o, rw::json::constantes::LIST_TYPENAME_SLUG); @@ -48,7 +48,7 @@ namespace armarx::aron::data::writer return o; } - nlohmann::json NlohmannJSONWriter::writeDict(const std::map<std::string, nlohmann::json>& elements, const std::optional<nlohmann::json>& extends) + nlohmann::json NlohmannJSONWriter::writeDict(const std::map<std::string, nlohmann::json>& elements, const std::optional<nlohmann::json>& extends, const Path&) { auto o = extends ? extends.value() : nlohmann::json(); @@ -57,7 +57,7 @@ namespace armarx::aron::data::writer return o; } - nlohmann::json NlohmannJSONWriter::writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data) + nlohmann::json NlohmannJSONWriter::writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data, const Path&) { nlohmann::json o; setupAronInformationForType(o, rw::json::constantes::NDARRAY_TYPENAME_SLUG); @@ -71,7 +71,7 @@ namespace armarx::aron::data::writer return o; } - nlohmann::json NlohmannJSONWriter::writeInt(const int i) + nlohmann::json NlohmannJSONWriter::writeInt(const int i, const Path&) { nlohmann::json o; setupAronInformationForType(o, rw::json::constantes::INT_TYPENAME_SLUG); @@ -79,7 +79,7 @@ namespace armarx::aron::data::writer return o; } - nlohmann::json NlohmannJSONWriter::writeLong(const long i) + nlohmann::json NlohmannJSONWriter::writeLong(const long i, const Path&) { nlohmann::json o; setupAronInformationForType(o, rw::json::constantes::LONG_TYPENAME_SLUG); @@ -87,7 +87,7 @@ namespace armarx::aron::data::writer return o; } - nlohmann::json NlohmannJSONWriter::writeFloat(const float i) + nlohmann::json NlohmannJSONWriter::writeFloat(const float i, const Path&) { nlohmann::json o; setupAronInformationForType(o, rw::json::constantes::FLOAT_TYPENAME_SLUG); @@ -95,7 +95,7 @@ namespace armarx::aron::data::writer return o; } - nlohmann::json NlohmannJSONWriter::writeDouble(const double i) + nlohmann::json NlohmannJSONWriter::writeDouble(const double i, const Path&) { nlohmann::json o; setupAronInformationForType(o, rw::json::constantes::DOUBLE_TYPENAME_SLUG); @@ -103,7 +103,7 @@ namespace armarx::aron::data::writer return o; } - nlohmann::json NlohmannJSONWriter::writeString(const std::string& i) + nlohmann::json NlohmannJSONWriter::writeString(const std::string& i, const Path&) { nlohmann::json o; setupAronInformationForType(o, rw::json::constantes::STRING_TYPENAME_SLUG); @@ -111,7 +111,7 @@ namespace armarx::aron::data::writer return o; } - nlohmann::json NlohmannJSONWriter::writeBool(const bool i) + nlohmann::json NlohmannJSONWriter::writeBool(const bool i, const Path&) { nlohmann::json o; setupAronInformationForType(o, rw::json::constantes::BOOL_TYPENAME_SLUG); diff --git a/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.h b/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.h index 799713333..fd281e5bc 100644 --- a/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.h +++ b/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.h @@ -39,16 +39,16 @@ namespace armarx::aron::data::writer public: NlohmannJSONWriter() = default; - nlohmann::json writeList(const std::vector<nlohmann::json>& elements) override; - nlohmann::json writeDict(const std::map<std::string, nlohmann::json>& elements, const std::optional<nlohmann::json>& extends = std::nullopt) override; + nlohmann::json writeList(const std::vector<nlohmann::json>& elements, const Path& p = Path()) override; + nlohmann::json writeDict(const std::map<std::string, nlohmann::json>& elements, const std::optional<nlohmann::json>& extends = std::nullopt, const Path& p = Path()) override; - nlohmann::json writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data) override; + nlohmann::json writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data, const Path& p = Path()) override; - nlohmann::json writeInt(const int i) override; - nlohmann::json writeLong(const long i) override; - nlohmann::json writeFloat(const float i) override; - nlohmann::json writeDouble(const double i) override; - nlohmann::json writeString(const std::string& i) override; - nlohmann::json writeBool(const bool i) override; + nlohmann::json writeInt(const int i, const Path& p = Path()) override; + nlohmann::json writeLong(const long i, const Path& p = Path()) override; + nlohmann::json writeFloat(const float i, const Path& p = Path()) override; + nlohmann::json writeDouble(const double i, const Path& p = Path()) override; + nlohmann::json writeString(const std::string& i, const Path& p = Path()) override; + nlohmann::json writeBool(const bool i, const Path& p = Path()) override; }; } diff --git a/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.cpp b/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.cpp index dd2c4d839..d7aaa4b0c 100644 --- a/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.cpp +++ b/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.cpp @@ -32,9 +32,9 @@ namespace armarx::aron::data::writer { - data::VariantPtr VariantWriter::writeList(const std::vector<data::VariantPtr>& elements) + data::VariantPtr VariantWriter::writeList(const std::vector<data::VariantPtr>& elements, const Path& p) { - auto o = std::make_shared<data::List>(); + auto o = std::make_shared<data::List>(p); for (const auto& el : elements) { o->addElement(el); @@ -42,9 +42,9 @@ namespace armarx::aron::data::writer return o; } - data::VariantPtr VariantWriter::writeDict(const std::map<std::string, data::VariantPtr>& elements, const std::optional<data::VariantPtr>& extends) + data::VariantPtr VariantWriter::writeDict(const std::map<std::string, data::VariantPtr>& elements, const std::optional<data::VariantPtr>& extends, const Path& p) { - auto o = extends ? data::Dict::DynamicCastAndCheck(extends.value()) : std::make_shared<data::Dict>(); + auto o = extends ? data::Dict::DynamicCastAndCheck(extends.value()) : std::make_shared<data::Dict>(p); for(const auto& [key, value] : elements) { @@ -53,9 +53,9 @@ namespace armarx::aron::data::writer return o; } - data::VariantPtr VariantWriter::writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data) + data::VariantPtr VariantWriter::writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data, const Path& p) { - auto o = std::make_shared<data::NDArray>(); + auto o = std::make_shared<data::NDArray>(p); o->setShape(shape); o->setType(typeAsString); int size = shape.empty() ? 0 : std::accumulate(std::begin(shape), std::end(shape), 1, std::multiplies<int>()); @@ -63,44 +63,44 @@ namespace armarx::aron::data::writer return o; } - data::VariantPtr VariantWriter::writeInt(const int i) + data::VariantPtr VariantWriter::writeInt(const int i, const Path& p) { - auto o = std::make_shared<data::Int>(); + auto o = std::make_shared<data::Int>(p); o->setValue(i); return o; } - data::VariantPtr VariantWriter::writeLong(const long i) + data::VariantPtr VariantWriter::writeLong(const long i, const Path& p) { - auto o = std::make_shared<data::Long>(); + auto o = std::make_shared<data::Long>(p); o->setValue(i); return o; } - data::VariantPtr VariantWriter::writeFloat(const float i) + data::VariantPtr VariantWriter::writeFloat(const float i, const Path& p) { - auto o = std::make_shared<data::Float>(); + auto o = std::make_shared<data::Float>(p); o->setValue(i); return o; } - data::VariantPtr VariantWriter::writeDouble(const double i) + data::VariantPtr VariantWriter::writeDouble(const double i, const Path& p) { - auto o = std::make_shared<data::Double>(); + auto o = std::make_shared<data::Double>(p); o->setValue(i); return o; } - data::VariantPtr VariantWriter::writeString(const std::string& i) + data::VariantPtr VariantWriter::writeString(const std::string& i, const Path& p) { - auto o = std::make_shared<data::String>(); + auto o = std::make_shared<data::String>(p); o->setValue(i); return o; } - data::VariantPtr VariantWriter::writeBool(const bool i) + data::VariantPtr VariantWriter::writeBool(const bool i, const Path& p) { - auto o = std::make_shared<data::Bool>(); + auto o = std::make_shared<data::Bool>(p); o->setValue(i); return o; } diff --git a/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.h b/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.h index d984ae53c..9f46f49ac 100644 --- a/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.h +++ b/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.h @@ -38,16 +38,16 @@ namespace armarx::aron::data::writer public: VariantWriter() = default; - data::VariantPtr writeList(const std::vector<data::VariantPtr>& elements) override; - data::VariantPtr writeDict(const std::map<std::string, data::VariantPtr>& elements, const std::optional<data::VariantPtr>& extends = std::nullopt) override; + data::VariantPtr writeList(const std::vector<data::VariantPtr>& elements, const Path& p = Path()) override; + data::VariantPtr writeDict(const std::map<std::string, data::VariantPtr>& elements, const std::optional<data::VariantPtr>& extends = std::nullopt, const Path& p = Path()) override; - data::VariantPtr writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data) override; + data::VariantPtr writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data, const Path& p = Path()) override; - data::VariantPtr writeInt(const int i) override; - data::VariantPtr writeLong(const long i) override; - data::VariantPtr writeFloat(const float i) override; - data::VariantPtr writeDouble(const double i) override; - data::VariantPtr writeString(const std::string& i) override; - data::VariantPtr writeBool(const bool i) override; + data::VariantPtr writeInt(const int i, const Path& p = Path()) override; + data::VariantPtr writeLong(const long i, const Path& p = Path()) override; + data::VariantPtr writeFloat(const float i, const Path& p = Path()) override; + data::VariantPtr writeDouble(const double i, const Path& p = Path()) override; + data::VariantPtr writeString(const std::string& i, const Path& p = Path()) override; + data::VariantPtr writeBool(const bool i, const Path& p = Path()) override; }; } diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp index 5f1da4558..e2d53ad04 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp +++ b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp @@ -43,7 +43,7 @@ namespace armarx::aron::data { for (const auto& [key, dataPtr] : this->aron->elements) { - childrenNavigators[key] = Variant::FromAronDTO(dataPtr, Path(path, key)); + childrenNavigators[key] = Variant::FromAronDTO(dataPtr, path.withElement(key)); } } @@ -84,6 +84,10 @@ namespace armarx::aron::data } return *this == *other; } + VariantPtr Dict::operator[](const std::string& s) const + { + return getElement(s); + } // static methods DictPtr Dict::FromAronDictPtr(const data::dto::DictPtr& aron) @@ -176,6 +180,11 @@ namespace armarx::aron::data aron->elements.clear(); } + VariantPtr Dict::at(const std::string& s) const + { + return getElement(s); + } + // virtual implementations std::string Dict::getShortName() const { diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h index b5463de9c..69315653a 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h +++ b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h @@ -51,6 +51,7 @@ namespace armarx::aron::data // operators virtual bool operator==(const Dict&) const override; bool operator==(const DictPtr&) const override; + VariantPtr operator[](const std::string&) const; static PointerType FromAronDictPtr(const data::dto::DictPtr& aron); static data::dto::DictPtr ToAronDictPtr(const PointerType& navigator); @@ -66,6 +67,7 @@ namespace armarx::aron::data VariantPtr getElement(const std::string&) const; std::map<std::string, VariantPtr> getElements() const; + VariantPtr at(const std::string&) const; void removeElement(const std::string& key); void clear(); diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp b/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp index 6be5ed1d2..2389e7ad5 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp +++ b/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp @@ -45,7 +45,7 @@ namespace armarx::aron::data unsigned int i = 0; for (const auto& dataPtr : l->elements) { - childrenNavigators.push_back(FromAronDTO(dataPtr, Path(path, std::to_string(i++)))); + childrenNavigators.push_back(FromAronDTO(dataPtr, path.withIndex(i++))); } } diff --git a/source/RobotAPI/libraries/aron/core/test/aronNavigateTest.cpp b/source/RobotAPI/libraries/aron/core/test/aronNavigateTest.cpp index ebc491ef2..e7d0393c6 100644 --- a/source/RobotAPI/libraries/aron/core/test/aronNavigateTest.cpp +++ b/source/RobotAPI/libraries/aron/core/test/aronNavigateTest.cpp @@ -56,24 +56,26 @@ BOOST_AUTO_TEST_CASE(AronNavigateTest) // test Path data::DictPtr aron = k.toAron(); Path path = aron->getPath(); // should be empty since aron is top level object - Path memberReached(path, "reached"); - Path memberJointValues(path, "jointValues"); - Path indexJointValues0(memberJointValues, "0"); - Path indexJointValues1(memberJointValues, "1"); + Path memberReached = path.withElement("reached"); + Path memberJointValues = path.withElement("jointValues"); + Path indexJointValues0 = memberJointValues.withElement("0"); + Path indexJointValues1 = memberJointValues.withElement("1"); - BOOST_CHECK_EQUAL(path.toString(), "\\"); + std::string root = path.getRootIdentifier(); + + BOOST_CHECK_EQUAL(path.toString(), root); BOOST_CHECK_EQUAL(path.size(), 0); - BOOST_CHECK_EQUAL(memberReached.toString(), "\\->reached"); + BOOST_CHECK_EQUAL(memberReached.toString(), root+"->reached"); BOOST_CHECK_EQUAL(memberReached.size(), 1); - BOOST_CHECK_EQUAL(memberJointValues.toString(), "\\->jointValues"); + BOOST_CHECK_EQUAL(memberJointValues.toString(), root+"->jointValues"); BOOST_CHECK_EQUAL(memberJointValues.size(), 1); - BOOST_CHECK_EQUAL(indexJointValues0.toString(), "\\->jointValues->0"); + BOOST_CHECK_EQUAL(indexJointValues0.toString(), root+"->jointValues->0"); BOOST_CHECK_EQUAL(indexJointValues0.size(), 2); - BOOST_CHECK_EQUAL(indexJointValues1.toString(), "\\->jointValues->1"); + BOOST_CHECK_EQUAL(indexJointValues1.toString(), root+"->jointValues->1"); BOOST_CHECK_EQUAL(indexJointValues1.size(), 2); data::BoolPtr reached = data::Bool::DynamicCastAndCheck(aron->navigateAbsolute(memberReached)); @@ -89,6 +91,6 @@ BOOST_AUTO_TEST_CASE(AronNavigateTest) } Path diff = indexJointValues1.getWithoutPrefix(indexJointValues0); - BOOST_CHECK_EQUAL(diff.toString(), "\\->1"); + BOOST_CHECK_EQUAL(diff.toString(), root+"->1"); BOOST_CHECK_EQUAL(diff.size(), 1); } diff --git a/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp b/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp index f9e023a84..3d2ba252c 100644 --- a/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp +++ b/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp @@ -187,7 +187,7 @@ namespace armarx::aron::typereader::xml std::vector<RapidXmlReaderNode> children = objectChild.nodes(); auto maybe = getMaybe(children[0]); - type::VariantPtr childNavigator = create(children[0], Path(path, key)); + type::VariantPtr childNavigator = create(children[0], path.withElement(key)); childNavigator->setMaybe(maybe); members.insert({key, childNavigator}); @@ -213,7 +213,7 @@ namespace armarx::aron::typereader::xml std::vector<RapidXmlReaderNode> c = node.nodes(); const RapidXmlReaderNode typeNode = c[0]; - type::VariantPtr type = create(typeNode, Path(path, "::accepted-type")); + type::VariantPtr type = create(typeNode, path.withAcceptedType()); type->setMaybe(getMaybe(typeNode)); auto o = std::make_shared<type::List>(type, path); @@ -226,7 +226,7 @@ namespace armarx::aron::typereader::xml std::vector<RapidXmlReaderNode> c = node.nodes(); const RapidXmlReaderNode typeNode = c[0]; - type::VariantPtr type = create(typeNode, Path(path, "::accepted-type")); + type::VariantPtr type = create(typeNode, path.withAcceptedType()); type->setMaybe(getMaybe(typeNode)); auto o = std::make_shared<type::Dict>(type, path); @@ -247,7 +247,7 @@ namespace armarx::aron::typereader::xml std::vector<RapidXmlReaderNode> typeNodeChildren = tupleTypeDeclarationNode.nodes(); const RapidXmlReaderNode typeNode = typeNodeChildren[0]; - type::VariantPtr type = create(typeNode, Path(path, "::accepted_type_" + std::to_string(i++))); + type::VariantPtr type = create(typeNode, path.withAcceptedTypeIndex(i++)); type->setMaybe(getMaybe(typeNode)); elementTypes.push_back(type); @@ -264,11 +264,11 @@ namespace armarx::aron::typereader::xml std::vector<RapidXmlReaderNode> c = node.nodes(); const RapidXmlReaderNode type1Node = c[0]; - type::VariantPtr type1 = create(type1Node, Path(path, "::accepted_type_" + std::to_string(0))); + type::VariantPtr type1 = create(type1Node, path.withAcceptedTypeIndex(0)); type1->setMaybe(getMaybe(type1Node)); const RapidXmlReaderNode type2Node = c[1]; - type::VariantPtr type2 = create(type2Node, Path(path, "::accepted_type_" + std::to_string(1))); + type::VariantPtr type2 = create(type2Node, path.withAcceptedTypeIndex(1)); type2->setMaybe(getMaybe(type2Node)); auto o = std::make_shared<type::Pair>(type1, type2, path); -- GitLab