AtxReferenceable.h

Go to the documentation of this file.
00001 /*****************************************************************
00002 |
00003 |   Atomix - Referenceable Interface
00004 |
00005 |   (c) 2002-2006 Gilles Boccon-Gibod
00006 |   Author: Gilles Boccon-Gibod (bok@bok.net)
00007 |
00008  ****************************************************************/
00013 #ifndef _ATX_REFERENCEABLE_H_
00014 #define _ATX_REFERENCEABLE_H_
00015 
00016 /*----------------------------------------------------------------------
00017 |   includes
00018 +---------------------------------------------------------------------*/
00019 #include "AtxInterfaces.h"
00020 #include "AtxDefs.h"
00021 #include "AtxTypes.h"
00022 #include "AtxDebug.h"
00023 
00024 /*----------------------------------------------------------------------
00025 |   ATX_Referenceable interface
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 |   convenience macros
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 |   macros
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 /* _ATX_REFERENCEABLE_H_ */
00151 
00152 
00153 
00154 
00155