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