ZFFramework
 
Loading...
Searching...
No Matches
ZFObjectCast.h
Go to the documentation of this file.
1
5
6#ifndef _ZFI_ZFObjectCast_h_
7#define _ZFI_ZFObjectCast_h_
8
10
12
16
17// ============================================================
28#define zfcast(T_To, obj) _ZFP_ObjCast<T_To>::c(obj)
29
30#define _ZFP_ObjCastInternal(T_To, obj) \
31 static_cast<T_To>(obj)
32
33
34// ============================================================
35// cast any to ZFObject
36template<typename T_Type, int isZFObject>
37zfclassNotPOD _ZFP_zfanyCastH {};
38template<>
39zfclassNotPOD _ZFP_zfanyCastH<zfnullT, 0> {
40public:
41 static inline ZFObject *c(ZF_IN zfnullT const &obj) {
42 return zfnull;
43 }
44};
45template<typename T_Type>
46zfclassNotPOD _ZFP_zfanyCastH<T_Type *, 1> {
47public:
48 static inline ZFObject *c(ZF_IN T_Type *const &obj) {
49 return obj ? obj->toObject() : zfnull;
50 }
51};
52template<typename T_Type>
53zfclassNotPOD _ZFP_zfanyCastH<T_Type, 1> {
54public:
55 static inline ZFObject *c(ZF_IN T_Type const &obj) {
56 return obj.toObject();
57 }
58};
59template<typename T_Type>
60inline ZFObject *_ZFP_zfanyCast(ZF_IN T_Type const &obj) {
61 typedef typename zftTraits<T_Type>::TrType T_TypeTmp;
62 return _ZFP_zfanyCastH<T_Type, zftIsZFObject(T_TypeTmp) || zftIsZFObjectType(T_TypeTmp)>::c(obj);
63}
64inline ZFObject *_ZFP_zfanyCast(ZF_IN ZFObject * const &obj) {
65 return obj;
66}
67
68// ============================================================
69// for impl
71template<typename T_ZFObjectTo, typename T_ZFObjectFrom>
72inline T_ZFObjectTo _ZFP_ObjCastImpl(T_ZFObjectFrom const &obj) {
73 return static_cast<T_ZFObjectTo>(obj->classData()->_ZFP_ZFClass_objectCast(obj, zftTraits<T_ZFObjectTo>::TrType::ClassData()));
74}
76
77
78// ============================================================
79#define _ZFP_ObjCastTypeZFObject 1
80#define _ZFP_ObjCastTypeZFInterface 2
81#define _ZFP_ObjCastTypeUnknown 3
82
83#define _ZFP_ObjCastType(TrType) \
84 (zftIsZFObject(TrType) \
85 ? (zftIsTypeOf<TrType, ZFObject>::Value \
86 ? _ZFP_ObjCastTypeZFObject \
87 : _ZFP_ObjCastTypeZFInterface \
88 ) \
89 : _ZFP_ObjCastTypeUnknown)
90
91
92// ============================================================
93// zfcast
94template<typename T_To>
95zfclassNotPOD _ZFP_ObjCast {
96public:
97 template<typename T_From>
98 static inline T_To c(ZF_IN T_From const &obj);
99};
100template<int T_CanCastDirectly, typename T_To, typename T_From, int T_ToType, int T_FromType>
101zfclassNotPOD _ZFP_ObjCastH {
102};
103
104// can cast directly
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> {
107public:
108 static inline T_To c(ZF_IN T_From const &obj) {
109 return static_cast<T_To>(obj);
110 }
111};
112// object to object
113template<typename T_To, typename T_From>
114zfclassNotPOD _ZFP_ObjCastH<0, T_To, T_From, _ZFP_ObjCastTypeZFObject, _ZFP_ObjCastTypeZFObject> {
115public:
116 static inline T_To c(ZF_IN T_From const &obj) {
117 return (obj
118 ? _ZFP_ObjCastImpl<T_To>(obj)
119 : zfnull);
120 }
121};
122// object to interface
123template<typename T_To, typename T_From>
124zfclassNotPOD _ZFP_ObjCastH<0, T_To, T_From, _ZFP_ObjCastTypeZFInterface, _ZFP_ObjCastTypeZFObject> {
125public:
126 static inline T_To c(ZF_IN T_From const &obj) {
127 return (obj
128 ? static_cast<T_To>(obj->classData()->_ZFP_ZFClass_interfaceCast(
129 obj,
131 : zfnull);
132 }
133};
134// interface to object
135template<typename T_To, typename T_From>
136zfclassNotPOD _ZFP_ObjCastH<0, T_To, T_From, _ZFP_ObjCastTypeZFObject, _ZFP_ObjCastTypeZFInterface> {
137public:
138 static inline T_To c(ZF_IN T_From const &obj) {
139 return (obj
140 ? _ZFP_ObjCastImpl<T_To>(obj->toObject())
141 : zfnull);
142 }
143};
144// interface to interface
145template<typename T_To, typename T_From>
146zfclassNotPOD _ZFP_ObjCastH<0, T_To, T_From, _ZFP_ObjCastTypeZFInterface, _ZFP_ObjCastTypeZFInterface> {
147public:
148 static inline T_To c(ZF_IN T_From const &obj) {
149 return (obj
150 ? static_cast<T_To>(obj->classData()->_ZFP_ZFClass_interfaceCast(
151 obj->toObject(),
153 : zfnull);
154 }
155};
156// unknown to any
157template<typename T_To, typename T_From, int T_ToType>
158zfclassNotPOD _ZFP_ObjCastH<0, T_To, T_From, T_ToType, _ZFP_ObjCastTypeUnknown> {
159public:
160 static inline T_To c(ZF_IN T_From const &obj) {
161 return zfcast(T_To, _ZFP_zfanyCast(obj));
162 }
163};
164// any to unknown
165template<typename T_To, typename T_From, int T_FromType>
166zfclassNotPOD _ZFP_ObjCastH<0, T_To, T_From, _ZFP_ObjCastTypeUnknown, T_FromType> {
167public:
168 static inline T_To c(ZF_IN T_From const &obj) {
169 return T_To(obj);
170 }
171};
172// unknown to unknown
173template<typename T_To, typename T_From>
174zfclassNotPOD _ZFP_ObjCastH<0, T_To, T_From, _ZFP_ObjCastTypeUnknown, _ZFP_ObjCastTypeUnknown> {
175public:
176 static inline T_To c(ZF_IN T_From const &obj) {
177 return T_To(_ZFP_zfanyCast(obj));
178 }
179};
180
181// invoker
182template<typename T_To>
183template<typename T_From>
184inline T_To _ZFP_ObjCast<T_To>::c(ZF_IN T_From const &obj) {
185 typedef typename zftTraits<T_To>::TrType T_ToTmp;
186 typedef typename zftTraits<T_From>::TrType T_FromTmp;
187 return _ZFP_ObjCastH<
189 T_To, T_From,
190 _ZFP_ObjCastType(T_ToTmp), _ZFP_ObjCastType(T_FromTmp)
191 >::c(obj);
192}
193// direct cast to ZFInterface is not allowed
194template<>
195zfclassNotPOD _ZFP_ObjCast<ZFInterface *> {};
196// spec for const void *
197template<>
198zfclassNotPOD _ZFP_ObjCast<const void *> {
199public:
200 template<typename T_From>
201 static inline const void *c(ZF_IN T_From const &obj) {
202 return (const void *)zfcast(ZFObject *, obj);
203 }
204};
205
207
208#endif // #ifndef _ZFI_ZFObjectCast_h_
209
#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
types for ZFFramework
#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