ZFFramework
Loading...
Searching...
No Matches
ZFObjectRetain.h
Go to the documentation of this file.
1
5
6#ifndef _ZFI_ZFObjectRetain_h_
7#define _ZFI_ZFObjectRetain_h_
8
9#include "ZFObjectCore.h"
11
12// ============================================================
13// zfobjAlloc
14/* ZFMETHOD_MAX_PARAM */
15template<typename T_ZFObject, int valid>
16zfclassNotPOD _ZFP_ObjACk; // alloc check
17template<typename T_ZFObject>
18zfclassNotPOD _ZFP_ObjACk<T_ZFObject, 1> {
19public:
20 static inline T_ZFObject *A(void) {
21 ZFObject *obj = T_ZFObject::_ZFP_Obj_ctor();
22 obj->_ZFP_ZFObject_objectOnInit();
23 obj->_ZFP_ZFObject_objectOnInitFinish();
24 return _ZFP_ObjCastInternal(T_ZFObject *, obj);
25 }
26public:
27 static inline T_ZFObject *CanAlloc(void);
28 template<typename P0>
29 static inline T_ZFObject *CanAlloc(P0 const &p0) {
30 T_ZFObject *obj = _ZFP_ObjCastInternal(T_ZFObject *, T_ZFObject::_ZFP_Obj_ctor());
31 obj->_ZFP_ZFObject_objectOnInit();
32 obj->objectOnInit(p0);
33 obj->_ZFP_ZFObject_objectOnInitFinish();
34 return obj;
35 }
36 template<typename P0, typename P1>
37 static inline T_ZFObject *CanAlloc(P0 const &p0, P1 const &p1) {
38 T_ZFObject *obj = _ZFP_ObjCastInternal(T_ZFObject *, T_ZFObject::_ZFP_Obj_ctor());
39 obj->_ZFP_ZFObject_objectOnInit();
40 obj->objectOnInit(p0, p1);
41 obj->_ZFP_ZFObject_objectOnInitFinish();
42 return obj;
43 }
44 template<typename P0, typename P1, typename P2>
45 static inline T_ZFObject *CanAlloc(P0 const &p0, P1 const &p1, P2 const &p2) {
46 T_ZFObject *obj = _ZFP_ObjCastInternal(T_ZFObject *, T_ZFObject::_ZFP_Obj_ctor());
47 obj->_ZFP_ZFObject_objectOnInit();
48 obj->objectOnInit(p0, p1, p2);
49 obj->_ZFP_ZFObject_objectOnInitFinish();
50 return obj;
51 }
52 template<typename P0, typename P1, typename P2, typename P3>
53 static inline T_ZFObject *CanAlloc(P0 const &p0, P1 const &p1, P2 const &p2, P3 const &p3) {
54 T_ZFObject *obj = _ZFP_ObjCastInternal(T_ZFObject *, T_ZFObject::_ZFP_Obj_ctor());
55 obj->_ZFP_ZFObject_objectOnInit();
56 obj->objectOnInit(p0, p1, p2, p3);
57 obj->_ZFP_ZFObject_objectOnInitFinish();
58 return obj;
59 }
60 template<typename P0, typename P1, typename P2, typename P3, typename P4>
61 static inline T_ZFObject *CanAlloc(P0 const &p0, P1 const &p1, P2 const &p2, P3 const &p3, P4 const &p4) {
62 T_ZFObject *obj = _ZFP_ObjCastInternal(T_ZFObject *, T_ZFObject::_ZFP_Obj_ctor());
63 obj->_ZFP_ZFObject_objectOnInit();
64 obj->objectOnInit(p0, p1, p2, p3, p4);
65 obj->_ZFP_ZFObject_objectOnInitFinish();
66 return obj;
67 }
68 template<typename P0, typename P1, typename P2, typename P3, typename P4, typename P5>
69 static inline T_ZFObject *CanAlloc(P0 const &p0, P1 const &p1, P2 const &p2, P3 const &p3, P4 const &p4, P5 const &p5) {
70 T_ZFObject *obj = _ZFP_ObjCastInternal(T_ZFObject *, T_ZFObject::_ZFP_Obj_ctor());
71 obj->_ZFP_ZFObject_objectOnInit();
72 obj->objectOnInit(p0, p1, p2, p3, p4, p5);
73 obj->_ZFP_ZFObject_objectOnInitFinish();
74 return obj;
75 }
76 template<typename P0, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
77 static inline T_ZFObject *CanAlloc(P0 const &p0, P1 const &p1, P2 const &p2, P3 const &p3, P4 const &p4, P5 const &p5, P6 const &p6) {
78 T_ZFObject *obj = _ZFP_ObjCastInternal(T_ZFObject *, T_ZFObject::_ZFP_Obj_ctor());
79 obj->_ZFP_ZFObject_objectOnInit();
80 obj->objectOnInit(p0, p1, p2, p3, p4, p5, p6);
81 obj->_ZFP_ZFObject_objectOnInitFinish();
82 return obj;
83 }
84 template<typename P0, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7>
85 static inline T_ZFObject *CanAlloc(P0 const &p0, P1 const &p1, P2 const &p2, P3 const &p3, P4 const &p4, P5 const &p5, P6 const &p6, P7 const &p7) {
86 T_ZFObject *obj = _ZFP_ObjCastInternal(T_ZFObject *, T_ZFObject::_ZFP_Obj_ctor());
87 obj->_ZFP_ZFObject_objectOnInit();
88 obj->objectOnInit(p0, p1, p2, p3, p4, p5, p6, p7);
89 obj->_ZFP_ZFObject_objectOnInitFinish();
90 return obj;
91 }
92};
93template<typename T_ZFObject>
94zfclassNotPOD _ZFP_ObjACk<T_ZFObject, 0> {
95};
96#define _ZFP_zfobjAlloc(T_ZFObject, ...) \
97 _ZFP_ObjACk<T_ZFObject, T_ZFObject::_ZFP_ZFObjectCanAlloc && T_ZFObject::_ZFP_ZFObjectCanAllocPublic>::CanAlloc(__VA_ARGS__)
101#define zfobjAlloc(T_ZFObject, ...) \
102 zfunsafe_zfobjAlloc(T_ZFObject, ##__VA_ARGS__)
103
104#define zfunsafe_zfobjAlloc(T_ZFObject, ...) \
105 _ZFP_zfobjAlloc(T_ZFObject, ##__VA_ARGS__)
106
107#define _ZFP_zfobjAllocInternal(T_ZFObject) \
108 _ZFP_ObjACk<T_ZFObject, T_ZFObject::_ZFP_ZFObjectCanAlloc && T_ZFObject::_ZFP_ZFObjectCanAllocPublic>::A()
109
110// ============================================================
111// zfobjRetain
112inline void _ZFP_zfobjRetainAction(ZF_IN ZFObject *obj) {
113 if(obj) {
114 obj->objectOnRetain();
115 }
116}
117template<typename T_ZFObject>
118inline T_ZFObject const &_ZFP_zfobjRetain(ZF_IN T_ZFObject const &obj) {
119 _ZFP_zfobjRetainAction(zfcast(ZFObject *, obj));
120 return obj;
121}
125#define zfobjRetain(obj) \
126 (ZFCoreMutexLockerHolder(), zfunsafe_zfobjRetain(obj))
127
128#define zfunsafe_zfobjRetain(obj) \
129 _ZFP_zfobjRetain(obj)
130
131// ============================================================
132// zfobjRelease
133inline void _ZFP_zfobjReleaseAction(ZF_IN ZFObject *obj) {
134 if(obj) {
135 obj->_ZFP_ZFObjectCheckRelease();
136 }
137}
138template<typename T_ZFObject>
139inline void _ZFP_zfobjRelease(ZF_IN T_ZFObject const &obj) {
140 _ZFP_zfobjReleaseAction(zfcast(ZFObject *, obj));
141}
145#define zfobjRelease(obj) \
146 (ZFCoreMutexLockerHolder(), zfunsafe_zfobjRelease(obj))
147
148#define zfunsafe_zfobjRelease(obj) \
149 _ZFP_zfobjRelease(obj)
150
151template<typename T_ZFObject>
152T_ZFObject *_ZFP_ObjACk<T_ZFObject, 1>::CanAlloc(void) {
153 return _ZFP_ObjACk<T_ZFObject, 1>::A();
154}
155
156// ============================================================
157template<typename T_ZFObject> void _ZFP_zfweakCk(T_ZFObject &t);
186template<typename T_ZFObject, typename T_ZFObject2>
187inline void zfobjRetainChange(ZF_IN T_ZFObject &obj, ZF_IN T_ZFObject2 const &v) {
189 _ZFP_zfweakCk(obj);
190 ZFObject *tmp = zfcast(ZFObject *, obj);
191 zfunsafe_zfobjRetain(obj = v);
194}
195
196template<typename T_ZFObject, typename T_ZFObject2>
197inline void zfunsafe_zfobjRetainChange(ZF_IN T_ZFObject &obj, ZF_IN T_ZFObject2 const &v) {
198 _ZFP_zfweakCk(obj);
199 ZFObject *tmp = zfcast(ZFObject *, obj);
200 zfunsafe_zfobjRetain(obj = v);
202}
203
205#endif // #ifndef _ZFI_ZFObjectRetain_h_
206
#define ZFCoreMutexUnlock()
see ZFCoreMutexLock
Definition ZFCoreMutex.h:58
#define ZFCoreMutexLock()
internal use only
Definition ZFCoreMutex.h:51
#define ZF_IN
dummy macro that shows the param used as required input
Definition ZFCoreTypeDef_ClassType.h:191
#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 ZF_NAMESPACE_GLOBAL_BEGIN
begin namespace ZFFramework
Definition ZFNamespace.h:97
#define ZF_NAMESPACE_GLOBAL_END
end namespace ZFFramework
Definition ZFNamespace.h:98
base class of all objects
#define zfunsafe_zfobjRelease(obj)
no lock version of zfobjRelease, use with caution
Definition ZFObjectRetain.h:148
void zfunsafe_zfobjRetainChange(T_ZFObject &obj, T_ZFObject2 const &v)
no lock version of zfobjRetainChange, use with caution
Definition ZFObjectRetain.h:197
void zfobjRetainChange(T_ZFObject &obj, T_ZFObject2 const &v)
util to release property's old value, retain new value, then set to property
Definition ZFObjectRetain.h:187
#define zfunsafe_zfobjRetain(obj)
no lock version of zfobjRetain, use with caution
Definition ZFObjectRetain.h:128
base class of all objects
Definition ZFObjectCore.h:195
#define zfcast(T_To, obj)
safely cast ZFObject types, return null if not desired type
Definition zfcast.h:24