diff --git a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h index 0b877909c4a35e5b867d21de7840b1625b5e74dc..02b2bcae49014e801c59d001fe9150dcae7a1b95 100644 --- a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h +++ b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h @@ -32,6 +32,12 @@ namespace armarx::armem::base /// An optional confidence, may be used for things like decay. float confidence = 1.0; + /// An optional value indicating the last access + Time lastAccessed = Time::Invalid(); + + /// A counter how often the instance has been accessed + unsigned long accessed = 0; + bool operator==(const EntityInstanceMetadata& other) const; inline bool operator!=(const EntityInstanceMetadata& other) const diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.cpp b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.cpp index f2baa4865ff5d2a832e61acc857863d2c6ca545a..1495b275baa88a14aecb9487db781ac0236b57d5 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.cpp @@ -1,5 +1,6 @@ #include "JsonConverter.h" +#include <ArmarXCore/core/logging/Logging.h> #include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h> namespace armarx::armem::server::ltm::converter::object diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/detail/CoreSegmentBase.h b/source/RobotAPI/libraries/armem/server/ltm/base/detail/CoreSegmentBase.h index b975b352f007c8ebd3364af641ef75c3a7fc6a08..ebe21f4c1c35a03ab8a0b5219d26e57417c4533a 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/detail/CoreSegmentBase.h +++ b/source/RobotAPI/libraries/armem/server/ltm/base/detail/CoreSegmentBase.h @@ -65,7 +65,7 @@ namespace armarx::armem::server::ltm } /// iterate over all provider segments of this ltm - virtual bool forEachProviderSegment(std::function<void(ProviderSegmentT&)>&& func) const = 0; + virtual bool forEachProviderSegment(std::function<void(ProviderSegmentT&)> func) const = 0; /// find provider segment virtual std::shared_ptr<ProviderSegmentT> findProviderSegment(const std::string&) const = 0; diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/detail/MemoryBase.h b/source/RobotAPI/libraries/armem/server/ltm/base/detail/MemoryBase.h index c0973aa90b7d54a3efde6f331e8ddaab65e0393b..1b32ee2c9fc10bdb476b36b7046f46fc8518e462 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/detail/MemoryBase.h +++ b/source/RobotAPI/libraries/armem/server/ltm/base/detail/MemoryBase.h @@ -123,7 +123,7 @@ namespace armarx::armem::server::ltm } /// iterate over all core segments of this ltm - virtual bool forEachCoreSegment(std::function<void(CoreSegmentT&)>&& func) const = 0; + virtual bool forEachCoreSegment(std::function<void(CoreSegmentT&)> func) const = 0; /// find core segment virtual std::shared_ptr<CoreSegmentT> findCoreSegment(const std::string&) const = 0; // TODO make unique!! diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/detail/ProviderSegmentBase.h b/source/RobotAPI/libraries/armem/server/ltm/base/detail/ProviderSegmentBase.h index b5aa8f0ee95711001d378f06ef5c674266dc021b..c241d7889621f534991733baf82973e28428a641 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/detail/ProviderSegmentBase.h +++ b/source/RobotAPI/libraries/armem/server/ltm/base/detail/ProviderSegmentBase.h @@ -65,7 +65,7 @@ namespace armarx::armem::server::ltm } /// iterate over all core segments of this ltm - virtual bool forEachEntity(std::function<void(EntityT&)>&& func) const = 0; + virtual bool forEachEntity(std::function<void(EntityT&)> func) const = 0; /// find entity segment virtual std::shared_ptr<EntityT> findEntity(const std::string&) const = 0; diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp index 785276d04bd1e366be172ba7a07560a96a0c7755..cfc859a5f89418247c1d7f383cfea1b5bce8aa2a 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp @@ -16,7 +16,7 @@ namespace armarx::armem::server::ltm::disk { } - bool CoreSegment::forEachProviderSegment(std::function<void(ProviderSegment&)>&& func) const + bool CoreSegment::forEachProviderSegment(std::function<void(ProviderSegment&)> func) const { auto mPath = getMemoryBasePathForMode(currentMode, currentExport); auto relPath = getRelativePathForMode(currentMode); diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.h b/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.h index 6dfc00e7e5e37814027cfc10a3be53dd83dff603..78ff8be3f12d35eeebbed370cc04559b37a57822 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.h +++ b/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.h @@ -18,7 +18,7 @@ namespace armarx::armem::server::ltm::disk CoreSegment(const std::filesystem::path& parentPath, const MemoryID& id, const std::shared_ptr<Processors>& p, const DiskMemoryItem::MemoryEncodingMode mode, const unsigned long e); - bool forEachProviderSegment(std::function<void(ProviderSegment&)>&& func) const override; + bool forEachProviderSegment(std::function<void(ProviderSegment&)> func) const override; std::shared_ptr<ProviderSegment> findProviderSegment(const std::string&) const override; diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.cpp index 72ed4653638d77adf1c1dc760354c8dcf12d43d3..f1706a545a0f3d81cee3637e3bef3f5eb7df0e17 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.cpp @@ -80,6 +80,7 @@ namespace armarx::armem::server::ltm::disk if (std::find(allFilesInIndexFolder.begin(), allFilesInIndexFolder.end(), dataFilename) != allFilesInIndexFolder.end()) { + //ARMARX_INFO << "Convert data for entity " << id(); auto datafilecontent = util::readDataFromFile(mPath, relDataPath); auto dataaron = dictConverter.convert(datafilecontent, ""); datadict = aron::data::Dict::DynamicCastAndCheck(dataaron); @@ -110,6 +111,7 @@ namespace armarx::armem::server::ltm::disk ARMARX_ERROR << "Could not find the data file '" << relDataPath.string() << "'. Continuing without data."; } + //ARMARX_INFO << "Convert metadata for entity " << id(); if (std::find(allFilesInIndexFolder.begin(), allFilesInIndexFolder.end(), metadataFilename) != allFilesInIndexFolder.end()) { auto metadatafilecontent = util::readDataFromFile(mPath, relMetadataPath); diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp index 6d0b4e1fa18ee244643c5fc45755af0468d056db..a2a374c6de24e4fd1dca370149841d79f85de027 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp @@ -65,7 +65,7 @@ namespace armarx::armem::server::ltm::disk } } - bool Memory::forEachCoreSegment(std::function<void(CoreSegment&)>&& func) const + bool Memory::forEachCoreSegment(std::function<void(CoreSegment&)> func) const { for (unsigned long i = 0; i <= maxExportIndex; ++i) { diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.h b/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.h index c9f1e95b216a0dd0dac6ff67c9f28c9ef1b38d5c..afd3a09004eea72c406ebfea844ffa80b257fc84 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.h +++ b/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.h @@ -29,7 +29,7 @@ namespace armarx::armem::server::ltm::disk void configure(const nlohmann::json& config) final; - bool forEachCoreSegment(std::function<void(CoreSegment&)>&& func) const final; + bool forEachCoreSegment(std::function<void(CoreSegment&)> func) const final; std::shared_ptr<CoreSegment> findCoreSegment(const std::string& coreSegmentName) const final; protected: diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp index ede13058b8a8abbca1eb348b3fa483234e4eae76..32500f7d6a799f678d5fdf1fce09024d93c4a796 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp @@ -18,7 +18,7 @@ namespace armarx::armem::server::ltm::disk { } - bool ProviderSegment::forEachEntity(std::function<void(Entity&)>&& func) const + bool ProviderSegment::forEachEntity(std::function<void(Entity&)> func) const { auto mPath = getMemoryBasePathForMode(currentMode, currentExport); auto relPath = getRelativePathForMode(currentMode); diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.h b/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.h index 0402f4b98408b73719ea2d2889d02c195186aac6..dfa7c42714310a042dc344c043794eca4536ea00 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.h +++ b/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.h @@ -17,7 +17,7 @@ namespace armarx::armem::server::ltm::disk public: ProviderSegment(const std::filesystem::path& parentPath, const MemoryID& id, const std::shared_ptr<Processors>& p, const DiskMemoryItem::MemoryEncodingMode mode, const unsigned long e); - bool forEachEntity(std::function<void(Entity&)>&& func) const override; + bool forEachEntity(std::function<void(Entity&)> func) const override; std::shared_ptr<Entity> findEntity(const std::string&) const override; diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/detail/util/filesystem_util.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/detail/util/filesystem_util.cpp index daea3fcfc439326545a79ad00ac53e9133afa195..6b6bfdc1be88e30507e2a5d865b94c44abfb090d 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/disk/detail/util/filesystem_util.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/disk/detail/util/filesystem_util.cpp @@ -97,6 +97,7 @@ namespace armarx::armem::server::ltm::disk ret.push_back(subdirPath.filename()); } } + std::sort(ret.begin(), ret.end()); return ret; } @@ -111,6 +112,7 @@ namespace armarx::armem::server::ltm::disk ret.push_back(subdirPath.filename()); } } + std::sort(ret.begin(), ret.end()); return ret; } } diff --git a/source/RobotAPI/libraries/armem/server/test/ArMemLTMTest.cpp b/source/RobotAPI/libraries/armem/server/test/ArMemLTMTest.cpp index 7999a6a5752cd1bc9432f9caec95a6f928645a20..edaa7bb5c5d92b57b0edf3918d1674db34337680 100644 --- a/source/RobotAPI/libraries/armem/server/test/ArMemLTMTest.cpp +++ b/source/RobotAPI/libraries/armem/server/test/ArMemLTMTest.cpp @@ -31,9 +31,16 @@ #include <RobotAPI/libraries/aron/core/data/variant/All.h> #include <RobotAPI/libraries/aron/core/type/variant/All.h> +#include <RobotAPI/libraries/armem/server/ltm/disk/Memory.h> //#include "../core/io/diskWriter/NlohmannJSON/NlohmannJSONDiskWriter.h" +// TODO: REMOVE ME!! +#include <VirtualRobot/Robot.h> +#include <VirtualRobot/RobotNodeSet.h> +#include <VirtualRobot/Import/SimoxXMLFactory.h> +#include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h> + #include <filesystem> #include <iostream> @@ -205,6 +212,61 @@ BOOST_AUTO_TEST_CASE(test_memory_export__easy_bool_setup) run<aron::type::Bool>("TestMemory_BoolSetup", "theBool"); } +BOOST_AUTO_TEST_CASE(test_memory_export__easy_fabian_setup) +{ + std::filesystem::path memoryExport = "/home/fabian/repos/projects/ltmtools/data/sim_2022_09_15"; + + armem::server::ltm::disk::Memory ltm(memoryExport, "Object"); + auto ltm_c_seg = ltm.findCoreSegment("Instance"); + + ltm_c_seg->forEachProviderSegment([](const armem::server::ltm::disk::ProviderSegment& ltm_p_seg){ + ltm_p_seg.forEachEntity([](const armem::server::ltm::disk::Entity& ltm_e){ + ltm_e.forEachSnapshot([](const armem::server::ltm::disk::EntitySnapshot& ltm_snapshot){ + armem::wm::EntitySnapshot s; + ltm_snapshot.loadAllReferences(s); + ltm_snapshot.resolve(s); + + auto i = s.getInstance(0); + auto data = i.data(); + + + + auto p = data->getElement("pose"); + auto p2 = armarx::aron::data::Dict::DynamicCastAndCheck(p); + + armarx::objpose::arondto::ObjectPose px; + px.fromAron(p2); + + auto a = p2->getElement("attachment"); + auto a2 = armarx::aron::data::Dict::DynamicCastAndCheck(a); + + armarx::objpose::arondto::ObjectAttachmentInfo ax; + ax.fromAron(a2); + + if (ax.agentName != "") + { + ARMARX_INFO << (ax.poseInFrame); + } + }); + }); + }); + + + //auto ltm_p_seg = ltm_c_seg->findProviderSegment("Armar3"); + //auto ltm_e = ltm_p_seg->findEntity("Armar3"); + + //armem::wm::Entity e; + //ltm_e->loadAllReferences(e); + //ltm_e->resolve(e); + + //std::function<void(armarx::armem::wm::EntitySnapshot)> f = [](armem::wm::EntitySnapshot s){ ARMARX_INFO << s.id(); }; + + //e.forEachSnapshot(f); + //auto wm = ltm.loadAllAndResolve(); + + +} + /* BOOST_AUTO_TEST_CASE(test_memory_export__easy_rainer_setup) { diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/Writer.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/Writer.cpp index 72a657218790d389d14283f7c22fb02ce183c357..85c6403e5e4452848c31ffbc3f59aa39c3fe46ee 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/Writer.cpp +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/Writer.cpp @@ -253,7 +253,6 @@ namespace armarx::aron::codegenerator::cpp c->addInherit("public armarx::aron::cpp::AronGeneratedClass"); // ctor - c->addCtor(generator.toCopyCtor(c->getName())); c->addCtor(generator.toInnerEnumCtor(c->getName())); // Specific methods @@ -336,6 +335,10 @@ namespace armarx::aron::codegenerator::cpp // ctor c->addCtor(gen.toCtor(c->getName())); + c->addCtor(gen.toCopyCtor(c->getName())); + + // dtor + c->addMethod(gen.toDtor(c->getName())); // Generic methods //std::cout << "Generate equals method" << std::endl; diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp index add1b800c01ad8186008d55574559e0705527a4b..98986e925c3f744a8b339108e372e05e95600709 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp @@ -41,6 +41,7 @@ namespace armarx::aron::codegenerator::cpp const std::string Generator::ARON_TEMPLATE_INSTANTIATIONS_ACCESSOR = Generator::ARON_VARIABLE_PREFIX + "_tmpls"; 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 std::string Generator::ARON_OTHER_ACCESSOR = Generator::ARON_VARIABLE_PREFIX + "_o"; const SerializerFactoryPtr Generator::FACTORY = SerializerFactoryPtr(new GeneratorFactory()); @@ -168,17 +169,52 @@ namespace armarx::aron::codegenerator::cpp CppCtorPtr Generator::toCtor(const std::string& name) const { - CppCtorPtr c = CppCtorPtr(new CppCtor(name + "()")); - std::vector<std::pair<std::string, std::string>> initList = this->getCtorInitializers(""); - CppBlockPtr b = std::make_shared<CppBlock>(); - b->addLine("resetHard();"); - b->appendBlock(this->getCtorBlock("")); - c->addInitListEntries(initList); - c->setBlock(b); + CppBlockPtr b = this->getCtorBlock(""); + auto initList = this->getCtorInitializers(""); + + if (b->size() > 0 || initList.second) + { + CppCtorPtr c = CppCtorPtr(new CppCtor(name + "()")); + c->addInitListEntries(initList.first); + c->setBlock(b); + return c; + } + CppCtorPtr c = CppCtorPtr(new CppCtor(name + "() = default;")); return c; } + CppCtorPtr Generator::toCopyCtor(const std::string& name) const + { + CppBlockPtr b = this->getCopyCtorBlock(""); + auto initList = this->getCopyCtorInitializers(""); + + if (b->size() > 0 || initList.second) + { + CppCtorPtr c = CppCtorPtr(new CppCtor(name + "(const " + name + "& " + ARON_OTHER_ACCESSOR + ")")); + c->addInitListEntries(initList.first); + c->setBlock(b); + return c; + } + + CppCtorPtr c = CppCtorPtr(new CppCtor(name + "(const " + name + "& " + ARON_OTHER_ACCESSOR + ") = default;")); + return c; + } + + CppMethodPtr Generator::toDtor(const std::string& name) const + { + CppBlockPtr b = this->getDtorBlock(""); + if (b->size() > 0) + { + CppMethodPtr m = CppMethodPtr(new CppMethod("virtual ~" + name + "()")); + m->setBlock(b); + return m; + } + + CppMethodPtr m = CppMethodPtr(new CppMethod("virtual ~" + name + "() = default;")); + return m; + } + CppMethodPtr Generator::toResetSoftMethod() const { std::stringstream doc; @@ -338,9 +374,9 @@ namespace armarx::aron::codegenerator::cpp return {field}; } - std::vector<std::pair<std::string, std::string>> Generator::getCtorInitializers(const std::string&) const + std::pair<std::vector<std::pair<std::string, std::string>>, bool> Generator::getCtorInitializers(const std::string&) const { - return {}; + return {{}, false}; } CppBlockPtr Generator::getCtorBlock(const std::string&) const @@ -348,6 +384,27 @@ namespace armarx::aron::codegenerator::cpp return std::make_shared<CppBlock>(); } + std::pair<std::vector<std::pair<std::string, std::string>>, bool> Generator::getCopyCtorInitializers(const std::string& name) const + { + const auto& t = getType(); + if (t.getMaybe() == type::Maybe::UNIQUE_PTR || t.getMaybe() == type::Maybe::RAW_PTR) + { + return {{{name, ARON_OTHER_ACCESSOR + "." + name + " ? " + resolveMaybeGenerator("*" + ARON_OTHER_ACCESSOR + "." + name) + " : nullptr"}}, true}; + } + + return {{{name, ARON_OTHER_ACCESSOR + "." + name}}, false}; + } + + CppBlockPtr Generator::getCopyCtorBlock(const std::string&) const + { + return std::make_shared<CppBlock>(); + } + + CppBlockPtr Generator::getDtorBlock(const std::string&) const + { + return std::make_shared<CppBlock>(); + } + CppBlockPtr Generator::getResetHardBlock(const std::string& cppAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); @@ -389,24 +446,35 @@ namespace armarx::aron::codegenerator::cpp return s; } - std::string Generator::resolveMaybeGenerator(const std::string& s) const + std::string Generator::resolveMaybeGenerator(const std::string& args) const { const auto& t = getType(); if (t.getMaybe() == type::Maybe::OPTIONAL) { - return s + " = std::make_optional<" + getInstantiatedCppTypename() + ">();"; + return "std::make_optional<" + getInstantiatedCppTypename() + ">(" + args + ")"; } if (t.getMaybe() == type::Maybe::RAW_PTR) { - return s + " = new " + getInstantiatedCppTypename() + "();"; + return "new " + getInstantiatedCppTypename() + "(" + args + ")"; } if (t.getMaybe() == type::Maybe::SHARED_PTR) { - return s + " = std::make_shared<" + getInstantiatedCppTypename() + ">();"; + return "std::make_shared<" + getInstantiatedCppTypename() + ">(" + args + ")"; } if (t.getMaybe() == type::Maybe::UNIQUE_PTR) { - return s + " = std::make_unique<" + getInstantiatedCppTypename() + ">();"; + return "std::make_unique<" + getInstantiatedCppTypename() + ">(" + args + ")"; + } + return ""; + + } + + std::string Generator::resolveMaybeGeneratorWithSetter(const std::string& s, const std::string& args) const + { + auto gen = resolveMaybeGenerator(args); + if (!gen.empty()) + { + return s + " = " + gen + ";"; } return ""; } @@ -497,7 +565,7 @@ namespace armarx::aron::codegenerator::cpp b->addLine("if (not (" + ARON_READER_ACCESSOR + ".readNull(" + variantAccessor + "))) // if aron contains data"); { CppBlockPtr ifb = std::make_shared<CppBlock>(); - ifb->addLine(resolveMaybeGenerator(cppAccessor)); + ifb->addLine(resolveMaybeGeneratorWithSetter(cppAccessor)); ifb->appendBlock(block_if_data); b->addBlock(ifb); } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.h index 7b9c15a7d4c6f1409db4999b906933bff64f3370..18bec1e225a6fbae97c71c10a7bd82a21ba5604b 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.h +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.h @@ -91,9 +91,16 @@ namespace armarx::aron::codegenerator::cpp virtual std::vector<CppFieldPtr> getPublicVariableDeclarations(const std::string&) const; CppCtorPtr toCtor(const std::string&) const; - virtual std::vector<std::pair<std::string, std::string>> getCtorInitializers(const std::string&) const; + virtual std::pair<std::vector<std::pair<std::string, std::string>>, bool> getCtorInitializers(const std::string&) const; virtual CppBlockPtr getCtorBlock(const std::string&) const; + CppCtorPtr toCopyCtor(const std::string&) const; + virtual std::pair<std::vector<std::pair<std::string, std::string>>, bool> getCopyCtorInitializers(const std::string&) const; + virtual CppBlockPtr getCopyCtorBlock(const std::string&) const; + + CppMethodPtr toDtor(const std::string&) const; + virtual CppBlockPtr getDtorBlock(const std::string&) const; + CppMethodPtr toResetSoftMethod() const; virtual CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const; @@ -127,7 +134,8 @@ namespace armarx::aron::codegenerator::cpp std::string toPointerAccessor(const std::string&) const; std::string resolveMaybeAccessor(const std::string&) const; - std::string resolveMaybeGenerator(const std::string&) const; + std::string resolveMaybeGenerator(const std::string& args = "") const; + std::string resolveMaybeGeneratorWithSetter(const std::string&, const std::string& args = "") const; CppBlockPtr resolveMaybeResetHardBlock(const CppBlockPtr&, const std::string&) const; CppBlockPtr resolveMaybeResetSoftBlock(const CppBlockPtr&, const std::string&) const; @@ -144,6 +152,7 @@ namespace armarx::aron::codegenerator::cpp static const std::string ARON_WRITER_ACCESSOR; static const std::string ARON_TEMPLATE_INSTANTIATIONS_ACCESSOR; static const std::string ARON_VARIANT_RETURN_ACCESSOR; + static const std::string ARON_OTHER_ACCESSOR; private: static const SerializerFactoryPtr FACTORY; diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.cpp index 5b734427b84bbd9fa139f6518110b55b7daf48ae..617a658199e8380a3c6fe02ad13a5a13fad1e886 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.cpp +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.cpp @@ -57,7 +57,7 @@ namespace armarx::aron::codegenerator::cpp::generator bool b = std::find(x.disallowedBases.begin(), x.disallowedBases.end(), t.getPath().getRootIdentifier()) == x.disallowedBases.end(); return b; } - return true; + return false; } std::string checkForInstantiationTypenameReplacement(const type::Object& t) @@ -99,7 +99,8 @@ namespace armarx::aron::codegenerator::cpp::generator checkForInstantiationTypenameReplacement(e), checkForClassNameReplacement(e), simox::meta::get_type_name<data::dto::Dict>(), - simox::meta::get_type_name<type::dto::AronObject>(), e) + simox::meta::get_type_name<type::dto::AronObject>(), e), + has_been_replaced(checkForAllowedReplacement(e)) { } @@ -160,7 +161,7 @@ namespace armarx::aron::codegenerator::cpp::generator std::string escaped_accessor = EscapeAccessor(cppAccessor); std::string resolved_accessor = resolveMaybeAccessor(cppAccessor); - if (const auto reset = resolveMaybeGenerator(cppAccessor); !reset.empty()) + if (const auto reset = resolveMaybeGeneratorWithSetter(cppAccessor); !reset.empty()) { block_if_data->addLine(reset); } @@ -169,5 +170,31 @@ namespace armarx::aron::codegenerator::cpp::generator return resolveMaybeReadBlock(block_if_data, cppAccessor, variantAccessor); } + + + + CppBlockPtr Object::getResetHardBlock(const std::string& cppAccessor) const + { + if (has_been_replaced) + { + return Base::getResetHardBlock(cppAccessor); + } + + CppBlockPtr block_if_data = std::make_shared<CppBlock>(); + block_if_data->addLine(cppAccessor + nextEl() + "resetHard();"); + return resolveMaybeResetHardBlock(block_if_data, cppAccessor); + } + + CppBlockPtr Object::getResetSoftBlock(const std::string& cppAccessor) const + { + if (has_been_replaced) + { + return Base::getResetHardBlock(cppAccessor); + } + + auto block_if_data = std::make_shared<CppBlock>(); + block_if_data->addLine(cppAccessor + nextEl() + "resetSoft();"); + return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); + } } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.h index b1a2995c443f4e680725fdcbfbf4ac6374d7c712..942dc161a8792b9b9455c08db5c40eba79260605 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.h +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.h @@ -37,12 +37,14 @@ namespace armarx::aron::codegenerator::cpp::generator std::string replacedInstantiatedTypename; std::vector<std::string> additionalIncludes; // additional includes for the replaced type and aron conversions - std::vector<std::string> disallowedBases; // disallow replacement if the used in a specific class + std::vector<std::string> disallowedBases; // disallow replacement if used in a specific class }; class Object : public detail::ContainerGenerator<type::Object, Object> { + using Base = detail::ContainerGenerator<type::Object, Object>; + public: // constructors Object(const type::Object&); @@ -53,5 +55,10 @@ namespace armarx::aron::codegenerator::cpp::generator CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const final; CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const final; CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const final; + CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final; + CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final; + + private: + bool has_been_replaced = false; }; } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp index c818db64a05d881f8f3efee3ae9d2a767c8383ed..00a9ab35d7f52eb757963c97355403377459737e 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp @@ -88,7 +88,7 @@ namespace armarx::aron::codegenerator::cpp::generator CppBlockPtr IntEnum::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); - if (const auto reset = resolveMaybeGenerator(cppAccessor); !reset.empty()) + if (const auto reset = resolveMaybeGeneratorWithSetter(cppAccessor); !reset.empty()) { block_if_data->addLine(reset); } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp index fb3572e26adb9a61cf7bcde1396a1a2cb4bfff26..7dcadbb33ae84d70a180e89763ca37a634946268 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp @@ -49,4 +49,18 @@ namespace armarx::aron::codegenerator::cpp::generator "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor); return b; } + + CppBlockPtr Bool::getResetHardBlock(const std::string& cppAccessor) const + { + CppBlockPtr block_if_data = std::make_shared<CppBlock>(); + block_if_data->addLine(cppAccessor + " = false;"); + return resolveMaybeResetHardBlock(block_if_data, cppAccessor); + } + + CppBlockPtr Bool::getResetSoftBlock(const std::string& cppAccessor) const + { + auto block_if_data = std::make_shared<CppBlock>(); + block_if_data->addLine(cppAccessor + " = false;"); + return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); + } } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.h index 85172f3de8745ac5b2feb465cd9ff8408e94cd56..381adec7bc759c7a20aedd54229dd499253110d1 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.h +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.h @@ -40,5 +40,7 @@ namespace armarx::aron::codegenerator::cpp::generator /* virtual implementations */ CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const final; + CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final; + CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final; }; } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.cpp index 7076794550d8e149f496677c079da4a3b7517e03..735f3ad9dc4efdf0f00a34093671644aebb0eb3f 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.cpp +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.cpp @@ -50,4 +50,18 @@ namespace armarx::aron::codegenerator::cpp::generator "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor); return b; } + + CppBlockPtr Double::getResetHardBlock(const std::string& cppAccessor) const + { + CppBlockPtr block_if_data = std::make_shared<CppBlock>(); + block_if_data->addLine(cppAccessor + " = 0.0;"); + return resolveMaybeResetHardBlock(block_if_data, cppAccessor); + } + + CppBlockPtr Double::getResetSoftBlock(const std::string& cppAccessor) const + { + auto block_if_data = std::make_shared<CppBlock>(); + block_if_data->addLine(cppAccessor + " = 0.0;"); + return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); + } } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.h index e109cc626500ce4004f2b69b670ed9574c947ea5..b9a96a077e225aad5b0871882e86e20f85fb3685 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.h +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.h @@ -39,5 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator /* virtual implementations */ CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const final; + CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final; + CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final; }; } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.cpp index 6c740a79206d323e0b6e9bf0b66c19d82eb1593a..d3d27ea6c34713b3d81074c1ab64e37ed696d69c 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.cpp +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.cpp @@ -50,4 +50,18 @@ namespace armarx::aron::codegenerator::cpp::generator "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor); return b; } + + CppBlockPtr Float::getResetHardBlock(const std::string& cppAccessor) const + { + CppBlockPtr block_if_data = std::make_shared<CppBlock>(); + block_if_data->addLine(cppAccessor + " = 0.0f;"); + return resolveMaybeResetHardBlock(block_if_data, cppAccessor); + } + + CppBlockPtr Float::getResetSoftBlock(const std::string& cppAccessor) const + { + auto block_if_data = std::make_shared<CppBlock>(); + block_if_data->addLine(cppAccessor + " = 0.0f;"); + return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); + } } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.h index a2f52f4fb7d78ebcefcd96ba3eba8d0b31fc7dcb..f1c88c502f92b7d86afc7668eda0710f0f3351b7 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.h +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.h @@ -39,5 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator /* virtual implementations */ CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const final; + CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final; + CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final; }; } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.cpp index 9242126f54ae10d3ee26fd6e242de8014c6a23f7..7a976bd83fffa4ad52bec05c2a5392bbf7400798 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.cpp +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.cpp @@ -50,4 +50,18 @@ namespace armarx::aron::codegenerator::cpp::generator "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor); return b; } + + CppBlockPtr Int::getResetHardBlock(const std::string& cppAccessor) const + { + CppBlockPtr block_if_data = std::make_shared<CppBlock>(); + block_if_data->addLine(cppAccessor + " = 0;"); + return resolveMaybeResetHardBlock(block_if_data, cppAccessor); + } + + CppBlockPtr Int::getResetSoftBlock(const std::string& cppAccessor) const + { + auto block_if_data = std::make_shared<CppBlock>(); + block_if_data->addLine(cppAccessor + " = 0;"); + return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); + } } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.h index eb18e445473f402c2be373da523ba92336a4ab48..b21abee9cef1850a1d55da0369a530b65585c210 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.h +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.h @@ -39,5 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator /* virtual implementations */ CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const final; + CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final; + CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final; }; } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.cpp index 2231f3305264746bb5c31855cac0e6a5c3d712b0..fe6cd5e87f6f3db26873c351987f91d86556d27b 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.cpp +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.cpp @@ -50,4 +50,18 @@ namespace armarx::aron::codegenerator::cpp::generator "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor); return b; } + + CppBlockPtr Long::getResetHardBlock(const std::string& cppAccessor) const + { + CppBlockPtr block_if_data = std::make_shared<CppBlock>(); + block_if_data->addLine(cppAccessor + " = 0;"); + return resolveMaybeResetHardBlock(block_if_data, cppAccessor); + } + + CppBlockPtr Long::getResetSoftBlock(const std::string& cppAccessor) const + { + auto block_if_data = std::make_shared<CppBlock>(); + block_if_data->addLine(cppAccessor + " = 0;"); + return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); + } } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.h index 8e74bf85b421ff3101af4f86a3edcdc91858559a..09d923e487108a7c2c0927156af77c21fddf79ec 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.h +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.h @@ -39,5 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator /* virtual implementations */ CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const final; + CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final; + CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final; }; } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.cpp index a335fafcbd33ffca5c0a1658aaa1da5ccfeb4cc6..d51ee9ed159a5abb82442a5501ffebb3500aad15 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.cpp +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.cpp @@ -50,4 +50,18 @@ namespace armarx::aron::codegenerator::cpp::generator "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor); return b; } + + CppBlockPtr String::getResetHardBlock(const std::string& cppAccessor) const + { + CppBlockPtr block_if_data = std::make_shared<CppBlock>(); + block_if_data->addLine(cppAccessor + " = \"\";"); + return resolveMaybeResetHardBlock(block_if_data, cppAccessor); + } + + CppBlockPtr String::getResetSoftBlock(const std::string& cppAccessor) const + { + auto block_if_data = std::make_shared<CppBlock>(); + block_if_data->addLine(cppAccessor + " = \"\";"); + return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor); + } } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.h index 7db96c8713e04a479d4f1623043f633d4d429f84..fd854ccee807d549fbe1448643eb31a4f069bcc8 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.h +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.h @@ -39,5 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator /* virtual implementations */ CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const final; + CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final; + CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final; }; } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp index c1c77424ba3d97dc217bd846bb1335023761fa2a..95677e1215ae6c317bec02186c23b71f91992089 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp @@ -147,12 +147,18 @@ namespace armarx::aron::codegenerator::cpp::generator } - CppCtorPtr IntEnumClass::toCopyCtor(const std::string& name) const + /*CppCtorPtr IntEnumClass::toCopyCtor(const std::string& name) const { CppCtorPtr c = std::make_shared<CppCtor>(name + "(const " + getFullInstantiatedCppTypename() + "& i)"); std::vector<std::pair<std::string, std::string>> initList = {{"value", "i.value"}}; c->addInitListEntries(initList); + c->setBlock(std::make_shared<CppBlock>()); return c; + }*/ + + std::pair<std::vector<std::pair<std::string, std::string>>, bool> IntEnumClass::getCopyCtorInitializers(const std::string&) const + { + return {{{"value", ARON_OTHER_ACCESSOR + ".value"}}, false}; } CppCtorPtr IntEnumClass::toInnerEnumCtor(const std::string& name) const @@ -160,6 +166,7 @@ namespace armarx::aron::codegenerator::cpp::generator CppCtorPtr c = std::make_shared<CppCtor>(name + "(const " + std::string(IMPL_ENUM) + " e)"); std::vector<std::pair<std::string, std::string>> initList = {{"value", "e"}}; c->addInitListEntries(initList); + c->setBlock(std::make_shared<CppBlock>()); return c; } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h index b03310d425bb6783f618e9548d573a87b87c77dc..10d6ca0c14d8100e71d78944f24fd3f46870b8e1 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h @@ -42,6 +42,9 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations std::vector<CppFieldPtr> getPublicVariableDeclarations(const std::string&) const final; + + std::pair<std::vector<std::pair<std::string, std::string>>, bool> getCopyCtorInitializers(const std::string&) const final; + CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final; CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final; CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const final; @@ -50,7 +53,7 @@ namespace armarx::aron::codegenerator::cpp::generator CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const final; // TODO: Move some of those methods to upper class for enums (if we want to support multiple enums) - CppCtorPtr toCopyCtor(const std::string&) const; + //CppCtorPtr toCopyCtor(const std::string&) const; CppCtorPtr toInnerEnumCtor(const std::string&) const; CppEnumPtr toInnerEnumDefinition() const; CppMethodPtr toIntMethod() const; diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp index 0d54dc8bf173b1262ecbc938a6c1678fb1dff8b2..bac3ce6239066682e134f21cbd6e968873823626 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp @@ -236,5 +236,26 @@ namespace armarx::aron::codegenerator::cpp::generator } return block_if_data; } + + std::pair<std::vector<std::pair<std::string, std::string>>, bool> ObjectClass::getCopyCtorInitializers(const std::string&) const + { + std::vector<std::pair<std::string, std::string>> ret; + + if (type.getExtends() != nullptr) + { + const auto extends_s = FromAronType(*type.getExtends()); + ret.push_back({extends_s->getFullInstantiatedCppTypename(), ARON_OTHER_ACCESSOR}); + } + + bool anyComplex = false; + for (const auto& [key, child] : type.getMemberTypes()) + { + auto child_s = FromAronType(*child); + auto initList = child_s->getCopyCtorInitializers(key); + simox::alg::append(ret, initList.first); + anyComplex = anyComplex || initList.second; + } + return {ret, anyComplex}; + } } diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h index dd8e7d3d95bb291a54aeba45d46bae8bbf336834..772d138cb7cc521753ce6bd3086bb076d475b462 100644 --- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h +++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h @@ -40,6 +40,9 @@ namespace armarx::aron::codegenerator::cpp::generator // virtual implementations std::vector<std::string> getRequiredIncludes() const final; std::vector<CppFieldPtr> getPublicVariableDeclarations(const std::string&) const final; + + std::pair<std::vector<std::pair<std::string, std::string>>, bool> getCopyCtorInitializers(const std::string&) const final; + CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final; CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final; CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const final; diff --git a/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp b/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp index e6429e7fe75ba54fea8a38c6f41398c0d149d2a5..3729e90a5812a192c256f2deaaa13bbecad71bab 100644 --- a/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp +++ b/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp @@ -1,5 +1,7 @@ #include "NLohmannJSONConverter.h" +#include <ArmarXCore/core/logging/Logging.h> + namespace armarx::aron::converter { nlohmann::json AronNlohmannJSONConverter::ConvertToNlohmannJSON(const data::VariantPtr& aron) diff --git a/source/RobotAPI/libraries/aron/core/Exception.h b/source/RobotAPI/libraries/aron/core/Exception.h index 52de8098900e7a8dc5538aa4d53453cffe52a7e5..977107f84e4446bf0c18e2297bfb6e0c1315c2e4 100644 --- a/source/RobotAPI/libraries/aron/core/Exception.h +++ b/source/RobotAPI/libraries/aron/core/Exception.h @@ -26,6 +26,7 @@ // STD/STL // ArmarX +#include <ArmarXCore/core/logging/Logging.h> #include <RobotAPI/interface/aron.h> #include <ArmarXCore/core/exceptions/local/ExpressionException.h> #include <ArmarXCore/core/exceptions/Exception.h> diff --git a/source/RobotAPI/libraries/aron/core/data/rw/reader/nlohmannJSON/NlohmannJSONReader.cpp b/source/RobotAPI/libraries/aron/core/data/rw/reader/nlohmannJSON/NlohmannJSONReader.cpp index 21fdfc82b0fdec76910890100721d6f5ee19654c..e6beb0e9aab36bc5aa245155b7a42b3d0acb82ab 100644 --- a/source/RobotAPI/libraries/aron/core/data/rw/reader/nlohmannJSON/NlohmannJSONReader.cpp +++ b/source/RobotAPI/libraries/aron/core/data/rw/reader/nlohmannJSON/NlohmannJSONReader.cpp @@ -52,7 +52,8 @@ namespace armarx::aron::data::reader data::Descriptor NlohmannJSONReader::getDescriptor(InputType& input) { - return ConstNlohmannJSONVisitor::GetDescriptor(input); + auto ret = ConstNlohmannJSONVisitor::GetDescriptor(input); + return ret; } void NlohmannJSONReader::readList(const nlohmann::json& input, std::vector<nlohmann::json>& elements, Path& p) diff --git a/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp b/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp index 84adf5c1ea7643ece74e2bc3e224e5df075f7a12..e80e7d37e071585f8b6f3ae0e7d0f81d280b49e4 100644 --- a/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp +++ b/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp @@ -33,6 +33,7 @@ namespace armarx::aron::data return data::Descriptor::UNKNOWN; } std::string t = n[armarx::aron::data::rw::json::constantes::TYPE_SLUG]; + return armarx::aron::data::rw::json::conversion::String2Descriptor.at(t); }