5#ifndef _ZFI_ZFObjectGlobalInstance_h_
6#define _ZFI_ZFObjectGlobalInstance_h_
43 _ZFP_ZFClassSingletonPointerHolder(
void) : d(
zfnull) {}
45typedef void (*_ZFP_ZFClassSingletonDeleteCallback)(
ZF_IN void *instance);
50 _ZFP_ZFClassSingletonDeleteCallback deleteCallback;
53 _ZFP_ZFClassSingletonDeleteCallbackHolder(
54 ZF_IN _ZFP_ZFClassSingletonDeleteCallback deleteCallback
55 ,
ZF_IN void *instance
57 : deleteCallback(deleteCallback)
61 ~_ZFP_ZFClassSingletonDeleteCallbackHolder(
void) {
62 if(this->deleteCallback && this->instance) {
63 this->deleteCallback(this->instance);
70#define _ZFP_ZFCLASS_SINGLETON_DECLARE(SetterAccessType, GetterAccessType, \
71 AccessTypeName, accessMethodName) \
74 static AccessTypeName *accessMethodName(void); \
77 static void accessMethodName(ZF_IN AccessTypeName *newInstance); \
79 static const ZFCorePointer *&_ZFP_ZFClassSingletonCleaner_##accessMethodName(void); \
80 static void _ZFP_ZFClassSingletonOnDelete_##accessMethodName(ZF_IN void *instance); \
82#define _ZFP_ZFCLASS_SINGLETON_DEFINE(OwnerClass, AccessTypeName, ObjectTypeName, sig, accessMethodName, \
84 newAction, retainAction, releaseAction) \
85 AccessTypeName *OwnerClass::accessMethodName(void) { \
86 static _ZFP_ZFClassSingletonPointerHolder *holder = _ZFP_ZFClassSingletonInstanceRefAccess(sig); \
87 if(holder->d == zfnull) { \
88 if(ZFFrameworkStateCheck(ZFLevel_) == ZFFrameworkStateNotAvailable) { \
91 AccessTypeName *t = newAction(ObjectTypeName); \
92 OwnerClass::accessMethodName(t); \
95 return (AccessTypeName *)holder->d; \
97 void OwnerClass::accessMethodName(ZF_IN AccessTypeName *newInstance) { \
98 if(ZFFrameworkStateCheck(ZFLevel_) == ZFFrameworkStateNotAvailable) { \
101 _ZFP_ZFClassSingletonPointerHolder *holder = _ZFP_ZFClassSingletonInstanceRefAccess(sig); \
102 if(holder->d == newInstance) { \
105 ZFCoreMutexLocker(); \
106 const ZFCorePointer *&cleanerRef = OwnerClass::_ZFP_ZFClassSingletonCleaner_##accessMethodName(); \
107 const ZFCorePointer *cleanerOld = cleanerRef; \
108 const ZFCorePointer *cleanerNew = zfnull; \
109 cleanerRef = zfnull; \
110 AccessTypeName *newInstanceValue = zfnull; \
111 if(newInstance != zfnull) { \
112 newInstanceValue = retainAction(newInstance); \
113 holder->d = newInstanceValue; \
114 cleanerNew = ZFObjectGlobalInstanceAdd(ZFCorePointerForObject<_ZFP_ZFClassSingletonDeleteCallbackHolder *>( \
115 zfnew(_ZFP_ZFClassSingletonDeleteCallbackHolder, OwnerClass::_ZFP_ZFClassSingletonOnDelete_##accessMethodName, holder->d)), \
117 cleanerRef = cleanerNew; \
119 if(cleanerOld != zfnull) { \
120 ZFObjectGlobalInstanceRemove(cleanerOld, ZFLevel_); \
121 holder->d = newInstanceValue; \
122 cleanerRef = cleanerNew; \
125 const ZFCorePointer *&OwnerClass::_ZFP_ZFClassSingletonCleaner_##accessMethodName(void) { \
126 static const ZFCorePointer *_cleaner = zfnull; \
129 void OwnerClass::_ZFP_ZFClassSingletonOnDelete_##accessMethodName(ZF_IN void *instance) { \
130 OwnerClass::_ZFP_ZFClassSingletonCleaner_##accessMethodName() = zfnull; \
131 _ZFP_ZFClassSingletonPointerHolder *holder = _ZFP_ZFClassSingletonInstanceRefAccess(sig); \
132 holder->d = zfnull; \
133 releaseAction((AccessTypeName *)instance); \
160#define ZFCLASS_SINGLETON_DECLARE(AccessTypeName, accessMethodName) \
161 ZFCLASS_SINGLETON_DECLARE_DETAIL(protected, public, AccessTypeName, accessMethodName)
165#define ZFCLASS_SINGLETON_DECLARE_DETAIL(SetterAccessType, GetterAccessType, AccessTypeName, accessMethodName) \
166 _ZFP_ZFCLASS_SINGLETON_DECLARE(SetterAccessType, GetterAccessType, AccessTypeName, accessMethodName)
170#define ZFCLASS_SINGLETON_DEFINE(OwnerClass, accessMethodName) \
171 ZFCLASS_SINGLETON_DEFINE_DETAIL(OwnerClass, OwnerClass, OwnerClass, accessMethodName, ZFLevelAppNormal)
175#define ZFCLASS_SINGLETON_DEFINE_WITH_LEVEL(OwnerClass, accessMethodName, ZFLevel_) \
176 ZFCLASS_SINGLETON_DEFINE_DETAIL(OwnerClass, OwnerClass, OwnerClass, accessMethodName, ZFLevel_)
180#define ZFCLASS_SINGLETON_DEFINE_DETAIL(OwnerClass, AccessTypeName, ObjectTypeName, accessMethodName, ZFLevel_) \
181 _ZFP_ZFCLASS_SINGLETON_DEFINE(OwnerClass, AccessTypeName, ObjectTypeName, \
182 zfstr("_ZFP_ZFClass_%s_%s", #AccessTypeName, #accessMethodName), \
183 accessMethodName, ZFLevel_, \
184 zfnew, ZFM_EXPAND, zfdelete)
188#define _ZFP_ZFOBJECT_SINGLETON_DECLARE(SetterAccessType, GetterAccessType, \
189 AccessTypeName, accessMethodName) \
192 ZFMETHOD_DECLARE_DETAIL_0( \
193 GetterAccessType, ZFMethodTypeStatic, \
194 AccessTypeName *, accessMethodName \
198 ZFMETHOD_DECLARE_DETAIL_1( \
199 SetterAccessType, ZFMethodTypeStatic, \
200 void, accessMethodName \
201 , ZFMP_IN(AccessTypeName *, param0) \
205 _ZFP_ZFCLASS_SINGLETON_DECLARE(private, private, \
206 AccessTypeName, _ZFP_ZFObjectSingleton_##accessMethodName) \
209#define _ZFP_ZFOBJECT_SINGLETON_DEFINE(OwnerClass, \
210 AccessTypeName, ObjectTypeName, sig, accessMethodName, \
212 _ZFP_ZFCLASS_SINGLETON_DEFINE(OwnerClass, \
213 AccessTypeName, ObjectTypeName, sig, _ZFP_ZFObjectSingleton_##accessMethodName, \
215 zfAlloc, zfRetain, zfRelease) \
216 ZFMETHOD_DEFINE_DETAIL_0(OwnerClass, G, \
217 AccessTypeName *, accessMethodName \
219 return zfself::_ZFP_ZFObjectSingleton_##accessMethodName(); \
221 ZFMETHOD_DEFINE_DETAIL_1(OwnerClass, S, \
222 void, accessMethodName \
223 , ZFMP_IN(AccessTypeName *, param0) \
225 if(ZFFrameworkStateCheck(ZFLevel_) == ZFFrameworkStateNotAvailable) { \
228 zfself::_ZFP_ZFObjectSingleton_##accessMethodName(param0); \
256#define ZFOBJECT_SINGLETON_DECLARE(AccessTypeName, accessMethodName) \
257 ZFOBJECT_SINGLETON_DECLARE_DETAIL(protected, public, AccessTypeName, accessMethodName)
261#define ZFOBJECT_SINGLETON_DECLARE_DETAIL(SetterAccessType, GetterAccessType, AccessTypeName, accessMethodName) \
262 _ZFP_ZFOBJECT_SINGLETON_DECLARE(SetterAccessType, GetterAccessType, AccessTypeName, accessMethodName)
266#define ZFOBJECT_SINGLETON_DEFINE(OwnerClass, accessMethodName) \
267 ZFOBJECT_SINGLETON_DEFINE_DETAIL(OwnerClass, OwnerClass, OwnerClass, accessMethodName, ZFLevelAppNormal)
271#define ZFOBJECT_SINGLETON_DEFINE_WITH_LEVEL(OwnerClass, accessMethodName, ZFLevel_) \
272 ZFOBJECT_SINGLETON_DEFINE_DETAIL(OwnerClass, OwnerClass, OwnerClass, accessMethodName, ZFLevel_)
276#define ZFOBJECT_SINGLETON_DEFINE_DETAIL(OwnerClass, \
277 AccessTypeName, ObjectTypeName, accessMethodName, \
279 _ZFP_ZFOBJECT_SINGLETON_DEFINE(OwnerClass, \
280 AccessTypeName, ObjectTypeName, \
281 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 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 ZF_IN
dummy macro that shows the param used as required input
Definition ZFCoreTypeDef_ClassType.h:180
#define ZF_IN_OPT
dummy macro that shows the param used as optional 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 zfnull
same as NULL, defined for future use
Definition ZFCoreTypeDef_CoreType.h:88
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
const ZFCorePointer * ZFObjectGlobalInstanceAdd(const ZFCorePointer &sp, ZFLevel level=ZFLevelAppNormal)
add a global instance that would be auto deleted while ZFFrameworkCleanup
void ZFObjectGlobalInstanceRemove(const ZFCorePointer *sp, ZFLevel level)
see ZFObjectGlobalInstanceAdd
abstract base class for ZFCorePointerT
Definition ZFCorePointer.h:46
base class of all objects
Definition ZFObjectCore.h:209