mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-01-18 19:48:07 +00:00
feat(c-wrapper): IsDefinedCppObject check inheritance and consistency between cpp and c objects \o/
This commit is contained in:
parent
9ce0960e32
commit
a67a7fbcc3
1 changed files with 25 additions and 5 deletions
|
|
@ -36,7 +36,10 @@ LINPHONE_BEGIN_NAMESPACE
|
|||
|
||||
template<typename CppType>
|
||||
struct CppTypeToCType {
|
||||
enum { defined = false };
|
||||
enum {
|
||||
defined = false,
|
||||
isSubtype = false
|
||||
};
|
||||
typedef void type;
|
||||
};
|
||||
|
||||
|
|
@ -58,17 +61,27 @@ private:
|
|||
};
|
||||
};
|
||||
|
||||
template<typename CppType>
|
||||
struct IsDefinedCppObject {
|
||||
enum {
|
||||
value = CppTypeToCType<CppType>::defined && (
|
||||
!CppTypeToCType<CppType>::isSubtype ||
|
||||
std::is_base_of<typename CTypeToCppType<typename CppTypeToCType<CppType>::type>::type, CppType>::value
|
||||
)
|
||||
};
|
||||
};
|
||||
|
||||
template<typename CppType>
|
||||
struct IsDefinedNotClonableCppObject {
|
||||
enum {
|
||||
value = CppTypeToCType<CppType>::defined && std::is_base_of<Object, CppType>::value
|
||||
value = IsDefinedCppObject<CppType>::value && std::is_base_of<Object, CppType>::value
|
||||
};
|
||||
};
|
||||
|
||||
template<typename CppType>
|
||||
struct IsDefinedClonableCppObject {
|
||||
enum {
|
||||
value = CppTypeToCType<CppType>::defined && std::is_base_of<ClonableObject, CppType>::value
|
||||
value = IsDefinedCppObject<CppType>::value && std::is_base_of<ClonableObject, CppType>::value
|
||||
};
|
||||
};
|
||||
|
||||
|
|
@ -340,7 +353,10 @@ LINPHONE_END_NAMESPACE
|
|||
class CPP_TYPE; \
|
||||
template<> \
|
||||
struct CppTypeToCType<CPP_TYPE> { \
|
||||
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<CPP_TYPE>::defined, "Type base is not defined"); \
|
||||
template<> \
|
||||
struct CppTypeToCType<CPP_SUBTYPE> { \
|
||||
enum { defined = true }; \
|
||||
enum { \
|
||||
defined = true, \
|
||||
isSubtype = true \
|
||||
}; \
|
||||
typedef CppTypeToCType<CPP_TYPE>::type type; \
|
||||
}; \
|
||||
template<> \
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue