From 6ba9c04f7068c42d00783d1b5ad2f5a358f4ea32 Mon Sep 17 00:00:00 2001 From: Christoph Pohl <christoph.pohl@kit.edu> Date: Thu, 16 Feb 2023 15:24:30 +0100 Subject: [PATCH] handle optional subtypes in fullfillsType --- .../aron/core/data/variant/container/Dict.cpp | 27 ++++++++++++++++--- .../aron/core/data/variant/container/List.cpp | 7 ++++- 2 files changed, 30 insertions(+), 4 deletions(-) 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 478c6a2c8..09cab7521 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp +++ b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp @@ -25,10 +25,12 @@ #include "Dict.h" // ArmarX -#include <RobotAPI/libraries/aron/core/data/variant/Factory.h> - #include <SimoxUtility/algorithm/string/string_conversion.h> +#include <ArmarXCore/util/CPPUtility/trace.h> + +#include <RobotAPI/libraries/aron/core/data/variant/Factory.h> + namespace armarx::aron::data { @@ -216,19 +218,35 @@ namespace armarx::aron::data { case type::Descriptor::OBJECT: { + ARMARX_TRACE; auto objectTypeNav = type::Object::DynamicCastAndCheck(type); for (const auto& [key, nav] : childrenNavigators) { if (!objectTypeNav->hasMemberType(key)) { + ARMARX_TRACE; return false; } - if (!nav || !objectTypeNav->getMemberType(key)) + if (!objectTypeNav->getMemberType(key)) { + ARMARX_TRACE; return false; } + + if (!nav) + { + ARMARX_TRACE; + auto childTypeNav = objectTypeNav->getMemberType(key); + if (childTypeNav->getMaybe() == type::Maybe::NONE) + { + ARMARX_TRACE; + return false; + } + return true; + } if (!nav->fullfillsType(objectTypeNav->getMemberType(key))) { + ARMARX_TRACE; return false; } } @@ -236,16 +254,19 @@ namespace armarx::aron::data } case type::Descriptor::DICT: { + ARMARX_TRACE; auto dictTypeNav = type::Dict::DynamicCastAndCheck(type); for (const auto& [key, nav] : childrenNavigators) { (void) key; if (!nav || !dictTypeNav->getAcceptedType()) { + ARMARX_TRACE; return false; } if (!nav->fullfillsType(dictTypeNav->getAcceptedType())) { + ARMARX_TRACE; return false; } } 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 84bf1a200..db80996a1 100644 --- a/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp +++ b/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp @@ -26,10 +26,12 @@ // ArmarX #include <ArmarXCore/core/exceptions/Exception.h> +#include <ArmarXCore/util/CPPUtility/trace.h> + #include <RobotAPI/libraries/aron/core/data/variant/Factory.h> #include <RobotAPI/libraries/aron/core/type/variant/container/List.h> -#include <RobotAPI/libraries/aron/core/type/variant/container/Tuple.h> #include <RobotAPI/libraries/aron/core/type/variant/container/Pair.h> +#include <RobotAPI/libraries/aron/core/type/variant/container/Tuple.h> namespace armarx::aron::data { @@ -218,15 +220,18 @@ namespace armarx::aron::data { case type::Descriptor::LIST: { + ARMARX_TRACE; auto listTypeNav = type::List::DynamicCastAndCheck(type); for (const auto& nav : childrenNavigators) { if (!nav && !listTypeNav->getAcceptedType()) { + ARMARX_TRACE; return false; } if (!nav->fullfillsType(listTypeNav->getAcceptedType())) { + ARMARX_TRACE; return false; } } -- GitLab