ZFFramework
 
Loading...
Searching...
No Matches
zfweak.h
Go to the documentation of this file.
1
5
6#ifndef _ZFI_zfweak_h_
7#define _ZFI_zfweak_h_
8
9#include "zfweak_fwd.h"
10
12
13// ============================================================
53public:
54 zfweak(void) : _ZFP_obj(zfnull) {}
55 zfweak(ZF_IN zfweak const &obj) : _ZFP_obj(zfobjRetain(obj._ZFP_obj)) {}
56 template<typename T_ZFObject>
57 zfweak(ZF_IN T_ZFObject const &obj) {
58 ZFObject *t = _ZFP_zfanyCast(obj);
59 _ZFP_obj = t ? zfobjRetain(t->_ZFP_ZFObject_weakHolder()) : zfnull;
60 }
61 ~zfweak(void) {
62 zfobjRelease(_ZFP_obj);
63 }
64
65public:
66 inline zfweak &operator = (ZF_IN zfweak const &obj) {
67 this->set(obj);
68 return *this;
69 }
70 template<typename T_ZFObject>
71 inline zfweak &operator = (ZF_IN T_ZFObject const &obj) {
72 this->set(obj);
73 return *this;
74 }
75
76public:
77 template<typename T_ZFObject>
78 inline zfbool operator == (ZF_IN T_ZFObject const &obj) const {
79 return this->toObject() == _ZFP_zfanyCast(obj);
80 }
81 template<typename T_ZFObject>
82 inline zfbool operator != (ZF_IN T_ZFObject const &obj) const {
83 return this->toObject() != _ZFP_zfanyCast(obj);
84 }
85
86public:
87 inline ZFObject *operator -> (void) const {
88 return this->toObject();
89 }
90 inline operator zfbool (void) const {
91 return this->toObject() != zfnull;
92 }
93 inline operator ZFObject * (void) const {
94 return this->toObject();
95 }
96 template<typename T_ZFObject>
97 inline operator T_ZFObject * (void) const {
98 return zfcast(T_ZFObject *, this->toObject());
99 }
100
101public:
102 static const ZFClass *ClassData(void) {
103 return ZFObject::ClassData();
104 }
106
107public:
111 inline zfbool valid(void) const {
112 return this->toObject() != zfnull;
113 }
114
118 inline zfany get(void) const {
119 return _ZFP_obj ? _ZFP_obj->get().toObject() : zfnull;
120 }
121
124 template<typename T_ZFObject>
125 void set(ZF_IN T_ZFObject const &obj) {
126 ZFObject *t = _ZFP_zfanyCast(obj);
127 _ZFP_I_zfweak *old = _ZFP_obj;
128 _ZFP_obj = (t ? zfobjRetain(t->_ZFP_ZFObject_weakHolder()) : zfnull);
129 zfobjRelease(old);
130 }
131
134 void set(ZF_IN const zfweak &obj) {
135 this->set(obj.toObject());
136 }
137
140 void set(ZF_IN zfnullT const &) {
141 _ZFP_I_zfweak *old = _ZFP_obj;
142 _ZFP_obj = zfnull;
143 zfobjRelease(old);
144 }
145
146public:
150 inline ZFObject *toObject(void) const {
151 return _ZFP_obj ? _ZFP_obj->get().toObject() : zfnull;
152 }
153
156 template<typename T_ZFObject>
157 inline T_ZFObject to(void) const {
158 return zfcast(T_ZFObject, this->toObject());
159 }
160
164 const zfany &asAny(void) const {
165 return _ZFP_obj;
166 }
167
168private:
169 zfanyT<_ZFP_I_zfweak> _ZFP_obj;
170};
172 if(v) {
173 s += "[weak]";
174 v.toObject()->objectInfoT(s);
175 }
176 else {
177 s += ZFTOKEN_zfnull;
178 }
179})
181 return ZFObjectCompare(v0.toObject(), v1.toObject());
182 })
185
186// ============================================================
190template<typename T_ZFObjectBase>
193public:
194 zfweakT(void) : zfweak() {}
195 zfweakT(ZF_IN zfweak const &obj) : zfweak(obj) {}
196 zfweakT(ZF_IN zfweakT<T_ZFObjectBase> const &obj) : zfweak((zfweak const &)obj) {}
197 template<typename T_ZFObject>
198 zfweakT(ZF_IN T_ZFObject const &obj) : zfweak(obj) {}
199
200public:
201 inline zfweakT<T_ZFObjectBase> &operator = (ZF_IN zfweak const &obj) {
202 this->set(obj);
203 return *this;
204 }
205 inline zfweakT<T_ZFObjectBase> &operator = (ZF_IN zfweakT<T_ZFObjectBase> const &obj) {
206 this->set(obj);
207 return *this;
208 }
209 template<typename T_ZFObject>
210 inline zfweakT<T_ZFObjectBase> &operator = (ZF_IN T_ZFObject const &obj) {
211 this->set(obj);
212 return *this;
213 }
214
215public:
216 template<typename T_ZFObject>
217 inline zfbool operator == (ZF_IN T_ZFObject const &obj) const {
218 return this->toObject() == _ZFP_zfanyCast(obj);
219 }
220 template<typename T_ZFObject>
221 inline zfbool operator != (ZF_IN T_ZFObject const &obj) const {
222 return this->toObject() != _ZFP_zfanyCast(obj);
223 }
224
225public:
226 inline T_ZFObjectBase *operator -> (void) const {
227 return zfcast(T_ZFObjectBase *, this->toObject());
228 }
229
230public:
231 inline ZFObject *toObject(void) const { // required for _ZFP_zfanyCast to work
232 return zfweak::toObject();
233 }
234
235public:
236 static const ZFClass *ClassData(void) {
237 return T_ZFObjectBase::ClassData();
238 }
240};
241ZFOUTPUT_TYPE_TEMPLATE(typename T_ZFObject, zfweakT<T_ZFObject>, {
242 if(v) {
243 s += "[weak]";
244 v.toObject()->objectInfoT(s);
245 }
246 else {
247 s += ZFTOKEN_zfnull;
248 }
249})
251template<typename T_ZFObject>
253public:
254 enum {
255 TypeIdRegistered = 1,
256 TypeIdSerializable = 1,
257 };
258 static inline const zfstring &TypeId(void) {
260 }
261 static inline const ZFClass *TypeIdClass(void) {
262 return v_zfweak::ClassData();
263 }
265 virtual zfbool typeIdSerializable(void) const {
266 return TypeIdSerializable;
267 }
269 virtual const zfstring &typeId(void) const {
270 return TypeId();
271 }
273 virtual const ZFClass *typeIdClass(void) const {
274 return TypeIdClass();
275 }
276 static zfbool ValueStore(
277 ZF_OUT zfauto &obj
278 , ZF_IN zfweakT<T_ZFObject> const &v
279 ) {
280 return ZFTypeId<zfweak>::ValueStore(obj, v);
281 }
282 template<typename T_Access = zfweakT<T_ZFObject>
283 , int T_Mode = ((zftTraits<typename zftTraits<T_Access>::TrNoRef>::TrIsPtr
284 && !zftIsSame<typename zftTraits<T_Access>::TrNoRef, zfweakT<T_ZFObject> >::Value) ? 1
285 : ((zftTraits<typename zftTraits<T_Access>::TrNoRef>::TrIsPtr
286 && zftIsSame<typename zftTraits<T_Access>::TrNoRef, zfweakT<T_ZFObject> >::Value
287 && !zftTraits<T_Access>::TrIsRef) ? 2 : 0))
288 , typename T_Fix = void
289 >
290 zfclassNotPOD Value {
291 public:
292 static zfbool zfvAccessAvailable(ZF_IN const zfauto &obj) {
294 }
295 static T_Access zfvAccess(ZF_IN const zfauto &obj) {
296 // zfweakT ensured safe for reinterpret cast
298 }
299 static zfauto zfvAccessFinish(ZF_IN const zfauto &obj) {
301 }
302 };
303 template<typename T_Access>
304 zfclassNotPOD Value<T_Access, 1> {
305 public:
306 static zfbool zfvAccessAvailable(ZF_IN const zfauto &obj) {
308 }
309 static typename zftTraits<T_Access>::TrNoRef zfvAccess(ZF_IN const zfauto &obj) {
310 // zfweakT ensured safe for reinterpret cast
312 }
313 static zfauto zfvAccessFinish(ZF_IN const zfauto &obj) {
315 }
316 };
317public:
319 virtual zfbool genericValueStore(ZF_OUT zfauto &obj, ZF_IN const void *v) const {
320 return ValueStore(obj, *(const zfweakT<T_ZFObject> *)v);
321 }
323 virtual void *genericAccess(ZF_IN const zfauto &obj) const {
324 if(!Value<zfweakT<T_ZFObject> >::zfvAccessAvailable(obj)) {
325 return zfnull;
326 }
327 else {
328 return _ZFP_genericAccessWrap<zfweakT<T_ZFObject> >(Value<zfweakT<T_ZFObject> >::zfvAccess(obj));
329 }
330 }
332 virtual zfauto genericAccessFinish(ZF_IN const zfauto &obj, ZF_IN void *v) const {
333 return _ZFP_genericAccessFinishWrap(Value<zfweakT<T_ZFObject> >::zfvAccessFinish(obj), v, _ZFP_genericAccessFinish<zfweakT<T_ZFObject> >);
334 }
336 virtual ZFCoreArrayBase *genericArrayNew(void) const {
337 return ZFCoreArray<zfweakT<T_ZFObject> >().refNew();
338 }
339};
341
343// ============================================================
344template<typename T_ZFObject>
345inline zfbool operator == (ZF_IN T_ZFObject *obj, ZF_IN zfweak const &e) {
346 return e.toObject() == _ZFP_zfanyCast(obj);
347}
348template<typename T_ZFObject>
349inline zfbool operator != (ZF_IN T_ZFObject *obj, ZF_IN zfweak const &e) {
350 return e.toObject() != _ZFP_zfanyCast(obj);
351}
352
353// ============================================================
354template<typename T_ZFObject, typename T_ZFObjectBase>
355inline zfbool operator == (ZF_IN T_ZFObject *obj, ZF_IN zfweakT<T_ZFObjectBase> const &e) {
356 return e.toObject() == _ZFP_zfanyCast(obj);
357}
358template<typename T_ZFObject, typename T_ZFObjectBase>
359inline zfbool operator != (ZF_IN T_ZFObject *obj, ZF_IN zfweakT<T_ZFObjectBase> const &e) {
360 return e.toObject() != _ZFP_zfanyCast(obj);
361}
363
364// ============================================================
365template<typename T_ZFObject>
366zfclassNotPOD _ZFP_zfweakCkT {
367public:
368 static inline void zfweakNotSupport(void) {}
369};
370template<> zfclassNotPOD _ZFP_zfweakCkT<zfweak> {};
371template<typename T_ZFObject> zfclassNotPOD _ZFP_zfweakCkT<zfweakT<T_ZFObject> > {};
372template<typename T_ZFObject>
373inline void _ZFP_zfweakCk(T_ZFObject &t) {
374 _ZFP_zfweakCkT<typename zftTraits<T_ZFObject>::TrNoRef>::zfweakNotSupport();
375}
376
378#endif // #ifndef _ZFI_zfweak_h_
379
#define ZFCOMPARER_DEFAULT_DECLARE(T_Comparable0, T_Comparable1, compareAction)
declare a template specialization for ZFComparerDefault
Definition ZFComparer.h:264
#define ZFLIB_ZFCore
used to export symbols
Definition ZFCoreEnvDef.h:30
#define zfclassLikePOD
shows the class is not a POD type, but you may use it like a POD except memset it to 0
Definition ZFCoreTypeDef_ClassType.h:41
#define zfextend
dummy macro shows class inherit from another
Definition ZFCoreTypeDef_ClassType.h:53
#define zfoverride
dummy macro shows that method override parent's method
Definition ZFCoreTypeDef_ClassType.h:58
#define ZF_IN
dummy macro that shows the param used as required input
Definition ZFCoreTypeDef_ClassType.h:184
#define ZF_OUT
dummy macro that shows the param used as required output
Definition ZFCoreTypeDef_ClassType.h:192
#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
_ZFT_t_zfbool zfbool
bool type
Definition ZFCoreTypeDef_CoreType.h:103
#define zfnull
same as NULL, defined for future use
Definition ZFCoreTypeDef_CoreType.h:88
#define ZFOUTPUT_TYPE(T_Type, outputAction)
declare your custom type conversion to string, convenient for debug
Definition ZFCoreTypeDef_OtherType.h:221
#define ZFOUTPUT_TYPE_TEMPLATE(T_typenameList, T_Type, outputAction)
see ZFOUTPUT_TYPE
Definition ZFCoreTypeDef_OtherType.h:262
#define ZFTOKEN_zfnull
string tokens
Definition ZFCoreTypeDef_OtherType.h:16
zft_zfstring< zfchar > zfstring
see zft_zfstring
Definition ZFCoreTypeDef_StringType.h:15
#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 zfobjRetain(obj)
retain an object, see ZFObject
Definition ZFObjectRetain.h:128
#define zfobjRelease(obj)
release an object, see ZFObject
Definition ZFObjectRetain.h:148
ZFCompareResult ZFObjectCompare(ZFObject *const &e0, ZFObject *const &e1)
util method to compare two ZFObject, return ZFCompareEqual if both null, return ZFCompareUncomparable...
Definition ZFObjectUtil.h:21
#define ZFTYPEID_ACCESS_ONLY_REG(ZFLIB_, TypeName, Type,...)
see ZFTYPEID_DECLARE
Definition ZFTypeIdDeclare.h:205
#define ZFTYPEID_ACCESS_ONLY_DECLARE(ZFLIB_, TypeName, Type)
see ZFTYPEID_DECLARE
Definition ZFTypeIdDeclare.h:195
ZFObject's class info.
Definition ZFClass.h:66
dummy base for ZFCoreArray
Definition ZFCoreArray.h:162
light weight array
Definition ZFCoreArray.h:342
base class of all objects
Definition ZFObjectCore.h:196
static const ZFClass * ClassData(void)
get class info
Definition ZFObjectCore.h:198
static zfauto zfvAccessFinish(const zfauto &obj)
finish access as raw value, see ZFTypeId::Value
static zfbool zfvAccessAvailable(const zfauto &obj)
try access as raw value, see ZFTypeId::Value
static T_Access zfvAccess(const zfauto &obj)
try access as raw value, see ZFTypeId::Value
type data traits for ZFTYPEID_DECLARE
Definition ZFTypeIdFwd.h:119
static const zfstring & TypeId(void)
get type id, or return ZFTypeId_none if not registered
static zfbool ValueStore(zfauto &obj, T_Type const &v)
store the value to wrapper object
base protocol for ZFTypeId
Definition ZFTypeIdFwd.h:24
static const ZFClass * ClassData(void)
get class info
Definition zfweak.h:183
util method to cast ZFObject types freely
Definition zfany.h:35
ZFObject * toObject(void) const
get the holded object
Definition zfany.h:92
see zfany
Definition zfany.h:113
a ZFObject holder which would release content object automatically when destroyed
Definition zfautoFwd.h:34
T_Type TrNoRef
remove reference
Definition ZFCoreUtilTemplate.h:112
weak reference to ZFObject
Definition zfweak.h:51
zfany get(void) const
get the holded object
Definition zfweak.h:118
const zfany & asAny(void) const
access as zfany
Definition zfweak.h:164
void set(T_ZFObject const &obj)
set the holded object
Definition zfweak.h:125
ZFObject * toObject(void) const
get the holded object
Definition zfweak.h:150
T_ZFObject to(void) const
cast by zfcast
Definition zfweak.h:157
void set(const zfweak &obj)
set the holded object
Definition zfweak.h:134
zfbool valid(void) const
true if the holded object is not null
Definition zfweak.h:111
void set(zft_zfnullT const &)
set the holded object
Definition zfweak.h:140
see zfweak
Definition zfweak.h:191
#define zfcast(T_To, obj)
safely cast ZFObject types, return null if not desired type
Definition zfcast.h:24
weak reference to ZFObject