00001 #ifndef _si_std_ptrh_h__a35826dd_2279_43d1_9d37_fc5fe6a0f591
00002 #define _si_std_ptrh_h__a35826dd_2279_43d1_9d37_fc5fe6a0f591
00003
00023 #include <si_sys/defs.h>
00024
00025 typedef struct sc_rep sc_rep;
00026
00027 typedef sc_status (*sc_rep_addRef)(sc_rep* prep);
00029 typedef sc_status (*sc_rep_relRef)(sc_rep* prep);
00031 typedef sc_status (*sc_rep_delete)(void* pObj, void* pOwner);
00040 typedef struct sc_rep_vtable {
00041 sc_rep_addRef addRef;
00042 sc_rep_relRef relRef;
00043 sc_rep_delete delete;
00044 } sc_rep_vtable;
00045
00052 struct sc_rep {
00053 s_uint32 refc;
00054 void* pobj;
00055 void* pown;
00056 const sc_rep_vtable* vtbl;
00058 };
00059
00060 sc_status sc_rep_construct(sc_rep* rep, void* pobj, void* pown,
00061 const sc_rep_vtable* vtbl);
00073 sc_status sc_rep_addRef_default(sc_rep* prep);
00083 sc_status sc_rep_relRef_default(sc_rep* prep);
00100 #define sm_repDefaultVtableDecl(n,T) \
00101 static const sc_rep_vtable n = { \
00102 sc_rep_addRef_default, \
00103 sc_rep_addRef_default, \
00104 (sc_rep_delete)T##_delete \
00105 }
00106
00113 typedef struct sc_ptrh {
00114 struct {
00115 sc_rep* rep_;
00116 } priv_;
00117 } sc_ptrh;
00118
00119 sc_status sc_ptrh_construct(sc_ptrh* pptrh, sc_rep* prep);
00125 sc_status sc_ptrh_constructCopy(sc_ptrh* pptrh, sc_ptrh* pother);
00135 sc_status sc_ptrh_assign(sc_ptrh* pptrh, sc_ptrh* prhs);
00144 sc_status sc_ptrh_assignNewRep(sc_ptrh* pptrh, sc_rep* prep);
00155 sc_status sc_ptrh_destruct(sc_ptrh* pptrh);
00161 #ifdef _DEBUG
00162 #include <assert.h>
00163 static void* sc_ptrh_get(sc_ptrh* pptrh) {
00164 assert(pptrh);
00165 if(pptrh->priv_.rep_)
00166 return pptrh->priv_.rep_->pobj;
00167 return NULL;
00168 }
00169 #else
00170 #define sc_ptrh_get(ph) ( (ph->priv_.rep_) ? ph->priv_.rep_->pobj : NULL)
00171 #endif
00172
00185 #define sm_ptrhDecl(T) \
00186 typedef sc_ptrh T##Ptrh; \
00187 sc_status T##Ptrh_construct(T##Ptrh* pptrh, sc_rep* prep); \
00188 sc_status T##Ptrh_constructCopy(T##Ptrh* pptrh, T##Ptrh* pother); \
00189 sc_status T##Ptrh_assign(T##Ptrh* pptrh, T##Ptrh* prhs); \
00190 sc_status T##Ptrh_assignNewRep(T##Ptrh* pptrh, sc_rep* prep); \
00191 sc_status T##Ptrh_destruct(T##Ptrh* pptrh); \
00192 T* T##Ptrh_get(T##Ptrh* pptrh)
00193
00202 #define sm_ptrhImpl(T) \
00203 sc_status T##Ptrh_construct(T##Ptrh* pptrh, sc_rep* prep) \
00204 { return sc_ptrh_construct(pptrh, prep); } \
00205 sc_status T##Ptrh_constructCopy(T##Ptrh* pptrh, T##Ptrh* pother) \
00206 { return sc_ptrh_constructCopy(pptrh, pother); } \
00207 sc_status T##Ptrh_assign(T##Ptrh* pptrh, T##Ptrh* prhs) \
00208 { return sc_ptrh_assign(pptrh, prhs); } \
00209 sc_status T##Ptrh_assignNewRep(T##Ptrh* pptrh, sc_rep* prep) \
00210 { return sc_ptrh_assignNewRep(pptrh, prep); } \
00211 sc_status T##Ptrh_destruct(T##Ptrh* pptrh) \
00212 { return sc_ptrh_destruct(pptrh); } \
00213 T* T##Ptrh_get(T##Ptrh* pptrh) \
00214 { return (T*) sc_ptrh_get(pptrh); }
00215
00216
00217 #endif