diff --git a/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp b/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp index 57056f83a9901b5423e7ef5e6a946d94b5b7c4a7..3404a33127c86b53650ff969166804a14a281681 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 f5396f815a31f12e54836cfe0b1cb1a0b51749ce..dbeb06e785e6035ed06c4c87c9eef008e8b24fbd 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 093fca38a8a4c97367669a86116e57c7503f3a2c..dfe5299f7bf37780a034b83f807496c3636728de 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 a01b0b4620748b581db928c4e7ddcbd7af1a3f46..3141eb165543ba9c8df2e8d3754f14954aa15181 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 398a5b6821f99ed7dc086dbd3564861937b8a07f..46af4143e128d4ca57c75ceedf272d1426ba49aa 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 ca01298108e1640b969b45f24d9a2f84302debfb..d47ca065f5cd5c746dfcdb7cf9aa5e982b9b57a2 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 b3fa265318e41d10681d0287e04314402847058d..666ee05e18aaeebaf9db1ab66c5748956c585801 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 10914c7da2cd777b72229f405b72b47c8e2d8233..8b9d00133992769b25d1978404f2f2a3d1526c19 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 7e4a5dcb1b45a3042c16fd2acabfc5a1781d8bd1..2f8652067d5b23ac8413bfbe31dfb41b73242bf6 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 f4b65623003f78ef124a23db021efce101974de7..158e8c5e1178394ef1c313bb0f96d42b0253d7d8 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 9f9b38486e9bc1049065763b9d89f89ec17083e2..d4e8ba98f35d2eb7fba8369370e914d330f226f2 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 98d3a574be3fb44e0fb75067fb5e18273d47e713..c1a0ef6b621506c0e855117dac81d6e3689b13b2 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 ab96e3fb87a2fe48b98b51a5daceeb4defe4b700..941345a759c4c9f31b0e87ddd39263194ebb95e0 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 e54134fbae50c5547dcddb0ef06bb8d57531c284..ca25e51b7032bbf96dcc6b910289df4412e7fc19 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 3978677fdc29f54fc1041d97b970780ecc37894a..e200e3157731965b0ee3f17be937a477190ed0ce 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 96d978cb603a2e79a5f65abd8063530ca39c8adf..1579bf11ff346ec44fd60792ec6842d9da093a12 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 b20b13a3deca289890f1863925385d14c9802045..d503a291e4edd09f36f5b7ea58b347dbac70b228 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 36d5c73e9ee79c6064915f4b2147deedee3f8a43..0b9de6d85826fb329b6bf3a4b18995cf963a9264 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 79867c9ff700fd3d08e47fdf8459257a830278d3..149c10c523a97f5ca36689531fc21d4c551cd8ae 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 2a2d784bd3ebae2ec7f575ee4d195d94dd26d4da..838db5b0dcabeff6a30a453a515e694901293e27 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 27410667647f3e793aede94677b54af60da1dc77..63296a64372dd0f41dd7553865491e95df5f7dd4 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 9ca8dab0dcdd5432efd145b3b2fbfae4e6a13dbe..c258ddc8addb60f451d62e44b001f29619184ebb 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 196ce6f51effa190191afee346f64842f5bd4f81..04cccc5067ee53f453743a778d16d869adee3aec 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 61f9927747645387d8e9c05ac67b0d48df768ae1..dce8fcf233f20e26f9f8e336b65f70cfcb644311 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 55d03d174f1c7b34fee371e7afce498fbedc4e23..2ed85c206c31611d07c1b2df84f71985a8dcc79f 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 b617536e10d371022a957afd47d0a6094faa6927..27381337413d6f350c11847b236bcdef55937673 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 ee638f0ab77f7c878117686dc1bc0254bfb85921..9547f5ff563e19f1d470fdee22cb8987ca939345 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 1d0e35b09c6e6d2775648cb92ac67a6ccbc69e1a..694cb7dc11c1ed4b3c14881bd9ef100aa99e721a 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 d0d5043c27fc6d7278bea3ba8cd30379bba75583..f6d6ba2c763df223f58336da2b33a351d60e6143 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 8c56ead469a3fba497d94b93154d06285d56b49f..027dfba2e3102edaa6d2909bdf7492954d013ee8 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 5475220262db56e3443d4c58adb05529ac1caaa0..4c2b71fa834526c4be21fad9ec8a95dc24b37608 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 44a78d9ed546474d8cae36f73fa94e34d1e1cd29..f4c6c1e661fb25650f72b5a3f9242c75817d6054 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 ae7db10ce01bac5090f0486a4d6e8bd9710ad23c..5981ba326bc459cf3d1223993f9ffbdda6dcf785 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 8127f2c6b8063aee2d272f044048bc4d2d072739..9adc6be067409c4a15978a50cade08b133e851b2 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 47f8a30c2b66e875eb29bda8a618368d61b32ebe..829fb7483914c8df18c09dca049849050dc5f96a 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 d7f5f6586cd1c34ba5f3da256ddd926adce91cd1..5b3b7d4cfc94e52709e8ffca77fae829595d4f19 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 c0fbed1127a93cbd4e6ba77a035375eba34245c5..f0e6448b153f17599aac1c0e1d837bd1c4e76fa6 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 fb267a9669edc44eee1d79df4e4344e454e76cae..302e9114b3c3e2a1bb4e9b2f83d078e62075f7da 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 b377dde0f39916daa25e80d4b74a7bc665c316c0..029ce03489316cad172d3278f40e285795d3a6b9 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 b684debf1bb8d143004b93be4b21ba07e34ae8f7..dc142f3ee6d28449f3278f82192165361486cce8 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 37c38e8af1a31e039cd8c230ed2b2f6ebe9ae0c1..1cdddae372c3470629005f3f53c8b8af7fd316e5 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 28021af44afdb2fd45398e84f443cd9c86b6cfb7..251b27c7cc43e72cd75df4aed3867235c1482f91 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 3a207ab3915c4f64ce012a664e865878c57b902e..7bdc3fd6aa2833f33a1b19c670f76825b0a3fea4 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 c552274d3f39b21abe10f5cbca8dcadf7a93f074..af1ff9aa9e51d5e46d8284da51ef63d61c81b8ee 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 ccd49acd06864351036938331042ad863f0bc76a..5cc283fc2d6853039e969d733131609ab2b76830 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 6d668108313decbdaae9fd292c7b2c59ce5ed8b5..082859e005bbb6bfd88b24844ffccddd2477e75f 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 72f7a79c151f66ee9410e616a4560634d974eaa7..ee262c12ba6303ee617dc166a4e3901e4fa94905 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 6e7f5758947f6879f1a680e8086f5bbf33ab5b8e..dc65d42d9677b4bc1389a12e8710198dae4049cb 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 7b7667321a30beede18f00273477ee979e2b6789..ba009be5959604d654bf61701761195006ad9410 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 c2fd86a8e2fed7ec29270a62e66f045b4c453920..3e438126218578248527210891234149d4351750 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 4688a18ccac10702429223437bea416212c8e864..a7d815f15aab6898b89b283275d1613f8eb03021 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 de61c2786aaef3bbc2871f24feb9d5723093b731..a57193e00ea590cd30ce42345c8a002e62126593 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 a2463ffa66c0d16ffcac1dfd0bc5bbcca5c4543c..cfc6d86c55233c209343fa3ed48beb77604ea669 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 265f1c1cee1af5c5e08a1736ff54ef7efb149a3a..c16b8c43924fb3c4fe2af5652e6778d49b14c2d3 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 75e3314fa1565ef596611ba010986c09aff78518..f2c48085d9ad4cd09b9fe7099cf1264446688bdc 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 0e795d06efd6ff8467cb841841ede82d56ec7313..254cd4e848f2b1de4543d3c68c8fcd61451d302f 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 befc258eeb249d16c359c5eafac5faca1bf29202..bfbacd20807304a202a4501961a1c270dd1e6a0d 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 a56233e1ae1b79cb35e40b51781524aacff4a725..caa92b1bf15f9e5964e9cb9e20a5e68472c1d5a7 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 7c2bfead4b652564ea20435e041306f029d4a9d5..8853abb334b1293521514f635004654f1ed2a8a2 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 ce3ac5c9622a99c15b1a5ca16f9b9076999e2702..ec4617d2c8e5c0a65898d6b49599327d3b056280 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 e46d4272f4d0c52dd5d1adc2ba94a17c6205d1cd..bde9b45c30fd8bfe844223ffef69659eb9151243 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 56ccc97a86c77b71b1a99eb0820056ece18a9dbd..27fd14a7b4e4e823fd9f96958b0bbaaf1e2b75be 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 edd43903f8615ea8d2847626a2e7ddccb900538e..f75438b52bc186389fb0b541a8c166ff27aa57f4 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 6a119999ab419398260e7e3a155b768db0a3e2b7..bfd75e274daafc4cf52ea733d7f594b359234f5e 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 79971333382dacac8fb50a1dd351732fd0044a1d..fd281e5bcbf4ac42947ccf037a68597267e55d47 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 dd2c4d8394d653f42c26857fc0db275d7dd5d3e0..d7aaa4b0c624368a477d539e0293fd139aa33f4b 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 d984ae53cf6f32186744af54c203fb1662e0d808..9f46f49ac92f328ad900daf38ea90ca074a859ae 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 5f1da4558ada6e3b065afa9ca8ca898ae5f0f1ce..e2d53ad044d9288b66793b2c18bddf4e088630cc 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 b5463de9cd711c0becca7d6ad4a9044df0af8511..69315653a29fb12fe403fe9068f6fdf7e09d51bd 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 6be5ed1d21f746ad5e69c486f878101439fe2315..2389e7ad51b10aa342f27208a3903db2629045bf 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 ebc491ef2edf3827ae6749a2ee8f8c14f60abe8d..e7d0393c6f750cd35db4500c6ad7dad274b5b3cb 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 f9e023a84bf5623bd0785fde391544e303f665d1..3d2ba252cbff89b33c88034093207db0780f808c 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);