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
00029 #include <gwenhywfar/gwenhywfarapi.h>
00030 #include <gwenhywfar/types.h>
00031 #include <assert.h>
00032
00033
00034 #ifndef GWEN_DUMMY_EMPTY_ARG
00035
00037 # define GWEN_DUMMY_EMPTY_ARG
00038 #endif
00039
00040
00041 #ifndef GWEN_LIST1_H
00042 #define GWEN_LIST1_H
00043
00044
00045 #ifdef __cplusplus
00046 extern "C" {
00047 #endif
00048
00049
00149
00150
00158 typedef struct GWEN_LIST1 GWEN_LIST1;
00159 typedef struct GWEN_LIST1_ELEMENT GWEN_LIST1_ELEMENT;
00160
00161
00163 GWENHYWFAR_API
00164 GWEN_LIST1 *GWEN_List1_new();
00165
00169 GWENHYWFAR_API
00170 void GWEN_List1_free(GWEN_LIST1 *l);
00171
00175 GWENHYWFAR_API
00176 int GWEN_List1_GetCount(const GWEN_LIST1 *l);
00177
00180 GWENHYWFAR_API
00181 int GWEN_List1_Add(GWEN_LIST1 *l, GWEN_LIST1_ELEMENT *el);
00182
00186 GWENHYWFAR_API
00187 int GWEN_List1_Insert(GWEN_LIST1 *l, GWEN_LIST1_ELEMENT *el);
00188
00193 GWENHYWFAR_API
00194 int GWEN_List1_Del(GWEN_LIST1_ELEMENT *el);
00195
00199 GWENHYWFAR_API
00200 int GWEN_List1_AddList(GWEN_LIST1 *dest, GWEN_LIST1 *l);
00201
00203 GWENHYWFAR_API
00204 void *GWEN_List1_GetFirst(const GWEN_LIST1 *l);
00205
00207 GWENHYWFAR_API
00208 void *GWEN_List1_GetLast(const GWEN_LIST1 *l);
00209
00210
00211
00213 GWENHYWFAR_API
00214 GWEN_LIST1_ELEMENT *GWEN_List1Element_new(void *d);
00215
00217 GWENHYWFAR_API
00218 void GWEN_List1Element_free(GWEN_LIST1_ELEMENT *el);
00219
00222 GWENHYWFAR_API
00223 void *GWEN_List1Element_GetData(const GWEN_LIST1_ELEMENT *el);
00224
00228 GWENHYWFAR_API
00229 void *GWEN_List1Element_GetPrevious(const GWEN_LIST1_ELEMENT *el);
00230
00234 GWENHYWFAR_API
00235 void *GWEN_List1Element_GetNext(const GWEN_LIST1_ELEMENT *el);
00236
00244
00249 #define GWEN_LIST_ELEMENT(t) \
00250 GWEN_LIST1_ELEMENT *_list1_element;
00251
00258 #define GWEN_LIST_FUNCTION_LIB_DEFS_CONST(t, pr, decl) \
00259 typedef GWEN_LIST1 t##_LIST; \
00260 \
00261 decl t* pr##_List_First(const t##_LIST *l); \
00262 decl t* pr##_List_Last(const t##_LIST *l); \
00263 decl t* pr##_List_Next(const t *element); \
00264 decl t* pr##_List_Previous(const t *element); \
00265 decl uint32_t pr##_List_GetCount(const t##_LIST *l); \
00266 decl int pr##_List_HasElement(const t##_LIST *l, const t *element);
00267
00268
00269 #define GWEN_LIST_FUNCTION_LIB_DEFS_NOCONST(t, pr, decl) \
00270 typedef GWEN_LIST1_ELEMENT t##_LIST_ELEMENT; \
00271 \
00272 decl void pr##_List_Clear(t##_LIST *l); \
00273 decl t##_LIST* pr##_List_new(); \
00274 decl void pr##_List_free(t##_LIST *l); \
00275 decl int pr##_List_AddList(t##_LIST *dst, t##_LIST *l); \
00276 decl int pr##_List_Add(t *element, t##_LIST *list); \
00277 decl int pr##_List_Insert(t *element, t##_LIST *list); \
00278 decl int pr##_List_Del(t *element); \
00279
00280
00281 #define GWEN_LIST_FUNCTION_DEFS_CONST(t, pr) \
00282 GWEN_LIST_FUNCTION_LIB_DEFS_CONST(t, pr, GWEN_DUMMY_EMPTY_ARG)
00283
00284 #define GWEN_LIST_FUNCTION_DEFS_NOCONST(t, pr) \
00285 GWEN_LIST_FUNCTION_LIB_DEFS_NOCONST(t, pr, GWEN_DUMMY_EMPTY_ARG)
00286
00287
00335 #define GWEN_LIST_FUNCTION_LIB_DEFS(t, pr, decl) \
00336 GWEN_LIST_FUNCTION_LIB_DEFS_CONST(t, pr, decl) \
00337 GWEN_LIST_FUNCTION_LIB_DEFS_NOCONST(t, pr, decl)
00338
00339
00344 #define GWEN_LIST_FUNCTION_DEFS(t, pr) \
00345 GWEN_LIST_FUNCTION_LIB_DEFS(t, pr, GWEN_DUMMY_EMPTY_ARG)
00346
00347
00353 #define GWEN_LIST_FUNCTIONS(t, pr) \
00354 \
00355 int pr##_List_Add(t *element, t##_LIST *l) { \
00356 assert(element); \
00357 assert(element->_list1_element);\
00358 return GWEN_List1_Add(l, element->_list1_element); \
00359 } \
00360 \
00361 int pr##_List_AddList(t##_LIST *dst, t##_LIST *l) { \
00362 return GWEN_List1_AddList(dst, l); \
00363 } \
00364 \
00365 int pr##_List_Insert(t *element, t##_LIST *l) { \
00366 assert(element); \
00367 assert(element->_list1_element);\
00368 return GWEN_List1_Insert(l, element->_list1_element); \
00369 } \
00370 \
00371 int pr##_List_Del(t *element){ \
00372 assert(element); \
00373 assert(element->_list1_element);\
00374 return GWEN_List1_Del(element->_list1_element); \
00375 }\
00376 \
00377 t* pr##_List_First(const t##_LIST *l) { \
00378 if (l) return (t*)GWEN_List1_GetFirst(l);\
00379 else return 0; \
00380 } \
00381 \
00382 t* pr##_List_Last(const t##_LIST *l) { \
00383 if (l) return (t*) GWEN_List1_GetLast(l);\
00384 else return 0; \
00385 } \
00386 \
00387 void pr##_List_Clear(t##_LIST *l) { \
00388 t* el; \
00389 while( (el=GWEN_List1_GetFirst(l)) ) {\
00390 pr##_List_Del(el);\
00391 pr##_free(el);\
00392 } \
00393 } \
00394 \
00395 int pr##_List_HasElement(const t##_LIST *l, const t *element) { \
00396 const t* el; \
00397 el=(t*)GWEN_List1_GetFirst(l); \
00398 while(el) {\
00399 if (el==element) \
00400 return 1; \
00401 el=(const t*)GWEN_List1Element_GetNext(element->_list1_element); \
00402 } \
00403 return 0; \
00404 } \
00405 \
00406 t##_LIST* pr##_List_new(){\
00407 return (t##_LIST*)GWEN_List1_new(); \
00408 }\
00409 \
00410 void pr##_List_free(t##_LIST *l) {\
00411 if (l) { \
00412 pr##_List_Clear(l);\
00413 GWEN_List1_free(l); \
00414 }\
00415 } \
00416 \
00417 t* pr##_List_Next(const t *element) { \
00418 assert(element); \
00419 assert(element->_list1_element);\
00420 return (t*)GWEN_List1Element_GetNext(element->_list1_element);\
00421 } \
00422 \
00423 t* pr##_List_Previous(const t *element) { \
00424 assert(element); \
00425 assert(element->_list1_element);\
00426 return (t*)GWEN_List1Element_GetPrevious(element->_list1_element);\
00427 } \
00428 \
00429 uint32_t pr##_List_GetCount(const t##_LIST *l){\
00430 return GWEN_List1_GetCount(l);\
00431 }
00432
00433
00434
00440 #define GWEN_LIST_INIT(t, element) \
00441 element->_list1_element=GWEN_List1Element_new(element);
00442
00443
00449 #define GWEN_LIST_FINI(t, element) \
00450 if (element && element->_list1_element) { \
00451 GWEN_List1Element_free(element->_list1_element); \
00452 element->_list1_element=0; \
00453 }
00454
00457
00458
00459
00460 #ifdef __cplusplus
00461 }
00462 #endif
00463
00464
00465 #endif
00466
00467