6#ifndef _ZFI_ZFObjectCast_h_
7#define _ZFI_ZFObjectCast_h_
28#define zfcast(T_To, obj) _ZFP_ObjCast<T_To>::c(obj)
30#define _ZFP_ObjCastInternal(T_To, obj) \
31 static_cast<T_To>(obj)
36template<
typename T_Type,
int isZFObject>
45template<
typename T_Type>
49 return obj ? obj->toObject() :
zfnull;
52template<
typename T_Type>
56 return obj.toObject();
59template<
typename T_Type>
71template<
typename T_ZFObjectTo,
typename T_ZFObjectFrom>
72inline T_ZFObjectTo _ZFP_ObjCastImpl(T_ZFObjectFrom
const &obj) {
79#define _ZFP_ObjCastTypeZFObject 1
80#define _ZFP_ObjCastTypeZFInterface 2
81#define _ZFP_ObjCastTypeUnknown 3
83#define _ZFP_ObjCastType(TrType) \
84 (zftIsZFObject(TrType) \
85 ? (zftIsTypeOf<TrType, ZFObject>::Value \
86 ? _ZFP_ObjCastTypeZFObject \
87 : _ZFP_ObjCastTypeZFInterface \
89 : _ZFP_ObjCastTypeUnknown)
94template<
typename T_To>
97 template<
typename T_From>
98 static inline T_To c(
ZF_IN T_From
const &obj);
100template<
int T_CanCastDirectly,
typename T_To,
typename T_From,
int T_ToType,
int T_FromType>
105template<
typename T_To,
typename T_From,
int T_ToType,
int T_FromType>
106zfclassNotPOD _ZFP_ObjCastH<1, T_To, T_From, T_ToType, T_FromType> {
108 static inline T_To c(
ZF_IN T_From
const &obj) {
109 return static_cast<T_To
>(obj);
113template<
typename T_To,
typename T_From>
114zfclassNotPOD _ZFP_ObjCastH<0, T_To, T_From, _ZFP_ObjCastTypeZFObject, _ZFP_ObjCastTypeZFObject> {
116 static inline T_To c(
ZF_IN T_From
const &obj) {
118 ? _ZFP_ObjCastImpl<T_To>(obj)
123template<
typename T_To,
typename T_From>
124zfclassNotPOD _ZFP_ObjCastH<0, T_To, T_From, _ZFP_ObjCastTypeZFInterface, _ZFP_ObjCastTypeZFObject> {
126 static inline T_To c(
ZF_IN T_From
const &obj) {
128 ?
static_cast<T_To
>(obj->classData()->_ZFP_ZFClass_interfaceCast(
135template<
typename T_To,
typename T_From>
136zfclassNotPOD _ZFP_ObjCastH<0, T_To, T_From, _ZFP_ObjCastTypeZFObject, _ZFP_ObjCastTypeZFInterface> {
138 static inline T_To c(
ZF_IN T_From
const &obj) {
140 ? _ZFP_ObjCastImpl<T_To>(obj->toObject())
145template<
typename T_To,
typename T_From>
146zfclassNotPOD _ZFP_ObjCastH<0, T_To, T_From, _ZFP_ObjCastTypeZFInterface, _ZFP_ObjCastTypeZFInterface> {
148 static inline T_To c(
ZF_IN T_From
const &obj) {
150 ?
static_cast<T_To
>(obj->classData()->_ZFP_ZFClass_interfaceCast(
157template<
typename T_To,
typename T_From,
int T_ToType>
158zfclassNotPOD _ZFP_ObjCastH<0, T_To, T_From, T_ToType, _ZFP_ObjCastTypeUnknown> {
160 static inline T_To c(
ZF_IN T_From
const &obj) {
161 return zfcast(T_To, _ZFP_zfanyCast(obj));
165template<
typename T_To,
typename T_From,
int T_FromType>
166zfclassNotPOD _ZFP_ObjCastH<0, T_To, T_From, _ZFP_ObjCastTypeUnknown, T_FromType> {
168 static inline T_To c(
ZF_IN T_From
const &obj) {
173template<
typename T_To,
typename T_From>
174zfclassNotPOD _ZFP_ObjCastH<0, T_To, T_From, _ZFP_ObjCastTypeUnknown, _ZFP_ObjCastTypeUnknown> {
176 static inline T_To c(
ZF_IN T_From
const &obj) {
177 return T_To(_ZFP_zfanyCast(obj));
182template<
typename T_To>
183template<
typename T_From>
184inline T_To _ZFP_ObjCast<T_To>::c(
ZF_IN T_From
const &obj) {
187 return _ZFP_ObjCastH<
190 _ZFP_ObjCastType(T_ToTmp), _ZFP_ObjCastType(T_FromTmp)
200 template<
typename T_From>
201 static inline const void *c(
ZF_IN T_From
const &obj) {
#define ZF_IN
dummy macro that shows the param used as required input
Definition ZFCoreTypeDef_ClassType.h:180
#define zfclassNotPOD
shows the class is not a POD type, you should not memset it or declare it in stack or copy value by c...
Definition ZFCoreTypeDef_ClassType.h:48
#define zfclassFwd
forward declaration of a class type
Definition ZFCoreTypeDef_ClassType.h:31
#define zfnullT
type for zfnull, can be used for function overload
Definition ZFCoreTypeDef_CoreType.h:85
#define zfnull
same as NULL, defined for future use
Definition ZFCoreTypeDef_CoreType.h:88
#define ZF_NAMESPACE_GLOBAL_BEGIN
begin namespace ZFFramework
Definition ZFNamespace.h:97
#define ZF_NAMESPACE_GLOBAL_END
end namespace ZFFramework
Definition ZFNamespace.h:98
#define zfcast(T_To, obj)
safely cast ZFObject types, return null if not desired type
Definition ZFObjectCast.h:28
#define zftIsZFObjectType(Type)
true if Type can cast to ZFObject
Definition ZFObjectClassTypeFwd.h:122
#define zftIsZFObject(Type)
true if Type is ZFObject type or ZFInterface type
Definition ZFObjectClassTypeFwd.h:106
ZFObject's class info.
Definition ZFClass.h:67
dummy base of interface types
Definition ZFObjectInterface.h:250
base class of all objects
Definition ZFObjectCore.h:209
std::is_base_of wrapper
Definition ZFCoreUtilTemplate.h:459
type traits similar to STL's traits
Definition ZFCoreUtilTemplate.h:98
T_Type TrType
normal type
Definition ZFCoreUtilTemplate.h:105