From a67a7fbcc311dc44eff27d3ef552e74237f2543b Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 26 Sep 2017 17:43:18 +0200 Subject: [PATCH] feat(c-wrapper): IsDefinedCppObject check inheritance and consistency between cpp and c objects \o/ --- src/c-wrapper/internal/c-tools.h | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/c-wrapper/internal/c-tools.h b/src/c-wrapper/internal/c-tools.h index 9cffcacff..9d6e90999 100644 --- a/src/c-wrapper/internal/c-tools.h +++ b/src/c-wrapper/internal/c-tools.h @@ -36,7 +36,10 @@ LINPHONE_BEGIN_NAMESPACE template struct CppTypeToCType { - enum { defined = false }; + enum { + defined = false, + isSubtype = false + }; typedef void type; }; @@ -58,17 +61,27 @@ private: }; }; + template + struct IsDefinedCppObject { + enum { + value = CppTypeToCType::defined && ( + !CppTypeToCType::isSubtype || + std::is_base_of::type>::type, CppType>::value + ) + }; + }; + template struct IsDefinedNotClonableCppObject { enum { - value = CppTypeToCType::defined && std::is_base_of::value + value = IsDefinedCppObject::value && std::is_base_of::value }; }; template struct IsDefinedClonableCppObject { enum { - value = CppTypeToCType::defined && std::is_base_of::value + value = IsDefinedCppObject::value && std::is_base_of::value }; }; @@ -340,7 +353,10 @@ LINPHONE_END_NAMESPACE class CPP_TYPE; \ template<> \ struct CppTypeToCType { \ - enum { defined = true }; \ + enum { \ + defined = true, \ + isSubtype = false \ + }; \ typedef Linphone ## C_TYPE type; \ }; \ template<> \ @@ -359,9 +375,13 @@ LINPHONE_END_NAMESPACE #define L_REGISTER_SUBTYPE(CPP_TYPE, CPP_SUBTYPE) \ LINPHONE_BEGIN_NAMESPACE \ class CPP_SUBTYPE; \ + static_assert(CppTypeToCType::defined, "Type base is not defined"); \ template<> \ struct CppTypeToCType { \ - enum { defined = true }; \ + enum { \ + defined = true, \ + isSubtype = true \ + }; \ typedef CppTypeToCType::type type; \ }; \ template<> \