diff --git a/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h b/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h index 081a5f9ef65857843e110017d3e491bd5f235801..093fca38a8a4c97367669a86116e57c7503f3a2c 100644 --- a/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h +++ b/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h @@ -38,7 +38,7 @@ namespace armarx::armem::server void visitDictOnEnter(const aron::data::VariantPtr& n) override { ARMARX_CHECK_NOT_NULL(n); - const std::string key = n->getPath().getLastElement(); + const std::string key = n->getPath().size() > 0 ? n->getPath().getLastElement() : ""; // check if root of object visitEnter(key, "dict", n->childrenSize()); } void visitDictOnExit(const aron::data::VariantPtr&) override diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp index c5cfddb7c11c39f6953453a7f36e6ab7f5ad56f1..99f95201e220830607148af08c1a9cce6ded71d2 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp @@ -1,5 +1,6 @@ #include "DataDisplayVisitor.h" +#include <RobotAPI/libraries/aron/core/data/variant/All.h> namespace armarx::aron { diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp index f426bf08da16341b679ead1f5883db038a029aab..6a132629b65031c1b27225528872bcb4c20cd611 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp @@ -7,7 +7,7 @@ #include <ArmarXCore/core/logging/Logging.h> -#include <RobotAPI/libraries/aron/core/Exception.h> +#include <RobotAPI/libraries/aron/core/data/variant/All.h> #include <RobotAPI/libraries/aron/converter/eigen/EigenConverter.h> #include <RobotAPI/libraries/armem/core/Time.h> diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h index 0bab97220aeecf9897ac0f4a8dde786c97315fed..eb8d4004ab2d4e5bb430995b5b9ba27f52da8e6e 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h @@ -6,6 +6,7 @@ #include <QTreeWidget> #include <QLabel> +#include <RobotAPI/libraries/aron/core/data/variant/All.h> #include <RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.h> diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.cpp index ea8973efc4c48a510f66698ca3ca53dfaf4dd926..775e95d2bb867ab88f58767f8cda8a68d15b4633 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.cpp @@ -1,5 +1,6 @@ #include "TreeDataVisitorBase.h" +#include <RobotAPI/libraries/aron/core/data/variant/All.h> #include <ArmarXCore/core/exceptions/local/ExpressionException.h> diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h index 558057cc067b5c4c5525ebe3ec3701350da68729..848a6e4bace8159a559558a0e7c12b28a749f9ef 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h @@ -6,6 +6,7 @@ #include <QTreeWidget> #include <QLabel> +#include <RobotAPI/libraries/aron/core/data/variant/All.h> #include <RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h> #include <RobotAPI/libraries/armem_gui/instance/sanitize_typename.h> diff --git a/source/RobotAPI/libraries/aron/core/data/converter/Converter.h b/source/RobotAPI/libraries/aron/core/data/converter/Converter.h index 611a91f6f05dc20f448ae8221bca0259196e5d96..c538c61f35eb639c6e915fb732190fc8ef8093fe 100644 --- a/source/RobotAPI/libraries/aron/core/data/converter/Converter.h +++ b/source/RobotAPI/libraries/aron/core/data/converter/Converter.h @@ -36,8 +36,7 @@ namespace armarx::aron::data /// Converter struct providing the needed methods. /// WriterImplementation is a writer class, TODO: add concepts template <class ReaderImplementation, class WriterImplementation, class DerivedT> - struct Converter : - virtual public Visitor<typename ReaderImplementation::InputType> + struct Converter : virtual public Visitor<typename ReaderImplementation::InputType> { using WriterReturnType = typename WriterImplementation::ReturnType; using ReaderInputType = typename ReaderImplementation::InputType; @@ -49,7 +48,7 @@ namespace armarx::aron::data virtual ~Converter() = default; - virtual void visitDict(ReaderInputType& o) override + void visitDict(ReaderInputType& o) final { std::map<std::string, ReaderInputTypeNonConst> elementsOfInput; std::map<std::string, WriterReturnType> elementsReturn; @@ -62,7 +61,8 @@ namespace armarx::aron::data last_returned = w.writeDict(elementsReturn); }; - virtual void visitList(ReaderInputType& o) override + + void visitList(ReaderInputType& o) final { std::vector<ReaderInputTypeNonConst> elementsOfInput; std::vector<WriterReturnType> elementsReturn; @@ -74,7 +74,8 @@ namespace armarx::aron::data } last_returned = w.writeList(elementsReturn); }; - virtual void visitNDArray(ReaderInputType& o) override + + void visitNDArray(ReaderInputType& o) final { std::string type; std::vector<int> shape; @@ -82,37 +83,43 @@ namespace armarx::aron::data r.readNDArray(o, shape, type, data); last_returned = w.writeNDArray(shape, type, data.data()); }; - virtual void visitInt(ReaderInputType& o) override + + void visitInt(ReaderInputType& o) final { int i; r.readInt(o, i); last_returned = w.writeInt(i); }; - virtual void visitLong(ReaderInputType& o) override + + void visitLong(ReaderInputType& o) final { long i; r.readLong(o, i); last_returned = w.writeLong(i); }; - virtual void visitFloat(ReaderInputType& o) override + + void visitFloat(ReaderInputType& o) final { float i; r.readFloat(o, i); last_returned = w.writeFloat(i); }; - virtual void visitDouble(ReaderInputType& o) override + + void visitDouble(ReaderInputType& o) final { double i; r.readDouble(o, i); last_returned = w.writeDouble(i); }; - virtual void visitBool(ReaderInputType& o) override + + void visitBool(ReaderInputType& o) final { bool i; r.readBool(o, i); last_returned = w.writeBool(i); }; - virtual void visitString(ReaderInputType& o) override + + void visitString(ReaderInputType& o) final { std::string i; r.readString(o, i); diff --git a/source/RobotAPI/libraries/aron/core/data/converter/nlohmannJSON/NlohmannJSONConverter.h b/source/RobotAPI/libraries/aron/core/data/converter/nlohmannJSON/NlohmannJSONConverter.h index 25cd0dc57d26b5dd1bd18c7b39f73e5edcc05f91..0fab928032c1884385c6231aeb3ef11f87766364 100644 --- a/source/RobotAPI/libraries/aron/core/data/converter/nlohmannJSON/NlohmannJSONConverter.h +++ b/source/RobotAPI/libraries/aron/core/data/converter/nlohmannJSON/NlohmannJSONConverter.h @@ -33,12 +33,18 @@ namespace armarx::aron::data /// WriterImplementation is a writer class, TODO: add concept template <class WriterImplementation, class DerivedT> struct NlohmannJSONConverter : - virtual public ConstNlohmannJSONVisitor, virtual public Converter<aron::data::reader::NlohmannJSONReader, WriterImplementation, DerivedT> { + using Base = Converter<aron::data::reader::NlohmannJSONReader, WriterImplementation, DerivedT>; + virtual ~NlohmannJSONConverter() = default; - virtual void visitUnknown(const nlohmann::json& o) override + data::Descriptor getDescriptor(typename Base::ReaderInputType& n) final + { + return ConstNlohmannJSONVisitor::GetDescriptor(n); + } + + void visitUnknown(typename Base::ReaderInputType& o) final { if (!this->r.readNull(o)) { diff --git a/source/RobotAPI/libraries/aron/core/data/converter/variant/VariantConverter.h b/source/RobotAPI/libraries/aron/core/data/converter/variant/VariantConverter.h index 4173e7143385e9d7fc1349366f1d38a5aeb3d8c0..eb122beb0e54819798eb0f64586e9dc7adc94282 100644 --- a/source/RobotAPI/libraries/aron/core/data/converter/variant/VariantConverter.h +++ b/source/RobotAPI/libraries/aron/core/data/converter/variant/VariantConverter.h @@ -34,12 +34,18 @@ namespace armarx::aron::data /// WriterImplementation is a writer class, TODO: add concept template <class WriterImplementation, class DerivedT> struct VariantConverter : - virtual public ConstVariantVisitor, virtual public Converter<aron::data::reader::VariantReader, WriterImplementation, DerivedT> { + using Base = Converter<aron::data::reader::VariantReader, WriterImplementation, DerivedT>; + virtual ~VariantConverter() = default; - virtual void visitUnknown(const data::VariantPtr& o) override + data::Descriptor getDescriptor(typename Base::ReaderInputType& n) final + { + return ConstVariantVisitor::GetDescriptor(n); + } + + virtual void visitUnknown(typename Base::ReaderInputType& o) final { if (!this->r.readNull(o)) { diff --git a/source/RobotAPI/libraries/aron/core/data/variant/Variant.h b/source/RobotAPI/libraries/aron/core/data/variant/Variant.h index be3d93336c1f7a3d26c47f7a8d579e4add06d395..00f5aa6ffd74350b344e5293947353dd28d02d73 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/Variant.h +++ b/source/RobotAPI/libraries/aron/core/data/variant/Variant.h @@ -129,10 +129,10 @@ namespace armarx::aron::data /// checks, if the current data variant fullfills the given type virtual bool fullfillsType(const type::VariantPtr&) const = 0; - /// naviate absoluet (TODO) + /// naviate absolute virtual VariantPtr navigateAbsolute(const Path& path) const = 0; - /// navigate relative (TODO) + /// navigate relative virtual VariantPtr navigateRelative(const Path& path) const = 0; /// get a short str representation of this variant diff --git a/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.cpp b/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.cpp index befc9ea5c3eb07e2f17d380d252c6191e5726ff5..dda38b2d0cd94a3bf51e9e9d25964a1ba3371299 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.cpp +++ b/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.cpp @@ -168,35 +168,62 @@ namespace armarx::aron::data type::VariantPtr NDArray::recalculateType() const { - // We set all to openCVMat because it accepts n-dimensional types TODO - //type::OpenCVMatNavigatorPtr typenav = type::OpenCVMatNavigatorPtr(new type::OpenCVMatNavigator(getPath())); - //return typenav; - return nullptr; + throw error::NotImplementedYetException(__PRETTY_FUNCTION__); } bool NDArray::fullfillsType(const type::VariantPtr& type) const { - /*if (!Resolver::Correspond(type->getDescriptor(), getDescriptor())) + if (!type) { return false; } - switch (type->getDescriptor()) + type::Descriptor typeDesc = type->getDescriptor(); + switch (typeDesc) { - case type::Descriptor::eMatrix: - { - auto casted = type::MatrixNavigator::DynamicCast(type); - if ((unsigned int) aron->shape[0] != casted->getRows() || (unsigned int) aron->shape[1] != casted->getCols()) - { - return false; - } - break; - } - // TODO: - default: - throw error::AronException("NDArrayNavigator", "fullfillsType", "Could not cast a type to an NDArray-Type", getPath()); - }*/ - return true; + case type::Descriptor::eMatrix: + { + auto casted = type::Matrix::DynamicCastAndCheck(type); + return (aron->shape.size() == 3 && (unsigned int) aron->shape[0] == casted->getRows() && (unsigned int) aron->shape[1] == casted->getCols()); + } + case type::Descriptor::eQuaternion: + { + auto casted = type::Quaternion::DynamicCastAndCheck(type); + return (aron->shape.size() == 3 && (unsigned int) aron->shape[0] == 1 && (unsigned int) aron->shape[1] == 4); + } + case type::Descriptor::ePosition: + { + auto casted = type::Position::DynamicCastAndCheck(type); + return (aron->shape.size() == 3 && (unsigned int) aron->shape[0] == 3 && (unsigned int) aron->shape[1] == 1 && (unsigned int) aron->shape[1] == 4); + } + case type::Descriptor::eOrientation: + { + auto casted = type::Orientation::DynamicCastAndCheck(type); + return (aron->shape.size() == 3 && (unsigned int) aron->shape[0] == 1 && (unsigned int) aron->shape[1] == 4 && (unsigned int) aron->shape[2] == 4); + } + case type::Descriptor::ePose: + { + auto casted = type::Pose::DynamicCastAndCheck(type); + return (aron->shape.size() == 3 && (unsigned int) aron->shape[0] == 4 && (unsigned int) aron->shape[1] == 4 && (unsigned int) aron->shape[2] == 4); + } + case type::Descriptor::ePointCloud: + { + auto casted = type::PointCloud::DynamicCastAndCheck(type); + return (aron->shape.size() == 3); + } + case type::Descriptor::eImage: + { + auto casted = type::Image::DynamicCastAndCheck(type); + return (aron->shape.size() == 3); + } + case type::Descriptor::eNDArray: + { + auto casted = type::NDArray::DynamicCastAndCheck(type); + return (aron->shape.size() == (unsigned int) casted->getNumberDimensions()); + } + default: + return false; + } } std::string NDArray::DimensionsToString(const std::vector<int>& dimensions) diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp index 62fa05d245337296eabbc1bba0629c050876839c..5f1da4558ada6e3b065afa9ca8ca898ae5f0f1ce 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp +++ b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp @@ -187,48 +187,32 @@ namespace armarx::aron::data return "armarx::aron::data::Dict"; } - // TODO type::VariantPtr Dict::recalculateType() const { - /*type::DictNavigatorPtr typenav = type::DictNavigatorPtr(new type::Dict(getPath())); - for (const auto& [key, nav] : childrenNavigators) - { - if (!nav) - { - continue; - } - - if (typenav->getAcceptedType() == nullptr) - { - typenav->setAcceptedType(nav->recalculateType()); - continue; - } - - if (!nav->fullfillsType(typenav->getAcceptedType())) - { - throw error::AronException("DictNavigator", "recalculateType", "Cannot recalculate the aronType. Inconsistency found for key: " + key, getPath()); - } - } - return typenav->getAcceptedType();*/ - return nullptr; + throw error::NotImplementedYetException(__PRETTY_FUNCTION__); } bool Dict::fullfillsType(const type::VariantPtr& type) const { - /*if (!Resolver::Correspond(type->getDescriptor(), getDescriptor())) + if(!type) { return false; } type::Descriptor typeDesc = type->getDescriptor(); + switch (typeDesc) { case type::Descriptor::eObject: { - typenavigator::ObjectNavigatorPtr objectTypeNav = typenavigator::ObjectNavigator::DynamicCast(type); + auto objectTypeNav = type::Object::DynamicCastAndCheck(type); for (const auto& [key, nav] : childrenNavigators) { - if (!nav && !objectTypeNav->getMemberType(key)) + if (!objectTypeNav->hasMemberType(key)) + { + return false; + } + if (!nav || !objectTypeNav->getMemberType(key)) { return false; } @@ -241,10 +225,11 @@ namespace armarx::aron::data } case type::Descriptor::eDict: { - typenavigator::DictNavigatorPtr dictTypeNav = typenavigator::DictNavigator::DynamicCast(type); - for (const auto& [_, nav] : childrenNavigators) + auto dictTypeNav = type::Dict::DynamicCastAndCheck(type); + for (const auto& [key, nav] : childrenNavigators) { - if (!nav && !dictTypeNav->getAcceptedType()) + (void) key; + if (!nav || !dictTypeNav->getAcceptedType()) { return false; } @@ -257,8 +242,7 @@ namespace armarx::aron::data } default: return false; - }*/ - return false; + } } std::vector<VariantPtr> Dict::getChildren() const @@ -302,10 +286,4 @@ namespace armarx::aron::data return childrenNavigators.at(el)->navigateAbsolute(next); } } - - VariantPtr Dict::navigateRelative(const Path& path) const - { - Path absoluteFromHere = path.getWithoutPrefix(getPath()); - return navigateAbsolute(absoluteFromHere); - } } diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h index 01842e78a5ae1c3cec8fc2fac85f2362541a486d..b5463de9cd711c0becca7d6ad4a9044df0af8511 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h +++ b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h @@ -70,7 +70,7 @@ namespace armarx::aron::data void clear(); // virtual implementations - virtual VariantPtr clone() const override + VariantPtr clone() const override { DictPtr ret(new Dict(getPath())); for (const auto& [key, val] : getElements()) @@ -80,16 +80,15 @@ namespace armarx::aron::data return ret; } - virtual std::string getShortName() const override; - virtual std::string getFullName() const override; - virtual std::vector<VariantPtr> getChildren() const override; - virtual size_t childrenSize() const override; + std::string getShortName() const override; + std::string getFullName() const override; + std::vector<VariantPtr> getChildren() const override; + size_t childrenSize() const override; - virtual type::VariantPtr recalculateType() const override; - virtual bool fullfillsType(const type::VariantPtr&) const override; + type::VariantPtr recalculateType() const override; + bool fullfillsType(const type::VariantPtr&) const override; - virtual VariantPtr navigateAbsolute(const Path& path) const override; - virtual VariantPtr navigateRelative(const Path& path) const override; + VariantPtr navigateAbsolute(const Path& path) const override; private: // members diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp b/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp index 23cc7b8d2cee6067879dd3c6975514445a47eeb3..6be5ed1d21f746ad5e69c486f878101439fe2315 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp +++ b/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp @@ -202,29 +202,12 @@ namespace armarx::aron::data // TODO type::VariantPtr List::recalculateType() const { - /*type::ListNavigatorPtr typenav = type::ListNavigatorPtr(new type::ListNavigator(getPath())); - unsigned int i = 0; - for (const auto& nav : childrenNavigators) - { - if (typenav->getAcceptedType() == nullptr) - { - typenav->setAcceptedType(nav->recalculateType()); - continue; - } - - if (!nav->fullfillsType(typenav->getAcceptedType())) - { - throw error::AronException("ListNavigator", "recalculateType", "Cannot recalculate the aronType. Inconsistency found for index: " + std::to_string(i), getPath()); - } - ++i; - } - return typenav->getAcceptedType();*/ - return nullptr; + throw error::NotImplementedYetException(__PRETTY_FUNCTION__); } bool List::fullfillsType(const type::VariantPtr& type) const { - /*if (!Resolver::Correspond(type->getDescriptor(), getDescriptor())) + if (!type) { return false; } @@ -234,7 +217,7 @@ namespace armarx::aron::data { case type::Descriptor::eList: { - typenavigator::ListNavigatorPtr listTypeNav = typenavigator::ListNavigator::DynamicCast(type); + auto listTypeNav = type::List::DynamicCastAndCheck(type); for (const auto& nav : childrenNavigators) { if (!nav && !listTypeNav->getAcceptedType()) @@ -250,7 +233,7 @@ namespace armarx::aron::data } case type::Descriptor::eTuple: { - typenavigator::TupleNavigatorPtr tupleTypeNav = typenavigator::TupleNavigator::DynamicCast(type); + auto tupleTypeNav = type::Tuple::DynamicCastAndCheck(type); unsigned int i = 0; for (const auto& nav : childrenNavigators) { @@ -267,7 +250,7 @@ namespace armarx::aron::data } case type::Descriptor::ePair: { - typenavigator::PairNavigatorPtr pairTypeNav = typenavigator::PairNavigator::DynamicCast(type); + auto pairTypeNav = type::Pair::DynamicCastAndCheck(type); if (childrenSize() != 2) { return false; @@ -284,8 +267,7 @@ namespace armarx::aron::data } default: return false; - }*/ - return false; + } } std::vector<VariantPtr> List::getChildren() const @@ -324,10 +306,4 @@ namespace armarx::aron::data return childrenNavigators.at(i)->navigateAbsolute(next); } } - - VariantPtr List::navigateRelative(const Path& path) const - { - Path absoluteFromHere = path.getWithoutPrefix(getPath()); - return navigateAbsolute(absoluteFromHere); - } } diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/List.h b/source/RobotAPI/libraries/aron/core/data/variant/container/List.h index d70929e1f75ab8f5fe70c96df35a36da6b077c8c..70a1f81d0317e5cae7333246cbfc3d5e425cc71e 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/container/List.h +++ b/source/RobotAPI/libraries/aron/core/data/variant/container/List.h @@ -73,7 +73,7 @@ namespace armarx::aron::data void clear(); // virtual implementations - virtual VariantPtr clone() const override + VariantPtr clone() const override { ListPtr ret(new List(getPath())); for (const auto& val : getElements()) @@ -82,16 +82,15 @@ namespace armarx::aron::data } return ret; } - virtual std::string getShortName() const override; - virtual std::string getFullName() const override; - virtual std::vector<VariantPtr> getChildren() const override; - virtual size_t childrenSize() const override; + std::string getShortName() const override; + std::string getFullName() const override; + std::vector<VariantPtr> getChildren() const override; + size_t childrenSize() const override; - virtual type::VariantPtr recalculateType() const override; - virtual bool fullfillsType(const type::VariantPtr&) const override; + type::VariantPtr recalculateType() const override; + bool fullfillsType(const type::VariantPtr&) const override; - virtual VariantPtr navigateAbsolute(const Path& path) const override; - virtual VariantPtr navigateRelative(const Path& path) const override; + VariantPtr navigateAbsolute(const Path& path) const override; private: std::vector<VariantPtr> childrenNavigators; diff --git a/source/RobotAPI/libraries/aron/core/data/variant/detail/ComplexVariant.h b/source/RobotAPI/libraries/aron/core/data/variant/detail/ComplexVariant.h index f69e96b35b4a11732e48acceb6fd886573768516..868b7a8df691a47458d1f8a73b319034627cbfb7 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/detail/ComplexVariant.h +++ b/source/RobotAPI/libraries/aron/core/data/variant/detail/ComplexVariant.h @@ -43,22 +43,19 @@ namespace armarx::aron::data::detail virtual ~ComplexVariant() = default; // virtual implementations - virtual std::vector<VariantPtr> getChildren() const override + VariantPtr navigateAbsolute(const Path &path) const override { - return {}; - } - virtual size_t childrenSize() const override - { - return 0; + throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath()); } - virtual VariantPtr navigateAbsolute(const Path &path) const override + + std::vector<VariantPtr> getChildren() const override { - throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath()); + return {}; } - virtual VariantPtr navigateRelative(const Path &path) const override + size_t childrenSize() const override { - throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath()); + return 0; } }; } diff --git a/source/RobotAPI/libraries/aron/core/data/variant/detail/PrimitiveVariant.h b/source/RobotAPI/libraries/aron/core/data/variant/detail/PrimitiveVariant.h index e2c479bbe3679c082b86c8d78391e65c348d9f4b..b7356be2074a27ba2ac4285ffafd2a400fcf1864 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/detail/PrimitiveVariant.h +++ b/source/RobotAPI/libraries/aron/core/data/variant/detail/PrimitiveVariant.h @@ -72,28 +72,25 @@ namespace armarx::aron::data::detail }*/ // virtual implementations - virtual VariantPtr clone() const override + VariantPtr navigateAbsolute(const Path &path) const override + { + throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath()); + } + + VariantPtr clone() const override { typename DerivedT::PointerType ret(new DerivedT(getValue(), this->getPath())); return ret; } - virtual std::vector<VariantPtr> getChildren() const override + std::vector<VariantPtr> getChildren() const override { return {}; } - virtual size_t childrenSize() const override - { - return 0; - } - virtual VariantPtr navigateAbsolute(const Path &path) const override - { - throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath()); - } - virtual VariantPtr navigateRelative(const Path &path) const override + size_t childrenSize() const override { - throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath()); + return 0; } // static methods diff --git a/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h b/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h index 2507f4d4b33cf0e9919a8ea58e796b32ee4f35a5..8d83766b801bed2474a7f5e9e59385a634b439a2 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h +++ b/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h @@ -68,7 +68,7 @@ namespace armarx::aron::data::detail return aron; } - virtual bool operator==(const Variant& other) const override + bool operator==(const Variant& other) const override { const auto& n = DerivedT::DynamicCast(other); return *this == n; @@ -78,11 +78,18 @@ namespace armarx::aron::data::detail virtual bool operator==(const PointerType& other) const = 0; // virtual implementations - virtual data::dto::GenericDataPtr toAronDTO() const override + data::dto::GenericDataPtr toAronDTO() const override { return aron; } + VariantPtr navigateRelative(const Path& path) const override + { + Path absoluteFromHere = path.getWithoutPrefix(getPath()); + return navigateAbsolute(absoluteFromHere); + } + + // static methods static PointerType DynamicCast(const VariantPtr& n) { @@ -101,7 +108,11 @@ namespace armarx::aron::data::detail static PointerType DynamicCastAndCheck(const VariantPtr& n) { - ARMARX_CHECK_NOT_NULL(n); + if (!n) + { + return nullptr; + } + auto casted = DerivedT::DynamicCast(n); ARMARX_CHECK_NOT_NULL(casted); return casted; diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Bool.h b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Bool.h index 17a2e016fcdbc8bb61e890f85ae5a29d029c7ecc..b598517a1f0e72f62548d1d2cc8e4fdbdef9026f 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Bool.h +++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Bool.h @@ -59,10 +59,10 @@ namespace armarx::aron::data data::dto::AronBoolPtr toAronBoolPtr() const; /* virtual implementations */ - virtual std::string getShortName() const override; - virtual std::string getFullName() const override; + std::string getShortName() const override; + std::string getFullName() const override; - virtual type::VariantPtr recalculateType() const override; - virtual bool fullfillsType(const type::VariantPtr&) const override; + type::VariantPtr recalculateType() const override; + bool fullfillsType(const type::VariantPtr&) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.cpp b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.cpp index 5fbaaca0a252da5999af4027ad43b9b2301108fc..829a5b7a37c85fad1afeb34bcf75ecf06fad6624 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.cpp +++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.cpp @@ -94,14 +94,11 @@ namespace armarx::aron::data bool Double::fullfillsType(const type::VariantPtr& type) const { - /*const auto f = FloatNavigator(); - return type->getDescriptor() == type::Descriptor::eDouble || f.fullfillsType(type);*/ - return false; + return type->getDescriptor() == type::Descriptor::eDouble; } type::VariantPtr Double::recalculateType() const { - //return std::make_shared<typenavigator::DoubleNavigator>(getPath()); - return nullptr; + return std::make_shared<type::Double>(getPath()); } } diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.h b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.h index cf02c8e4ef5e50d8e78697e553c271d09cc51a6a..3149e996133279215e7d8d76d0ac5ab8c5113707 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.h +++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.h @@ -59,10 +59,10 @@ namespace armarx::aron::data data::dto::AronDoublePtr toAronDoublePtr() const; /* virtual implementations */ - virtual std::string getShortName() const override; - virtual std::string getFullName() const override; + std::string getShortName() const override; + std::string getFullName() const override; - virtual type::VariantPtr recalculateType() const override; - virtual bool fullfillsType(const type::VariantPtr&) const override; + type::VariantPtr recalculateType() const override; + bool fullfillsType(const type::VariantPtr&) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.cpp b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.cpp index b00a40215bba8f865ff36d5651452bbf963b4954..712e5bf686a6403831a9212861fda202b04d0843 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.cpp +++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.cpp @@ -91,13 +91,11 @@ namespace armarx::aron::data bool Float::fullfillsType(const type::VariantPtr& type) const { - //return type->getDescriptor() == type::Descriptor::eFloat; - return false; + return type->getDescriptor() == type::Descriptor::eFloat; } type::VariantPtr Float::recalculateType() const { - //return std::make_shared<typenavigator::FloatNavigator>(getPath()); - return nullptr; + return std::make_shared<type::Float>(getPath()); } } diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.h b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.h index 925fdcae00351b5b916d72ca91db7fc1ebca22eb..71187edf435a052d875ad8ae6c8ed3f6c6d6dd02 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.h +++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.h @@ -59,10 +59,10 @@ namespace armarx::aron::data data::dto::AronFloatPtr toAronFloatPtr() const; /* virtual implementations */ - virtual std::string getShortName() const override; - virtual std::string getFullName() const override; + std::string getShortName() const override; + std::string getFullName() const override; - virtual type::VariantPtr recalculateType() const override; - virtual bool fullfillsType(const type::VariantPtr&) const override; + type::VariantPtr recalculateType() const override; + bool fullfillsType(const type::VariantPtr&) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.cpp b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.cpp index da8ce3f4da647e29379848ba7bd3eb8975689c74..f2670889c9c2310a788fdab0ceeac9bdd768b8cc 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.cpp +++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.cpp @@ -94,13 +94,11 @@ namespace armarx::aron::data bool Int::fullfillsType(const type::VariantPtr& type) const { - //return type->getDescriptor() == type::Descriptor::eInt || type->getDescriptor() == type::Descriptor::eIntEnum; - return false; + return type->getDescriptor() == type::Descriptor::eInt || type->getDescriptor() == type::Descriptor::eIntEnum; } type::VariantPtr Int::recalculateType() const { - //return std::make_shared<typenavigator::IntNavigator>(getPath()); - return nullptr; + return std::make_shared<type::Int>(getPath()); } } diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.h b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.h index 2ccb032e64eb518442468625b7013adddfdbe9d2..f2324a7e040828a5917dfcad8cbe69e1277b4fef 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.h +++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.h @@ -31,6 +31,7 @@ // ArmarX #include "../../../type/variant/primitive/Int.h" +#include "../../../type/variant/enum/IntEnum.h" namespace armarx::aron::data { @@ -59,10 +60,10 @@ namespace armarx::aron::data data::dto::AronIntPtr toAronIntPtr() const; /* virtual implementations */ - virtual std::string getShortName() const override; - virtual std::string getFullName() const override; + std::string getShortName() const override; + std::string getFullName() const override; - virtual type::VariantPtr recalculateType() const override; - virtual bool fullfillsType(const type::VariantPtr&) const override; + type::VariantPtr recalculateType() const override; + bool fullfillsType(const type::VariantPtr&) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.cpp b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.cpp index 38503db1b5bf414abdcc6dff2c9c252a52c7eaa0..8393743c71497be7470f81e5444210fc6dc226f0 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.cpp +++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.cpp @@ -95,14 +95,11 @@ namespace armarx::aron::data bool Long::fullfillsType(const type::VariantPtr& type) const { - /*const auto i = IntNavigator(); - return type->getDescriptor() == type::Descriptor::eLong || type->getDescriptor() == type::Descriptor::eTime || i.fullfillsType(type); */ - return false; + return type->getDescriptor() == type::Descriptor::eLong || type->getDescriptor() == type::Descriptor::eTime; } type::VariantPtr Long::recalculateType() const { - //return std::make_shared<typenavigator::LongNavigator>(getPath()); - return nullptr; + return std::make_shared<type::Long>(getPath()); } } diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.h b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.h index d14335b6267f4ee07d39be65dfa03d5645369f2f..813a63228051b9e29b87ee69fb2d029a5c1d0198 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.h +++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.h @@ -60,10 +60,10 @@ namespace armarx::aron::data data::dto::AronLongPtr toAronLongPtr() const; /* virtual implementations */ - virtual std::string getShortName() const override; - virtual std::string getFullName() const override; + std::string getShortName() const override; + std::string getFullName() const override; - virtual type::VariantPtr recalculateType() const override; - virtual bool fullfillsType(const type::VariantPtr&) const override; + type::VariantPtr recalculateType() const override; + bool fullfillsType(const type::VariantPtr&) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/String.h b/source/RobotAPI/libraries/aron/core/data/variant/primitive/String.h index 88f67acbc8444e6956da7f7a234541a4b854167c..b049fd36e067e83766436e868fba1044d939b281 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/String.h +++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/String.h @@ -59,10 +59,10 @@ namespace armarx::aron::data data::dto::AronStringPtr toAronStringPtr() const; /* virtual implementations */ - virtual std::string getShortName() const override; - virtual std::string getFullName() const override; + std::string getShortName() const override; + std::string getFullName() const override; - virtual type::VariantPtr recalculateType() const override; - virtual bool fullfillsType(const type::VariantPtr&) const override; + type::VariantPtr recalculateType() const override; + bool fullfillsType(const type::VariantPtr&) const override; }; } diff --git a/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h b/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h index 2cb8658dba91ffb333f91d62ef318af7e5387955..c5c729c3c61394663a1790e290d24a9b99dbb402 100644 --- a/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h +++ b/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h @@ -191,8 +191,11 @@ namespace armarx::aron::data using Input = typename VisitorBase<T>::Input; using InputNonConst = typename std::remove_const<Input>::type; - virtual std::map<std::string, InputNonConst> getDictElements(Input&) = 0; - virtual std::vector<InputNonConst> getListElements(Input&) = 0; + using MapElements = std::map<std::string, InputNonConst>; + using ListElements = std::vector<InputNonConst>; + + virtual MapElements getDictElements(Input&) = 0; + virtual ListElements getListElements(Input&) = 0; virtual void visitDictOnEnter(Input& element) {}; virtual void visitDictOnExit(Input& element) {}; @@ -222,11 +225,16 @@ namespace armarx::aron::data using TypeInputNonConst = typename std::remove_const<TypeInput>::type; using DataInputNonConst = typename std::remove_const<DataInput>::type; - virtual std::map<std::string, std::pair<DataInputNonConst, TypeInputNonConst>> getObjectElements(DataInput&, TypeInput&) = 0; - virtual std::map<std::string, std::pair<DataInputNonConst, TypeInputNonConst>> getDictElements(DataInput&, TypeInput&) = 0; - virtual std::vector<std::pair<DataInputNonConst, TypeInputNonConst>> getListElements(DataInput&, TypeInput&) = 0; - virtual std::pair<std::pair<DataInputNonConst, TypeInputNonConst>, std::pair<DataInputNonConst, TypeInputNonConst>> getPairElements(DataInput&, TypeInput&) = 0; - virtual std::vector<std::pair<DataInputNonConst, TypeInputNonConst>> getTupleElements(DataInput&, TypeInput&) = 0; + using MapElements = std::map<std::string, std::pair<DataInputNonConst, TypeInputNonConst>>; + using ListElements = std::vector<std::pair<DataInputNonConst, TypeInputNonConst>>; + using PairElements = std::pair<std::pair<DataInputNonConst, TypeInputNonConst>, std::pair<DataInputNonConst, TypeInputNonConst>>; + using TupleElements = std::vector<std::pair<DataInputNonConst, TypeInputNonConst>>; + + virtual MapElements getObjectElements(DataInput&, TypeInput&) = 0; + virtual MapElements getDictElements(DataInput&, TypeInput&) = 0; + virtual ListElements getListElements(DataInput&, TypeInput&) = 0; + virtual PairElements getPairElements(DataInput&, TypeInput&) = 0; + virtual TupleElements getTupleElements(DataInput&, TypeInput&) = 0; virtual void visitObjectOnEnter(DataInput& elementData, TypeInput& elementType) {}; virtual void visitObjectOnExit(DataInput& elementData, TypeInput& elementType) {}; diff --git a/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp b/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp index 6b2175d223a59338b77521a0f07c289ce598eca9..623356c73972c6bd086d4f23e80a8fa5a6901524 100644 --- a/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp +++ b/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp @@ -26,5 +26,18 @@ namespace armarx::aron::data { + data::Descriptor ConstNlohmannJSONVisitor::GetDescriptor(Input& n) + { + if (n == nlohmann::json()) + { + return data::Descriptor::eUnknown; + } + std::string t = n[armarx::aron::data::rw::json::constantes::TYPE_SLUG]; + return armarx::aron::data::rw::json::conversion::String2Descriptor.at(t); + } + data::Descriptor ConstNlohmannJSONVisitor::getDescriptor(Input& n) + { + return GetDescriptor(n); + } } diff --git a/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.h b/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.h index 7ff87236d2aa6221543bb488e7ec616599931bf2..1b83bc3ca472d490c894d1dd9f94e50beec723e7 100644 --- a/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.h +++ b/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.h @@ -31,7 +31,6 @@ #include <SimoxUtility/json.h> #include "../Visitor.h" -#include "../../../Descriptor.h" #include "../../rw/json/Data.h" namespace armarx::aron::data @@ -41,16 +40,8 @@ namespace armarx::aron::data */ struct ConstNlohmannJSONVisitor : virtual public Visitor<const nlohmann::json> { - virtual data::Descriptor getDescriptor(Input& n) override - { - if (n == nlohmann::json()) - { - return data::Descriptor::eUnknown; - } - std::string t = n[armarx::aron::data::rw::json::constantes::TYPE_SLUG]; - return armarx::aron::data::rw::json::conversion::String2Descriptor.at(t); - } - + static data::Descriptor GetDescriptor(Input& n); + data::Descriptor getDescriptor(Input& n) override; virtual ~ConstNlohmannJSONVisitor() = default; }; diff --git a/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.cpp b/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.cpp index 005f9110566e3e90b6cd28d88d688ad00b51a09c..778cc64395e305578249cf115e86da6c2ce1d227 100644 --- a/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.cpp +++ b/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.cpp @@ -24,7 +24,798 @@ // Header #include "VariantVisitor.h" +#include "../../variant/All.h" +#include "../../../type/visitor/variant/VariantVisitor.h" + namespace armarx::aron::data { + /**************************************************************************** + * ConstVariantVisitor + ***************************************************************************/ + data::Descriptor ConstVariantVisitor::GetDescriptor(Input& n) + { + if (!n) + { + return data::Descriptor::eUnknown; + } + return n->getDescriptor(); + } + + data::Descriptor ConstVariantVisitor::getDescriptor(Input& n) + { + return GetDescriptor(n); + } + + void ConstVariantVisitor::visitDict(Input& i) + { + auto aron = data::Dict::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void ConstVariantVisitor::visitList(Input& i) + { + auto aron = data::List::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void ConstVariantVisitor::visitNDArray(Input& i) + { + auto aron = data::NDArray::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void ConstVariantVisitor::visitInt(Input& i) + { + auto aron = data::Int::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void ConstVariantVisitor::visitLong(Input& i) + { + auto aron = data::Long::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void ConstVariantVisitor::visitFloat(Input& i) + { + auto aron = data::Float::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void ConstVariantVisitor::visitDouble(Input& i) + { + auto aron = data::Double::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void ConstVariantVisitor::visitBool(Input& i) + { + auto aron = data::Bool::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void ConstVariantVisitor::visitString(Input& i) + { + auto aron = data::String::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void ConstVariantVisitor::visitAronVariant(const data::DictPtr&) {} + void ConstVariantVisitor::visitAronVariant(const data::ListPtr&) {} + void ConstVariantVisitor::visitAronVariant(const data::NDArrayPtr&) {} + void ConstVariantVisitor::visitAronVariant(const data::IntPtr&) {} + void ConstVariantVisitor::visitAronVariant(const data::LongPtr&) {} + void ConstVariantVisitor::visitAronVariant(const data::FloatPtr&) {} + void ConstVariantVisitor::visitAronVariant(const data::DoublePtr&) {} + void ConstVariantVisitor::visitAronVariant(const data::BoolPtr&) {} + void ConstVariantVisitor::visitAronVariant(const data::StringPtr&) {} + + + /**************************************************************************** + * ConstTypedVariantVisitor + ***************************************************************************/ + type::Descriptor ConstTypedVariantVisitor::getDescriptor(TypeInput& n) + { + return type::ConstVariantVisitor::GetDescriptor(n); + } + + void ConstTypedVariantVisitor::visitObject(DataInput& i, TypeInput& j) + { + auto d = data::Dict::DynamicCastAndCheck(i); + auto t = type::Object::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitDict(DataInput& i, TypeInput& j) + { + auto d = data::Dict::DynamicCastAndCheck(i); + auto t = type::Dict::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitPair(DataInput& i, TypeInput& j) + { + auto d = data::List::DynamicCastAndCheck(i); + auto t = type::Pair::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitTuple(DataInput& i, TypeInput& j) + { + auto d = data::List::DynamicCastAndCheck(i); + auto t = type::Tuple::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitList(DataInput& i, TypeInput& j) + { + auto d = data::List::DynamicCastAndCheck(i); + auto t = type::List::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitMatrix(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::Matrix::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitNDArray(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::NDArray::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitQuaternion(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::Quaternion::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitOrientation(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::Orientation::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitPosition(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::Position::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitPose(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::Pose::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitImage(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::Image::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitPointCloud(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::PointCloud::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitIntEnum(DataInput& i, TypeInput& j) + { + auto d = data::Int::DynamicCastAndCheck(i); + auto t = type::IntEnum::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitInt(DataInput& i, TypeInput& j) + { + auto d = data::Int::DynamicCastAndCheck(i); + auto t = type::Int::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitLong(DataInput& i, TypeInput& j) + { + auto d = data::Long::DynamicCastAndCheck(i); + auto t = type::Long::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitFloat(DataInput& i, TypeInput& j) + { + auto d = data::Float::DynamicCastAndCheck(i); + auto t = type::Float::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitDouble(DataInput& i, TypeInput& j) + { + auto d = data::Double::DynamicCastAndCheck(i); + auto t = type::Double::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitBool(DataInput& i, TypeInput& j) + { + auto d = data::Bool::DynamicCastAndCheck(i); + auto t = type::Bool::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitString(DataInput& i, TypeInput& j) + { + auto d = data::String::DynamicCastAndCheck(i); + auto t = type::String::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitTime(DataInput& i, TypeInput& j) + { + auto d = data::Long::DynamicCastAndCheck(i); + auto t = type::Time::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void ConstTypedVariantVisitor::visitAronVariant(const data::DictPtr&, const type::Object&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::DictPtr&, const type::Dict&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::ListPtr&, const type::List&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::ListPtr&, const type::Pair&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::ListPtr&, const type::Tuple&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Matrix&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::NDArray&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Quaternion&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Orientation&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Position&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Pose&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::PointCloud&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Image&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::IntPtr&, const type::IntEnum&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::IntPtr&, const type::Int&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::LongPtr&, const type::Long&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::LongPtr&, const type::Time&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::FloatPtr&, const type::Float&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::DoublePtr&, const type::Double&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::BoolPtr&, const type::Bool&) {} + void ConstTypedVariantVisitor::visitAronVariant(const data::StringPtr&, const type::String&) {} + + + + /**************************************************************************** + * RecursiveConstVariantVisitor + ***************************************************************************/ + data::Descriptor RecursiveConstVariantVisitor::getDescriptor(Input& n) + { + return ConstVariantVisitor::GetDescriptor(n); + } + + RecursiveConstVariantVisitor::MapElements RecursiveConstVariantVisitor::GetDictElements(Input& n) + { + auto x = data::Dict::DynamicCastAndCheck(n); + return x->getElements(); + } + + RecursiveConstVariantVisitor::MapElements RecursiveConstVariantVisitor::getDictElements(Input& n) + { + return GetDictElements(n); + } + + RecursiveConstVariantVisitor::ListElements RecursiveConstVariantVisitor::GetListElements(Input& n) + { + auto x = data::List::DynamicCastAndCheck(n); + return x->getElements(); + } + + RecursiveConstVariantVisitor::ListElements RecursiveConstVariantVisitor::getListElements(Input& n) + { + return GetListElements(n); + } + + void RecursiveConstVariantVisitor::visitDictOnEnter(Input& i) + { + auto aron = data::Dict::DynamicCastAndCheck(i); + visitAronVariantOnEnter(aron); + } + + void RecursiveConstVariantVisitor::visitDictOnExit(Input& i) + { + auto aron = data::Dict::DynamicCastAndCheck(i); + visitAronVariantOnExit(aron); + } + + void RecursiveConstVariantVisitor::visitListOnEnter(Input& i) + { + auto aron = data::List::DynamicCastAndCheck(i); + visitAronVariantOnEnter(aron); + } + + void RecursiveConstVariantVisitor::visitListOnExit(Input& i) + { + auto aron = data::List::DynamicCastAndCheck(i); + visitAronVariantOnExit(aron); + } + + void RecursiveConstVariantVisitor::visitNDArray(Input& i) + { + auto aron = data::NDArray::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void RecursiveConstVariantVisitor::visitInt(Input& i) + { + auto aron = data::Int::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void RecursiveConstVariantVisitor::visitLong(Input& i) + { + auto aron = data::Long::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void RecursiveConstVariantVisitor::visitFloat(Input& i) + { + auto aron = data::Float::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void RecursiveConstVariantVisitor::visitDouble(Input& i) + { + auto aron = data::Double::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void RecursiveConstVariantVisitor::visitBool(Input& i) + { + auto aron = data::Bool::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void RecursiveConstVariantVisitor::visitString(Input& i) + { + auto aron = data::String::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void RecursiveConstVariantVisitor::visitAronVariantOnEnter(const data::DictPtr&) {} + void RecursiveConstVariantVisitor::visitAronVariantOnEnter(const data::ListPtr&) {} + void RecursiveConstVariantVisitor::visitAronVariantOnExit(const data::DictPtr&) {} + void RecursiveConstVariantVisitor::visitAronVariantOnExit(const data::ListPtr&) {} + void RecursiveConstVariantVisitor::visitAronVariant(const data::NDArrayPtr&) {} + void RecursiveConstVariantVisitor::visitAronVariant(const data::IntPtr&) {} + void RecursiveConstVariantVisitor::visitAronVariant(const data::LongPtr&) {} + void RecursiveConstVariantVisitor::visitAronVariant(const data::FloatPtr&) {} + void RecursiveConstVariantVisitor::visitAronVariant(const data::DoublePtr&) {} + void RecursiveConstVariantVisitor::visitAronVariant(const data::BoolPtr&) {} + void RecursiveConstVariantVisitor::visitAronVariant(const data::StringPtr&) {} + + + + /**************************************************************************** + * RecursiveVariantVisitor + ***************************************************************************/ + data::Descriptor RecursiveVariantVisitor::getDescriptor(Input& n) + { + return ConstVariantVisitor::GetDescriptor(n); + } + + std::map<std::string, RecursiveVariantVisitor::InputNonConst> RecursiveVariantVisitor::getDictElements(Input& n) + { + return RecursiveConstVariantVisitor::GetDictElements(n); + } + + std::vector<RecursiveVariantVisitor::InputNonConst> RecursiveVariantVisitor::getListElements(Input& n) + { + return RecursiveConstVariantVisitor::GetListElements(n); + } + + void RecursiveVariantVisitor::visitDictOnEnter(Input& i) + { + auto aron = data::Dict::DynamicCastAndCheck(i); + visitAronVariantOnEnter(aron); + } + + void RecursiveVariantVisitor::visitDictOnExit(Input& i) + { + auto aron = data::Dict::DynamicCastAndCheck(i); + visitAronVariantOnExit(aron); + } + + void RecursiveVariantVisitor::visitListOnEnter(Input& i) + { + auto aron = data::List::DynamicCastAndCheck(i); + visitAronVariantOnEnter(aron); + } + + void RecursiveVariantVisitor::visitListOnExit(Input& i) + { + auto aron = data::List::DynamicCastAndCheck(i); + visitAronVariantOnExit(aron); + } + + void RecursiveVariantVisitor::visitNDArray(Input& i) + { + auto aron = data::NDArray::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void RecursiveVariantVisitor::visitInt(Input& i) + { + auto aron = data::Int::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void RecursiveVariantVisitor::visitLong(Input& i) + { + auto aron = data::Long::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void RecursiveVariantVisitor::visitFloat(Input& i) + { + auto aron = data::Float::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void RecursiveVariantVisitor::visitDouble(Input& i) + { + auto aron = data::Double::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void RecursiveVariantVisitor::visitBool(Input& i) + { + auto aron = data::Bool::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void RecursiveVariantVisitor::visitString(Input& i) + { + auto aron = data::String::DynamicCastAndCheck(i); + visitAronVariant(aron); + } + + void RecursiveVariantVisitor::visitAronVariantOnEnter(data::DictPtr&) {} + void RecursiveVariantVisitor::visitAronVariantOnEnter(data::ListPtr&) {} + void RecursiveVariantVisitor::visitAronVariantOnExit(data::DictPtr&) {} + void RecursiveVariantVisitor::visitAronVariantOnExit(data::ListPtr&) {} + void RecursiveVariantVisitor::visitAronVariant(data::NDArrayPtr&) {} + void RecursiveVariantVisitor::visitAronVariant(data::IntPtr&) {} + void RecursiveVariantVisitor::visitAronVariant(data::LongPtr&) {} + void RecursiveVariantVisitor::visitAronVariant(data::FloatPtr&) {} + void RecursiveVariantVisitor::visitAronVariant(data::DoublePtr&) {} + void RecursiveVariantVisitor::visitAronVariant(data::BoolPtr&) {} + void RecursiveVariantVisitor::visitAronVariant(data::StringPtr&) {} + + + /**************************************************************************** + * RecursiveConstTypedVariantVisitor + ***************************************************************************/ + type::Descriptor RecursiveConstTypedVariantVisitor::getDescriptor(TypeInput& n) + { + return type::ConstVariantVisitor::GetDescriptor(n); + } + + RecursiveConstTypedVariantVisitor::MapElements + RecursiveConstTypedVariantVisitor::GetObjectElements(DataInput& o, TypeInput& t) + { + std::map<std::string, std::pair<data::VariantPtr, type::VariantPtr>> ret; + auto x = data::Dict::DynamicCastAndCheck(o); + auto y = type::Object::DynamicCastAndCheck(t); + for (const auto& [key, e] : x->getElements()) + { + auto ct = y->getMemberType(key); + ret.insert({key, {e, ct}}); + } + return ret; + } + + RecursiveConstTypedVariantVisitor::MapElements + RecursiveConstTypedVariantVisitor::GetDictElements(DataInput& o, TypeInput& t) + { + std::map<std::string, std::pair<data::VariantPtr, type::VariantPtr>> ret; + auto x = data::Dict::DynamicCastAndCheck(o); + auto y = type::Dict::DynamicCastAndCheck(t); + auto ac = y->getAcceptedType(); + + for (const auto& [key, e] : x->getElements()) + { + ret.insert({key, {e, ac}}); + } + return ret; + } + + RecursiveConstTypedVariantVisitor::ListElements + RecursiveConstTypedVariantVisitor::GetListElements(DataInput& o, TypeInput& t) + { + std::vector<std::pair<data::VariantPtr, type::VariantPtr>> ret; + auto x = data::List::DynamicCastAndCheck(o); + auto y = type::List::DynamicCastAndCheck(t); + auto ac = y->getAcceptedType(); + + for (const auto& e : x->getElements()) + { + ret.push_back({e, ac}); + } + return ret; + } + + RecursiveConstTypedVariantVisitor::PairElements + RecursiveConstTypedVariantVisitor::GetPairElements(DataInput& o, TypeInput& t) + { + auto x = data::List::DynamicCastAndCheck(o); + auto y = type::Pair::DynamicCastAndCheck(t); + + auto e0 = x->getElement(0); + auto ac0 = y->getFirstAcceptedType(); + auto e1 = x->getElement(1); + auto ac1 = y->getSecondAcceptedType(); + return {{e0, ac0}, {e1, ac1}}; + } + + RecursiveConstTypedVariantVisitor::TupleElements + RecursiveConstTypedVariantVisitor::GetTupleElements(DataInput& o, TypeInput& t) + { + std::vector<std::pair<data::VariantPtr, type::VariantPtr>> ret; + auto x = data::List::DynamicCastAndCheck(o); + auto y = type::Tuple::DynamicCastAndCheck(t); + + unsigned int i = 0; + for (const auto& e : x->getElements()) + { + auto ac = y->getAcceptedType(i++); + ret.push_back({e, ac}); + } + return ret; + } + + RecursiveConstTypedVariantVisitor::MapElements + RecursiveConstTypedVariantVisitor::getObjectElements(DataInput& o, TypeInput& t) + { + return GetObjectElements(o, t); + } + + RecursiveConstTypedVariantVisitor::MapElements + RecursiveConstTypedVariantVisitor::getDictElements(DataInput& o, TypeInput& t) + { + return GetDictElements(o, t); + } + + RecursiveConstTypedVariantVisitor::ListElements + RecursiveConstTypedVariantVisitor::getListElements(DataInput& o, TypeInput& t) + { + return GetListElements(o, t); + } + + RecursiveConstTypedVariantVisitor::PairElements + RecursiveConstTypedVariantVisitor::getPairElements(DataInput& o, TypeInput& t) + { + return GetPairElements(o, t); + } + + RecursiveConstTypedVariantVisitor::TupleElements + RecursiveConstTypedVariantVisitor::getTupleElements(DataInput& o, TypeInput& t) + { + return GetTupleElements(o, t); + } + + void RecursiveConstTypedVariantVisitor::visitObjectOnEnter(DataInput& i, TypeInput& j) + { + auto d = data::Dict::DynamicCastAndCheck(i); + auto t = type::Object::DynamicCastAndCheck(j); + visitAronVariantOnEnter(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitDictOnEnter(DataInput& i, TypeInput& j) + { + auto d = data::Dict::DynamicCastAndCheck(i); + auto t = type::Dict::DynamicCastAndCheck(j); + visitAronVariantOnEnter(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitPairOnEnter(DataInput& i, TypeInput& j) + { + auto d = data::List::DynamicCastAndCheck(i); + auto t = type::Pair::DynamicCastAndCheck(j); + visitAronVariantOnEnter(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitTupleOnEnter(DataInput& i, TypeInput& j) + { + auto d = data::List::DynamicCastAndCheck(i); + auto t = type::Tuple::DynamicCastAndCheck(j); + visitAronVariantOnEnter(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitListOnEnter(DataInput& i, TypeInput& j) + { + auto d = data::List::DynamicCastAndCheck(i); + auto t = type::List::DynamicCastAndCheck(j); + visitAronVariantOnEnter(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitObjectOnExit(DataInput& i, TypeInput& j) + { + auto d = data::Dict::DynamicCastAndCheck(i); + auto t = type::Object::DynamicCastAndCheck(j); + visitAronVariantOnExit(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitDictOnExit(DataInput& i, TypeInput& j) + { + auto d = data::Dict::DynamicCastAndCheck(i); + auto t = type::Dict::DynamicCastAndCheck(j); + visitAronVariantOnExit(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitPairOnExit(DataInput& i, TypeInput& j) + { + auto d = data::List::DynamicCastAndCheck(i); + auto t = type::Pair::DynamicCastAndCheck(j); + visitAronVariantOnExit(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitTupleOnExit(DataInput& i, TypeInput& j) + { + auto d = data::List::DynamicCastAndCheck(i); + auto t = type::Tuple::DynamicCastAndCheck(j); + visitAronVariantOnExit(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitListOnExit(DataInput& i, TypeInput& j) + { + auto d = data::List::DynamicCastAndCheck(i); + auto t = type::List::DynamicCastAndCheck(j); + visitAronVariantOnExit(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitMatrix(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::Matrix::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitNDArray(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::NDArray::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitQuaternion(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::Quaternion::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitOrientation(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::Orientation::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitPosition(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::Position::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitPose(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::Pose::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitImage(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::Image::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitPointCloud(DataInput& i, TypeInput& j) + { + auto d = data::NDArray::DynamicCastAndCheck(i); + auto t = type::PointCloud::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitIntEnum(DataInput& i, TypeInput& j) + { + auto d = data::Int::DynamicCastAndCheck(i); + auto t = type::IntEnum::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitInt(DataInput& i, TypeInput& j) + { + auto d = data::Int::DynamicCastAndCheck(i); + auto t = type::Int::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitLong(DataInput& i, TypeInput& j) + { + auto d = data::Long::DynamicCastAndCheck(i); + auto t = type::Long::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitFloat(DataInput& i, TypeInput& j) + { + auto d = data::Float::DynamicCastAndCheck(i); + auto t = type::Float::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitDouble(DataInput& i, TypeInput& j) + { + auto d = data::Double::DynamicCastAndCheck(i); + auto t = type::Double::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitBool(DataInput& i, TypeInput& j) + { + auto d = data::Bool::DynamicCastAndCheck(i); + auto t = type::Bool::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitString(DataInput& i, TypeInput& j) + { + auto d = data::String::DynamicCastAndCheck(i); + auto t = type::String::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + void RecursiveConstTypedVariantVisitor::visitTime(DataInput& i, TypeInput& j) + { + auto d = data::Long::DynamicCastAndCheck(i); + auto t = type::Time::DynamicCastAndCheck(j); + visitAronVariant(d, *t); + } + + // see above + void RecursiveConstTypedVariantVisitor::visitAronVariantOnEnter(const data::DictPtr&, const type::Object&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariantOnEnter(const data::DictPtr&, const type::Dict&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariantOnEnter(const data::ListPtr&, const type::List&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariantOnEnter(const data::ListPtr&, const type::Pair&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariantOnEnter(const data::ListPtr&, const type::Tuple&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariantOnExit(const data::DictPtr&, const type::Object&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariantOnExit(const data::DictPtr&, const type::Dict&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariantOnExit(const data::ListPtr&, const type::List&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariantOnExit(const data::ListPtr&, const type::Pair&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariantOnExit(const data::ListPtr&, const type::Tuple&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Matrix&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::NDArray&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Quaternion&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Orientation&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Position&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Pose&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::PointCloud&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Image&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::IntPtr&, const type::IntEnum&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::IntPtr&, const type::Int&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::LongPtr&, const type::Long&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::LongPtr&, const type::Time&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::FloatPtr&, const type::Float&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::DoublePtr&, const type::Double&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::BoolPtr&, const type::Bool&) {} + void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::StringPtr&, const type::String&) {} } diff --git a/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h b/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h index c0e3f66e6bd0d85e1100ea241d6cc415ec0496b4..e1ffd36fa4f4e4a72f8c5fc9d2b6d9f70ff80e77 100644 --- a/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h +++ b/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h @@ -28,7 +28,8 @@ #include <vector> #include "../RecursiveVisitor.h" -#include "../../variant/All.h" +#include "../../variant/forward_declarations.h" +#include "../../../type/variant/forward_declarations.h" namespace armarx::aron::data { @@ -37,16 +38,32 @@ namespace armarx::aron::data */ struct ConstVariantVisitor : virtual public Visitor<const data::VariantPtr> { - virtual data::Descriptor getDescriptor(Input& n) override - { - if (!n) - { - return data::Descriptor::eUnknown; - } - return n->getDescriptor(); - } - + static data::Descriptor GetDescriptor(Input& n); + data::Descriptor getDescriptor(Input& n) override; virtual ~ConstVariantVisitor() = default; + + // Already implemented so that they cast the input and call specilized method below + // Override if you do not want to use the specialized methods + void visitDict(Input& i) override; + void visitList(Input& i) override; + void visitNDArray(Input& i) override; + void visitInt(Input& i) override; + void visitLong(Input& i) override; + void visitFloat(Input& i) override; + void visitDouble(Input& i) override; + void visitBool(Input& i) override; + void visitString(Input& i) override; + + // Use these if you do not want to cast manually + virtual void visitAronVariant(const data::DictPtr&); + virtual void visitAronVariant(const data::ListPtr&); + virtual void visitAronVariant(const data::NDArrayPtr&); + virtual void visitAronVariant(const data::IntPtr&); + virtual void visitAronVariant(const data::LongPtr&); + virtual void visitAronVariant(const data::FloatPtr&); + virtual void visitAronVariant(const data::DoublePtr&); + virtual void visitAronVariant(const data::BoolPtr&); + virtual void visitAronVariant(const data::StringPtr&); }; /** @@ -54,16 +71,54 @@ namespace armarx::aron::data */ struct ConstTypedVariantVisitor : virtual public TypedVisitor<const data::VariantPtr, const type::VariantPtr> { - virtual type::Descriptor getDescriptor(TypeInput& n) override - { - if (!n) - { - return type::Descriptor::eUnknown; - } - return n->getDescriptor(); - } - + type::Descriptor getDescriptor(TypeInput& n) override; virtual ~ConstTypedVariantVisitor() = default; + + // see above + void visitObject(DataInput& i, TypeInput& j) override; + void visitDict(DataInput&, TypeInput&) override; + void visitPair(DataInput&, TypeInput&) override; + void visitTuple(DataInput&, TypeInput&) override; + void visitList(DataInput&, TypeInput&) override; + void visitMatrix(DataInput&, TypeInput&) override; + void visitNDArray(DataInput&, TypeInput&) override; + void visitQuaternion(DataInput&, TypeInput&) override; + void visitOrientation(DataInput&, TypeInput&) override; + void visitPosition(DataInput&, TypeInput&) override; + void visitPose(DataInput&, TypeInput&) override; + void visitImage(DataInput&, TypeInput&) override; + void visitPointCloud(DataInput&, TypeInput&) override; + void visitIntEnum(DataInput&, TypeInput&) override; + void visitInt(DataInput&, TypeInput&) override; + void visitLong(DataInput&, TypeInput&) override; + void visitFloat(DataInput&, TypeInput&) override; + void visitDouble(DataInput&, TypeInput&) override; + void visitBool(DataInput&, TypeInput&) override; + void visitString(DataInput&, TypeInput&) override; + void visitTime(DataInput&, TypeInput&) override; + + // see above + virtual void visitAronVariant(const data::DictPtr&, const type::Object&); + virtual void visitAronVariant(const data::DictPtr&, const type::Dict&); + virtual void visitAronVariant(const data::ListPtr&, const type::List&); + virtual void visitAronVariant(const data::ListPtr&, const type::Pair&); + virtual void visitAronVariant(const data::ListPtr&, const type::Tuple&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::Matrix&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::NDArray&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::Quaternion&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::Orientation&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::Position&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::Pose&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::PointCloud&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::Image&); + virtual void visitAronVariant(const data::IntPtr&, const type::IntEnum&); + virtual void visitAronVariant(const data::IntPtr&, const type::Int&); + virtual void visitAronVariant(const data::LongPtr&, const type::Long&); + virtual void visitAronVariant(const data::LongPtr&, const type::Time&); + virtual void visitAronVariant(const data::FloatPtr&, const type::Float&); + virtual void visitAronVariant(const data::DoublePtr&, const type::Double&); + virtual void visitAronVariant(const data::BoolPtr&, const type::Bool&); + virtual void visitAronVariant(const data::StringPtr&, const type::String&); }; /** @@ -71,28 +126,36 @@ namespace armarx::aron::data */ struct RecursiveConstVariantVisitor : virtual public RecursiveVisitor<const data::VariantPtr> { - virtual data::Descriptor getDescriptor(Input& n) override - { - if (!n) - { - return data::Descriptor::eUnknown; - } - return n->getDescriptor(); - } - - virtual std::map<std::string, InputNonConst> getDictElements(Input& n) override - { - auto x = data::Dict::DynamicCastAndCheck(n); - return x->getElements(); - } - - virtual std::vector<InputNonConst> getListElements(Input& n) override - { - auto x = data::List::DynamicCastAndCheck(n); - return x->getElements(); - } - + data::Descriptor getDescriptor(Input& n) override; + static MapElements GetDictElements(Input& n); + MapElements getDictElements(Input& n) override; + static ListElements GetListElements(Input& n); + ListElements getListElements(Input& n) override; virtual ~RecursiveConstVariantVisitor() = default; + + void visitDictOnEnter(Input& i) override; + void visitDictOnExit(Input& i) override; + void visitListOnEnter(Input& i) override; + void visitListOnExit(Input& i) override; + void visitNDArray(Input& i) override; + void visitInt(Input& i) override; + void visitLong(Input& i) override; + void visitFloat(Input& i) override; + void visitDouble(Input& i) override; + void visitBool(Input& i) override; + void visitString(Input& i) override; + + virtual void visitAronVariantOnEnter(const data::DictPtr&); + virtual void visitAronVariantOnExit(const data::DictPtr&); + virtual void visitAronVariantOnEnter(const data::ListPtr&); + virtual void visitAronVariantOnExit(const data::ListPtr&); + virtual void visitAronVariant(const data::NDArrayPtr&); + virtual void visitAronVariant(const data::IntPtr&); + virtual void visitAronVariant(const data::LongPtr&); + virtual void visitAronVariant(const data::FloatPtr&); + virtual void visitAronVariant(const data::DoublePtr&); + virtual void visitAronVariant(const data::BoolPtr&); + virtual void visitAronVariant(const data::StringPtr&); }; /** @@ -100,28 +163,34 @@ namespace armarx::aron::data */ struct RecursiveVariantVisitor : virtual public RecursiveVisitor<data::VariantPtr> { - virtual data::Descriptor getDescriptor(Input& n) override - { - if (!n) - { - return data::Descriptor::eUnknown; - } - return n->getDescriptor(); - } - - virtual std::map<std::string, InputNonConst> getDictElements(Input& n) override - { - auto x = data::Dict::DynamicCastAndCheck(n); - return x->getElements(); - } - - virtual std::vector<InputNonConst> getListElements(Input& n) override - { - auto x = data::List::DynamicCastAndCheck(n); - return x->getElements(); - } - + data::Descriptor getDescriptor(Input& n) override; + std::map<std::string, InputNonConst> getDictElements(Input& n) override; + std::vector<InputNonConst> getListElements(Input& n) override; virtual ~RecursiveVariantVisitor() = default; + + void visitDictOnEnter(Input& i) override; + void visitDictOnExit(Input& i) override; + void visitListOnEnter(Input& i) override; + void visitListOnExit(Input& i) override; + void visitNDArray(Input& i) override; + void visitInt(Input& i) override; + void visitLong(Input& i) override; + void visitFloat(Input& i) override; + void visitDouble(Input& i) override; + void visitBool(Input& i) override; + void visitString(Input& i) override; + + virtual void visitAronVariantOnEnter(data::DictPtr&); + virtual void visitAronVariantOnExit(data::DictPtr&); + virtual void visitAronVariantOnEnter(data::ListPtr&); + virtual void visitAronVariantOnExit(data::ListPtr&); + virtual void visitAronVariant(data::NDArrayPtr&); + virtual void visitAronVariant(data::IntPtr&); + virtual void visitAronVariant(data::LongPtr&); + virtual void visitAronVariant(data::FloatPtr&); + virtual void visitAronVariant(data::DoublePtr&); + virtual void visitAronVariant(data::BoolPtr&); + virtual void visitAronVariant(data::StringPtr&); }; /** @@ -129,80 +198,74 @@ namespace armarx::aron::data */ struct RecursiveConstTypedVariantVisitor : virtual public RecursiveTypedVisitor<const data::VariantPtr, const type::VariantPtr> { - virtual type::Descriptor getDescriptor(TypeInput& n) override - { - if (!n) - { - return type::Descriptor::eUnknown; - } - return n->getDescriptor(); - } - - virtual std::map<std::string, std::pair<DataInputNonConst, TypeInputNonConst>> getObjectElements(DataInput& o, TypeInput& t) override - { - std::map<std::string, std::pair<data::VariantPtr, type::VariantPtr>> ret; - auto x = data::Dict::DynamicCastAndCheck(o); - auto y = type::Object::DynamicCastAndCheck(t); - for (const auto& [key, e] : x->getElements()) - { - auto ct = y->getMemberType(key); - ret.insert({key, {e, ct}}); - } - return ret; - } - virtual std::map<std::string, std::pair<DataInputNonConst, TypeInputNonConst>> getDictElements(DataInput& o, TypeInput& t) override - { - std::map<std::string, std::pair<data::VariantPtr, type::VariantPtr>> ret; - auto x = data::Dict::DynamicCastAndCheck(o); - auto y = type::Dict::DynamicCastAndCheck(t); - auto ac = y->getAcceptedType(); - - for (const auto& [key, e] : x->getElements()) - { - ret.insert({key, {e, ac}}); - } - return ret; - } - virtual std::vector<std::pair<DataInputNonConst, TypeInputNonConst>> getListElements(DataInput& o, TypeInput& t) override - { - std::vector<std::pair<data::VariantPtr, type::VariantPtr>> ret; - auto x = data::List::DynamicCastAndCheck(o); - auto y = type::List::DynamicCastAndCheck(t); - auto ac = y->getAcceptedType(); - - for (const auto& e : x->getElements()) - { - ret.push_back({e, ac}); - } - return ret; - } - virtual std::pair<std::pair<DataInputNonConst, TypeInputNonConst>, std::pair<DataInputNonConst, TypeInputNonConst>> - getPairElements(DataInput& o, TypeInput& t) override - { - auto x = data::List::DynamicCastAndCheck(o); - auto y = type::Pair::DynamicCastAndCheck(t); - - auto e0 = x->getElement(0); - auto ac0 = y->getFirstAcceptedType(); - auto e1 = x->getElement(1); - auto ac1 = y->getSecondAcceptedType(); - return {{e0, ac0}, {e1, ac1}}; - } - virtual std::vector<std::pair<DataInputNonConst, TypeInputNonConst>> getTupleElements(DataInput& o, TypeInput& t) override - { - std::vector<std::pair<data::VariantPtr, type::VariantPtr>> ret; - auto x = data::List::DynamicCastAndCheck(o); - auto y = type::Tuple::DynamicCastAndCheck(t); - - unsigned int i = 0; - for (const auto& e : x->getElements()) - { - auto ac = y->getAcceptedType(i++); - ret.push_back({e, ac}); - } - return ret; - } + type::Descriptor getDescriptor(TypeInput& n) override; + static MapElements GetObjectElements(DataInput& o, TypeInput& t); + static MapElements GetDictElements(DataInput& o, TypeInput& t); + static ListElements GetListElements(DataInput& o, TypeInput& t); + static PairElements GetPairElements(DataInput& o, TypeInput& t); + static TupleElements GetTupleElements(DataInput& o, TypeInput& t); + MapElements getObjectElements(DataInput& o, TypeInput& t) override; + MapElements getDictElements(DataInput& o, TypeInput& t) override; + ListElements getListElements(DataInput& o, TypeInput& t) override; + PairElements getPairElements(DataInput& o, TypeInput& t) override; + TupleElements getTupleElements(DataInput& o, TypeInput& t) override; virtual ~RecursiveConstTypedVariantVisitor() = default; + + // see above + void visitObjectOnEnter(DataInput&, TypeInput&) override; + void visitDictOnEnter(DataInput&, TypeInput&) override; + void visitPairOnEnter(DataInput&, TypeInput&) override; + void visitTupleOnEnter(DataInput&, TypeInput&) override; + void visitListOnEnter(DataInput&, TypeInput&) override; + void visitObjectOnExit(DataInput& i, TypeInput& j) override; + void visitDictOnExit(DataInput&, TypeInput&) override; + void visitPairOnExit(DataInput&, TypeInput&) override; + void visitTupleOnExit(DataInput&, TypeInput&) override; + void visitListOnExit(DataInput&, TypeInput&) override; + void visitMatrix(DataInput&, TypeInput&) override; + void visitNDArray(DataInput&, TypeInput&) override; + void visitQuaternion(DataInput&, TypeInput&) override; + void visitOrientation(DataInput&, TypeInput&) override; + void visitPosition(DataInput&, TypeInput&) override; + void visitPose(DataInput&, TypeInput&) override; + void visitImage(DataInput&, TypeInput&) override; + void visitPointCloud(DataInput&, TypeInput&) override; + void visitIntEnum(DataInput&, TypeInput&) override; + void visitInt(DataInput&, TypeInput&) override; + void visitLong(DataInput&, TypeInput&) override; + void visitFloat(DataInput&, TypeInput&) override; + void visitDouble(DataInput&, TypeInput&) override; + void visitBool(DataInput&, TypeInput&) override; + void visitString(DataInput&, TypeInput&) override; + void visitTime(DataInput&, TypeInput&) override; + + // see above + virtual void visitAronVariantOnEnter(const data::DictPtr&, const type::Object&); + virtual void visitAronVariantOnEnter(const data::DictPtr&, const type::Dict&); + virtual void visitAronVariantOnEnter(const data::ListPtr&, const type::List&); + virtual void visitAronVariantOnEnter(const data::ListPtr&, const type::Pair&); + virtual void visitAronVariantOnEnter(const data::ListPtr&, const type::Tuple&); + virtual void visitAronVariantOnExit(const data::DictPtr&, const type::Object&); + virtual void visitAronVariantOnExit(const data::DictPtr&, const type::Dict&); + virtual void visitAronVariantOnExit(const data::ListPtr&, const type::List&); + virtual void visitAronVariantOnExit(const data::ListPtr&, const type::Pair&); + virtual void visitAronVariantOnExit(const data::ListPtr&, const type::Tuple&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::Matrix&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::NDArray&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::Quaternion&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::Orientation&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::Position&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::Pose&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::PointCloud&); + virtual void visitAronVariant(const data::NDArrayPtr&, const type::Image&); + virtual void visitAronVariant(const data::IntPtr&, const type::IntEnum&); + virtual void visitAronVariant(const data::IntPtr&, const type::Int&); + virtual void visitAronVariant(const data::LongPtr&, const type::Long&); + virtual void visitAronVariant(const data::LongPtr&, const type::Time&); + virtual void visitAronVariant(const data::FloatPtr&, const type::Float&); + virtual void visitAronVariant(const data::DoublePtr&, const type::Double&); + virtual void visitAronVariant(const data::BoolPtr&, const type::Bool&); + virtual void visitAronVariant(const data::StringPtr&, const type::String&); }; } diff --git a/source/RobotAPI/libraries/aron/core/type/variant/Variant.h b/source/RobotAPI/libraries/aron/core/type/variant/Variant.h index c287a8bf4c54f50d01f49b8a6ebe295df4372271..3b189122e1dc29d26f7680a4e3fc69f1ce4f86a8 100644 --- a/source/RobotAPI/libraries/aron/core/type/variant/Variant.h +++ b/source/RobotAPI/libraries/aron/core/type/variant/Variant.h @@ -102,6 +102,12 @@ namespace armarx::aron::type } // virtual methods + /// naviate absolute + virtual VariantPtr navigateAbsolute(const Path& path) const = 0; + + /// navigate relative + virtual VariantPtr navigateRelative(const Path& path) const = 0; + /// get a short name of this specific type virtual std::string getShortName() const = 0; diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.cpp b/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.cpp index d8b627b8863ed5a8c018653aef3bec957a063977..1ba76b6260864ff6659d8fb46363b95dbc7d99e5 100644 --- a/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.cpp +++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.cpp @@ -79,5 +79,27 @@ namespace armarx::aron::type { return "armarx::aron::type::Dict<" + acceptedType->getFullName() + ">"; } + + VariantPtr Dict::navigateAbsolute(const Path& path) const + { + if (!path.hasElement()) + { + throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate without a valid path", path); + } + + if (path.size() != 1) + { + throw error::AronException(__PRETTY_FUNCTION__, "Could not get more than 1 value from a dict.", path); + } + + std::string el = path.getFirstElement(); + if (el != "::accepted_type") + { + throw error::ValueNotValidException(__PRETTY_FUNCTION__, "Could not find an element of a path.", el, path); + } + + + return acceptedType; + } } diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.h b/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.h index d458ad4bf6d3a11983dcf88b8f928a603362786d..4dfdd35e238b39b729d67c583ec9378fc19f5c0e 100644 --- a/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.h +++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.h @@ -52,6 +52,8 @@ namespace armarx::aron::type type::dto::DictPtr toDictDTO() const; // virtual implementations + VariantPtr navigateAbsolute(const Path& path) const override; + std::string getShortName() const override; std::string getFullName() const override; std::vector<VariantPtr> getChildren() const override; diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/List.cpp b/source/RobotAPI/libraries/aron/core/type/variant/container/List.cpp index 47c129681572c9b1153b7ee4d30a9ab7da48a321..2f65cb75b0724e814fb569f5d2c9fc175bc8d5cc 100644 --- a/source/RobotAPI/libraries/aron/core/type/variant/container/List.cpp +++ b/source/RobotAPI/libraries/aron/core/type/variant/container/List.cpp @@ -79,4 +79,26 @@ namespace armarx::aron::type { return "armarx::aron::type::List<" + acceptedType->getFullName() + ">"; } + + VariantPtr List::navigateAbsolute(const Path& path) const + { + if (!path.hasElement()) + { + throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate without a valid path", path); + } + + if (path.size() != 1) + { + throw error::AronException(__PRETTY_FUNCTION__, "Could not get more than 1 value from a dict.", path); + } + + std::string el = path.getFirstElement(); + if (el != "::accepted_type") + { + throw error::ValueNotValidException(__PRETTY_FUNCTION__, "Could not find an element of a path.", el, path); + } + + + return acceptedType; + } } diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/List.h b/source/RobotAPI/libraries/aron/core/type/variant/container/List.h index 277591cf7974685b7db2908641ca0ed4c3cf13c5..532146e010bf8217c4669649ee2da9771c0623ec 100644 --- a/source/RobotAPI/libraries/aron/core/type/variant/container/List.h +++ b/source/RobotAPI/libraries/aron/core/type/variant/container/List.h @@ -51,6 +51,8 @@ namespace armarx::aron::type type::dto::ListPtr toListDTO() const; // virtual implementations + VariantPtr navigateAbsolute(const Path& path) const override; + std::string getShortName() const override; std::string getFullName() const override; std::vector<VariantPtr> getChildren() const override; diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Object.cpp b/source/RobotAPI/libraries/aron/core/type/variant/container/Object.cpp index a6e61b8866e15a194126a9fbf0161f2ba32a9f71..d252ae8fc5461f659ce8dd5b160009de4003b792 100644 --- a/source/RobotAPI/libraries/aron/core/type/variant/container/Object.cpp +++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Object.cpp @@ -195,5 +195,33 @@ namespace armarx::aron::type { return "armarx::aron::type::Object<" + this->aron->objectName + (extends ? (" : " + extends->getFullName()) : "") + ">"; } + + VariantPtr Object::navigateAbsolute(const Path& path) const + { + if (!path.hasElement()) + { + throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate without a valid path", path); + } + + std::string el = path.getFirstElement(); + if (!hasMemberType(el)) + { + throw error::ValueNotValidException(__PRETTY_FUNCTION__, "Could not find an element of a path.", el, path); + } + + if (path.size() == 1) + { + return memberTypes.at(el); + } + else + { + Path next = path.withDetachedFirstElement(); + if (!memberTypes.at(el)) + { + throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate into a NULL member.", next); + } + return memberTypes.at(el)->navigateAbsolute(next); + } + } } diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Object.h b/source/RobotAPI/libraries/aron/core/type/variant/container/Object.h index fcd20e561e25b6d356302400584142ba97713c41..50ce062d4dcd0e86548fbc0b625588947c22e568 100644 --- a/source/RobotAPI/libraries/aron/core/type/variant/container/Object.h +++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Object.h @@ -68,6 +68,8 @@ namespace armarx::aron::type type::dto::AronObjectPtr toObjectDTO() const; // virtual implementations + VariantPtr navigateAbsolute(const Path& path) const override; + std::string getShortName() const override; std::string getFullName() const override; std::vector<VariantPtr> getChildren() const override; diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.cpp b/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.cpp index c8bdeaf653ceaf6d67f87637de6d65bc4652fb37..d1cebcd3dda7a750c897a0d6b81bedb754eecd92 100644 --- a/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.cpp +++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.cpp @@ -114,5 +114,43 @@ namespace armarx::aron::type { return "armarx::aron::type::Pair<" + acceptedType1->getFullName() + ", " + acceptedType2->getFullName() + ">"; } + + VariantPtr Pair::navigateAbsolute(const Path& path) const + { + if (!path.hasElement()) + { + throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate without a valid path", path); + } + + std::string el = path.getFirstElement(); + if (el == "::accepted_type_0") + { + if (path.size() == 1) + { + return acceptedType1; + } + else + { + Path next = path.withDetachedFirstElement(); + return acceptedType1->navigateAbsolute(next); + } + } + else if (el == "::accepted_type_1") + { + if (path.size() == 1) + { + return acceptedType2; + } + else + { + Path next = path.withDetachedFirstElement(); + return acceptedType2->navigateAbsolute(next); + } + } + else + { + throw error::ValueNotValidException(__PRETTY_FUNCTION__, "Could not find an element of a path.", el, path); + } + } } diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.h b/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.h index 7a987e304b145316cab6b4d55dbe03322ad4a264..a63f6819406ce2b328e97a4026aeae21127d7b09 100644 --- a/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.h +++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.h @@ -55,6 +55,8 @@ namespace armarx::aron::type type::dto::PairPtr toPairDTO() const; // virtual implementations + VariantPtr navigateAbsolute(const Path& path) const override; + std::string getShortName() const override; std::string getFullName() const override; std::vector<VariantPtr> getChildren() const override; diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.cpp b/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.cpp index 781291eccb8f9e93173ed5bc3108b9bd5fd70572..e189a85c76619b13984a90d2c0eb6332fb728bfa 100644 --- a/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.cpp +++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.cpp @@ -105,5 +105,31 @@ namespace armarx::aron::type } return "armarx::aron::type::Tuple<" + simox::alg::to_string(names, ", ") + ">"; } + + VariantPtr Tuple::navigateAbsolute(const Path& path) const + { + if (!path.hasElement()) + { + throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate without a valid path", path); + } + + std::string el = path.getFirstElement(); + for (unsigned int i = 0; i < acceptedTypes.size(); ++i) + { + if (el == "::accepted_type_" + std::to_string(i)) + { + if (path.size() == 1) + { + return acceptedTypes[i]; + } + else + { + Path next = path.withDetachedFirstElement(); + return acceptedTypes[i]->navigateAbsolute(next); + } + } + } + throw error::ValueNotValidException(__PRETTY_FUNCTION__, "Could not find an element of a path.", el, path); + } } diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.h b/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.h index a0096397073110d8bdbaa7eff9531c1c2f000145..d464f83269d5074e1ec6e759119b433c76de0f7d 100644 --- a/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.h +++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.h @@ -52,6 +52,8 @@ namespace armarx::aron::type type::dto::TuplePtr toTupleDTO() const; // virtual implementations + VariantPtr navigateAbsolute(const Path& path) const override; + std::string getShortName() const override; std::string getFullName() const override; std::vector<VariantPtr> getChildren() const override; diff --git a/source/RobotAPI/libraries/aron/core/type/variant/detail/EnumVariant.h b/source/RobotAPI/libraries/aron/core/type/variant/detail/EnumVariant.h index eaa1924c1e5204e224f2a485afbcb174acc52d1f..a9b390b8db6383d63fbc594f23841351861def4f 100644 --- a/source/RobotAPI/libraries/aron/core/type/variant/detail/EnumVariant.h +++ b/source/RobotAPI/libraries/aron/core/type/variant/detail/EnumVariant.h @@ -44,6 +44,12 @@ namespace armarx::aron::type::detail virtual ~EnumVariant() = default; + /* virtual implementations */ + VariantPtr navigateAbsolute(const Path &path) const override + { + throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath()); + } + std::vector<VariantPtr> getChildren() const override { return {}; diff --git a/source/RobotAPI/libraries/aron/core/type/variant/detail/NDArrayVariant.h b/source/RobotAPI/libraries/aron/core/type/variant/detail/NDArrayVariant.h index cef80f77c690ea823fdb3ee9d1c3f28c9097cbbd..283b11a6383593e389e905c6b27e5fec4716a72a 100644 --- a/source/RobotAPI/libraries/aron/core/type/variant/detail/NDArrayVariant.h +++ b/source/RobotAPI/libraries/aron/core/type/variant/detail/NDArrayVariant.h @@ -45,10 +45,16 @@ namespace armarx::aron::type::detail virtual ~NDArrayVariant() = default; /* virtual implementations */ + VariantPtr navigateAbsolute(const Path &path) const override + { + throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath()); + } + std::vector<VariantPtr> getChildren() const override { return {}; } + size_t childrenSize() const override { return 0; diff --git a/source/RobotAPI/libraries/aron/core/type/variant/detail/PrimitiveVariant.h b/source/RobotAPI/libraries/aron/core/type/variant/detail/PrimitiveVariant.h index 4c729aed09aa8e01caeda41b68e79568b18f95bb..c7c6eb0b9c00e9ab1cd40800d5917929b8e9e5c3 100644 --- a/source/RobotAPI/libraries/aron/core/type/variant/detail/PrimitiveVariant.h +++ b/source/RobotAPI/libraries/aron/core/type/variant/detail/PrimitiveVariant.h @@ -45,10 +45,16 @@ namespace armarx::aron::type::detail virtual ~PrimitiveVariant() = default; /* virtual implementations */ + VariantPtr navigateAbsolute(const Path &path) const override + { + throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath()); + } + std::vector<VariantPtr> getChildren() const override { return {}; } + size_t childrenSize() const override { return 0; diff --git a/source/RobotAPI/libraries/aron/core/type/variant/detail/SpecializedVariant.h b/source/RobotAPI/libraries/aron/core/type/variant/detail/SpecializedVariant.h index 06bae251e9f9e2f032ce513eab2a5d236599c0b6..a34a215308e265d844b10d2e6d1359e1b31fd111 100644 --- a/source/RobotAPI/libraries/aron/core/type/variant/detail/SpecializedVariant.h +++ b/source/RobotAPI/libraries/aron/core/type/variant/detail/SpecializedVariant.h @@ -88,6 +88,13 @@ namespace armarx::aron::type::detail return aron->maybe; } + VariantPtr navigateRelative(const Path& path) const override + { + Path absoluteFromHere = path.getWithoutPrefix(getPath()); + return navigateAbsolute(absoluteFromHere); + } + + // static methods static DerivedT& DynamicCast(Variant& n) { @@ -106,7 +113,11 @@ namespace armarx::aron::type::detail static std::shared_ptr<DerivedT> DynamicCastAndCheck(const VariantPtr& n) { - ARMARX_CHECK_NOT_NULL(n); + if (!n) + { + return nullptr; + } + auto casted = std::dynamic_pointer_cast<DerivedT>(n); ARMARX_CHECK_NOT_NULL(casted); return casted; diff --git a/source/RobotAPI/libraries/aron/core/type/visitor/RecursiveVisitor.h b/source/RobotAPI/libraries/aron/core/type/visitor/RecursiveVisitor.h index a49b0751edcc7d689fe8e57a1eca7d2d3fe4bcaf..b11894e7b039d52a15feadf46b7ef5872f24e80a 100644 --- a/source/RobotAPI/libraries/aron/core/type/visitor/RecursiveVisitor.h +++ b/source/RobotAPI/libraries/aron/core/type/visitor/RecursiveVisitor.h @@ -133,11 +133,15 @@ namespace armarx::aron::type using Input = typename VisitorBase<T>::Input; using InputNonConst = typename std::remove_const<Input>::type; - virtual std::map<std::string, InputNonConst> getObjectAcceptedTypes(Input&) = 0; + using ObjectElements = std::map<std::string, InputNonConst>; + using PairElements = std::pair<InputNonConst, InputNonConst>; + using TupleElements = std::vector<InputNonConst>; + + virtual ObjectElements getObjectAcceptedTypes(Input&) = 0; virtual InputNonConst getDictAcceptedType(Input&) = 0; virtual InputNonConst getListAcceptedType(Input&) = 0; - virtual std::pair<InputNonConst, InputNonConst> getPairAcceptedTypes(Input&) = 0; - virtual std::vector<InputNonConst> getTupleAcceptedTypes(Input&) = 0; + virtual PairElements getPairAcceptedTypes(Input&) = 0; + virtual TupleElements getTupleAcceptedTypes(Input&) = 0; virtual void visitObjectOnEnter(Input&) {}; virtual void visitObjectOnExit(Input&) {}; diff --git a/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp b/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp index 6b2175d223a59338b77521a0f07c289ce598eca9..b99a9228c61f320978026943b758a01953354e6a 100644 --- a/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp +++ b/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp @@ -24,7 +24,16 @@ // Header #include "NlohmannJSONVisitor.h" -namespace armarx::aron::data +namespace armarx::aron::type { + type::Descriptor NlohmannJSONVisitor::GetDescriptor(Input& n) + { + std::string t = n[armarx::aron::type::rw::json::constantes::TYPE_SLUG]; + return armarx::aron::type::rw::json::conversion::String2Descriptor.at(t); + } + type::Descriptor NlohmannJSONVisitor::getDescriptor(Input& n) + { + return GetDescriptor(n); + } } diff --git a/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.h b/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.h index 08a7060d02132fd3c1fb0c3686e7c96a0780ba07..9618654d052599c79b8cd02d7ae702a5163951b7 100644 --- a/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.h +++ b/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.h @@ -27,11 +27,10 @@ #include <string> #include <vector> -// SImox +// Simox #include <SimoxUtility/json.h> #include "../Visitor.h" -#include "../../../Descriptor.h" #include "../../rw/json/Data.h" namespace armarx::aron::type @@ -41,12 +40,8 @@ namespace armarx::aron::type */ struct NlohmannJSONVisitor : virtual public Visitor<const nlohmann::json> { - virtual type::Descriptor getDescriptor(Input& n) override - { - std::string t = n[armarx::aron::type::rw::json::constantes::TYPE_SLUG]; - return armarx::aron::type::rw::json::conversion::String2Descriptor.at(t); - } - + static type::Descriptor GetDescriptor(Input& n); + type::Descriptor getDescriptor(Input& n) override; virtual ~NlohmannJSONVisitor() = default; }; diff --git a/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.cpp b/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.cpp index 005f9110566e3e90b6cd28d88d688ad00b51a09c..a6fa9e7dc4ac83794c4c9226ff7d38a643bcde1d 100644 --- a/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.cpp +++ b/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.cpp @@ -24,7 +24,84 @@ // Header #include "VariantVisitor.h" -namespace armarx::aron::data +#include "../../variant/All.h" + +namespace armarx::aron::type { + /**************************************************************************** + * VariantVisitor + ***************************************************************************/ + type::Descriptor ConstVariantVisitor::GetDescriptor(Input& n) + { + return n->getDescriptor(); + } + + type::Descriptor ConstVariantVisitor::getDescriptor(Input& n) + { + return GetDescriptor(n); + } + + + /**************************************************************************** + * RecursiveVariantVisitor + ***************************************************************************/ + type::Descriptor RecursiveConstVariantVisitor::getDescriptor(Input& n) + { + return ConstVariantVisitor::GetDescriptor(n); + } + + RecursiveConstVariantVisitor::ObjectElements RecursiveConstVariantVisitor::GetObjectAcceptedTypes(Input& t) + { + auto o = type::Object::DynamicCastAndCheck(t); + return o->getMemberTypes(); + } + + RecursiveConstVariantVisitor::ObjectElements RecursiveConstVariantVisitor::getObjectAcceptedTypes(Input& t) + { + return GetObjectAcceptedTypes(t); + } + + RecursiveConstVariantVisitor::InputNonConst RecursiveConstVariantVisitor::GetDictAcceptedType(Input& t) + { + auto o = type::Dict::DynamicCastAndCheck(t); + return o->getAcceptedType(); + } + + RecursiveConstVariantVisitor::InputNonConst RecursiveConstVariantVisitor::getDictAcceptedType(Input& t) + { + return GetDictAcceptedType(t); + } + + RecursiveConstVariantVisitor::InputNonConst RecursiveConstVariantVisitor::GetListAcceptedType(Input& t) + { + auto o = type::List::DynamicCastAndCheck(t); + return o->getAcceptedType(); + } + + RecursiveConstVariantVisitor::InputNonConst RecursiveConstVariantVisitor::getListAcceptedType(Input& t) + { + return GetListAcceptedType(t); + } + + RecursiveConstVariantVisitor::PairElements RecursiveConstVariantVisitor::GetPairAcceptedTypes(Input& t) + { + auto o = type::Pair::DynamicCastAndCheck(t); + return o->getAcceptedTypes(); + } + + RecursiveConstVariantVisitor::PairElements RecursiveConstVariantVisitor::getPairAcceptedTypes(Input& t) + { + return GetPairAcceptedTypes(t); + } + + RecursiveConstVariantVisitor::TupleElements RecursiveConstVariantVisitor::GetTupleAcceptedTypes(Input& t) + { + auto o = type::Tuple::DynamicCastAndCheck(t); + return o->getAcceptedTypes(); + } + RecursiveConstVariantVisitor::TupleElements RecursiveConstVariantVisitor::getTupleAcceptedTypes(Input& t) + { + return GetTupleAcceptedTypes(t); + } } diff --git a/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.h b/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.h index 8b8bd1aeaf4959a5d13b34d37e44c7aaad7d8dff..4f08dca8f6465d5f6a752807b87674671237915e 100644 --- a/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.h +++ b/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.h @@ -28,58 +28,37 @@ #include <vector> #include "../RecursiveVisitor.h" -#include "../../variant/All.h" +#include "../../variant/forward_declarations.h" namespace armarx::aron::type { /** * @brief The VariantVisitor struct. Already implements the method to get the descriptor of an aron variant. */ - struct VariantVisitor : virtual public Visitor<const type::VariantPtr> + struct ConstVariantVisitor : virtual public Visitor<const type::VariantPtr> { - virtual type::Descriptor getDescriptor(Input& n) override - { - return n->getDescriptor(); - } - virtual ~VariantVisitor() = default; + static type::Descriptor GetDescriptor(Input& n); + type::Descriptor getDescriptor(Input& n) override; + virtual ~ConstVariantVisitor() = default; }; /** * @brief The RecursiveVariantVisitor struct. Already implements the methods to get the descriptor and children of an aron variant */ - struct RecursiveVariantVisitor : virtual public RecursiveVisitor<const type::VariantPtr> + struct RecursiveConstVariantVisitor : virtual public RecursiveVisitor<const type::VariantPtr> { - virtual type::Descriptor getDescriptor(Input& n) override - { - return n->getDescriptor(); - } + type::Descriptor getDescriptor(Input& n) override; + static ObjectElements GetObjectAcceptedTypes(Input& t); + ObjectElements getObjectAcceptedTypes(Input& t) override; + static InputNonConst GetDictAcceptedType(Input& t); + InputNonConst getDictAcceptedType(Input& t) override; + static InputNonConst GetListAcceptedType(Input& t); + InputNonConst getListAcceptedType(Input& t) override; + static PairElements GetPairAcceptedTypes(Input& t); + PairElements getPairAcceptedTypes(Input& t) override; + static TupleElements GetTupleAcceptedTypes(Input& t); + TupleElements getTupleAcceptedTypes(Input& t) override; - virtual std::map<std::string, type::VariantPtr> getObjectAcceptedTypes(Input& t) override - { - auto o = type::Object::DynamicCastAndCheck(t); - return o->getMemberTypes(); - } - virtual type::VariantPtr getDictAcceptedType(Input& t) override - { - auto o = type::Dict::DynamicCastAndCheck(t); - return o->getAcceptedType(); - } - virtual type::VariantPtr getListAcceptedType(Input& t) override - { - auto o = type::List::DynamicCastAndCheck(t); - return o->getAcceptedType(); - } - virtual std::pair<type::VariantPtr, type::VariantPtr> getPairAcceptedTypes(Input& t) override - { - auto o = type::Pair::DynamicCastAndCheck(t); - return o->getAcceptedTypes(); - } - virtual std::vector<type::VariantPtr> getTupleAcceptedTypes(Input& t) override - { - auto o = type::Tuple::DynamicCastAndCheck(t); - return o->getAcceptedTypes(); - } - - virtual ~RecursiveVariantVisitor() = default; + virtual ~RecursiveConstVariantVisitor() = default; }; } diff --git a/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp b/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp index bffc30376046d6eae82a9e8aedc412d93645b6db..f9e023a84bf5623bd0785fde391544e303f665d1 100644 --- a/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp +++ b/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp @@ -213,7 +213,7 @@ namespace armarx::aron::typereader::xml std::vector<RapidXmlReaderNode> c = node.nodes(); const RapidXmlReaderNode typeNode = c[0]; - type::VariantPtr type = create(typeNode, Path(path, "[accepted-type]")); + type::VariantPtr type = create(typeNode, Path(path, "::accepted-type")); type->setMaybe(getMaybe(typeNode)); auto o = std::make_shared<type::List>(type, path); @@ -226,7 +226,7 @@ namespace armarx::aron::typereader::xml std::vector<RapidXmlReaderNode> c = node.nodes(); const RapidXmlReaderNode typeNode = c[0]; - type::VariantPtr type = create(typeNode, Path(path, "type")); + type::VariantPtr type = create(typeNode, Path(path, "::accepted-type")); type->setMaybe(getMaybe(typeNode)); auto o = std::make_shared<type::Dict>(type, path); @@ -247,7 +247,7 @@ namespace armarx::aron::typereader::xml std::vector<RapidXmlReaderNode> typeNodeChildren = tupleTypeDeclarationNode.nodes(); const RapidXmlReaderNode typeNode = typeNodeChildren[0]; - type::VariantPtr type = create(typeNode, Path(path, "<" + std::to_string(i++) + ">")); + type::VariantPtr type = create(typeNode, Path(path, "::accepted_type_" + std::to_string(i++))); type->setMaybe(getMaybe(typeNode)); elementTypes.push_back(type); @@ -264,11 +264,11 @@ namespace armarx::aron::typereader::xml std::vector<RapidXmlReaderNode> c = node.nodes(); const RapidXmlReaderNode type1Node = c[0]; - type::VariantPtr type1 = create(type1Node, Path(path, std::to_string(0))); + type::VariantPtr type1 = create(type1Node, Path(path, "::accepted_type_" + std::to_string(0))); type1->setMaybe(getMaybe(type1Node)); const RapidXmlReaderNode type2Node = c[1]; - type::VariantPtr type2 = create(type2Node, Path(path, std::to_string(1))); + type::VariantPtr type2 = create(type2Node, Path(path, "::accepted_type_" + std::to_string(1))); type2->setMaybe(getMaybe(type2Node)); auto o = std::make_shared<type::Pair>(type1, type2, path);