00001
00002
00003
00004
00005
00006
00007
00008
00013 #ifndef _ATX_REFERENCEABLE_H_
00014 #define _ATX_REFERENCEABLE_H_
00015
00016
00017
00018
00019 #include "AtxInterfaces.h"
00020 #include "AtxDefs.h"
00021 #include "AtxTypes.h"
00022 #include "AtxDebug.h"
00023
00024
00025
00026
00027 ATX_DECLARE_INTERFACE(ATX_Referenceable)
00035 ATX_BEGIN_INTERFACE_DEFINITION(ATX_Referenceable)
00041 ATX_Result (*AddReference)(ATX_Referenceable* self);
00047 ATX_Result (*Release)(ATX_Referenceable* self);
00048 ATX_END_INTERFACE_DEFINITION
00049
00050
00051
00052
00057 #define ATX_Referenceable_AddReference(object) \
00058 ATX_INTERFACE(object)->AddReference(object)
00059
00064 #define ATX_Referenceable_Release(object) \
00065 ATX_INTERFACE(object)->Release(object)
00066
00067
00068
00069
00081 #define ATX_RELEASE_OBJECT(object) \
00082 do { \
00083 if (object) { \
00084 ATX_Referenceable* referenceable = \
00085 ATX_CAST(object, ATX_Referenceable); \
00086 ATX_ASSERT(referenceable != NULL); \
00087 ATX_Referenceable_Release(referenceable); \
00088 object = NULL; \
00089 } \
00090 } while(0)
00091
00100 #define ATX_REFERENCE_OBJECT(object) \
00101 do { \
00102 if (object) { \
00103 ATX_Referenceable* referenceable = \
00104 ATX_CAST(object, ATX_Referenceable); \
00105 ATX_ASSERT(referenceable != NULL); \
00106 ATX_Referenceable_AddReference(referenceable); \
00107 } \
00108 } while(0)
00109
00110 #define ATX_IMPLEMENT_REFERENCEABLE_INTERFACE(_class, _counter) \
00111 ATX_METHOD _class##_AddReference(ATX_Referenceable* _self) \
00112 { \
00113 _class* self = ATX_SELF(_class, ATX_Referenceable); \
00114 self->_counter++; \
00115 return ATX_SUCCESS; \
00116 } \
00117 ATX_METHOD _class##_Release(ATX_Referenceable* _self) \
00118 { \
00119 _class* self = ATX_SELF(_class, ATX_Referenceable); \
00120 if (--self->_counter == 0) { \
00121 _class##_Destroy(self); \
00122 } \
00123 return ATX_SUCCESS; \
00124 } \
00125 ATX_BEGIN_INTERFACE_MAP(_class, ATX_Referenceable) \
00126 _class##_AddReference, \
00127 _class##_Release \
00128 };
00129
00130 #define ATX_IMPLEMENT_REFERENCEABLE_INTERFACE_EX(_class, _base, _counter) \
00131 ATX_METHOD _class##_AddReference(ATX_Referenceable* _self) \
00132 { \
00133 _class* self = ATX_SELF_EX(_class, _base, ATX_Referenceable); \
00134 ATX_BASE(self, _base)._counter++; \
00135 return ATX_SUCCESS; \
00136 } \
00137 ATX_METHOD _class##_Release(ATX_Referenceable* _self) \
00138 { \
00139 _class* self = ATX_SELF_EX(_class, _base, ATX_Referenceable); \
00140 if (--ATX_BASE(self, _base)._counter == 0) { \
00141 _class##_Destroy(self); \
00142 } \
00143 return ATX_SUCCESS; \
00144 } \
00145 ATX_BEGIN_INTERFACE_MAP_EX(_class, _base, ATX_Referenceable) \
00146 _class##_AddReference, \
00147 _class##_Release \
00148 };
00149
00150 #endif
00151
00152
00153
00154
00155