ZFFramework
Loading...
Searching...
No Matches
ZFObjectGlobalInstance.h
Go to the documentation of this file.
1
5#ifndef _ZFI_ZFObjectGlobalInstance_h_
6#define _ZFI_ZFObjectGlobalInstance_h_
7
8#include "ZFTypeId.h"
9#include "ZFMethodDeclare.h"
11
12// ============================================================
13// global instance cleaner
24 ZF_IN ZFObject *obj
26 );
29 ZF_IN ZFObject *obj
30 , ZF_IN ZFLevel level
31 );
32
33// ============================================================
34// private
35typedef void (*_ZFP_ZFClassSingletonDeleteCallback)(ZF_IN void *instance);
36extern ZFLIB_ZFCore void **_ZFP_ZFClassSingletonInstanceRefAccess(ZF_IN const zfstring &sig);
37
38zffinal zfclassNotPOD ZFLIB_ZFCore _ZFP_ZFClassSingletonDeleteCallbackHolder {
39public:
40 _ZFP_ZFClassSingletonDeleteCallback deleteCallback;
41 void *instance;
42public:
43 _ZFP_ZFClassSingletonDeleteCallbackHolder(
44 ZF_IN _ZFP_ZFClassSingletonDeleteCallback deleteCallback
45 , ZF_IN void *instance
46 )
47 : deleteCallback(deleteCallback)
48 , instance(instance)
49 {
50 }
51 ~_ZFP_ZFClassSingletonDeleteCallbackHolder(void) {
52 if(this->deleteCallback && this->instance) {
53 this->deleteCallback(this->instance);
54 }
55 }
56};
57
58// ============================================================
59// singleton for normal class type
60#define _ZFP_ZFCLASS_SINGLETON_DECLARE(SetterAccessType, GetterAccessType, \
61 AccessTypeName, accessMethodName) \
62 GetterAccessType: \
63 \
64 static AccessTypeName *accessMethodName(void); \
65 SetterAccessType: \
66 \
67 static void accessMethodName(ZF_IN AccessTypeName *newInstance); \
68 private: \
69 static ZFObject *&_ZFP_ClsSIC_##accessMethodName(void); /* ClassSingletonCleaner */ \
70 static void _ZFP_ClsSID_##accessMethodName(ZF_IN void *instance); /* ClassSingletonOnDelete */ \
71 public:
72#define _ZFP_ZFCLASS_SINGLETON_DEFINE(OwnerClass, AccessTypeName, ObjectTypeName, sig, accessMethodName, \
73 ZFLevel_, \
74 newAction, retainAction, releaseAction) \
75 AccessTypeName *OwnerClass::accessMethodName(void) { \
76 static void **holder = _ZFP_ZFClassSingletonInstanceRefAccess(sig); \
77 if(*holder == zfnull) { \
78 if(ZFFrameworkStateCheck(ZFLevel_) == ZFFrameworkStateNotAvailable) { \
79 return zfnull; \
80 } \
81 AccessTypeName *t = newAction(ObjectTypeName); \
82 OwnerClass::accessMethodName(t); \
83 releaseAction(t); \
84 } \
85 return (AccessTypeName *)(*holder); \
86 } \
87 void OwnerClass::accessMethodName(ZF_IN AccessTypeName *newInstance) { \
88 if(ZFFrameworkStateCheck(ZFLevel_) == ZFFrameworkStateNotAvailable) { \
89 return; \
90 } \
91 void **holder = _ZFP_ZFClassSingletonInstanceRefAccess(sig); \
92 if(*holder == (void *)newInstance) { \
93 return; \
94 } \
95 ZFCoreMutexLocker(); \
96 ZFObject *&cleanerRef = OwnerClass::_ZFP_ClsSIC_##accessMethodName(); \
97 zfauto cleanerOld = cleanerRef; \
98 cleanerRef = zfnull; \
99 AccessTypeName *newInstanceValue = zfnull; \
100 if(newInstance != zfnull) { \
101 newInstanceValue = retainAction(newInstance); \
102 *holder = (void *)newInstanceValue; \
103 zfobj<ZFValue> cleanerRefTmp(*holder, OwnerClass::_ZFP_ClsSID_##accessMethodName); \
104 cleanerRef = cleanerRefTmp; \
105 ZFObjectGlobalInstanceAdd(cleanerRef, ZFLevel_); \
106 } \
107 if(cleanerOld != zfnull) { \
108 ZFObjectGlobalInstanceRemove(cleanerOld, ZFLevel_); \
109 *holder = (void *)newInstanceValue; \
110 } \
111 } \
112 ZFObject *&OwnerClass::_ZFP_ClsSIC_##accessMethodName(void) { \
113 static ZFObject *_cleaner = zfnull; \
114 return _cleaner; \
115 } \
116 void OwnerClass::_ZFP_ClsSID_##accessMethodName(ZF_IN void *instance) { \
117 OwnerClass::_ZFP_ClsSIC_##accessMethodName() = zfnull; \
118 void **holder = _ZFP_ZFClassSingletonInstanceRefAccess(sig); \
119 *holder = zfnull; \
120 releaseAction((AccessTypeName *)instance); \
121 }
147#define ZFCLASS_SINGLETON_DECLARE(AccessTypeName, accessMethodName) \
148 ZFCLASS_SINGLETON_DECLARE_DETAIL(protected, public, AccessTypeName, accessMethodName)
149
152#define ZFCLASS_SINGLETON_DECLARE_DETAIL(SetterAccessType, GetterAccessType, AccessTypeName, accessMethodName) \
153 _ZFP_ZFCLASS_SINGLETON_DECLARE(SetterAccessType, GetterAccessType, AccessTypeName, accessMethodName)
154
157#define ZFCLASS_SINGLETON_DEFINE(OwnerClass, accessMethodName) \
158 ZFCLASS_SINGLETON_DEFINE_DETAIL(OwnerClass, OwnerClass, OwnerClass, accessMethodName, ZFLevelAppNormal)
159
162#define ZFCLASS_SINGLETON_DEFINE_WITH_LEVEL(OwnerClass, accessMethodName, ZFLevel_) \
163 ZFCLASS_SINGLETON_DEFINE_DETAIL(OwnerClass, OwnerClass, OwnerClass, accessMethodName, ZFLevel_)
164
167#define ZFCLASS_SINGLETON_DEFINE_DETAIL(OwnerClass, AccessTypeName, ObjectTypeName, accessMethodName, ZFLevel_) \
168 _ZFP_ZFCLASS_SINGLETON_DEFINE(OwnerClass, AccessTypeName, ObjectTypeName, \
169 zfstr("_ZFP_ZFClass_%s_%s", #AccessTypeName, #accessMethodName), \
170 accessMethodName, ZFLevel_, \
171 zfnew, ZFM_EXPAND, zfdelete)
172
173// ============================================================
174// singleton for ZFObject
175#define _ZFP_ZFOBJECT_SINGLETON_DECLARE(SetterAccessType, GetterAccessType, \
176 AccessTypeName, accessMethodName) \
177 GetterAccessType: \
178 \
179 ZFMETHOD_DECLARE_DETAIL_0( \
180 GetterAccessType, ZFMethodTypeStatic, \
181 AccessTypeName *, accessMethodName \
182 ) \
183 SetterAccessType: \
184 \
185 ZFMETHOD_DECLARE_DETAIL_1( \
186 SetterAccessType, ZFMethodTypeStatic, \
187 void, accessMethodName \
188 , ZFMP_IN(AccessTypeName *, param0) \
189 ) \
190 \
191 private: \
192 _ZFP_ZFCLASS_SINGLETON_DECLARE(private, private, \
193 AccessTypeName, _ZFP_ZFObjectSingleton_##accessMethodName) \
194 \
195 public:
196#define _ZFP_ZFOBJECT_SINGLETON_DEFINE(OwnerClass, \
197 AccessTypeName, ObjectTypeName, sig, accessMethodName, \
198 ZFLevel_) \
199 _ZFP_ZFCLASS_SINGLETON_DEFINE(OwnerClass, \
200 AccessTypeName, ObjectTypeName, sig, _ZFP_ZFObjectSingleton_##accessMethodName, \
201 ZFLevel_, \
202 zfobjAlloc, zfobjRetain, zfobjRelease) \
203 ZFMETHOD_DEFINE_DETAIL_0(OwnerClass, G, \
204 AccessTypeName *, accessMethodName \
205 ) { \
206 return zfself::_ZFP_ZFObjectSingleton_##accessMethodName(); \
207 } \
208 ZFMETHOD_DEFINE_DETAIL_1(OwnerClass, S, \
209 void, accessMethodName \
210 , ZFMP_IN(AccessTypeName *, param0) \
211 ) { \
212 if(ZFFrameworkStateCheck(ZFLevel_) == ZFFrameworkStateNotAvailable) { \
213 return; \
214 } \
215 zfself::_ZFP_ZFObjectSingleton_##accessMethodName(param0); \
216 }
217
243#define ZFOBJECT_SINGLETON_DECLARE(AccessTypeName, accessMethodName) \
244 ZFOBJECT_SINGLETON_DECLARE_DETAIL(protected, public, AccessTypeName, accessMethodName)
245
248#define ZFOBJECT_SINGLETON_DECLARE_DETAIL(SetterAccessType, GetterAccessType, AccessTypeName, accessMethodName) \
249 _ZFP_ZFOBJECT_SINGLETON_DECLARE(SetterAccessType, GetterAccessType, AccessTypeName, accessMethodName)
250
253#define ZFOBJECT_SINGLETON_DEFINE(OwnerClass, accessMethodName) \
254 ZFOBJECT_SINGLETON_DEFINE_DETAIL(OwnerClass, OwnerClass, OwnerClass, accessMethodName, ZFLevelAppNormal)
255
258#define ZFOBJECT_SINGLETON_DEFINE_WITH_LEVEL(OwnerClass, accessMethodName, ZFLevel_) \
259 ZFOBJECT_SINGLETON_DEFINE_DETAIL(OwnerClass, OwnerClass, OwnerClass, accessMethodName, ZFLevel_)
260
263#define ZFOBJECT_SINGLETON_DEFINE_DETAIL(OwnerClass, \
264 AccessTypeName, ObjectTypeName, accessMethodName, \
265 ZFLevel_) \
266 _ZFP_ZFOBJECT_SINGLETON_DEFINE(OwnerClass, \
267 AccessTypeName, ObjectTypeName, \
268 zfstr("_ZFP_ZFObject_%s_%s_%s", zfself::ClassData()->classNameFull(), #AccessTypeName, #accessMethodName), \
269 accessMethodName, \
270 ZFLevel_)
271
273#endif // #ifndef _ZFI_ZFObjectGlobalInstance_h_
274
#define ZFLIB_ZFCore
used to export symbols
Definition ZFCoreEnvDef.h:30
#define zffinal
dummy macro shows that a method or class is designed must not to be overrided
Definition ZFCoreTypeDef_ClassType.h:63
#define ZF_IN
dummy macro that shows the param used as required input
Definition ZFCoreTypeDef_ClassType.h:191
#define ZF_IN_OPT
dummy macro that shows the param used as optional input
Definition ZFCoreTypeDef_ClassType.h:195
#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
zft_zfstring< zfchar > zfstring
see zft_zfstring
Definition ZFCoreTypeDef_StringType.h:15
ZFLevel
level for logic which depends on order
Definition ZFLevel.h:17
@ ZFLevelAppNormal
app
Definition ZFLevel.h:26
ZFMethod declaration.
#define ZF_NAMESPACE_GLOBAL_BEGIN
begin namespace ZFFramework
Definition ZFNamespace.h:97
#define ZF_NAMESPACE_GLOBAL_END
end namespace ZFFramework
Definition ZFNamespace.h:98
void ZFObjectGlobalInstanceAdd(ZFObject *obj, ZFLevel level=ZFLevelAppNormal)
add a global instance that would be auto deleted while ZFFrameworkCleanup
void ZFObjectGlobalInstanceRemove(ZFObject *obj, ZFLevel level)
see ZFObjectGlobalInstanceAdd
reflectable type define
base class of all objects
Definition ZFObjectCore.h:195