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_REF(bt, t) \
272 extern uint32_t t##__INHERIT_ID;
279 #define GWEN_INHERIT_GETDATA(bt, t, element) \
280 ((t*)GWEN_Inherit_FindData(bt##__INHERIT_GETLIST(element),t##__INHERIT_ID,0))
300 #define GWEN_INHERIT_SETDATA(bt, t, element, data, fn) {\
301 if (!t##__INHERIT_ID)\
302 t##__INHERIT_ID=GWEN_Inherit_MakeId(__STRING(t));\
303 bt##__INHERIT_SETDATA(element, __STRING(t), t##__INHERIT_ID, data, fn);\
313 #define GWEN_INHERIT_ISOFTYPE(bt, t, element) \
314 ((bt##__INHERIT_ISOFTYPE(element,\
315 ((t##__INHERIT_ID==0)?\
316 ((t##__INHERIT_ID=GWEN_Inherit_MakeId(__STRING(t)))):\
317 t##__INHERIT_ID)))?1:0)
326 #define GWEN_INHERIT_UNLINK(bt, t, element) {\
327 if (!t##__INHERIT_ID)\
328 t##__INHERIT_ID=GWEN_Inherit_MakeId(__STRING(t));\
329 bt##__INHERIT_UNLINK(element, __STRING(t), t##__INHERIT_ID);\
GWENHYWFAR_API GWEN_INHERITDATA * GWEN_Inherit_FindEntry(GWEN_INHERITDATA_LIST *l, uint32_t id, int wantCreate)
GWENHYWFAR_API GWEN_INHERITDATA * GWEN_InheritData_new(const char *t, uint32_t id, void *data, void *baseData, GWEN_INHERIT_FREEDATAFN fn)
GWENHYWFAR_API uint32_t GWEN_Inherit_MakeId(const char *typeName)
GWENHYWFAR_API uint32_t GWEN_InheritData_GetId(const GWEN_INHERITDATA *d)
GWENHYWFAR_API void GWEN_InheritData_clear(GWEN_INHERITDATA *d)
GWENHYWFAR_API void * GWEN_InheritData_GetData(const GWEN_INHERITDATA *d)
GWENHYWFAR_API void GWEN_InheritData_freeAllData(GWEN_INHERITDATA *d)
GWENHYWFAR_API void GWEN_InheritData_free(GWEN_INHERITDATA *d)
struct GWEN_INHERITDATA GWEN_INHERITDATA
GWENHYWFAR_API const char * GWEN_InheritData_GetTypeName(const GWEN_INHERITDATA *d)
GWENHYWFAR_API void GWEN_InheritData_freeData(GWEN_INHERITDATA *d)
GWENHYWFAR_API void * GWEN_Inherit_FindData(GWEN_INHERITDATA_LIST *l, uint32_t id, int wantCreate)
GWENHYWFAR_API GWEN_INHERIT_FREEDATAFN GWEN_InheritData_GetFreeDataFn(const GWEN_INHERITDATA *d)
void GWENHYWFAR_CB(* GWEN_INHERIT_FREEDATAFN)(void *baseData, void *data)
#define GWEN_LIST_FUNCTION_LIB_DEFS(t, pr, decl)