00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef GWENHYWFAR_INHERIT_H
00029 #define GWENHYWFAR_INHERIT_H
00030
00031 #ifdef __cplusplus
00032 extern "C" {
00033 #endif
00034 typedef struct GWEN_INHERITDATA GWEN_INHERITDATA;
00035 #ifdef __cplusplus
00036 }
00037 #endif
00038
00039
00040 #include <gwenhywfar/misc.h>
00041 #include <gwenhywfar/gwenhywfarapi.h>
00042
00043
00044 #ifdef __cplusplus
00045 extern "C" {
00046 #endif
00047
00048
00053 typedef void GWENHYWFAR_CB (*GWEN_INHERIT_FREEDATAFN)(void *baseData,
00054 void *data);
00055
00056 GWEN_LIST_FUNCTION_LIB_DEFS(GWEN_INHERITDATA, GWEN_InheritData, GWENHYWFAR_API)
00057
00058
00059 GWENHYWFAR_API
00060 GWEN_INHERITDATA *GWEN_InheritData_new(const char *t,
00061 uint32_t id,
00062 void *data,
00063 void *baseData,
00064 GWEN_INHERIT_FREEDATAFN fn);
00065 GWENHYWFAR_API
00066 void GWEN_InheritData_free(GWEN_INHERITDATA *d);
00067
00068 GWENHYWFAR_API
00069 void GWEN_InheritData_freeData(GWEN_INHERITDATA *d);
00070
00071 GWENHYWFAR_API
00072 void GWEN_InheritData_freeAllData(GWEN_INHERITDATA *d);
00073
00074 GWENHYWFAR_API
00075 void GWEN_InheritData_clear(GWEN_INHERITDATA *d);
00076
00077 GWENHYWFAR_API
00078 const char *GWEN_InheritData_GetTypeName(const GWEN_INHERITDATA *d);
00079
00080 GWENHYWFAR_API
00081 uint32_t GWEN_InheritData_GetId(const GWEN_INHERITDATA *d);
00082
00083 GWENHYWFAR_API
00084 void *GWEN_InheritData_GetData(const GWEN_INHERITDATA *d);
00085
00086 GWENHYWFAR_API
00087 GWEN_INHERIT_FREEDATAFN
00088 GWEN_InheritData_GetFreeDataFn(const GWEN_INHERITDATA *d);
00089
00090 GWENHYWFAR_API
00091 uint32_t GWEN_Inherit_MakeId(const char *typeName);
00092
00093 GWENHYWFAR_API
00094 void* GWEN_Inherit_FindData(GWEN_INHERITDATA_LIST *l,
00095 uint32_t id,
00096 int wantCreate);
00097
00098 GWENHYWFAR_API
00099 GWEN_INHERITDATA *GWEN_Inherit_FindEntry(GWEN_INHERITDATA_LIST *l,
00100 uint32_t id,
00101 int wantCreate);
00102
00112 #define GWEN_INHERIT_ELEMENT(t) \
00113 GWEN_INHERITDATA_LIST *INHERIT__list;
00114
00125 #define GWEN_INHERIT_FUNCTION_LIB_DEFS(t, decl) \
00126 decl void t##__INHERIT_SETDATA(t *element, \
00127 const char *typeName,\
00128 uint32_t id,\
00129 void *data,\
00130 GWEN_INHERIT_FREEDATAFN f);\
00131 decl int t##__INHERIT_ISOFTYPE(const t *element, uint32_t id);\
00132 decl GWEN_INHERITDATA_LIST *t##__INHERIT_GETLIST(const t *element);\
00133 decl void t##__INHERIT_UNLINK(t *element, \
00134 const char *typeName,\
00135 uint32_t id);
00136
00147 #define GWEN_INHERIT_FUNCTION_DEFS(t) \
00148 GWEN_INHERIT_FUNCTION_LIB_DEFS(t, GWEN_DUMMY_EMPTY_ARG)
00149
00163 #define GWEN_INHERIT_FUNCTIONS(t) \
00164 GWEN_INHERITDATA_LIST *t##__INHERIT_GETLIST(const t *element) {\
00165 assert(element);\
00166 return element->INHERIT__list;\
00167 }\
00168 \
00169 void t##__INHERIT_SETDATA(t *element, \
00170 const char *typeName,\
00171 uint32_t id,\
00172 void *data,\
00173 GWEN_INHERIT_FREEDATAFN f) {\
00174 GWEN_INHERITDATA *d;\
00175 void *p;\
00176 \
00177 assert(element);\
00178 assert(element->INHERIT__list);\
00179 \
00180 p=GWEN_Inherit_FindData(element->INHERIT__list, id, 1);\
00181 if (p) {\
00182 fprintf(stderr,\
00183 "ERROR: Type \"%s\" already inherits base type\n",\
00184 typeName);\
00185 abort();\
00186 }\
00187 d=GWEN_InheritData_new(typeName, id, data, (void*)element, f);\
00188 GWEN_InheritData_List_Insert(d, element->INHERIT__list);\
00189 }\
00190 \
00191 int t##__INHERIT_ISOFTYPE(const t *element, uint32_t id) {\
00192 assert(element);\
00193 assert(element->INHERIT__list);\
00194 \
00195 return (GWEN_Inherit_FindData(element->INHERIT__list, id, 1)!=0);\
00196 }\
00197 \
00198 void t##__INHERIT_UNLINK(t *element, \
00199 const char *typeName,\
00200 uint32_t id) {\
00201 GWEN_INHERITDATA *d;\
00202 \
00203 assert(element);\
00204 assert(element->INHERIT__list);\
00205 \
00206 d=GWEN_Inherit_FindEntry(element->INHERIT__list, id, 1);\
00207 if (!d) {\
00208 fprintf(stderr, \
00209 "ERROR: Type \"%s\" does not inherit base type\n",\
00210 typeName);\
00211 abort();\
00212 }\
00213 GWEN_InheritData_clear(d);\
00214 GWEN_InheritData_List_Del(d);\
00215 GWEN_InheritData_free(d);\
00216 }
00217
00223 #define GWEN_INHERIT_INIT(t, element) {\
00224 assert(element);\
00225 element->INHERIT__list=GWEN_InheritData_List_new();\
00226 }
00227
00228
00238 #define GWEN_INHERIT_FINI(t, element) {\
00239 GWEN_INHERITDATA *inherit__data;\
00240 \
00241 assert(element);\
00242 assert(element->INHERIT__list);\
00243 \
00244 while( (inherit__data=GWEN_InheritData_List_First(element->INHERIT__list)) ) {\
00245 GWEN_InheritData_freeData(inherit__data); \
00246 GWEN_InheritData_List_Del(inherit__data); \
00247 GWEN_InheritData_free(inherit__data); \
00248 } \
00249 GWEN_InheritData_List_free(element->INHERIT__list);\
00250 }
00251
00264 #define GWEN_INHERIT(bt, t) \
00265 uint32_t t##__INHERIT_ID=0;
00266
00271 #define GWEN_INHERIT_GETDATA(bt, t, element) \
00272 ((t*)GWEN_Inherit_FindData(bt##__INHERIT_GETLIST(element),t##__INHERIT_ID,0))
00273
00292 #define GWEN_INHERIT_SETDATA(bt, t, element, data, fn) {\
00293 if (!t##__INHERIT_ID)\
00294 t##__INHERIT_ID=GWEN_Inherit_MakeId(__STRING(t));\
00295 bt##__INHERIT_SETDATA(element, __STRING(t), t##__INHERIT_ID, data, fn);\
00296 }
00297
00305 #define GWEN_INHERIT_ISOFTYPE(bt, t, element) \
00306 ((bt##__INHERIT_ISOFTYPE(element,\
00307 ((t##__INHERIT_ID==0)?\
00308 ((t##__INHERIT_ID=GWEN_Inherit_MakeId(__STRING(t)))):\
00309 t##__INHERIT_ID)))?1:0)
00310
00318 #define GWEN_INHERIT_UNLINK(bt, t, element) {\
00319 if (!t##__INHERIT_ID)\
00320 t##__INHERIT_ID=GWEN_Inherit_MakeId(__STRING(t));\
00321 bt##__INHERIT_UNLINK(element, __STRING(t), t##__INHERIT_ID);\
00322 }
00323
00326
00327
00328
00329 #ifdef __cplusplus
00330 }
00331 #endif
00332
00333
00334
00335 #endif
00336
00337
00338