#ifndef REF_COUNT_H #define REF_COUNT_H #pragma once #include #include /*for warning: implicit declaration of function InterlockedIncrement*/ #ifdef __cplusplus extern "C" { #endif #define __REF_COUNT_NOTHING #define __REF_COUNT_STATIC static typedef void (*refcnt_on_destroy)(void *inst); /*declare function prototype*/ #define __DECLARE_REF_COUNT(typeprefix, type, modifier) \ modifier int typeprefix##_inc_ref(type*); \ modifier int typeprefix##_dec_ref(type*); \ modifier int typeprefix##_ref_cnt(type*); #define DECLARE_REF_COUNT(typeprefix, type) __DECLARE_REF_COUNT(typeprefix, type, __REF_COUNT_NOTHING) #define DECLARE_REF_COUNT_STATIC(typeprefix, type) __DECLARE_REF_COUNT(typeprefix, type, __REF_COUNT_STATIC) #define DECLARE_REF_COUNT_MEMBER(member) int member #define REF_COUNT_INIT(ep) *(ep) = 1 /* *typeprefix: function prefix declare *type: the object type to deal with *member: object's member name in refcnt type *free_fn: the free function to free the object pointer *modifer: static or not(empty) */ #define __IMPLEMENT_REF_COUNT(typeprefix, type, member, free_fn, modifer) \ modifer int typeprefix##_inc_ref(type *o) { \ return ++((o)->member); \ }\ modifer int typeprefix##_dec_ref(type *o) { \ if(--((o)->member) == 0) \ free_fn(o); \ return (o)->member; \ }\ modifer int typeprefix##_ref_cnt(type* o) { \ return (o)->member; \ } #define IMPLEMENT_REF_COUNT(typeprefix, type, member, free_fn) __IMPLEMENT_REF_COUNT(typeprefix, type, member, free_fn, __REF_COUNT_NOTHING) #define IMPLEMENT_REF_COUNT_STATIC(typeprefix, type, member, free_fn) __IMPLEMENT_REF_COUNT(typeprefix, type, member, free_fn, __REF_COUNT_STATIC) /*in case: multi thread environment*/ #define __IMPLEMENT_REF_COUNT_MT(typeprefix, type, member, free_fn, modifier) \ modifier int typeprefix##_inc_ref(type *o) {\ return (int)InterlockedIncrement((LONG*)&((o)->member));\ }\ modifier int typeprefix##_dec_ref(type *o) { \ int ret = InterlockedDecrement((LONG*)&(o)->member); \ if (0 == ret) \ free_fn(o); \ return ret; \ }\ modifier int typeprefix##_ref_cnt(type* o) { \ return (o)->member; \ } #define IMPLEMENT_REF_COUNT_MT(typeprefix, type, member, free_fn) __IMPLEMENT_REF_COUNT_MT(typeprefix, type, member, free_fn, __REF_COUNT_NOTHING) #define IMPLEMENT_REF_COUNT_MT_STATIC(typeprefix, type, member, free_fn) __IMPLEMENT_REF_COUNT_MT(typeprefix, type, member, free_fn, __REF_COUNT_STATIC) #define inc_ref(type, ptr) type##_inc_ref(ptr) #define dec_ref(type, ptr) type##_dec_ref(ptr) #define ref_cnt(type, ptr) type##_ref_cnt(ptr) #ifdef __cplusplus } // extern "C" { #endif #endif // REF_COUNT_H