5#ifndef _ZFI_ZFObjectGlobalInstance_h_
6#define _ZFI_ZFObjectGlobalInstance_h_
35typedef void (*_ZFP_ZFClassSingletonDeleteCallback)(
ZF_IN void *instance);
40 _ZFP_ZFClassSingletonDeleteCallback deleteCallback;
43 _ZFP_ZFClassSingletonDeleteCallbackHolder(
44 ZF_IN _ZFP_ZFClassSingletonDeleteCallback deleteCallback
45 ,
ZF_IN void *instance
47 : deleteCallback(deleteCallback)
51 ~_ZFP_ZFClassSingletonDeleteCallbackHolder(
void) {
52 if(this->deleteCallback && this->instance) {
53 this->deleteCallback(this->instance);
60#define _ZFP_ZFCLASS_SINGLETON_DECLARE(SetterAccessType, GetterAccessType, \
61 AccessTypeName, accessMethodName) \
64 static AccessTypeName *accessMethodName(void); \
67 static void accessMethodName(ZF_IN AccessTypeName *newInstance); \
69 static ZFObject *&_ZFP_ClsSIC_##accessMethodName(void); \
70 static void _ZFP_ClsSID_##accessMethodName(ZF_IN void *instance); \
72#define _ZFP_ZFCLASS_SINGLETON_DEFINE(OwnerClass, AccessTypeName, ObjectTypeName, sig, accessMethodName, \
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) { \
81 AccessTypeName *t = newAction(ObjectTypeName); \
82 OwnerClass::accessMethodName(t); \
85 return (AccessTypeName *)(*holder); \
87 void OwnerClass::accessMethodName(ZF_IN AccessTypeName *newInstance) { \
88 if(ZFFrameworkStateCheck(ZFLevel_) == ZFFrameworkStateNotAvailable) { \
91 void **holder = _ZFP_ZFClassSingletonInstanceRefAccess(sig); \
92 if(*holder == (void *)newInstance) { \
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_); \
107 if(cleanerOld != zfnull) { \
108 ZFObjectGlobalInstanceRemove(cleanerOld, ZFLevel_); \
109 *holder = (void *)newInstanceValue; \
112 ZFObject *&OwnerClass::_ZFP_ClsSIC_##accessMethodName(void) { \
113 static ZFObject *_cleaner = zfnull; \
116 void OwnerClass::_ZFP_ClsSID_##accessMethodName(ZF_IN void *instance) { \
117 OwnerClass::_ZFP_ClsSIC_##accessMethodName() = zfnull; \
118 void **holder = _ZFP_ZFClassSingletonInstanceRefAccess(sig); \
120 releaseAction((AccessTypeName *)instance); \
147#define ZFCLASS_SINGLETON_DECLARE(AccessTypeName, accessMethodName) \
148 ZFCLASS_SINGLETON_DECLARE_DETAIL(protected, public, AccessTypeName, accessMethodName)
152#define ZFCLASS_SINGLETON_DECLARE_DETAIL(SetterAccessType, GetterAccessType, AccessTypeName, accessMethodName) \
153 _ZFP_ZFCLASS_SINGLETON_DECLARE(SetterAccessType, GetterAccessType, AccessTypeName, accessMethodName)
157#define ZFCLASS_SINGLETON_DEFINE(OwnerClass, accessMethodName) \
158 ZFCLASS_SINGLETON_DEFINE_DETAIL(OwnerClass, OwnerClass, OwnerClass, accessMethodName, ZFLevelAppNormal)
162#define ZFCLASS_SINGLETON_DEFINE_WITH_LEVEL(OwnerClass, accessMethodName, ZFLevel_) \
163 ZFCLASS_SINGLETON_DEFINE_DETAIL(OwnerClass, OwnerClass, OwnerClass, accessMethodName, ZFLevel_)
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)
175#define _ZFP_ZFOBJECT_SINGLETON_DECLARE(SetterAccessType, GetterAccessType, \
176 AccessTypeName, accessMethodName) \
179 ZFMETHOD_DECLARE_DETAIL_0( \
180 GetterAccessType, ZFMethodTypeStatic, \
181 AccessTypeName *, accessMethodName \
185 ZFMETHOD_DECLARE_DETAIL_1( \
186 SetterAccessType, ZFMethodTypeStatic, \
187 void, accessMethodName \
188 , ZFMP_IN(AccessTypeName *, param0) \
192 _ZFP_ZFCLASS_SINGLETON_DECLARE(private, private, \
193 AccessTypeName, _ZFP_ZFObjectSingleton_##accessMethodName) \
196#define _ZFP_ZFOBJECT_SINGLETON_DEFINE(OwnerClass, \
197 AccessTypeName, ObjectTypeName, sig, accessMethodName, \
199 _ZFP_ZFCLASS_SINGLETON_DEFINE(OwnerClass, \
200 AccessTypeName, ObjectTypeName, sig, _ZFP_ZFObjectSingleton_##accessMethodName, \
202 zfobjAlloc, zfobjRetain, zfobjRelease) \
203 ZFMETHOD_DEFINE_DETAIL_0(OwnerClass, G, \
204 AccessTypeName *, accessMethodName \
206 return zfself::_ZFP_ZFObjectSingleton_##accessMethodName(); \
208 ZFMETHOD_DEFINE_DETAIL_1(OwnerClass, S, \
209 void, accessMethodName \
210 , ZFMP_IN(AccessTypeName *, param0) \
212 if(ZFFrameworkStateCheck(ZFLevel_) == ZFFrameworkStateNotAvailable) { \
215 zfself::_ZFP_ZFObjectSingleton_##accessMethodName(param0); \
243#define ZFOBJECT_SINGLETON_DECLARE(AccessTypeName, accessMethodName) \
244 ZFOBJECT_SINGLETON_DECLARE_DETAIL(protected, public, AccessTypeName, accessMethodName)
248#define ZFOBJECT_SINGLETON_DECLARE_DETAIL(SetterAccessType, GetterAccessType, AccessTypeName, accessMethodName) \
249 _ZFP_ZFOBJECT_SINGLETON_DECLARE(SetterAccessType, GetterAccessType, AccessTypeName, accessMethodName)
253#define ZFOBJECT_SINGLETON_DEFINE(OwnerClass, accessMethodName) \
254 ZFOBJECT_SINGLETON_DEFINE_DETAIL(OwnerClass, OwnerClass, OwnerClass, accessMethodName, ZFLevelAppNormal)
258#define ZFOBJECT_SINGLETON_DEFINE_WITH_LEVEL(OwnerClass, accessMethodName, ZFLevel_) \
259 ZFOBJECT_SINGLETON_DEFINE_DETAIL(OwnerClass, OwnerClass, OwnerClass, accessMethodName, ZFLevel_)
263#define ZFOBJECT_SINGLETON_DEFINE_DETAIL(OwnerClass, \
264 AccessTypeName, ObjectTypeName, accessMethodName, \
266 _ZFP_ZFOBJECT_SINGLETON_DEFINE(OwnerClass, \
267 AccessTypeName, ObjectTypeName, \
268 zfstr("_ZFP_ZFObject_%s_%s_%s", zfself::ClassData()->classNameFull(), #AccessTypeName, #accessMethodName), \
#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
#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
base class of all objects
Definition ZFObjectCore.h:195