28 #ifndef GWENHYWFAR_INHERIT_H 29 #define GWENHYWFAR_INHERIT_H 112 #define GWEN_INHERIT_ELEMENT(t) \ 113 GWEN_INHERITDATA_LIST *INHERIT__list; 125 #define GWEN_INHERIT_FUNCTION_LIB_DEFS(t, decl) \ 126 decl void t##__INHERIT_SETDATA(t *element, \ 127 const char *typeName,\ 130 GWEN_INHERIT_FREEDATAFN f);\ 131 decl int t##__INHERIT_ISOFTYPE(const t *element, uint32_t id);\ 132 decl GWEN_INHERITDATA_LIST *t##__INHERIT_GETLIST(const t *element);\ 133 decl void t##__INHERIT_UNLINK(t *element, \ 134 const char *typeName,\ 147 #define GWEN_INHERIT_FUNCTION_DEFS(t) \ 148 GWEN_INHERIT_FUNCTION_LIB_DEFS(t, GWEN_DUMMY_EMPTY_ARG) 163 #define GWEN_INHERIT_FUNCTIONS(t) \ 164 GWEN_INHERITDATA_LIST *t##__INHERIT_GETLIST(const t *element) {\ 166 return element->INHERIT__list;\ 169 void t##__INHERIT_SETDATA(t *element, \ 170 const char *typeName,\ 173 GWEN_INHERIT_FREEDATAFN f) {\ 174 GWEN_INHERITDATA *d;\ 178 assert(element->INHERIT__list);\ 180 p=GWEN_Inherit_FindData(element->INHERIT__list, id, 1);\ 183 "ERROR: Type \"%s\" already inherits base type\n",\ 187 d=GWEN_InheritData_new(typeName, id, data, (void*)element, f);\ 188 GWEN_InheritData_List_Insert(d, element->INHERIT__list);\ 191 int t##__INHERIT_ISOFTYPE(const t *element, uint32_t id) {\ 193 assert(element->INHERIT__list);\ 195 return (GWEN_Inherit_FindData(element->INHERIT__list, id, 1)!=0);\ 198 void t##__INHERIT_UNLINK(t *element, \ 199 const char *typeName,\ 201 GWEN_INHERITDATA *d;\ 204 assert(element->INHERIT__list);\ 206 d=GWEN_Inherit_FindEntry(element->INHERIT__list, id, 1);\ 209 "ERROR: Type \"%s\" does not inherit base type\n",\ 213 GWEN_InheritData_clear(d);\ 214 GWEN_InheritData_List_Del(d);\ 215 GWEN_InheritData_free(d);\ 223 #define GWEN_INHERIT_INIT(t, element) {\ 225 element->INHERIT__list=GWEN_InheritData_List_new();\ 238 #define GWEN_INHERIT_FINI(t, element) {\ 239 GWEN_INHERITDATA *inherit__data;\ 242 assert(element->INHERIT__list);\ 244 while( (inherit__data=GWEN_InheritData_List_First(element->INHERIT__list)) ) {\ 245 GWEN_InheritData_freeData(inherit__data); \ 246 GWEN_InheritData_List_Del(inherit__data); \ 247 GWEN_InheritData_free(inherit__data); \ 249 GWEN_InheritData_List_free(element->INHERIT__list);\ 264 #define GWEN_INHERIT(bt, t) \ 265 uint32_t t##__INHERIT_ID=0; 271 #define GWEN_INHERIT_GETDATA(bt, t, element) \ 272 ((t*)GWEN_Inherit_FindData(bt##__INHERIT_GETLIST(element),t##__INHERIT_ID,0)) 292 #define GWEN_INHERIT_SETDATA(bt, t, element, data, fn) {\ 293 if (!t##__INHERIT_ID)\ 294 t##__INHERIT_ID=GWEN_Inherit_MakeId(__STRING(t));\ 295 bt##__INHERIT_SETDATA(element, __STRING(t), t##__INHERIT_ID, data, fn);\ 305 #define GWEN_INHERIT_ISOFTYPE(bt, t, element) \ 306 ((bt##__INHERIT_ISOFTYPE(element,\ 307 ((t##__INHERIT_ID==0)?\ 308 ((t##__INHERIT_ID=GWEN_Inherit_MakeId(__STRING(t)))):\ 309 t##__INHERIT_ID)))?1:0) 318 #define GWEN_INHERIT_UNLINK(bt, t, element) {\ 319 if (!t##__INHERIT_ID)\ 320 t##__INHERIT_ID=GWEN_Inherit_MakeId(__STRING(t));\ 321 bt##__INHERIT_UNLINK(element, __STRING(t), t##__INHERIT_ID);\
GWENHYWFAR_API void GWEN_InheritData_freeAllData(GWEN_INHERITDATA *d)
GWENHYWFAR_API uint32_t GWEN_Inherit_MakeId(const char *typeName)
GWENHYWFAR_API void * GWEN_Inherit_FindData(GWEN_INHERITDATA_LIST *l, uint32_t id, int wantCreate)
GWENHYWFAR_API void GWEN_InheritData_free(GWEN_INHERITDATA *d)
GWENHYWFAR_API void * GWEN_InheritData_GetData(const GWEN_INHERITDATA *d)
struct GWEN_INHERITDATA GWEN_INHERITDATA
GWENHYWFAR_API GWEN_INHERIT_FREEDATAFN GWEN_InheritData_GetFreeDataFn(const GWEN_INHERITDATA *d)
#define GWEN_LIST_FUNCTION_LIB_DEFS(t, pr, decl)
GWENHYWFAR_API uint32_t GWEN_InheritData_GetId(const GWEN_INHERITDATA *d)
void GWENHYWFAR_CB(* GWEN_INHERIT_FREEDATAFN)(void *baseData, void *data)
GWENHYWFAR_API void GWEN_InheritData_clear(GWEN_INHERITDATA *d)
GWENHYWFAR_API void GWEN_InheritData_freeData(GWEN_INHERITDATA *d)
GWENHYWFAR_API const char * GWEN_InheritData_GetTypeName(const GWEN_INHERITDATA *d)
GWENHYWFAR_API GWEN_INHERITDATA * GWEN_InheritData_new(const char *t, uint32_t id, void *data, void *baseData, GWEN_INHERIT_FREEDATAFN fn)
GWENHYWFAR_API GWEN_INHERITDATA * GWEN_Inherit_FindEntry(GWEN_INHERITDATA_LIST *l, uint32_t id, int wantCreate)