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