From 56480d67763f0df5d2193bf0712b3bf6c0d1183d Mon Sep 17 00:00:00 2001 From: Tomasz Jankowski Date: Fri, 17 Jan 2025 14:43:11 +0100 Subject: [PATCH 1/5] Use OV dynamic cast on Android only Signed-off-by: Tomasz Jankowski --- src/core/include/openvino/core/type.hpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/core/include/openvino/core/type.hpp b/src/core/include/openvino/core/type.hpp index 4877b9ce02b251..812208855fa7f3 100644 --- a/src/core/include/openvino/core/type.hpp +++ b/src/core/include/openvino/core/type.hpp @@ -77,6 +77,10 @@ struct OPENVINO_API DiscreteTypeInfo { OPENVINO_API std::ostream& operator<<(std::ostream& s, const DiscreteTypeInfo& info); +#if defined(__ANDROID__) || defined(ANDROID) +# define OPENVINO_DYNAMIC_CAST +#endif + /// \brief Tests if value is a pointer/shared_ptr that can be statically cast to a /// Type*/shared_ptr template @@ -93,7 +97,11 @@ template typename std::enable_if(std::declval())), Type*>::value, Type*>::type as_type(Value value) { +#ifdef OPENVINO_DYNAMIC_CAST return ov::is_type(value) ? static_cast(value) : nullptr; +#else + return dynamic_cast(value); +#endif } namespace util { @@ -114,7 +122,11 @@ struct AsTypePtr> { /// Type, nullptr otherwise template auto as_type_ptr(const U& value) -> decltype(::ov::util::AsTypePtr::template call(value)) { +#ifdef OPENVINO_DYNAMIC_CAST return ::ov::util::AsTypePtr::template call(value); +#else + return std::dynamic_pointer_cast(value); +#endif } } // namespace ov From b06aa09464d74dde15f122db98be319299e5f538 Mon Sep 17 00:00:00 2001 From: Tomasz Jankowski Date: Mon, 20 Jan 2025 14:17:37 +0100 Subject: [PATCH 2/5] Add test Signed-off-by: Tomasz Jankowski --- src/core/tests/rtti.cpp | 54 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/src/core/tests/rtti.cpp b/src/core/tests/rtti.cpp index 1fd8787ee60f38..32ef5dc958fac9 100644 --- a/src/core/tests/rtti.cpp +++ b/src/core/tests/rtti.cpp @@ -5,10 +5,12 @@ #include "common_test_utils/test_tools.hpp" #include "gtest/gtest.h" #include "openvino/op/op.hpp" +#include "openvino/pass/matcher_pass.hpp" -using namespace ov; using namespace std; +namespace ov::test { + class OpType : public ov::op::Op { public: OPENVINO_OP("OpType"); @@ -88,3 +90,53 @@ TEST(rtti, op_with_type_version_parent_old) { ASSERT_NE(type_info.parent, nullptr); ASSERT_EQ(*type_info.parent, OpType::get_type_info_static()); } + +class IncompleteRtti : public pass::MatcherPass { +public: + OPENVINO_RTTI("IncompleteRtti", "rtti_test"); +}; + +class DerivedIncompleteRtti : public IncompleteRtti { +public: + OPENVINO_RTTI("DerivedIncompleteRtti", "rtti_test", IncompleteRtti); +}; + +// Assert backward compatibility of RTTI definition without parent but casted with as_type or as_type pointer work +TEST(rtti, assert_casting_without_parent) { + { + IncompleteRtti incomplete; + DerivedIncompleteRtti derived; + + auto pass_A = as_type(&incomplete); + auto pass_B = as_type(&derived); + auto pass_C = as_type(&derived); + + EXPECT_NE(nullptr, pass_A); + EXPECT_NE(nullptr, pass_B); + EXPECT_NE(nullptr, pass_C); + + EXPECT_NE(nullptr, as_type(pass_A)); + EXPECT_NE(nullptr, as_type(pass_B)); + EXPECT_NE(nullptr, as_type(pass_B)); + EXPECT_NE(nullptr, as_type(pass_C)); + } + { + auto incomplete = std::make_shared(); + auto derived = std::make_shared(); + + auto pass_A = as_type_ptr(incomplete); + auto pass_B = as_type_ptr(derived); + auto pass_C = as_type_ptr(derived); + + EXPECT_NE(nullptr, pass_A); + EXPECT_NE(nullptr, pass_B); + EXPECT_NE(nullptr, pass_C); + + EXPECT_NE(nullptr, as_type_ptr(pass_A)); + EXPECT_NE(nullptr, as_type_ptr(pass_B)); + EXPECT_NE(nullptr, as_type_ptr(pass_B)); + EXPECT_NE(nullptr, as_type_ptr(pass_C)); + } +} + +} // namespace ov::test \ No newline at end of file From c51f22e4678bc4a1add70f9582be9c2c1c2a1ade Mon Sep 17 00:00:00 2001 From: Tomasz Jankowski Date: Mon, 20 Jan 2025 14:24:50 +0100 Subject: [PATCH 3/5] Fix typo Signed-off-by: Tomasz Jankowski --- src/core/tests/rtti.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/tests/rtti.cpp b/src/core/tests/rtti.cpp index 32ef5dc958fac9..444b69a6f1f9f3 100644 --- a/src/core/tests/rtti.cpp +++ b/src/core/tests/rtti.cpp @@ -101,7 +101,7 @@ class DerivedIncompleteRtti : public IncompleteRtti { OPENVINO_RTTI("DerivedIncompleteRtti", "rtti_test", IncompleteRtti); }; -// Assert backward compatibility of RTTI definition without parent but casted with as_type or as_type pointer work +// Assert backward compatibility of RTTI definition without parent but casted with as_type or as_type_ptr pointer work. TEST(rtti, assert_casting_without_parent) { { IncompleteRtti incomplete; From d81a04ae1e3486a7b45b37f5be81da50337cefdc Mon Sep 17 00:00:00 2001 From: Tomasz Jankowski Date: Mon, 20 Jan 2025 14:54:08 +0100 Subject: [PATCH 4/5] non android only Signed-off-by: Tomasz Jankowski --- src/core/tests/rtti.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/tests/rtti.cpp b/src/core/tests/rtti.cpp index 444b69a6f1f9f3..00fadffeca565b 100644 --- a/src/core/tests/rtti.cpp +++ b/src/core/tests/rtti.cpp @@ -91,6 +91,8 @@ TEST(rtti, op_with_type_version_parent_old) { ASSERT_EQ(*type_info.parent, OpType::get_type_info_static()); } +#if !defined(__ANDROID__) && !defined(ANDROID) + class IncompleteRtti : public pass::MatcherPass { public: OPENVINO_RTTI("IncompleteRtti", "rtti_test"); @@ -138,5 +140,5 @@ TEST(rtti, assert_casting_without_parent) { EXPECT_NE(nullptr, as_type_ptr(pass_C)); } } - +#endif // ANDROID } // namespace ov::test \ No newline at end of file From 4e2512a1a8243355dae1531af0929c5fbffd646f Mon Sep 17 00:00:00 2001 From: Tomasz Jankowski Date: Mon, 20 Jan 2025 14:58:03 +0100 Subject: [PATCH 5/5] Fix typo Signed-off-by: Tomasz Jankowski --- src/core/tests/rtti.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/tests/rtti.cpp b/src/core/tests/rtti.cpp index 00fadffeca565b..9cfa225f4a3010 100644 --- a/src/core/tests/rtti.cpp +++ b/src/core/tests/rtti.cpp @@ -141,4 +141,4 @@ TEST(rtti, assert_casting_without_parent) { } } #endif // ANDROID -} // namespace ov::test \ No newline at end of file +} // namespace ov::test