From d8a9b0573c05737355db057b3c0ca1b7d7653f71 Mon Sep 17 00:00:00 2001 From: "fabian.peller-konrad@kit.edu" <fabian.peller-konrad@kit.edu> Date: Wed, 19 May 2021 15:39:55 +0200 Subject: [PATCH] aron fixes for better code generation. Finalized maybe types. Merged master and armem/dev into aron/dev. Fixed build issues. Repaired ArMemMemoryTest test since an update now adds a provider segment (instead of throwing MisingEntryException) --- .../server/ExampleMemory/aron/ExampleData.xml | 2 +- .../server/ObjectMemory/ObjectMemory.cpp | 4 +- .../RobotStateMemory/RobotStateMemory.cpp | 2 +- .../server/SkillsMemory/SkillsMemory.cpp | 4 +- .../aron_conversions/objpose.cpp | 4 +- .../libraries/armem/core/aron_conversions.cpp | 4 +- .../core/workingmemory/EntityInstance.cpp | 16 +- .../libraries/armem/test/ArMemMemoryTest.cpp | 5 +- .../articulated_object_class/Segment.cpp | 2 +- .../articulated_object_instance/Segment.cpp | 2 +- .../armem_robot/aron_conversions.cpp | 9 +- .../armem_robot_mapping/aron_conversions.cpp | 12 +- .../armem_robot_state/aron_conversions.cpp | 4 +- .../server/description/Segment.cpp | 4 +- .../server/localization/Segment.cpp | 2 +- .../codegenerator/codeWriter/cpp/Writer.cpp | 8 +- .../codeWriter/cpp/serializer/Serializer.cpp | 260 +++++++++++++++--- .../codeWriter/cpp/serializer/Serializer.h | 3 + .../cpp/serializer/container/Dict.cpp | 41 ++- .../cpp/serializer/container/List.cpp | 38 +-- .../cpp/serializer/container/Object.cpp | 46 ++-- .../cpp/serializer/container/Pair.cpp | 68 ++--- .../cpp/serializer/container/Tuple.cpp | 64 ++--- .../detail/PrimitiveSerializerBase.h | 24 +- .../cpp/serializer/detail/SerializerBase.h | 16 +- .../cpp/serializer/enum/IntEnum.cpp | 19 +- .../cpp/serializer/ndarray/EigenMatrix.cpp | 32 +-- .../serializer/ndarray/EigenQuaternion.cpp | 32 +-- .../cpp/serializer/ndarray/IVTCByteImage.cpp | 40 +-- .../cpp/serializer/ndarray/NDArray.cpp | 20 +- .../cpp/serializer/ndarray/OpenCVMat.cpp | 70 +++-- .../cpp/serializer/ndarray/OpenCVMat.h | 6 +- .../cpp/serializer/ndarray/Orientation.cpp | 32 +-- .../cpp/serializer/ndarray/PCLPointCloud.cpp | 39 ++- .../cpp/serializer/ndarray/Pose.cpp | 32 +-- .../cpp/serializer/ndarray/Position.cpp | 32 +-- .../cpp/serializer/primitive/Bool.cpp | 4 +- .../cpp/serializer/primitive/Double.cpp | 4 +- .../cpp/serializer/primitive/Float.cpp | 4 +- .../cpp/serializer/primitive/Int.cpp | 4 +- .../cpp/serializer/primitive/Long.cpp | 4 +- .../cpp/serializer/primitive/String.cpp | 4 +- .../cpp/serializer/primitive/Time.cpp | 16 +- .../cpp/serializer/toplevel/IntEnumClass.cpp | 58 ++-- .../cpp/serializer/toplevel/ObjectClass.cpp | 75 +++-- .../core/codegenerator/typeReader/xml/Data.h | 6 +- .../reader/navigator/NavigatorReader.cpp | 8 +- .../aron/core/io/dataIO/visitor/Visitor.cpp | 1 + .../aron/core/navigator/data/Navigator.cpp | 1 + .../core/navigator/data/complex/NDArray.cpp | 8 + .../core/navigator/data/complex/NDArray.h | 4 + .../core/navigator/data/container/List.cpp | 10 +- .../aron/core/navigator/data/container/List.h | 3 + .../data/detail/PrimitiveNavigatorBase.h | 9 + .../libraries/aron/core/test/aronTest.cpp | 162 +++++++++-- .../aron/core/test/xmls/IVTCByteImageTest.xml | 4 +- 56 files changed, 843 insertions(+), 544 deletions(-) diff --git a/source/RobotAPI/components/armem/server/ExampleMemory/aron/ExampleData.xml b/source/RobotAPI/components/armem/server/ExampleMemory/aron/ExampleData.xml index 7acb4e6d4..dd0bdb301 100644 --- a/source/RobotAPI/components/armem/server/ExampleMemory/aron/ExampleData.xml +++ b/source/RobotAPI/components/armem/server/ExampleMemory/aron/ExampleData.xml @@ -33,7 +33,7 @@ <EigenMatrix rows="4" cols="4" type="float" /> </ObjectChild> <ObjectChild key='the_ivt_image'> - <IVTCByteImage type="GrayScale" /> + <IVTCByteImage type="GrayScale" raw_ptr="true"/> </ObjectChild> <ObjectChild key='the_float_list'> diff --git a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp index 837fcbcf8..25b56fcb8 100644 --- a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp +++ b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp @@ -158,8 +158,8 @@ namespace armarx::armem::server::obj // { // std::lock_guard g(server::ComponentPluginUser::workingMemoryMutex); - // // server::ComponentPluginUser::workingMemory.addCoreSegment("ArticulatedObjectInstance"); // TODO , arondto::::toInitialAronType()); - // server::ComponentPluginUser::workingMemory.addCoreSegment("ArticulatedObjectClass"); // TODO , arondto::::toInitialAronType()); + // // server::ComponentPluginUser::workingMemory.addCoreSegment("ArticulatedObjectInstance"); // TODO , arondto::::toAronType()); + // server::ComponentPluginUser::workingMemory.addCoreSegment("ArticulatedObjectClass"); // TODO , arondto::::toAronType()); // } createRemoteGuiTab(); diff --git a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp index 5aba12106..90d970813 100644 --- a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp +++ b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp @@ -32,7 +32,7 @@ // Header #include "ArmarXCore/core/logging/Logging.h" #include "RobotAPI/libraries/armem/core/Time.h" -#include "RobotAPI/libraries/aron/core/navigator/data/primitive/Primitive.h" +#include "RobotAPI/libraries/aron/core/navigator/data/AllNavigators.h" #include "RobotAPI/libraries/core/Pose.h" // Simox diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp index 8a03cc159..c0a9fd2f3 100644 --- a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp +++ b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp @@ -70,8 +70,8 @@ namespace armarx workingMemory.name() = p.memoryName; { - armarx::armem::wm::CoreSegment& c = workingMemory.addCoreSegment(p.statechartCoreSegmentName, armarx::armem::arondto::Statechart::Transition::toInitialAronType()); - c.addProviderSegment("Transitions", armarx::armem::arondto::Statechart::Transition::toInitialAronType()); + armarx::armem::wm::CoreSegment& c = workingMemory.addCoreSegment(p.statechartCoreSegmentName, armarx::armem::arondto::Statechart::Transition::toAronType()); + c.addProviderSegment("Transitions", armarx::armem::arondto::Statechart::Transition::toAronType()); } } diff --git a/source/RobotAPI/libraries/ArmarXObjects/aron_conversions/objpose.cpp b/source/RobotAPI/libraries/ArmarXObjects/aron_conversions/objpose.cpp index 2de8a3da0..4ca668696 100644 --- a/source/RobotAPI/libraries/ArmarXObjects/aron_conversions/objpose.cpp +++ b/source/RobotAPI/libraries/ArmarXObjects/aron_conversions/objpose.cpp @@ -80,7 +80,7 @@ void armarx::objpose::fromAron(const arondto::ObjectPose& dto, ObjectPose& bo) bo.confidence = dto.confidence; - bo.timestamp = IceUtil::Time::microSeconds(dto.timestamp); + bo.timestamp = dto.timestamp; if (dto.localOOBBValid) { @@ -122,7 +122,7 @@ void armarx::objpose::toAron(arondto::ObjectPose& dto, const ObjectPose& bo) dto.confidence = bo.confidence; - dto.timestamp = bo.timestamp.toMicroSeconds(); + dto.timestamp = bo.timestamp; if (bo.localOOBB) { diff --git a/source/RobotAPI/libraries/armem/core/aron_conversions.cpp b/source/RobotAPI/libraries/armem/core/aron_conversions.cpp index ed2197e66..1f8e33c40 100644 --- a/source/RobotAPI/libraries/armem/core/aron_conversions.cpp +++ b/source/RobotAPI/libraries/armem/core/aron_conversions.cpp @@ -7,7 +7,7 @@ void armarx::armem::fromAron(const arondto::MemoryID& dto, MemoryID& bo) bo.coreSegmentName = dto.coreSegmentName; bo.providerSegmentName = dto.providerSegmentName; bo.entityName = dto.entityName; - bo.timestamp = IceUtil::Time::microSeconds(dto.timestamp); + bo.timestamp = dto.timestamp; bo.instanceIndex = dto.instanceIndex; } @@ -17,7 +17,7 @@ void armarx::armem::toAron(arondto::MemoryID& dto, const MemoryID& bo) dto.coreSegmentName = bo.coreSegmentName; dto.providerSegmentName = bo.providerSegmentName; dto.entityName = bo.entityName; - dto.timestamp = bo.timestamp.toMicroSeconds(); + dto.timestamp = bo.timestamp; dto.instanceIndex = bo.instanceIndex; } diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp index 95e508bde..6149449c7 100644 --- a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp +++ b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp @@ -10,7 +10,7 @@ std::ostream& armarx::armem::wm::operator<<(std::ostream& os, const EntityInstan << "\n- t_sent = \t" << armem::toStringMicroSeconds(d.timeSent) << " us" << "\n- t_arrived = \t" << armem::toStringMicroSeconds(d.timeArrived) << " us" << "\n- confidence = \t" << d.confidence << " us" - ; + ; return os; } @@ -28,9 +28,17 @@ namespace armarx::armem::wm bool EntityInstance::equalsDeep(const EntityInstance& other) const { - return id() == other.id() - && _metadata == other.metadata() - && _data->equalsDeep(other.data()); + if (_data and other.data()) + { + return id() == other.id() + && _metadata == other.metadata() + && *_data == *other.data(); + } + if (_data or other.data()) + { + return false; + } + return id() == other.id() && _metadata == other.metadata(); } void EntityInstance::update(const EntityUpdate& update, int index) diff --git a/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp b/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp index 7588230d8..984c1f8e5 100644 --- a/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp +++ b/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp @@ -627,8 +627,9 @@ BOOST_AUTO_TEST_CASE(test_segment_setup) { update.entityID = armem::MemoryID::fromString("Memory/OtherCoreSegment"); BOOST_CHECK_THROW(coreSegment.update(update), armem::error::ContainerNameMismatch); - update.entityID = armem::MemoryID::fromString("Memory/ImageRGB/MissingProvider"); - BOOST_CHECK_THROW(coreSegment.update(update), armem::error::MissingEntry); + // This adds the segment now (changed default behavior) + //update.entityID = armem::MemoryID::fromString("Memory/ImageRGB/MissingProvider"); + //BOOST_CHECK_THROW(coreSegment.update(update), armem::error::MissingEntry); } armem::wm::ProviderSegment& providerSegment = coreSegment.addProviderSegment("SomeRGBImageProvider"); diff --git a/source/RobotAPI/libraries/armem_objects/server/articulated_object_class/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/articulated_object_class/Segment.cpp index 422b8e6be..b2e6be2f6 100644 --- a/source/RobotAPI/libraries/armem_objects/server/articulated_object_class/Segment.cpp +++ b/source/RobotAPI/libraries/armem_objects/server/articulated_object_class/Segment.cpp @@ -48,7 +48,7 @@ namespace armarx::armem::server::obj::articulated_object_class { ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory); - coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreClassSegmentName, arondto::RobotDescription::toInitialAronType()); + coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreClassSegmentName, arondto::RobotDescription::toAronType()); coreSegment->setMaxHistorySize(p.maxHistorySize); if (p.loadFromObjectsPackage) diff --git a/source/RobotAPI/libraries/armem_objects/server/articulated_object_instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/articulated_object_instance/Segment.cpp index c7fa562a6..dba8c91a8 100644 --- a/source/RobotAPI/libraries/armem_objects/server/articulated_object_instance/Segment.cpp +++ b/source/RobotAPI/libraries/armem_objects/server/articulated_object_instance/Segment.cpp @@ -49,7 +49,7 @@ namespace armarx::armem::server::obj::articulated_object_instance { ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory); - coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreInstanceSegmentName, arondto::Robot::toInitialAronType()); + coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreInstanceSegmentName, arondto::Robot::toAronType()); coreSegment->setMaxHistorySize(p.maxHistorySize); } diff --git a/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp b/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp index 6a56d19f3..601f17d65 100644 --- a/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp +++ b/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp @@ -8,11 +8,6 @@ namespace armarx::armem::robot { /* to be moved */ - void fromAron(const long& dto, IceUtil::Time& time) - { - time = IceUtil::Time::microSeconds(dto); - } - void toAron(long& dto, const IceUtil::Time& time) { dto = time.toMicroSeconds(); @@ -51,14 +46,14 @@ namespace armarx::armem::robot void fromAron(const arondto::RobotState& dto, RobotState& bo) { - fromAron(dto.timestamp, bo.timestamp); + bo.timestamp = dto.timestamp; bo.globalPose.matrix() = dto.globalPose; bo.jointMap = dto.jointMap; } void toAron(arondto::RobotState& dto, const RobotState& bo) { - toAron(dto.timestamp, bo.timestamp); + dto.timestamp = bo.timestamp; dto.globalPose = bo.globalPose.matrix(); dto.jointMap = bo.jointMap; } diff --git a/source/RobotAPI/libraries/armem_robot_mapping/aron_conversions.cpp b/source/RobotAPI/libraries/armem_robot_mapping/aron_conversions.cpp index b37a88381..9b4535719 100644 --- a/source/RobotAPI/libraries/armem_robot_mapping/aron_conversions.cpp +++ b/source/RobotAPI/libraries/armem_robot_mapping/aron_conversions.cpp @@ -16,18 +16,12 @@ namespace armarx { /************ fromAron ************/ - - armem::Time timeFromAron(const int64_t timestamp) - { - return armem::Time::microSeconds(timestamp); - } - SensorHeader fromAron(const arondto::SensorHeader& aronSensorHeader) { return {.agent = aronSensorHeader.agent, .frame = aronSensorHeader.frame, - .timestamp = timeFromAron(aronSensorHeader.timestamp)}; + .timestamp = aronSensorHeader.timestamp}; } void fromAron(const arondto::LaserScanStamped& aronLaserScan, @@ -70,7 +64,7 @@ namespace armarx aronSensorHeader.agent = sensorHeader.agent; aronSensorHeader.frame = sensorHeader.frame; - aronSensorHeader.timestamp = toAron(sensorHeader.timestamp); + aronSensorHeader.timestamp = sensorHeader.timestamp; return aronSensorHeader; } @@ -97,4 +91,4 @@ namespace armarx toAron(laserScanStamped, aronLaserScanStamped); } -} // namespace armarx \ No newline at end of file +} // namespace armarx diff --git a/source/RobotAPI/libraries/armem_robot_state/aron_conversions.cpp b/source/RobotAPI/libraries/armem_robot_state/aron_conversions.cpp index 27fecee2e..785d25bdc 100644 --- a/source/RobotAPI/libraries/armem_robot_state/aron_conversions.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/aron_conversions.cpp @@ -38,7 +38,7 @@ namespace armarx::armem aron::toAron(dto.parentFrame, bo.parentFrame); aron::toAron(dto.frame, bo.frame); aron::toAron(dto.agent, bo.agent); - armarx::toAron(dto.timestamp, bo.timestamp); + dto.timestamp = bo.timestamp; } void fromAron(const arondto::TransformHeader& dto, robot_state::TransformHeader& bo) @@ -46,7 +46,7 @@ namespace armarx::armem aron::fromAron(dto.parentFrame, bo.parentFrame); aron::fromAron(dto.frame, bo.frame); aron::fromAron(dto.agent, bo.agent); - armarx::fromAron(dto.timestamp, bo.timestamp); + bo.timestamp = dto.timestamp; } /* JointState */ diff --git a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp index 826c5b484..67fc09b09 100644 --- a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp @@ -55,7 +55,7 @@ namespace armarx::armem::server::robot_state::description ARMARX_INFO << "Adding core segment '" << p.coreSegment << "'"; coreSegment = &iceMemory.workingMemory->addCoreSegment( - p.coreSegment, arondto::RobotDescription::toInitialAronType()); + p.coreSegment, arondto::RobotDescription::toAronType()); coreSegment->setMaxHistorySize(p.maxHistorySize); } @@ -73,7 +73,7 @@ namespace armarx::armem::server::robot_state::description const Time now = TimeUtil::GetTime(); const MemoryID providerID = coreSegment->id().withProviderSegmentName(robotDescription.name); - coreSegment->addProviderSegment(providerID.providerSegmentName, arondto::RobotDescription::toInitialAronType()); + coreSegment->addProviderSegment(providerID.providerSegmentName, arondto::RobotDescription::toAronType()); EntityUpdate update; update.entityID = providerID.withEntityName("description"); diff --git a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp index 6858f0c34..108c80691 100644 --- a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp @@ -61,7 +61,7 @@ namespace armarx::armem::server::robot_state::localization ARMARX_INFO << "Adding core segment '" << p.coreSegment << "'"; coreSegment = &iceMemory.workingMemory->addCoreSegment( - p.coreSegment, arondto::Transform::toInitialAronType()); + p.coreSegment, arondto::Transform::toAronType()); coreSegment->setMaxHistorySize(p.maxHistorySize); } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp index 0cdf58d6d..86dc28743 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp @@ -132,22 +132,22 @@ namespace armarx::aron::cppserializer } } - std::cout << "Generate Type classes" << std::endl; + //std::cout << "Generate Type classes" << std::endl; generateInnerTypeObjects(c, publicGenerateObjectType->nestedObjects); // ctor c->addCtor(serializer->toCtor(c->getName())); // Generic methods - std::cout << "Generate equals method" << std::endl; + //std::cout << "Generate equals method" << std::endl; CppMethodPtr equals = serializer->toEqualsMethod(); c->addMethod(equals); - std::cout << "Generate reset method" << std::endl; + //std::cout << "Generate reset method" << std::endl; CppMethodPtr resetHard = serializer->toResetHardMethod(); c->addMethod(resetHard); - std::cout << "Generate init method" << std::endl; + //std::cout << "Generate init method" << std::endl; CppMethodPtr resetSoft = serializer->toResetSoftMethod(); c->addMethod(resetSoft); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.cpp index 4265939ef..757995c47 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.cpp @@ -42,12 +42,13 @@ namespace armarx::aron::cppserializer const std::map<std::string, std::string> Serializer::ESCAPE_ACCESSORS = { - {"->", "_ptr_"}, - {".", "_dot_"}, - {"[", "_lbrE_"}, - {"]", "_rbrE_"}, - {"(", "_lbrR_"}, - {")", "_rbrR_"} + {"->", "__ptr__"}, + {".", "__dot__"}, + {"[", "__lbrC__"}, + {"]", "__rbrC__"}, + {"(", "__lbrR__"}, + {")", "__rbrR__"}, + {"*", "__ast__"}, }; const SerializerFactoryPtr Serializer::FACTORY = SerializerFactoryPtr(new SerializerFactory()); @@ -78,35 +79,54 @@ namespace armarx::aron::cppserializer CppBlockPtr Serializer::ResolveMaybeWriteBlock(const std::string& accessor, const CppBlockPtr& block_if_data, const typenavigator::NavigatorPtr& typenavigator) { + CppBlockPtr b = std::make_shared<CppBlock>(); + + if (!accessor.empty()) + { + b->addLine("// Generate WriteInterface API calls for " + accessor); + } + else + { + b->addLine("// Generate WriteInterface API calls for the top level object " + ExtractCppTypename(typenavigator)); + } + if (typenavigator->getMaybe() != type::Maybe::eNone) { - CppBlockPtr b = std::make_shared<CppBlock>(); - if (typenavigator->getMaybe() == type::Maybe::eOptional) - { - b->addLine("if (" + accessor + ".has_value())"); - b->addBlock(block_if_data); - } - if (typenavigator->getMaybe() == type::Maybe::eRawPointer) + switch (typenavigator->getMaybe()) { - b->addLine("if (" + accessor + " == NULL)"); - b->addBlock(block_if_data); - } - if (typenavigator->getMaybe() == type::Maybe::eSharedPointer || typenavigator->getMaybe() == type::Maybe::eUniquePointer) - { - b->addLine("if (" + accessor + " == nullptr)"); - b->addBlock(block_if_data); + case type::Maybe::eOptional: + { + b->addLine("if (" + accessor + ".has_value())"); + b->addBlock(block_if_data); + break; + } + case type::Maybe::eRawPointer: + { + b->addLine("if (" + accessor + " != NULL)"); + b->addBlock(block_if_data); + break; + } + case type::Maybe::eSharedPointer: + case type::Maybe::eUniquePointer: + { + b->addLine("if (" + accessor + " != nullptr)"); + b->addBlock(block_if_data); + break; + } + default: + { + throw error::MaybeNotValidException("Serializer", "ResolveMaybeWriteBlock", "Unkown Maybe type (perhaps forgot to add in switch case?)", typenavigator->getMaybe(), typenavigator->getPath()); + } } b->addLine("else"); CppBlockPtr block_if_no_data = std::make_shared<CppBlock>(); - block_if_no_data->addLine("w.writeNull();"); + block_if_no_data->addLine("w.writeNull(); // The maybe type '" + accessor + "' has no data, so we simply write NULL (resulting in a AronData nullhandle)"); b->addBlock(block_if_no_data); return b; } - else - { - return block_if_data; - } + b->appendBlock(block_if_data); + return b; } CppBlockPtr Serializer::ResolveMaybeReadBlock(const std::string& accessor, const std::string& readElement, const CppBlockPtr& block_if_data, const typenavigator::NavigatorPtr& typenavigator) @@ -114,22 +134,194 @@ namespace armarx::aron::cppserializer std::string escaped_accessor = EscapeAccessor(accessor); std::string read_start_result_accessor = escaped_accessor + READ_START_RETURN_TYPE_ACCESSOR; + CppBlockPtr resolved_block = std::make_shared<CppBlock>(); + + if (!accessor.empty()) + { + resolved_block->addLine("// Generate ReadInterface API calls for " + accessor); + } + else + { + resolved_block->addLine("// Generate ReadInterface API calls for the top level object " + ExtractCppTypename(typenavigator)); + } + + if (!readElement.empty()) + { + resolved_block->addLine("auto " + read_start_result_accessor + " = " + readElement + "; // of " + accessor); + } + + if (typenavigator->getMaybe() != type::Maybe::eNone) + { + resolved_block->addLine("if (" + read_start_result_accessor + ".success)"); + CppBlockPtr if_success = std::make_shared<CppBlock>(); + + switch (typenavigator->getMaybe()) + { + case type::Maybe::eOptional: + { + auto s = FromAronTypeNaviagtorPtr(typenavigator); + if_success->addLine(accessor + " = " + s->getFullTypenameGenerator() + "();"); + if_success->appendBlock(block_if_data); + break; + } + case type::Maybe::eRawPointer: + { + auto s = FromAronTypeNaviagtorPtr(typenavigator); + if_success->addLine(accessor + " = " + s->getFullTypenameGenerator() + "();"); + if_success->appendBlock(block_if_data); + break; + } + case type::Maybe::eSharedPointer: + case type::Maybe::eUniquePointer: + { + auto s = FromAronTypeNaviagtorPtr(typenavigator); + if_success->addLine(accessor + " = " + s->getFullTypenameGenerator() + "();"); + if_success->appendBlock(block_if_data); + break; + } + default: + { + throw error::MaybeNotValidException("Serializer", "ResolveMaybeReadBlock", "Unkown Maybe type (perhaps forgot to add in switch case?)", typenavigator->getMaybe(), typenavigator->getPath()); + } + } + resolved_block->addBlock(if_success); + return resolved_block; + } + resolved_block->appendBlock(block_if_data); + return resolved_block; + } + + CppBlockPtr Serializer::ResolveMaybeEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor, const CppBlockPtr& block_if_data, const typenavigator::NavigatorPtr& typenavigator) + { CppBlockPtr b = std::make_shared<CppBlock>(); - b->addLine("auto " + read_start_result_accessor + " = " + readElement + ";"); - if (typenavigator->getMaybe() == type::Maybe::eOptional) + if (!accessor.empty()) + { + b->addLine("// Comparing " + accessor + " and " + otherInstanceAccessor); + } + else { - b->addLine("if (" + read_start_result_accessor + ".success)"); + b->addLine("// Comparing two objects of type " + ExtractCppTypename(typenavigator)); + } - CppBlockPtr b2 = std::make_shared<CppBlock>(); - b2->addLine(accessor + ".emplace();"); - b2->appendBlock(block_if_data); + if (typenavigator->getMaybe() != type::Maybe::eNone) + { + switch (typenavigator->getMaybe()) + { + case type::Maybe::eOptional: + { + b->addLine("if (" + accessor + ".has_value() and " + otherInstanceAccessor + ".has_value()) // both have a value set"); + b->addBlock(block_if_data); + b->addLine("if ((" + accessor + ".has_value() and !" + otherInstanceAccessor + ".has_value()) or (!" + accessor + ".has_value() and " + otherInstanceAccessor + ".has_value())) // only one has a value set (XOR)"); + b->addLine("\t return false;"); + break; + } + case type::Maybe::eRawPointer: + { + b->addLine("if (" + accessor + " != NULL and " + otherInstanceAccessor + " != NULL) // both have a value set"); + b->addBlock(block_if_data); + b->addLine("if ((" + accessor + " != NULL and " + otherInstanceAccessor + " == NULL) or (" + accessor + " == NULL and " + otherInstanceAccessor + " != NULL)) // only one has a value set (XOR)"); + b->addLine("\t return false;"); + break; + } + case type::Maybe::eSharedPointer: + case type::Maybe::eUniquePointer: + { + b->addLine("if (" + accessor + " != nullptr and " + otherInstanceAccessor + " != nullptr) // both have a value set"); + b->addBlock(block_if_data); + b->addLine("if ((" + accessor + " != nullptr and " + otherInstanceAccessor + " == nullptr) or (" + accessor + " == nullptr and " + otherInstanceAccessor + " != nullptr)) // only one has a value set (XOR)"); + b->addLine("\t return false;"); + break; + } + default: + { + throw error::MaybeNotValidException("Serializer", "ResolveMaybeEqualsBlock", "Unkown Maybe type (perhaps forgot to add in switch case?)", typenavigator->getMaybe(), typenavigator->getPath()); + } + } + return b; + } + b->appendBlock(block_if_data); + return b; + } - b->addBlock(b2); + CppBlockPtr Serializer::ResolveMaybeResetSoftBlock(const std::string& accessor, const CppBlockPtr& block_if_data, const typenavigator::NavigatorPtr& typenavigator) + { + CppBlockPtr b = std::make_shared<CppBlock>(); + + if (!accessor.empty()) + { + b->addLine("// Resetting soft member " + accessor); } else { - b->appendBlock(block_if_data); + b->addLine("// Ressetting soft the type " + ExtractCppTypename(typenavigator)); + } + + if (typenavigator->getMaybe() != type::Maybe::eNone) + { + switch (typenavigator->getMaybe()) + { + case type::Maybe::eOptional: + { + b->addLine("if (" + accessor + ".has_value())"); + b->addBlock(block_if_data); + break; + } + case type::Maybe::eRawPointer: + { + b->addLine("if (" + accessor + " != NULL)"); + b->addBlock(block_if_data); + break; + } + case type::Maybe::eSharedPointer: + case type::Maybe::eUniquePointer: + { + b->addLine("if (" + accessor + " != nullptr)"); + b->addBlock(block_if_data); + break; + } + default: + { + throw error::MaybeNotValidException("Serializer", "ResolveMaybeResetSoftBlock", "Unkown Maybe type (perhaps forgot to add in switch case?)", typenavigator->getMaybe(), typenavigator->getPath()); + } + } + return b; + } + b->appendBlock(block_if_data); + return b; + } + + CppBlockPtr Serializer::ResolveMaybeResetHardBlock(const std::string& accessor, const CppBlockPtr& block_if_data, const typenavigator::NavigatorPtr& typenavigator) + { + CppBlockPtr b = std::make_shared<CppBlock>(); + if (!accessor.empty()) + { + b->addLine("// Resetting hard member " + accessor); + } + else + { + b->addLine("// Ressetting hard the type " + ExtractCppTypename(typenavigator)); + } + + if (typenavigator->getMaybe() != type::Maybe::eNone) + { + switch (typenavigator->getMaybe()) + { + case type::Maybe::eOptional: + case type::Maybe::eRawPointer: + case type::Maybe::eSharedPointer: + case type::Maybe::eUniquePointer: + { + b->addLine(accessor + " = {};"); + break; + } + default: + { + throw error::MaybeNotValidException("Serializer", "ResolveMaybeResetSoftBlock", "Unkown Maybe type (perhaps forgot to add in switch case?)", typenavigator->getMaybe(), typenavigator->getPath()); + } + } + return b; } + b->appendBlock(block_if_data); return b; } @@ -156,7 +348,7 @@ namespace armarx::aron::cppserializer std::string Serializer::ExtractCppTypename(const typenavigator::NavigatorPtr& n) { SerializerPtr cpp = Serializer::FromAronTypeNaviagtorPtr(n); - return cpp->getFullCppTypename(); + return cpp->getCoreCppTypename(); } std::vector<std::string> Serializer::ExtractCppTypenames(const std::vector<typenavigator::NavigatorPtr>& n) diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.h index 1914c0e7c..ce4f11e9b 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.h @@ -116,6 +116,9 @@ namespace armarx::aron::cppserializer static std::string ResolveMaybeAccessor(const std::string&, const typenavigator::NavigatorPtr&); static CppBlockPtr ResolveMaybeWriteBlock(const std::string&, const CppBlockPtr&, const typenavigator::NavigatorPtr&); static CppBlockPtr ResolveMaybeReadBlock(const std::string&, const std::string&, const CppBlockPtr&, const typenavigator::NavigatorPtr&); + static CppBlockPtr ResolveMaybeEqualsBlock(const std::string&, const std::string&, const CppBlockPtr&, const typenavigator::NavigatorPtr&); + static CppBlockPtr ResolveMaybeResetSoftBlock(const std::string&, const CppBlockPtr&, const typenavigator::NavigatorPtr&); + static CppBlockPtr ResolveMaybeResetHardBlock(const std::string&, const CppBlockPtr&, const typenavigator::NavigatorPtr&); protected: static const std::string READ_START_RETURN_TYPE_ACCESSOR; diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.cpp index d5ee832a5..10b3470db 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.cpp @@ -30,45 +30,44 @@ namespace armarx::aron::cppserializer::serializer // constructors DictSerializer::DictSerializer(const typenavigator::DictNavigatorPtr& e) : detail::ContainerSerializerBase<typenavigator::DictNavigator, DictSerializer>("std::map<std::string, " + FromAronTypeNaviagtorPtr(e->getAcceptedType())->getFullCppTypename() + ">", - simox::meta::get_type_name(typeid(data::AronDict)), - simox::meta::get_type_name(typeid(type::AronDict)), e) + simox::meta::get_type_name(typeid(data::AronDict)), + simox::meta::get_type_name(typeid(type::AronDict)), e) { } // virtual implementations CppBlockPtr DictSerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = {};"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator); + + block_if_data->addLine(accessor + nextEl() + "clear();"); + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } CppBlockPtr DictSerializer::getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = {};"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); + return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator); } CppBlockPtr DictSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeStartDict({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); - - std::string escaped_accessor = EscapeAccessor(accessor); - std::string accessor_iterator = escaped_accessor + DICT_ITERATOR_ACCESSOR; + b->addLine("w.writeStartDict({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType()); CppBlockPtr b2 = type_s->getWriteTypeBlock(type_s->getFullCppTypename()); b->appendBlock(b2); - b->addLine("w.writeEndDict();"); + b->addLine("w.writeEndDict(); // of " + accessor); return b; } CppBlockPtr DictSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); - block_if_data->addLine("w.writeStartDict();"); + block_if_data->addLine("w.writeStartDict(); // of " + accessor); std::string escaped_accessor = EscapeAccessor(accessor); std::string accessor_iterator_key = escaped_accessor + DICT_KEY_ACCESSOR; @@ -83,7 +82,7 @@ namespace armarx::aron::cppserializer::serializer b2->addLine("w.writeKey(" + accessor_iterator_key + ");"); b2->appendBlock(type_s->getWriteBlock(accessor_iterator_val)); block_if_data->addBlock(b2); - block_if_data->addLine("w.writeEndDict();"); + block_if_data->addLine("w.writeEndDict(); // of " + accessor); return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator); } @@ -98,10 +97,10 @@ namespace armarx::aron::cppserializer::serializer auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType()); - block_if_data->addLine("while(!r.readEndDict())"); + block_if_data->addLine("while(!r.readEndDict()) // of " + accessor); CppBlockPtr b2 = CppBlockPtr(new CppBlock()); - b2->addLine("std::string " + accessor_iterator_key + " = r.readKey();"); + b2->addLine("std::string " + accessor_iterator_key + " = r.readKey(); // in dict " + accessor); b2->addLine(type_s->getFullCppTypename() + " " + accessor_iterator + ";"); b2->appendBlock(type_s->getReadBlock(accessor_iterator)); b2->addLine(accessor + nextEl() + "insert({" + accessor_iterator_key + ", " + accessor_iterator + "});"); @@ -112,10 +111,10 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr DictSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))"); - b->addLine("\t return false;"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))"); + block_if_data->addLine("\t return false;"); + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.cpp index 1aa21fe91..b0fb56473 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.cpp @@ -29,43 +29,45 @@ namespace armarx::aron::cppserializer::serializer // constructors ListSerializer::ListSerializer(const typenavigator::ListNavigatorPtr& e) : detail::ContainerSerializerBase<typenavigator::ListNavigator, ListSerializer>("std::vector<" + FromAronTypeNaviagtorPtr(e->getAcceptedType())->getFullCppTypename() + ">", - simox::meta::get_type_name(typeid(data::AronList)), - simox::meta::get_type_name(typeid(type::AronList)), e) + simox::meta::get_type_name(typeid(data::AronList)), + simox::meta::get_type_name(typeid(type::AronList)), e) { } CppBlockPtr ListSerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = {};"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator); + + block_if_data->addLine(accessor + nextEl() + "clear();"); + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } CppBlockPtr ListSerializer::getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = {};"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); + return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator); } - CppBlockPtr ListSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr ListSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeStartList({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writeStartList({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType()); CppBlockPtr b2 = type_s->getWriteTypeBlock(type_s->getFullCppTypename()); b->appendBlock(b2); - b->addLine("w.writeEndList();"); + b->addLine("w.writeEndList(); // of " + accessor); return b; } CppBlockPtr ListSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine("w.writeStartList();"); + block_if_data->addLine("w.writeStartList(); // of " + accessor); std::string escaped_accessor = EscapeAccessor(accessor); std::string accessor_iterator = escaped_accessor + LIST_ITERATOR_ACCESSOR; @@ -73,7 +75,7 @@ namespace armarx::aron::cppserializer::serializer auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType()); block_if_data->addLine("for(unsigned int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + nextEl() + "size(); ++" + accessor_iterator + ")"); block_if_data->addBlock(type_s->getWriteBlock(accessor + nextEl() + "at(" + accessor_iterator + ")")); - block_if_data->addLine("w.writeEndList();"); + block_if_data->addLine("w.writeEndList(); // of " + accessor); return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator); } @@ -85,7 +87,7 @@ namespace armarx::aron::cppserializer::serializer std::string escaped_accessor = EscapeAccessor(accessor); std::string accessor_iterator = escaped_accessor + LIST_ITERATOR_ACCESSOR; - block_if_data->addLine("while(!r.readEndList())"); + block_if_data->addLine("while(!r.readEndList()) // of " + accessor); CppBlockPtr b2 = CppBlockPtr(new CppBlock()); auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType()); @@ -99,9 +101,9 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr ListSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))"); - b->addLine("\t return false;"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))"); + block_if_data->addLine("\t return false;"); + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.cpp index c5dd78ce3..1ffbe7db2 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.cpp @@ -30,50 +30,38 @@ namespace armarx::aron::cppserializer::serializer // constructors ObjectSerializer::ObjectSerializer(const typenavigator::ObjectNavigatorPtr& e) : detail::ContainerSerializerBase<typenavigator::ObjectNavigator, ObjectSerializer>(e->getObjectName(), - simox::meta::get_type_name(typeid(data::AronDict)), - simox::meta::get_type_name(typeid(type::AronObject)), e) + simox::meta::get_type_name(typeid(data::AronDict)), + simox::meta::get_type_name(typeid(type::AronObject)), e) { } CppBlockPtr ObjectSerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - if (typenavigator->getMaybe() != type::Maybe::eNone) - { - b->addLine(accessor + " = {};"); - } - else - { - b->addLine(accessor + nextEl() + "resetSoft();"); - } - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator); + + block_if_data->addLine(accessor + nextEl() + "resetSoft();"); + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } CppBlockPtr ObjectSerializer::getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - if (typenavigator->getMaybe() != type::Maybe::eNone) - { - b->addLine(accessor + " = {};"); - } - else - { - b->addLine(accessor + nextEl() + "resetHard();"); - } - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); + return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator); } CppBlockPtr ObjectSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + "::writeType(w, " + MAYBE_TO_STRING(typenavigator->getMaybe()) + ");"); + b->addLine(accessor + "::writeType(w, " + MAYBE_TO_STRING(typenavigator->getMaybe()) + "); // of " + accessor); return b; } CppBlockPtr ObjectSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine(accessor + nextEl() + "write(w);"); + block_if_data->addLine(accessor + nextEl() + "write(w); // of " + accessor); return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator); } @@ -81,16 +69,16 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr ObjectSerializer::getReadBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine(accessor + nextEl() + "read(r, true);"); + block_if_data->addLine(accessor + nextEl() + "read(r, true); // of " + accessor); return ResolveMaybeReadBlock(accessor, "r.readStartDict()", block_if_data, typenavigator); } CppBlockPtr ObjectSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))"); - b->addLine("\t return false;"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))"); + block_if_data->addLine("\t return false;"); + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.cpp index 5b7fac538..6f78c2996 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.cpp @@ -29,55 +29,37 @@ namespace armarx::aron::cppserializer::serializer { PairSerializer::PairSerializer(const typenavigator::PairNavigatorPtr& e) : detail::ContainerSerializerBase<typenavigator::PairNavigator, PairSerializer>("std::pair<" + ExtractCppTypename(e->getFirstAcceptedType()) + ", " + ExtractCppTypename(e->getSecondAcceptedType()) + ">", - simox::meta::get_type_name(typeid(data::AronList)), - simox::meta::get_type_name(typeid(type::AronPair)), e) + simox::meta::get_type_name(typeid(data::AronList)), + simox::meta::get_type_name(typeid(type::AronPair)), e) { } CppBlockPtr PairSerializer::getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - if (typenavigator->getMaybe() != type::Maybe::eNone) - { - b->addLine(accessor + " = {};"); - } - else - { - auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType()); - CppBlockPtr b21 = child_s1->getResetHardBlock(accessor + nextEl() + "first"); - b->appendBlock(b21); - - auto child_s2 = FromAronTypeNaviagtorPtr(typenavigator->getSecondAcceptedType()); - CppBlockPtr b22 = child_s2->getResetHardBlock(accessor + nextEl() + "second"); - b->appendBlock(b22); - } - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); + return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator); } CppBlockPtr PairSerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - if (typenavigator->getMaybe() != type::Maybe::eNone) - { - b->addLine(accessor + " = {};"); - } - else - { - auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType()); - CppBlockPtr b21 = child_s1->getResetSoftBlock(accessor + nextEl() + "first"); - b->appendBlock(b21); - - auto child_s2 = FromAronTypeNaviagtorPtr(typenavigator->getSecondAcceptedType()); - CppBlockPtr b22 = child_s2->getResetSoftBlock(accessor + nextEl() + "second"); - b->appendBlock(b22); - } - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator); + + auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType()); + CppBlockPtr b21 = child_s1->getResetSoftBlock(accessor + nextEl() + "first"); + block_if_data->appendBlock(b21); + + auto child_s2 = FromAronTypeNaviagtorPtr(typenavigator->getSecondAcceptedType()); + CppBlockPtr b22 = child_s2->getResetSoftBlock(accessor + nextEl() + "second"); + block_if_data->appendBlock(b22); + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } CppBlockPtr PairSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeStartPair({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writeStartPair({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); std::string escaped_accessor = EscapeAccessor(accessor); @@ -93,14 +75,14 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr b22 = child_s2->getWriteTypeBlock(accessor_iterator2); b->appendBlock(b22); - b->addLine("w.writeEndPair();"); + b->addLine("w.writeEndPair(); // of " + accessor); return b; } CppBlockPtr PairSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine("w.writeStartList();"); + block_if_data->addLine("w.writeStartList(); // of " + accessor); auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType()); CppBlockPtr b21 = child_s1->getWriteBlock(accessor + nextEl() + "first"); @@ -110,7 +92,7 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr b22 = child_s2->getWriteBlock(accessor + nextEl() + "second"); block_if_data->appendBlock(b22); - block_if_data->addLine("w.writeEndList();"); + block_if_data->addLine("w.writeEndList(); // of " + accessor); return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator); } @@ -127,16 +109,16 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr b22 = child_s2->getReadBlock(accessor + nextEl() + "second"); block_if_data->appendBlock(b22); - block_if_data->addLine("r.readEndList();"); + block_if_data->addLine("r.readEndList(); // of " + accessor); return ResolveMaybeReadBlock(accessor, "r.readStartList()", block_if_data, typenavigator); } CppBlockPtr PairSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))"); - b->addLine("\t return false;"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))"); + block_if_data->addLine("\t return false;"); + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.cpp index 643f16570..dab5b33a0 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.cpp @@ -29,55 +29,37 @@ namespace armarx::aron::cppserializer::serializer { TupleSerializer::TupleSerializer(const typenavigator::TupleNavigatorPtr& e) : detail::ContainerSerializerBase<typenavigator::TupleNavigator, TupleSerializer>("std::tuple<" + simox::alg::join(ExtractCppTypenames(e->getAcceptedTypes()), ", ") + ">", - simox::meta::get_type_name(typeid(data::AronList)), - simox::meta::get_type_name(typeid(type::AronTuple)), e) + simox::meta::get_type_name(typeid(data::AronList)), + simox::meta::get_type_name(typeid(type::AronTuple)), e) { } CppBlockPtr TupleSerializer::getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - if (typenavigator->getMaybe() != type::Maybe::eNone) - { - b->addLine(accessor + " = {};"); - } - else - { - unsigned int i = 0; - for (const auto& child : typenavigator->getAcceptedTypes()) - { - auto child_s = FromAronTypeNaviagtorPtr(child); - CppBlockPtr b2 = child_s->getResetHardBlock("std::get<" + std::to_string(i++) + ">(" + accessor + ")"); - b->appendBlock(b2); - } - } - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); + return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator); } CppBlockPtr TupleSerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - if (typenavigator->getMaybe() != type::Maybe::eNone) - { - b->addLine(accessor + " = {};"); - } - else + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator); + + unsigned int i = 0; + for (const auto& child : typenavigator->getAcceptedTypes()) { - unsigned int i = 0; - for (const auto& type : typenavigator->getAcceptedTypes()) - { - auto type_s = FromAronTypeNaviagtorPtr(type); - CppBlockPtr b2 = type_s->getResetSoftBlock("std::get<" + std::to_string(i++) + ">(" + accessor + ")"); - b->appendBlock(b2); - } + auto child_s = FromAronTypeNaviagtorPtr(child); + CppBlockPtr b2 = child_s->getResetSoftBlock("std::get<" + std::to_string(i++) + ">(" + resolved_accessor + ")"); + block_if_data->appendBlock(b2); } - return b; + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } CppBlockPtr TupleSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeStartTuple({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writeStartTuple({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); std::string escaped_accessor = EscapeAccessor(accessor); unsigned int i = 0; @@ -89,14 +71,14 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr b2 = type_s->getWriteTypeBlock(accessor_iterator); b->appendBlock(b2); } - b->addLine("w.writeEndTuple();"); + b->addLine("w.writeEndTuple(); // of " + accessor); return b; } CppBlockPtr TupleSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine("w.writeStartList();"); + block_if_data->addLine("w.writeStartList(); // of " + accessor); std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator); @@ -107,7 +89,7 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr b2 = type_s->getWriteBlock("std::get<" + std::to_string(i++) + ">(" + resolved_accessor + ")"); block_if_data->appendBlock(b2); } - block_if_data->addLine("w.writeEndList();"); + block_if_data->addLine("w.writeEndList(); // of " + accessor); return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator); } @@ -125,16 +107,16 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr b2 = type_s->getReadBlock("std::get<" + std::to_string(i++) + ">(" + resolved_accessor + ")"); block_if_data->appendBlock(b2); } - block_if_data->addLine("r.readEndList();"); + block_if_data->addLine("r.readEndList(); // of " + accessor); return ResolveMaybeReadBlock(accessor, "r.readStartList()", block_if_data, typenavigator); } CppBlockPtr TupleSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))"); - b->addLine("\t return false;"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))"); + block_if_data->addLine("\t return false;"); + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/PrimitiveSerializerBase.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/PrimitiveSerializerBase.h index ef187424d..171f4defb 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/PrimitiveSerializerBase.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/PrimitiveSerializerBase.h @@ -46,23 +46,23 @@ namespace armarx::aron::cppserializer::detail virtual CppBlockPtr getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); + return this->ResolveMaybeResetHardBlock(accessor, block_if_data, this->typenavigator); } virtual CppBlockPtr getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullCppTypename() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullCppTypename() + "();"); + return this->ResolveMaybeResetSoftBlock(accessor, block_if_data, this->typenavigator); } virtual CppBlockPtr getWriteBlock(const std::string& accessor) const override { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); std::string resolved_accessor = this->ResolveMaybeAccessor(accessor, this->typenavigator); - block_if_data->addLine("w.writePrimitive(" + resolved_accessor + ");"); + block_if_data->addLine("w.writePrimitive(" + resolved_accessor + "); // of " + accessor); return this->ResolveMaybeWriteBlock(accessor, block_if_data, this->typenavigator); } @@ -71,16 +71,16 @@ namespace armarx::aron::cppserializer::detail { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); std::string resolved_accessor = this->ResolveMaybeAccessor(accessor, this->typenavigator); - block_if_data->addLine("r.readEndPrimitive(" + resolved_accessor + ");"); + block_if_data->addLine("r.readEndPrimitive(" + resolved_accessor + "); // of " + accessor); return this->ResolveMaybeReadBlock(accessor, "r.readStartPrimitive()", block_if_data, this->typenavigator); } virtual CppBlockPtr getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const override { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))"); - b->addLine("\t return false;"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))"); + block_if_data->addLine("\t return false;"); + return this->ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, this->typenavigator); } }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/SerializerBase.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/SerializerBase.h index 06370ed75..4b2dd5f89 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/SerializerBase.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/SerializerBase.h @@ -60,7 +60,7 @@ namespace armarx::aron::cppserializer::detail case type::Maybe::eOptional: return "std::optional<" + getCoreCppTypename() + ">"; case type::Maybe::eRawPointer: - return "*" + getCoreCppTypename(); + return getCoreCppTypename() + "*"; case type::Maybe::eSharedPointer: return "std::shared_ptr<" + getCoreCppTypename() + ">"; case type::Maybe::eUniquePointer: @@ -124,6 +124,20 @@ namespace armarx::aron::cppserializer::detail } } + std::string toPointerAccessor(const std::string& accessor) const + { + switch (typenavigator->getMaybe()) + { + case type::Maybe::eRawPointer: + return accessor; + case type::Maybe::eSharedPointer: + case type::Maybe::eUniquePointer: + return accessor + ".get()"; + default: + throw error::MaybeNotValidException("SerializerBase", "toPointerAccessor", "Received invalid maybe enum (not a pointer?)", typenavigator->getMaybe(), typenavigator->getPath()); + } + } + protected: typename TypenavigatorT::PointerType typenavigator; }; diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.cpp index 73b9cfa58..e412f52b5 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.cpp @@ -29,23 +29,18 @@ namespace armarx::aron::cppserializer::serializer // constructors IntEnumSerializer::IntEnumSerializer(const typenavigator::IntEnumNavigatorPtr& e) : detail::SerializerBase<typenavigator::IntEnumNavigator, IntEnumSerializer>(e->getEnumName(), - simox::meta::get_type_name(typeid(data::AronNDArray)), - simox::meta::get_type_name(typeid(type::AronIntEnum)), e) + simox::meta::get_type_name(typeid(data::AronNDArray)), + simox::meta::get_type_name(typeid(type::AronIntEnum)), e) { } CppBlockPtr IntEnumSerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - if (typenavigator->getMaybe() != type::Maybe::eNone) - { - b->addLine(accessor + " = {};"); - } - else - { - b->addLine(accessor + nextEl() + "resetSoft();"); - } - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator); + + block_if_data->addLine(accessor + nextEl() + "resetSoft();"); + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } CppBlockPtr IntEnumSerializer::getWriteTypeBlock(const std::string& accessor) const diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp index 34c90f38a..790d6157d 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp @@ -41,37 +41,37 @@ namespace armarx::aron::cppserializer::serializer // constructors EigenMatrixSerializer::EigenMatrixSerializer(const typenavigator::EigenMatrixNavigatorPtr& n) : detail::NDArraySerializerBase<typenavigator::EigenMatrixNavigator, EigenMatrixSerializer>("Eigen::Matrix<" + ACCEPTED_TYPES.at(n->getTypename()).first + ", " + std::to_string(n->getRows()) + ", " + std::to_string(n->getCols()) + ">", - simox::meta::get_type_name(typeid(data::AronNDArray)), - simox::meta::get_type_name(typeid(type::AronEigenMatrix)), n) + simox::meta::get_type_name(typeid(data::AronNDArray)), + simox::meta::get_type_name(typeid(type::AronEigenMatrix)), n) { ARMARX_CHECK_NOT_NULL(typenavigator); } CppBlockPtr EigenMatrixSerializer::getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); + return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator); } CppBlockPtr EigenMatrixSerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullCppTypename() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullCppTypename() + "();"); + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } - CppBlockPtr EigenMatrixSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr EigenMatrixSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeEigenMatrix({" + std::to_string(typenavigator->getRows()) + ", " + std::to_string(typenavigator->getCols()) + ", \"" + typenavigator->getTypename() + "\", " + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writeEigenMatrix({(int) " + std::to_string(typenavigator->getRows()) + ", (int) " + std::to_string(typenavigator->getCols()) + ", \"" + typenavigator->getTypename() + "\", " + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); return b; } CppBlockPtr EigenMatrixSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine("w.writeNDArray({" + accessor + nextEl() + "rows(), " + accessor + nextEl() + "cols(), " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data()));"); + block_if_data->addLine("w.writeNDArray({(int) " + accessor + nextEl() + "rows(), (int) " + accessor + nextEl() + "cols(), " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor); return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator); } @@ -79,15 +79,15 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr EigenMatrixSerializer::getReadBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data()));"); + block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor); return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator); } CppBlockPtr EigenMatrixSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + nextEl() + "isApprox(" + ResolveMaybeAccessor(otherInstanceAccessor, typenavigator) + ")))"); - b->addLine("\t return false;"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("if (not (" + accessor + nextEl() + "isApprox(" + ResolveMaybeAccessor(otherInstanceAccessor, typenavigator) + ")))"); + block_if_data->addLine("\t return false;"); + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp index 17eca9bd2..8e697ab6d 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp @@ -36,37 +36,37 @@ namespace armarx::aron::cppserializer::serializer // constructors EigenQuaternionSerializer::EigenQuaternionSerializer(const typenavigator::EigenQuaternionNavigatorPtr& n) : detail::NDArraySerializerBase<typenavigator::EigenQuaternionNavigator, EigenQuaternionSerializer>("Eigen::Quaternion<" + ACCEPTED_TYPES.at(n->getTypename()).first + ">", - simox::meta::get_type_name(typeid(data::AronNDArray)), - simox::meta::get_type_name(typeid(type::AronEigenQuaternion)), n) + simox::meta::get_type_name(typeid(data::AronNDArray)), + simox::meta::get_type_name(typeid(type::AronEigenQuaternion)), n) { ARMARX_CHECK_NOT_NULL(typenavigator); } CppBlockPtr EigenQuaternionSerializer::getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); + return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator); } CppBlockPtr EigenQuaternionSerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullCppTypename() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullCppTypename() + "();"); + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } - CppBlockPtr EigenQuaternionSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr EigenQuaternionSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeEigenQuaternion({\"" + typenavigator->getTypename() + "\", " + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writeEigenQuaternion({\"" + typenavigator->getTypename() + "\", " + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); return b; } CppBlockPtr EigenQuaternionSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "coeffs().data()));"); + block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "coeffs().data())); // of " + accessor); return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator); } @@ -74,15 +74,15 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr EigenQuaternionSerializer::getReadBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "coeffs().data()));"); + block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "coeffs().data())); // of " + accessor); return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator); } CppBlockPtr EigenQuaternionSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))"); - b->addLine("\t return false;"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))"); + block_if_data->addLine("\t return false;"); + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.cpp index f7f4a1d03..e33934d35 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.cpp @@ -37,37 +37,41 @@ namespace armarx::aron::cppserializer::serializer // constructors IVTCByteImageSerializer::IVTCByteImageSerializer(const typenavigator::IVTCByteImageNavigatorPtr& n) : detail::NDArraySerializerBase<typenavigator::IVTCByteImageNavigator, IVTCByteImageSerializer>("CByteImage", - simox::meta::get_type_name(typeid(data::AronNDArray)), - simox::meta::get_type_name(typeid(type::AronIVTCByteImage)), n) + simox::meta::get_type_name(typeid(data::AronNDArray)), + simox::meta::get_type_name(typeid(type::AronIVTCByteImage)), n) { ARMARX_CHECK_NOT_NULL(typenavigator); + if (typenavigator->getMaybe() == type::Maybe::eNone or typenavigator->getMaybe() == type::Maybe::eOptional) + { + throw error::MaybeNotValidException("IVTCByteImageSerializer", "IVTCByteImageSerializer", "An IVTCByteImage must be a pointer!", typenavigator->getMaybe(), typenavigator->getPath()); + } } CppBlockPtr IVTCByteImageSerializer::getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); + return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator); } CppBlockPtr IVTCByteImageSerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + nextEl() + "Set(" + accessor + nextEl() + "width, " + accessor + nextEl() + "height, " + accessor + nextEl() + "type);"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + nextEl() + "Set(" + accessor + nextEl() + "width, " + accessor + nextEl() + "height, " + accessor + nextEl() + "type);"); + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } - CppBlockPtr IVTCByteImageSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr IVTCByteImageSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeIVTCByteImage({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writeIVTCByteImage({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); return b; } CppBlockPtr IVTCByteImageSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine("w.writeNDArray({" + accessor + nextEl() + "width, " + accessor + nextEl() + "height, " + accessor + nextEl() + "bytesPerPixel}, std::to_string(" + accessor + nextEl() + "type), reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "pixels));"); + block_if_data->addLine("w.writeNDArray({" + accessor + nextEl() + "width, " + accessor + nextEl() + "height, " + accessor + nextEl() + "bytesPerPixel}, std::to_string(" + accessor + nextEl() + "type), reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "pixels)); // of " + accessor); return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator); } @@ -79,18 +83,18 @@ namespace armarx::aron::cppserializer::serializer std::string read_start_result_accessor = escaped_accessor + READ_START_RETURN_TYPE_ACCESSOR; block_if_data->addLine(accessor + nextEl() + "Set(" + read_start_result_accessor + ".dims[0], " + read_start_result_accessor + ".dims[1], static_cast<CByteImage::ImageType>(std::stoi(" + read_start_result_accessor + ".type)));"); - block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "pixels));"); + block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "pixels)); // of " + accessor); return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator); } CppBlockPtr IVTCByteImageSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + nextEl() + "IsCompatible(" + otherInstanceAccessor + ".get())))"); - b->addLine("\t return false;"); - b->addLine("if (not (memcmp(" + accessor + nextEl() + "pixels, " + otherInstanceAccessor + nextEl() + "pixels, " + accessor + nextEl() + "width * " + accessor + nextEl() + "height * " + accessor + nextEl() + "bytesPerPixel) == 0))"); - b->addLine("\t return false;"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("if (not (" + accessor + nextEl() + "IsCompatible(" + toPointerAccessor(otherInstanceAccessor) + ")))"); + block_if_data->addLine("\t return false;"); + block_if_data->addLine("if (not (memcmp(" + accessor + nextEl() + "pixels, " + otherInstanceAccessor + nextEl() + "pixels, " + accessor + nextEl() + "width * " + accessor + nextEl() + "height * " + accessor + nextEl() + "bytesPerPixel) == 0))"); + block_if_data->addLine("\t return false;"); + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/NDArray.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/NDArray.cpp index 43e7f183f..67eb03720 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/NDArray.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/NDArray.cpp @@ -29,24 +29,24 @@ namespace armarx::aron::cppserializer::serializer // constructors NDArraySerializer::NDArraySerializer(const typenavigator::NDArrayNavigatorPtr& n) : detail::NDArraySerializerBase<typenavigator::NDArrayNavigator, NDArraySerializer>("NDArray", - simox::meta::get_type_name(typeid(data::AronNDArray)), - simox::meta::get_type_name(typeid(type::AronNDArray)), n) + simox::meta::get_type_name(typeid(data::AronNDArray)), + simox::meta::get_type_name(typeid(type::AronNDArray)), n) { ARMARX_CHECK_NOT_NULL(typenavigator); } CppBlockPtr NDArraySerializer::getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); + return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator); } CppBlockPtr NDArraySerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullCppTypename() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullCppTypename() + "();"); + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } CppBlockPtr NDArraySerializer::getWriteTypeBlock(const std::string&) const @@ -69,8 +69,8 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr NDArraySerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.cpp index 3631eb1ff..da0e3c013 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.cpp @@ -41,20 +41,13 @@ namespace armarx::aron::cppserializer::serializer // constructors OpenCVMatSerializer::OpenCVMatSerializer(const typenavigator::OpenCVMatNavigatorPtr& n) : detail::NDArraySerializerBase<typenavigator::OpenCVMatNavigator, OpenCVMatSerializer>("cv::Mat", - simox::meta::get_type_name(typeid(data::AronNDArray)), - simox::meta::get_type_name(typeid(type::AronOpenCVMat)), n) + simox::meta::get_type_name(typeid(data::AronNDArray)), + simox::meta::get_type_name(typeid(type::AronOpenCVMat)), n) { ARMARX_CHECK_NOT_NULL(typenavigator); } - CppBlockPtr OpenCVMatSerializer::getResetHardBlock(const std::string& accessor) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); - return b; - } - - CppBlockPtr OpenCVMatSerializer::getResetSoftBlock(const std::string& accessor) const + std::pair<CppBlockPtr, std::string> OpenCVMatSerializer::getDimensionsFromAccessor(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); @@ -66,15 +59,35 @@ namespace armarx::aron::cppserializer::serializer b->addLine("for (int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + nextEl() + "dims; ++" + accessor_iterator + ")"); CppBlockPtr b2 = CppBlockPtr(new CppBlock()); b2->addLine(accessor_dimensions + ".push_back(" + accessor + nextEl() + "size[" + accessor_iterator + "]);"); - b->appendBlock(b2); - b->addLine(accessor + " = " + getFullCppTypename() + "(" + accessor_dimensions + ", " + accessor + nextEl() + "type());"); - return b; + b->addBlock(b2); + return {b, accessor_dimensions}; + } + + CppBlockPtr OpenCVMatSerializer::getResetHardBlock(const std::string& accessor) const + { + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); + return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator); + } + + CppBlockPtr OpenCVMatSerializer::getResetSoftBlock(const std::string& accessor) const + { + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + + auto [get_dim_block, accessor_dimensions] = getDimensionsFromAccessor(accessor); + block_if_data->appendBlock(get_dim_block); + block_if_data->addLine("if (!" + accessor_dimensions + ".empty())"); + CppBlockPtr b2 = CppBlockPtr(new CppBlock()); + b2->addLine(accessor + " = " + getFullCppTypename() + "(" + accessor_dimensions + ", " + accessor + nextEl() + "type());"); + block_if_data->addBlock(b2); + + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } - CppBlockPtr OpenCVMatSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr OpenCVMatSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeOpenCVMat({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writeOpenCVMat({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); return b; } @@ -83,16 +96,11 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); std::string escaped_accessor = EscapeAccessor(accessor); - std::string accessor_dimensions = escaped_accessor + DIMENSION_ACCESSOR; - std::string accessor_iterator = escaped_accessor + ITERATOR_ACCESSOR; - block_if_data->addLine("std::vector<int> " + accessor_dimensions + ";"); - block_if_data->addLine("for (int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + nextEl() + "dims; ++" + accessor_iterator + ")"); - CppBlockPtr b2 = CppBlockPtr(new CppBlock()); - b2->addLine(accessor_dimensions + ".push_back(" + accessor + nextEl() + "size[" + accessor_iterator + "]);"); - block_if_data->appendBlock(b2); + auto [get_dim_block, accessor_dimensions] = getDimensionsFromAccessor(accessor); + block_if_data->appendBlock(get_dim_block); block_if_data->addLine(accessor_dimensions + ".push_back(" + accessor + nextEl() + "elemSize());"); - block_if_data->addLine("w.writeNDArray(" + accessor_dimensions + ", std::to_string(" + accessor + nextEl() + "type()), reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data));"); + block_if_data->addLine("w.writeNDArray(" + accessor_dimensions + ", std::to_string(" + accessor + nextEl() + "type()), reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data)); // of " + accessor); return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator); } @@ -103,17 +111,21 @@ namespace armarx::aron::cppserializer::serializer std::string escaped_accessor = EscapeAccessor(accessor); std::string read_start_result_accessor = escaped_accessor + READ_START_RETURN_TYPE_ACCESSOR; - block_if_data->addLine(accessor + " = " + getCoreCppTypename() + "(std::vector<int>({" + read_start_result_accessor + ".dims.begin(), std::prev(" + read_start_result_accessor + ".dims.end())}), std::stoi(" + read_start_result_accessor + ".type));"); - block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data));"); + block_if_data->addLine("if (!" + read_start_result_accessor + ".dims.empty())"); + CppBlockPtr b2 = CppBlockPtr(new CppBlock()); + b2->addLine(accessor + " = " + getCoreCppTypename() + "(std::vector<int>({" + read_start_result_accessor + ".dims.begin(), std::prev(" + read_start_result_accessor + ".dims.end())}), std::stoi(" + read_start_result_accessor + ".type));"); + b2->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data)); // of " + accessor); + block_if_data->addBlock(b2); + return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator); } CppBlockPtr OpenCVMatSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (cv::countNonZero(" + accessor + " != " + otherInstanceAccessor + ") != 0)"); - b->addLine("\t return false;"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("if (cv::countNonZero(" + accessor + " != " + otherInstanceAccessor + ") != 0)"); + block_if_data->addLine("\t return false;"); + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h index 089891a87..4ed162490 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h @@ -40,7 +40,7 @@ namespace armarx::aron::cppserializer::serializer typedef std::shared_ptr<OpenCVMatSerializer> AronOpenCVMatTypeCppSerializerPtr; class OpenCVMatSerializer : - virtual public detail::NDArraySerializerBase<typenavigator::OpenCVMatNavigator, OpenCVMatSerializer> + virtual public detail::NDArraySerializerBase<typenavigator::OpenCVMatNavigator, OpenCVMatSerializer> { public: using PointerType = AronOpenCVMatTypeCppSerializerPtr; @@ -57,10 +57,14 @@ namespace armarx::aron::cppserializer::serializer virtual CppBlockPtr getReadBlock(const std::string&) const override; virtual CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override; + private: + std::pair<CppBlockPtr, std::string> getDimensionsFromAccessor(const std::string& accessor) const; + private: // members static const std::map<std::string, std::pair<std::string, int>> ACCEPTED_TYPES; static constexpr const char* ITERATOR_ACCESSOR = "_iterator"; static constexpr const char* DIMENSION_ACCESSOR = "_dimensions"; + static constexpr const char* NUM_DIMENSION_ACCESSOR = "_num_dimensions"; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp index 13023745e..c10d1adfb 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp @@ -29,37 +29,37 @@ namespace armarx::aron::cppserializer::serializer // constructors OrientationSerializer::OrientationSerializer(const typenavigator::OrientationNavigatorPtr& n) : detail::NDArraySerializerBase<typenavigator::OrientationNavigator, OrientationSerializer>("Eigen::Quaternion<" + n->ACCEPTED_TYPE + ">", - simox::meta::get_type_name(typeid(data::AronNDArray)), - simox::meta::get_type_name(typeid(type::AronOrientation)), n) + simox::meta::get_type_name(typeid(data::AronNDArray)), + simox::meta::get_type_name(typeid(type::AronOrientation)), n) { ARMARX_CHECK_NOT_NULL(typenavigator); } CppBlockPtr OrientationSerializer::getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); + return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator); } CppBlockPtr OrientationSerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullCppTypename() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullCppTypename() + "();"); + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } - CppBlockPtr OrientationSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr OrientationSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeOrientation({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writeOrientation({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); return b; } CppBlockPtr OrientationSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", 4}, \"" + typenavigator->ACCEPTED_TYPE + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "coeffs().data()));"); + block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", 4}, \"" + typenavigator->ACCEPTED_TYPE + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "coeffs().data())); // of " + accessor); return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator); } @@ -67,16 +67,16 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr OrientationSerializer::getReadBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "coeffs().data()));"); + block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "coeffs().data())); // of " + accessor); return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator); } CppBlockPtr OrientationSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))"); - b->addLine("\t return false;"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))"); + block_if_data->addLine("\t return false;"); + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.cpp index 09196a8b6..8229554f6 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.cpp @@ -42,44 +42,37 @@ namespace armarx::aron::cppserializer::serializer // constructors PCLPointCloudSerializer::PCLPointCloudSerializer(const typenavigator::PCLPointCloudNavigatorPtr& n) : detail::NDArraySerializerBase<typenavigator::PCLPointCloudNavigator, PCLPointCloudSerializer>("pcl::PointCloud<" + ACCEPTED_TYPES.at(n->getTypename()).first + ">", - simox::meta::get_type_name(typeid(data::AronNDArray)), - simox::meta::get_type_name(typeid(type::AronPCLPointCloud)), n) + simox::meta::get_type_name(typeid(data::AronNDArray)), + simox::meta::get_type_name(typeid(type::AronPCLPointCloud)), n) { ARMARX_CHECK_NOT_NULL(typenavigator); } CppBlockPtr PCLPointCloudSerializer::getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); + return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator); } CppBlockPtr PCLPointCloudSerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - if (typenavigator->getMaybe() != type::Maybe::eNone) - { - b->addLine(accessor + " = {};"); - } - else - { - b->addLine(accessor + " = " + getFullCppTypename() + "(" + accessor + nextEl() + "width, " + accessor + nextEl() + "height);"); - } - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + getFullCppTypename() + "(" + accessor + nextEl() + "width, " + accessor + nextEl() + "height);"); + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } - CppBlockPtr PCLPointCloudSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr PCLPointCloudSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writePCLPointCloud({\"" + typenavigator->getTypename() + "\", " + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writePCLPointCloud({\"" + typenavigator->getTypename() + "\", " + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); return b; } CppBlockPtr PCLPointCloudSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine("w.writeNDArray({" + accessor + nextEl() + "width, " + accessor + nextEl() + "height, " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "points.data()));"); + block_if_data->addLine("w.writeNDArray({" + accessor + nextEl() + "width, " + accessor + nextEl() + "height, " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "points.data())); // of " + accessor); return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator); } @@ -91,18 +84,18 @@ namespace armarx::aron::cppserializer::serializer std::string read_start_result_accessor = escaped_accessor + READ_START_RETURN_TYPE_ACCESSOR; block_if_data->addLine(accessor + " = " + getCoreCppTypename() + "(" + read_start_result_accessor + ".dims[0], " + read_start_result_accessor + ".dims[1]);"); - block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "points.data()));"); + block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "points.data())); // of " + accessor); return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator); } CppBlockPtr PCLPointCloudSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (" + accessor + nextEl() + "width != " + otherInstanceAccessor + nextEl() + "width || " + accessor + nextEl() + "height != " + otherInstanceAccessor + nextEl() + "height)"); - b->addLine("\t return false;"); + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("if (" + accessor + nextEl() + "width != " + otherInstanceAccessor + nextEl() + "width || " + accessor + nextEl() + "height != " + otherInstanceAccessor + nextEl() + "height)"); + block_if_data->addLine("\t return false;"); //b->addLine("if (" + accessor + "->points != " + otherInstanceAccessor + "->points)"); //b->addLine("\t return false;"); - return b; + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp index f755e5442..93e340f51 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp @@ -29,37 +29,37 @@ namespace armarx::aron::cppserializer::serializer // constructors PoseSerializer::PoseSerializer(const typenavigator::PoseNavigatorPtr& n) : detail::NDArraySerializerBase<typenavigator::PoseNavigator, PoseSerializer>("Eigen::Matrix<" + n->ACCEPTED_TYPE + ", " + simox::alg::to_string(n->ACCEPTED_DIMENSION, ", ") + ">", - simox::meta::get_type_name(typeid(data::AronNDArray)), - simox::meta::get_type_name(typeid(type::AronPose)), n) + simox::meta::get_type_name(typeid(data::AronNDArray)), + simox::meta::get_type_name(typeid(type::AronPose)), n) { ARMARX_CHECK_NOT_NULL(typenavigator); } CppBlockPtr PoseSerializer::getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); + return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator); } CppBlockPtr PoseSerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullCppTypename() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullCppTypename() + "();"); + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } - CppBlockPtr PoseSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr PoseSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writePose({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writePose({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); return b; } CppBlockPtr PoseSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", 4}, \"" + typenavigator->ACCEPTED_TYPE + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data()));"); + block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", 4}, \"" + typenavigator->ACCEPTED_TYPE + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor); return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator); } @@ -67,16 +67,16 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr PoseSerializer::getReadBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data()));"); + block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor); return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator); } CppBlockPtr PoseSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))"); - b->addLine("\t return false;"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))"); + block_if_data->addLine("\t return false;"); + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp index 109294d85..b4409c2f9 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp @@ -29,37 +29,37 @@ namespace armarx::aron::cppserializer::serializer // constructors PositionSerializer::PositionSerializer(const typenavigator::PositionNavigatorPtr& n) : detail::NDArraySerializerBase<typenavigator::PositionNavigator, PositionSerializer>("Eigen::Matrix<" + n->ACCEPTED_TYPE + ", " + simox::alg::to_string(n->ACCEPTED_DIMENSION, ", ") + ">", - simox::meta::get_type_name(typeid(data::AronNDArray)), - simox::meta::get_type_name(typeid(type::AronPosition)), n) + simox::meta::get_type_name(typeid(data::AronNDArray)), + simox::meta::get_type_name(typeid(type::AronPosition)), n) { ARMARX_CHECK_NOT_NULL(typenavigator); } CppBlockPtr PositionSerializer::getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();"); + return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator); } CppBlockPtr PositionSerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + this->getFullCppTypename() + "();"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine(accessor + " = " + this->getFullCppTypename() + "();"); + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } - CppBlockPtr PositionSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr PositionSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writePosition({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writePosition({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); return b; } CppBlockPtr PositionSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", 4}, \"" + typenavigator->ACCEPTED_TYPE + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data()));"); + block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", 4}, \"" + typenavigator->ACCEPTED_TYPE + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor); return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator); } @@ -67,16 +67,16 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr PositionSerializer::getReadBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data()));"); + block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor); return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator); } CppBlockPtr PositionSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))"); - b->addLine("\t return false;"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))"); + block_if_data->addLine("\t return false;"); + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Bool.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Bool.cpp index cb0dcfdbb..c0bb65832 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Bool.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Bool.cpp @@ -39,10 +39,10 @@ namespace armarx::aron::cppserializer::serializer } /* virtual implementations */ - CppBlockPtr BoolSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr BoolSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeBool({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writeBool({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); return b; } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Double.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Double.cpp index aa1b6deb2..62a47a280 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Double.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Double.cpp @@ -39,10 +39,10 @@ namespace armarx::aron::cppserializer::serializer } /* virtual implementations */ - CppBlockPtr DoubleSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr DoubleSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeDouble({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writeDouble({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); return b; } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Float.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Float.cpp index b48272103..06cbd8c1a 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Float.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Float.cpp @@ -39,10 +39,10 @@ namespace armarx::aron::cppserializer::serializer } /* virtual implementations */ - CppBlockPtr FloatSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr FloatSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeFloat({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writeFloat({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); return b; } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Int.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Int.cpp index fb460dffb..7458faa28 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Int.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Int.cpp @@ -39,10 +39,10 @@ namespace armarx::aron::cppserializer::serializer } /* virtual implementations */ - CppBlockPtr IntSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr IntSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeInt({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writeInt({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); return b; } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Long.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Long.cpp index 90f03a5f5..754f4818d 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Long.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Long.cpp @@ -39,10 +39,10 @@ namespace armarx::aron::cppserializer::serializer } /* virtual implementations */ - CppBlockPtr LongSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr LongSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeLong({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writeLong({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); return b; } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/String.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/String.cpp index f815628ff..89e3603ee 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/String.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/String.cpp @@ -39,10 +39,10 @@ namespace armarx::aron::cppserializer::serializer } /* virtual implementations */ - CppBlockPtr StringSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr StringSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeString({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writeString({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); return b; } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Time.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Time.cpp index 39e5c6717..e76d5e1ba 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Time.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Time.cpp @@ -39,10 +39,10 @@ namespace armarx::aron::cppserializer::serializer } /* virtual implementations */ - CppBlockPtr TimeSerializer::getWriteTypeBlock(const std::string&) const + CppBlockPtr TimeSerializer::getWriteTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeTime({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});"); + b->addLine("w.writeTime({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor); return b; } @@ -50,7 +50,7 @@ namespace armarx::aron::cppserializer::serializer { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); std::string resolved_accessor = this->ResolveMaybeAccessor(accessor, this->typenavigator); - block_if_data->addLine("w.writePrimitive(" + resolved_accessor + nextEl() + "toMicroSeconds());"); + block_if_data->addLine("w.writePrimitive(" + resolved_accessor + nextEl() + "toMicroSeconds()); // of " + accessor); return this->ResolveMaybeWriteBlock(accessor, block_if_data, this->typenavigator); } @@ -58,12 +58,12 @@ namespace armarx::aron::cppserializer::serializer CppBlockPtr TimeSerializer::getReadBlock(const std::string& accessor) const { CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); - std::string escaped_accessor = this->EscapeAccessor(accessor); - std::string resolved_accessor = this->ResolveMaybeAccessor(accessor, this->typenavigator); + std::string escaped_accessor = EscapeAccessor(accessor); + std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator); block_if_data->addLine("long " + escaped_accessor + TIME_SETTER_ACCESSOR_SUFFIX + ";"); - block_if_data->addLine("r.readEndPrimitive(" + escaped_accessor + TIME_SETTER_ACCESSOR_SUFFIX + ");"); - block_if_data->addLine(accessor + nextEl() + "microSeconds(" + escaped_accessor + TIME_SETTER_ACCESSOR_SUFFIX + ");"); - return this->ResolveMaybeReadBlock(accessor, "r.readStartPrimitive()", block_if_data, this->typenavigator); + block_if_data->addLine("r.readEndPrimitive(" + escaped_accessor + TIME_SETTER_ACCESSOR_SUFFIX + "); // of " + accessor); + block_if_data->addLine(resolved_accessor + " = IceUtil::Time::microSeconds(" + escaped_accessor + TIME_SETTER_ACCESSOR_SUFFIX + ");"); + return this->ResolveMaybeReadBlock(accessor, "r.readStartPrimitive()", block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp index 6f1fa5a13..e4d844b9e 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp @@ -66,59 +66,59 @@ namespace armarx::aron::cppserializer::serializer enum_to_value << "\t}"; value_to_enum << "\t}"; - fields.push_back(std::make_shared<CppField>("const std::map<" + std::string(IMPL_ENUM) + ", std::string>", "EnumToStringMap", enum_to_name.str())); - fields.push_back(std::make_shared<CppField>("const std::map<std::string, " + std::string(IMPL_ENUM) + ">", "StringToEnumMap", name_to_enum.str())); - fields.push_back(std::make_shared<CppField>("const std::map<" + std::string(IMPL_ENUM) + ", int>", "EnumToValueMap", enum_to_value.str())); - fields.push_back(std::make_shared<CppField>("const std::map<int, " + std::string(IMPL_ENUM) + ">", "ValueToEnumMap", value_to_enum.str())); + fields.push_back(std::make_shared<CppField>("const std::map<" + std::string(IMPL_ENUM) + ", std::string>", "EnumToStringMap", enum_to_name.str(), "Mapping enum values to readable strings")); + fields.push_back(std::make_shared<CppField>("const std::map<std::string, " + std::string(IMPL_ENUM) + ">", "StringToEnumMap", name_to_enum.str(), "Mapping readable strings to enum values")); + fields.push_back(std::make_shared<CppField>("const std::map<" + std::string(IMPL_ENUM) + ", int>", "EnumToValueMap", enum_to_value.str(), "Mapping enum values to a int value")); + fields.push_back(std::make_shared<CppField>("const std::map<int, " + std::string(IMPL_ENUM) + ">", "ValueToEnumMap", value_to_enum.str(), "Mapping int values to a enum")); - fields.push_back(std::make_shared<CppField>(std::string(IMPL_ENUM), "value")); + fields.push_back(std::make_shared<CppField>(std::string(IMPL_ENUM), "value", "", "The current value of the enum object")); return fields; } - CppBlockPtr IntEnumClassSerializer::getResetSoftBlock(const std::string&) const + CppBlockPtr IntEnumClassSerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("value = {};"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("value = {};"); + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } - CppBlockPtr IntEnumClassSerializer::getResetHardBlock(const std::string&) const + CppBlockPtr IntEnumClassSerializer::getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("value = {};"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("value = {};"); + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } CppBlockPtr IntEnumClassSerializer::getWriteTypeBlock(const std::string&) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeInt({__aronMaybeType});"); + b->addLine("w.writeInt({__aronMaybeType}); // of top level enum " + getCoreCppTypename()); return b; } - CppBlockPtr IntEnumClassSerializer::getWriteBlock(const std::string&) const + CppBlockPtr IntEnumClassSerializer::getWriteBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writePrimitive(EnumToValueMap.at(value));"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("w.writePrimitive(EnumToValueMap.at(value)); // of top level enum " + getCoreCppTypename()); + return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator); } - CppBlockPtr IntEnumClassSerializer::getReadBlock(const std::string&) const + CppBlockPtr IntEnumClassSerializer::getReadBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("int temporary;"); - b->addLine("r.readEndPrimitive(temporary);"); - b->addLine("value = ValueToEnumMap.at(temporary);"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("int temporary;"); + block_if_data->addLine("r.readEndPrimitive(temporary); // of top level enum " + getCoreCppTypename()); + block_if_data->addLine("value = ValueToEnumMap.at(temporary);"); + return ResolveMaybeReadBlock(accessor, "r.readStartPrimitive()", block_if_data, typenavigator); } - CppBlockPtr IntEnumClassSerializer::getEqualsBlock(const std::string&, const std::string& otherInstanceAccessor) const + CppBlockPtr IntEnumClassSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (value == " + otherInstanceAccessor + ".value))"); - b->addLine("\t return false;"); - return b; + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); + block_if_data->addLine("if (not (value == " + otherInstanceAccessor + ".value))"); + block_if_data->addLine("\t return false;"); + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.cpp index f4d2f4fe9..e674c2445 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.cpp @@ -61,40 +61,40 @@ namespace armarx::aron::cppserializer::serializer return b; } - CppBlockPtr ObjectClassSerializer::getResetSoftBlock(const std::string&) const + CppBlockPtr ObjectClassSerializer::getResetSoftBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); if (typenavigator->getExtends() != nullptr) { const auto extends_s = FromAronTypeNaviagtorPtr(typenavigator->getExtends()); - b->addLine(extends_s->getFullCppTypename() + "::resetSoft();"); + block_if_data->addLine(extends_s->getFullCppTypename() + "::resetSoft();"); } for (const auto& [key, child] : typenavigator->getMemberTypes()) { auto child_s = FromAronTypeNaviagtorPtr(child); CppBlockPtr b2 = child_s->getResetSoftBlock(key); - b->appendBlock(b2); + block_if_data->appendBlock(b2); } - return b; + return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator); } - CppBlockPtr ObjectClassSerializer::getResetHardBlock(const std::string&) const + CppBlockPtr ObjectClassSerializer::getResetHardBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); if (typenavigator->getExtends() != nullptr) { const auto extends_s = FromAronTypeNaviagtorPtr(typenavigator->getExtends()); - b->addLine(extends_s->getFullCppTypename() + "::resetHard();"); + block_if_data->addLine(extends_s->getFullCppTypename() + "::resetHard();"); } for (const auto& [key, child] : typenavigator->getMemberTypes()) { const auto child_s = FromAronTypeNaviagtorPtr(child); CppBlockPtr b2 = child_s->getResetHardBlock(key); - b->appendBlock(b2); + block_if_data->appendBlock(b2); } - return b; + return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator); } CppBlockPtr ObjectClassSerializer::getWriteTypeBlock(const std::string&) const @@ -106,7 +106,7 @@ namespace armarx::aron::cppserializer::serializer b->addLine(extends_s->getFullCppTypename() + "::writeType(w);"); } - b->addLine("w.writeStartObject({\"" + typenavigator->getObjectName() + "\", __aronMaybeType});"); + b->addLine("w.writeStartObject({\"" + typenavigator->getObjectName() + "\", __aronMaybeType}); // of top level object " + getCoreCppTypename()); for (const auto& [key, child] : typenavigator->getMemberTypes()) { const auto child_s = FromAronTypeNaviagtorPtr(child); @@ -115,20 +115,20 @@ namespace armarx::aron::cppserializer::serializer b->appendBlock(b2); } - b->addLine("w.writeEndObject();"); + b->addLine("w.writeEndObject(); // of top level object " + getCoreCppTypename()); return b; } - CppBlockPtr ObjectClassSerializer::getWriteBlock(const std::string&) const + CppBlockPtr ObjectClassSerializer::getWriteBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); if (typenavigator->getExtends() != nullptr) { const auto extends_s = FromAronTypeNaviagtorPtr(typenavigator->getExtends()); - b->addLine(extends_s->getFullCppTypename() + "::write(w, aron_type);"); + block_if_data->addLine(extends_s->getFullCppTypename() + "::write(w, aron_type);"); } - b->addLine("w.writeStartDict();"); + block_if_data->addLine("w.writeStartDict(); // of top level object " + getCoreCppTypename()); for (const auto& [key, child] : typenavigator->getMemberTypes()) { const auto child_s = FromAronTypeNaviagtorPtr(child); @@ -136,57 +136,52 @@ namespace armarx::aron::cppserializer::serializer child_b->addLine("w.writeKey(\"" + key + "\");"); child_b->appendBlock(child_s->getWriteBlock(key)); - b->appendBlock(child_b); + block_if_data->appendBlock(child_b); } - b->addLine("w.writeEndDict();"); - return b; + block_if_data->addLine("w.writeEndDict(); // of top level object " + getCoreCppTypename()); + return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator); } - CppBlockPtr ObjectClassSerializer::getReadBlock(const std::string&) const + CppBlockPtr ObjectClassSerializer::getReadBlock(const std::string& accessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); if (typenavigator->getExtends() != nullptr) { const auto extends_s = FromAronTypeNaviagtorPtr(typenavigator->getExtends()); - b->addLine(extends_s->getFullCppTypename() + "::read(r);"); + block_if_data->addLine(extends_s->getFullCppTypename() + "::read(r);"); } - b->addLine("if(!skip_first_readStartDict)"); + block_if_data->addLine("if(!skip_first_readStartDict)"); auto readStartDict = std::make_shared<CppBlock>(); - readStartDict->addLine("r.readStartDict();"); - b->addBlock(readStartDict); + readStartDict->addLine("r.readStartDict(); // of top level object " + getCoreCppTypename()); + block_if_data->addBlock(readStartDict); for (const auto& [key, child] : typenavigator->getMemberTypes()) { const auto child_s = FromAronTypeNaviagtorPtr(child); - CppBlockPtr q = CppBlockPtr(new CppBlock()); - - CppBlockPtr child_b = child_s->getReadBlock(key); - q->appendBlock(child_b); - b->addLine("r.loadMember(\"" + key + "\");"); - b->appendBlock(q); - + block_if_data->addLine("r.loadMember(\"" + key + "\");"); + block_if_data->appendBlock(child_s->getReadBlock(key)); } - b->addLine("r.readEndDict();"); - return b; + block_if_data->addLine("r.readEndDict(); // of top level object " + getCoreCppTypename()); + return ResolveMaybeReadBlock(accessor, "", block_if_data, typenavigator); } - CppBlockPtr ObjectClassSerializer::getEqualsBlock(const std::string&, const std::string& otherInstanceAccessor) const + CppBlockPtr ObjectClassSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { - CppBlockPtr b = CppBlockPtr(new CppBlock()); + CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); if (typenavigator->getExtends() != nullptr) { const auto extends_s = FromAronTypeNaviagtorPtr(typenavigator->getExtends()); - b->addLine("if (not (" + extends_s->getFullCppTypename() + "::operator== (" + otherInstanceAccessor + ")))"); - b->addLine("\t return false;"); + block_if_data->addLine("if (not (" + extends_s->getFullCppTypename() + "::operator== (" + otherInstanceAccessor + ")))"); + block_if_data->addLine("\t return false;"); } for (const auto& [key, child] : typenavigator->getMemberTypes()) { auto child_s = FromAronTypeNaviagtorPtr(child); CppBlockPtr b2 = child_s->getEqualsBlock(key, otherInstanceAccessor + "." + key); - b->appendBlock(b2); + block_if_data->appendBlock(b2); } - return b; + return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h index f4c1f26e2..852bf2bbd 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h @@ -74,9 +74,9 @@ namespace armarx::aron::xmltypereader static constexpr const char* COLS_ATTRIBUTE_NAME = "cols"; static constexpr const char* DIMENSIONS_ATTRIBUTE_NAME = "dimensions"; static constexpr const char* OPTIONAL_NAME = "optional"; - static constexpr const char* RAW_PTR_NAME = "rawptr"; - static constexpr const char* SHARED_PTR_NAME = "sharedptr"; - static constexpr const char* UNIQUE_PTR_NAME = "uniqueptr"; + static constexpr const char* RAW_PTR_NAME = "raw_ptr"; + static constexpr const char* SHARED_PTR_NAME = "shared_ptr"; + static constexpr const char* UNIQUE_PTR_NAME = "unique_ptr"; // Second level tags. Only important if in specific top level tag static constexpr const char* OBJECT_CHILD_TAG = "objectchild"; diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp index 7565aa64b..665b1b125 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp @@ -80,7 +80,7 @@ namespace armarx::aron::dataIO::reader auto token = stack.top(); datanavigator::DictNavigator::DynamicCastAndCheck(token->getElement()); - std::cout << "We are at: " << token->getCurrentIndex() << "/" << token->getElementChildrenSize() << std::endl; + //std::cout << "We are at: " << token->getCurrentIndex() << "/" << token->getElementChildrenSize() << std::endl; if (token->finishedElement()) { @@ -120,7 +120,7 @@ namespace armarx::aron::dataIO::reader auto token = stack.top(); datanavigator::ListNavigator::DynamicCastAndCheck(token->getElement()); - std::cout << "We are at: " << token->getCurrentIndex() << "/" << token->getElementChildrenSize() << std::endl; + //std::cout << "We are at: " << token->getCurrentIndex() << "/" << token->getElementChildrenSize() << std::endl; if (token->finishedElement()) { stack.pop(); @@ -241,13 +241,13 @@ namespace armarx::aron::dataIO::reader { auto token = stack.top(); auto s = token->getCurrentKey(); - std::cout << "Read key: " << s << std::endl; + //std::cout << "Read key: " << s << std::endl; return s; } void NavigatorReader::loadMember(const std::string& k) { - std::cout << "Loading member " << k << std::endl; + //std::cout << "Loading member " << k << std::endl; auto token = stack.top(); token->setCurrentKey(k); } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp index a505284ef..e66463490 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp @@ -61,6 +61,7 @@ namespace armarx::aron::dataIO writer.writeStartDict(); for (const auto& [key, value] : casted->elements) { + //std::cout << "Visit writer for " << key << std::endl; writer.writeKey(key); Visitor::VisitAndSetup(writer, value); } diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/Navigator.cpp b/source/RobotAPI/libraries/aron/core/navigator/data/Navigator.cpp index 24adf0c75..ff4a18c89 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/data/Navigator.cpp +++ b/source/RobotAPI/libraries/aron/core/navigator/data/Navigator.cpp @@ -27,6 +27,7 @@ // ArmarX #include "../../Exception.h" #include "NavigatorFactory.h" +#include "container/Dict.h" namespace armarx::aron::datanavigator diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.cpp b/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.cpp index bd43a9a24..c21af9e90 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.cpp +++ b/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.cpp @@ -91,6 +91,14 @@ namespace armarx::aron::datanavigator } // public member functions + DictNavigatorPtr NDArrayNavigator::getAsDict() const + { + auto dict = std::make_shared<DictNavigator>(); + auto copy_this = FromAronData(toAronDataPtr(), getPath()); + dict->addElement("data", copy_this); + return dict; + } + unsigned char* NDArrayNavigator::getData() const { return aron->data.data(); diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.h b/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.h index 8e51803c1..fb7461791 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.h +++ b/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.h @@ -35,6 +35,8 @@ #include "../detail/NavigatorBase.h" // ArmarX +#include "../container/Dict.h" + #include "../../type/ndarray/EigenMatrix.h" #include "../../type/ndarray/EigenQuaternion.h" #include "../../type/ndarray/IVTCByteImage.h" @@ -70,6 +72,8 @@ namespace armarx::aron::datanavigator static std::string DimensionsToString(const std::vector<int>& dimensions); // public member functions + DictNavigatorPtr getAsDict() const; + unsigned char* getData() const; void setData(unsigned int, const unsigned char*); diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/container/List.cpp b/source/RobotAPI/libraries/aron/core/navigator/data/container/List.cpp index 3c328cb01..eb4c74fd6 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/data/container/List.cpp +++ b/source/RobotAPI/libraries/aron/core/navigator/data/container/List.cpp @@ -72,7 +72,7 @@ namespace armarx::aron::datanavigator { if (!nav) { - if(!other.getElement(i)) + if (!other.getElement(i)) { return false; } @@ -102,6 +102,14 @@ namespace armarx::aron::datanavigator } // public member functions + DictNavigatorPtr ListNavigator::getAsDict() const + { + auto dict = std::make_shared<DictNavigator>(); + auto copy_this = FromAronData(toAronDataPtr(), getPath()); + dict->addElement("data", copy_this); + return dict; + } + void ListNavigator::addElement(const NavigatorPtr& n) { if (n) diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/container/List.h b/source/RobotAPI/libraries/aron/core/navigator/data/container/List.h index 1b9104e2f..d46607c13 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/data/container/List.h +++ b/source/RobotAPI/libraries/aron/core/navigator/data/container/List.h @@ -30,6 +30,7 @@ #include "../detail/NavigatorBase.h" // ArmarX +#include "Dict.h" #include "../../type/container/List.h" namespace armarx::aron::datanavigator @@ -55,6 +56,8 @@ namespace armarx::aron::datanavigator static data::AronListPtr ToAronListPtr(const PointerType& navigator); // public member functions + DictNavigatorPtr getAsDict() const; + data::AronListPtr toAronListPtr() const; void addElement(const NavigatorPtr&); diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/detail/PrimitiveNavigatorBase.h b/source/RobotAPI/libraries/aron/core/navigator/data/detail/PrimitiveNavigatorBase.h index 6edd96d7b..d18112d5f 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/data/detail/PrimitiveNavigatorBase.h +++ b/source/RobotAPI/libraries/aron/core/navigator/data/detail/PrimitiveNavigatorBase.h @@ -32,6 +32,7 @@ #include "NavigatorBase.h" // ArmarX +#include "../container/Dict.h" namespace armarx::aron::datanavigator::detail { @@ -74,6 +75,14 @@ namespace armarx::aron::datanavigator::detail // static methods /* public member functions */ + DictNavigatorPtr getAsDict() const + { + auto dict = std::make_shared<DictNavigator>(); + auto copy_this = FromAronData(this->toAronDataPtr(), this->getPath()); + dict->addElement("data", copy_this); + return dict; + } + void setValue(const ValueT& x) { this->aron->value = x; diff --git a/source/RobotAPI/libraries/aron/core/test/aronTest.cpp b/source/RobotAPI/libraries/aron/core/test/aronTest.cpp index a2d07c93f..17a3ddf27 100644 --- a/source/RobotAPI/libraries/aron/core/test/aronTest.cpp +++ b/source/RobotAPI/libraries/aron/core/test/aronTest.cpp @@ -90,50 +90,100 @@ using namespace aron; template <typename T> void runTestWithInstances(T& k1, T& k2) { + bool echo = true; + Randomizer r; - std::cout << "\t getting type 1" << std::endl; + if (echo) + { + std::cout << "\t getting type 1" << std::endl; + } typenavigator::ObjectNavigatorPtr k1_type_nav = k1.toAronType(); type::AronObjectPtr k1_type = k1_type_nav->toAronObjectPtr(); BOOST_CHECK_EQUAL((bool) k1_type, true); - std::cout << "\t getting type 2" << std::endl; + if (echo) + { + std::cout << "\t getting type 2" << std::endl; + } typenavigator::ObjectNavigatorPtr k2_type_nav = k2.toAronType(); type::AronObjectPtr k2_type = k2_type_nav->toAronObjectPtr(); BOOST_CHECK_EQUAL((bool) k2_type, true); datanavigator::DictNavigatorPtr k1_aron_nav = k1.toAron(); - std::cout << "\t initialize aron 1 randomly" << std::endl; + if (echo) + { + std::cout << "\t initialize aron 1 randomly" << std::endl; + } r.initializeRandomly(k1_aron_nav, k1_type_nav); - std::cout << "\t getting aron 1" << std::endl; + if (echo) + { + std::cout << "\t getting aron 1" << std::endl; + } data::AronDictPtr k1_aron = k1_aron_nav->toAronDictPtr(); BOOST_CHECK_EQUAL((bool) k1_aron, true); - std::cout << "K1 Aron:" << std::endl; - std::cout << armarx::aron::Debug::AronDataPtrToString(k1_aron) << std::endl; + if (echo) + { + std::cout << "K1 Aron:" << std::endl; + } + if (echo) + { + std::cout << armarx::aron::Debug::AronDataPtrToString(k1_aron) << std::endl; + } + + if (echo) + { + std::cout << "K2 Aron:" << std::endl; + } + if (echo) + { + std::cout << armarx::aron::Debug::AronDataPtrToString(k2.toAron()->toAronDictPtr()) << std::endl; + } - std::cout << "\t setting aron 2 from aron 1" << std::endl; + if (echo) + { + std::cout << "\t setting aron 2 from aron 1" << std::endl; + } k2.fromAron(k1_aron); - std::cout << "\t getting aron 2" << std::endl; + if (echo) + { + std::cout << "\t getting aron 2" << std::endl; + } datanavigator::DictNavigatorPtr k2_aron_nav = k2.toAron(); data::AronDictPtr k2_aron = k2_aron_nav->toAronDictPtr(); BOOST_CHECK_EQUAL((bool) k2_aron, true); - //std::cout << "K2 Aron:" << std::endl; - //std::cout << AronDebug::AronDataPtrToString(k2_aron) << std::endl; + //if (echo) std::cout << "K2 Aron:" << std::endl; + //if (echo) std::cout << armarx::aron::Debug::AronDataPtrToString(k2_aron) << std::endl; - std::cout << "\t setting aron 1 from aron 2 and check for equality" << std::endl; + if (echo) + { + std::cout << "\t setting aron 1 from aron 2 and check for equality" << std::endl; + } k1.fromAron(k2_aron_nav); - //std::cout << "K1 Aron:" << std::endl; - //std::cout << armarx::aron::Debug::AronDataPtrToString(k1_aron) << std::endl; + if (echo) + { + std::cout << "K1 Aron:" << std::endl; + } + if (echo) + { + std::cout << armarx::aron::Debug::AronDataPtrToString(k1.toAron()->toAronDictPtr()) << std::endl; + } - //std::cout << "K2 Aron:" << std::endl; - //std::cout << armarx::aron::Debug::AronDataPtrToString(k2_aron) << std::endl; + if (echo) + { + std::cout << "K2 Aron:" << std::endl; + } + if (echo) + { + std::cout << armarx::aron::Debug::AronDataPtrToString(k2.toAron()->toAronDictPtr()) << std::endl; + } BOOST_CHECK_EQUAL((k1 == k2), true); @@ -152,7 +202,10 @@ void runTestWithInstances(T& k1, T& k2) k1.fromAron(k1_aron); - std::cout << "\t check JSON export of k and k2 for equality" << std::endl; + if (echo) + { + std::cout << "\t check JSON export of k and k2 for equality" << std::endl; + } armarx::aron::dataIO::writer::NlohmannJSONWriter json_writer_for_k1; armarx::aron::dataIO::writer::NlohmannJSONWriter json_writer_for_k2; @@ -164,6 +217,15 @@ void runTestWithInstances(T& k1, T& k2) armarx::aron::dataIO::Visitor::VisitAndSetup(direct_json_writer_for_k1, k1_aron); nlohmann::json direct_k1_aron_json = direct_json_writer_for_k1.getResult(); std::string direct_k1_aron_json_str = direct_k1_aron_json.dump(4); + + if (echo) + { + std::cout << "\t K1 as json: " << std::endl << k1_aron_json_str << std::endl; + } + if (echo) + { + std::cout << "\t K1 as direct json: " << std::endl << direct_k1_aron_json_str << std::endl; + } BOOST_CHECK_EQUAL((k1_aron_json_str == direct_k1_aron_json_str), true); armarx::aron::dataIO::reader::NlohmannJSONReader json_reader_for_k2(k1_aron_json); @@ -173,11 +235,44 @@ void runTestWithInstances(T& k1, T& k2) nlohmann::json k2_aron_json = json_writer_for_k2.getResult(); std::string k2_aron_json_str = k2_aron_json.dump(4); - //std::cout << "\t K1 as json: " << std::endl << k1_aron_json_str << std::endl; - //std::cout << "\t K2 as json: " << std::endl << k2_aron_json_str << std::endl; + if (echo) + { + std::cout << "\t K1 as json: " << std::endl << k1_aron_json_str << std::endl; + } + if (echo) + { + std::cout << "\t K2 as json: " << std::endl << k2_aron_json_str << std::endl; + } BOOST_CHECK_EQUAL((k1_aron_json_str == k2_aron_json_str), true); } +BOOST_AUTO_TEST_CASE(AssignmentTest) +{ + std::cout << "Aron Assignment test" << std::endl; + float f = 5.0; + double d = 42.0; + int i = 666; + long l = 123; + std::string s = "Hello World"; + bool b = true; + + aron::datanavigator::FloatNavigator fn = f; + aron::datanavigator::DoubleNavigator dn = d; + aron::datanavigator::IntNavigator in = i; + aron::datanavigator::LongNavigator ln = l; + aron::datanavigator::StringNavigator sn = s; + aron::datanavigator::BoolNavigator bn = b; + + BOOST_CHECK_EQUAL((float) fn == f, true); + BOOST_CHECK_EQUAL((double) dn == d, true); + BOOST_CHECK_EQUAL((int) in == i, true); + BOOST_CHECK_EQUAL((long) ln == l, true); + BOOST_CHECK_EQUAL((std::string) sn == s, true); + BOOST_CHECK_EQUAL((bool) bn == b, true); + + +} + BOOST_AUTO_TEST_CASE(AronNaturalIKTest) { @@ -268,11 +363,18 @@ BOOST_AUTO_TEST_CASE(AronImageTest) std::cout << "Running Image test" << std::endl; IVTCByteImageTest ii; IVTCByteImageTest ii2; - ii.the_grayscale_image->Set(100, 100, CByteImage::eGrayScale); - ii2.the_grayscale_image->Set(10, 10, CByteImage::eGrayScale); - ii.the_rgb_image->Set(50, 50, CByteImage::eRGB24); - ii2.the_rgb_image->Set(10, 10, CByteImage::eRGB24); + ii.the_grayscale_image = std::make_shared<CByteImage>(); + ii2.the_grayscale_image = std::make_shared<CByteImage>(); + + ii.the_rgb_image = std::make_shared<CByteImage>(); + ii2.the_rgb_image = std::make_shared<CByteImage>(); + + ii.the_grayscale_image->Set(5, 5, CByteImage::eGrayScale); + ii2.the_grayscale_image->Set(7, 7, CByteImage::eGrayScale); + + ii.the_rgb_image->Set(5, 5, CByteImage::eRGB24); + ii2.the_rgb_image->Set(7, 7, CByteImage::eRGB24); runTestWithInstances<IVTCByteImageTest>(ii, ii2); } @@ -291,10 +393,10 @@ BOOST_AUTO_TEST_CASE(AronOpenCVTest) OpenCVMatTest ocv; OpenCVMatTest ocv2; - ocv.the_2d_opencv_matrix = cv::Mat(2, 2, CV_64FC4); - ocv.the_3d_opencv_matrix = cv::Mat(std::vector<int>({2, 2, 2}), CV_64FC4); - ocv.the_4d_opencv_matrix = cv::Mat(std::vector<int>({2, 2, 2, 2}), CV_64FC4); - ocv.the_5d_opencv_matrix = cv::Mat(std::vector<int>({2, 2, 2, 2, 2}), CV_64FC4); + ocv.the_2d_opencv_matrix = cv::Mat(2, 2, CV_64F); + ocv.the_3d_opencv_matrix = cv::Mat(std::vector<int>({2, 2, 2}), CV_32F); + ocv.the_4d_opencv_matrix = cv::Mat(std::vector<int>({2, 2, 2, 2}), CV_16S); + ocv.the_5d_opencv_matrix = cv::Mat(std::vector<int>({2, 2, 2, 2, 2}), CV_8U); runTestWithInstances<OpenCVMatTest>(ocv, ocv2); } @@ -305,11 +407,11 @@ BOOST_AUTO_TEST_CASE(AronPCLPointCloudTest) PointCloudTest pc; PointCloudTest pc2; - pc.the_xyzrgb_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGB>(20, 20); - pc.the_xyzrgba_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGBA>(20, 20); + pc.the_xyzrgb_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGB>(5, 5); + pc.the_xyzrgba_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGBA>(7, 7); - pc2.the_xyzrgb_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGB>(50, 50); - pc2.the_xyzrgba_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGBA>(50, 50); + pc2.the_xyzrgb_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGB>(4, 4); + pc2.the_xyzrgba_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGBA>(3, 3); runTestWithInstances<PointCloudTest>(pc, pc2); } diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml index cd1dfccc4..38ac4391e 100644 --- a/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml +++ b/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml @@ -7,11 +7,11 @@ <Object name='armarx::IVTCByteImageTest'> <ObjectChild key='the_grayscale_image'> - <IVTCByteImage width="25" height="25" type="GrayScale" sharedptr="ja" /> + <IVTCByteImage width="25" height="25" type="GrayScale" shared_ptr="ja" /> </ObjectChild> <ObjectChild key='the_rgb_image'> - <IVTCByteImage width="1920" height="1080" type="RGB24" sharedptr="ja" /> + <IVTCByteImage width="1920" height="1080" type="RGB24" shared_ptr="ja" /> </ObjectChild> </Object> -- GitLab