31 #ifndef GWEN_DUMMY_EMPTY_ARG
34 # define GWEN_DUMMY_EMPTY_ARG
286 #define GWEN_TREE_ELEMENT(t) \
287 GWEN_TREE_ELEMENT *_tree_element;
295 #define GWEN_TREE_FUNCTION_LIB_DEFS_CONST(t, pr, decl) \
296 typedef GWEN_TREE t##_TREE; \
298 decl t* pr##_Tree_GetFirst(const t##_TREE *l); \
299 decl t* pr##_Tree_GetLast(const t##_TREE *l); \
300 decl t* pr##_Tree_GetNext(const t *element); \
301 decl t* pr##_Tree_GetPrevious(const t *element); \
302 decl t* pr##_Tree_GetBelow(const t *element); \
303 decl uint32_t pr##_Tree_GetCount(const t##_TREE *l); \
304 decl int pr##_Tree_HasElement(const t##_TREE *l, const t *element); \
305 decl t* pr##_Tree_GetFirstChild(const t *element); \
306 decl t* pr##_Tree_GetLastChild(const t *element); \
307 decl uint32_t pr##_Tree_GetChildrenCount(const t *element); \
308 decl t* pr##_Tree_GetParent(const t *element);
311 #define GWEN_TREE_FUNCTION_LIB_DEFS_NOCONST(t, pr, decl) \
312 typedef GWEN_TREE_ELEMENT t##_TREE_ELEMENT; \
314 decl void pr##_Tree_Clear(t##_TREE *l); \
315 decl t##_TREE* pr##_Tree_new(); \
316 decl void pr##_Tree_free(t##_TREE *l); \
317 decl void pr##_Tree_AddList(t##_TREE *dst, t##_TREE *l); \
318 decl void pr##_Tree_Add(t##_TREE *list, t *element); \
319 decl void pr##_Tree_Insert(t##_TREE *list, t *element); \
320 decl void pr##_Tree_Del(t *element); \
321 decl void pr##_Tree_Replace(t *elToReplace, t *elReplacement); \
323 decl void pr##_Tree_AddChild(t *where, t *element); \
324 decl void pr##_Tree_InsertChild(t *where, t *element); \
326 decl int pr##_Tree_HasChildElement(const t *who, const t *element); \
327 decl void pr##_Tree_ClearChildren(t *element); \
330 #define GWEN_TREE_FUNCTION_DEFS_CONST(t, pr) \
331 GWEN_TREE_FUNCTION_LIB_DEFS_CONST(t, pr, GWEN_DUMMY_EMPTY_ARG)
333 #define GWEN_TREE_FUNCTION_DEFS_NOCONST(t, pr) \
334 GWEN_TREE_FUNCTION_LIB_DEFS_NOCONST(t, pr, GWEN_DUMMY_EMPTY_ARG)
384 #define GWEN_TREE_FUNCTION_LIB_DEFS(t, pr, decl) \
385 GWEN_TREE_FUNCTION_LIB_DEFS_CONST(t, pr, decl) \
386 GWEN_TREE_FUNCTION_LIB_DEFS_NOCONST(t, pr, decl)
393 #define GWEN_TREE_FUNCTION_DEFS(t, pr) \
394 GWEN_TREE_FUNCTION_LIB_DEFS(t, pr, GWEN_DUMMY_EMPTY_ARG)
402 #define GWEN_TREE_FUNCTIONS(t, pr) \
404 void pr##_Tree_Add(t##_TREE *l, t *element) { \
406 assert(element->_tree_element);\
407 GWEN_Tree_Add(l, element->_tree_element); \
410 void pr##_Tree_AddList(t##_TREE *dst, t##_TREE *l) { \
411 GWEN_Tree_AddList(dst, l); \
414 void pr##_Tree_Insert(t##_TREE *l, t *element) { \
416 assert(element->_tree_element);\
417 GWEN_Tree_Insert(l, element->_tree_element); \
420 void pr##_Tree_Del(t *element){ \
422 assert(element->_tree_element);\
423 GWEN_Tree_Del(element->_tree_element); \
426 void pr##_Tree_Replace(t *elToReplace, t *elReplacement) { \
427 assert(elToReplace); \
428 assert(elToReplace->_tree_element);\
429 assert(elReplacement); \
430 assert(elReplacement->_tree_element);\
431 GWEN_Tree_Replace(elToReplace->_tree_element, elReplacement->_tree_element); \
434 t* pr##_Tree_GetFirst(const t##_TREE *l) { \
435 if (l) return (t*)GWEN_Tree_GetFirst(l);\
439 t* pr##_Tree_GetLast(const t##_TREE *l) { \
440 if (l) return (t*) GWEN_Tree_GetLast(l);\
444 void pr##_Tree_Clear(t##_TREE *l) { \
446 while( (el=GWEN_Tree_GetFirst(l)) ) {\
448 pr##_Tree_ClearChildren(el); \
453 int pr##_Tree_HasElement(const t##_TREE *l, const t *element) { \
455 el=(t*)GWEN_Tree_GetFirst(l); \
459 el=(const t*)GWEN_TreeElement_GetBelow(el->_tree_element); \
464 t##_TREE* pr##_Tree_new(){\
465 return (t##_TREE*)GWEN_Tree_new(); \
468 void pr##_Tree_free(t##_TREE *l) {\
475 t* pr##_Tree_GetNext(const t *element) { \
477 assert(element->_tree_element);\
478 return (t*)GWEN_TreeElement_GetNext(element->_tree_element);\
481 t* pr##_Tree_GetPrevious(const t *element) { \
483 assert(element->_tree_element);\
484 return (t*)GWEN_TreeElement_GetPrevious(element->_tree_element);\
487 t* pr##_Tree_GetBelow(const t *element) { \
489 assert(element->_tree_element);\
490 return (t*)GWEN_TreeElement_GetBelow(element->_tree_element);\
493 uint32_t pr##_Tree_GetCount(const t##_TREE *l){\
494 return GWEN_Tree_GetCount(l);\
497 int pr##_Tree_HasChildElement(const t *who, const t *element) { \
499 el=(const t*)GWEN_TreeElement_GetFirstChild(who->_tree_element); \
503 el=(const t*)GWEN_TreeElement_GetNext(el->_tree_element); \
508 void pr##_Tree_AddChild(t *where, t *element) { \
510 assert(where->_tree_element);\
512 assert(element->_tree_element);\
513 GWEN_Tree_AddChild(where->_tree_element, element->_tree_element); \
516 void pr##_Tree_InsertChild(t *where, t *element) { \
518 assert(where->_tree_element);\
520 assert(element->_tree_element);\
521 GWEN_Tree_InsertChild(where->_tree_element, element->_tree_element); \
524 void pr##_Tree_ClearChildren(t *element) { \
526 while( (c=GWEN_TreeElement_GetFirstChild(element->_tree_element)) ) {\
527 pr##_Tree_ClearChildren(c);\
533 t* pr##_Tree_GetFirstChild(const t *element) { \
535 assert(element->_tree_element);\
536 return (t*)GWEN_TreeElement_GetFirstChild(element->_tree_element);\
539 t* pr##_Tree_GetLastChild(const t *element) { \
541 assert(element->_tree_element);\
542 return (t*)GWEN_TreeElement_GetLastChild(element->_tree_element);\
545 uint32_t pr##_Tree_GetChildrenCount(const t *element){\
546 return GWEN_TreeElement_GetChildrenCount(element->_tree_element);\
549 t* pr##_Tree_GetParent(const t *element) { \
551 assert(element->_tree_element);\
552 return (t*)GWEN_TreeElement_GetParent(element->_tree_element);\
562 #define GWEN_TREE_INIT(t, element) \
563 element->_tree_element=GWEN_TreeElement_new(element);
571 #define GWEN_TREE_FINI(t, element) \
572 if (element && element->_tree_element) { \
573 GWEN_TreeElement_free(element->_tree_element); \
574 element->_tree_element=0; \
GWENHYWFAR_API void GWEN_Tree_Add(GWEN_TREE *l, GWEN_TREE_ELEMENT *el)
GWENHYWFAR_API void * GWEN_TreeElement_GetPrevious(const GWEN_TREE_ELEMENT *el)
GWENHYWFAR_API uint32_t GWEN_TreeElement_GetChildrenCount(const GWEN_TREE_ELEMENT *el)
GWENHYWFAR_API GWEN_TREE * GWEN_Tree_new(void)
GWENHYWFAR_API void GWEN_Tree_Replace(GWEN_TREE_ELEMENT *elToReplace, GWEN_TREE_ELEMENT *elReplacement)
GWENHYWFAR_API void GWEN_Tree_Del(GWEN_TREE_ELEMENT *el)
struct GWEN_TREE_ELEMENT GWEN_TREE_ELEMENT
GWENHYWFAR_API void * GWEN_TreeElement_GetLastChild(const GWEN_TREE_ELEMENT *el)
struct GWEN_TREE GWEN_TREE
GWENHYWFAR_API void * GWEN_TreeElement_GetNext(const GWEN_TREE_ELEMENT *el)
GWENHYWFAR_API void GWEN_Tree_AddList(GWEN_TREE *dest, GWEN_TREE *l)
GWENHYWFAR_API void * GWEN_TreeElement_GetFirstChild(const GWEN_TREE_ELEMENT *el)
GWENHYWFAR_API void GWEN_Tree_InsertChild(GWEN_TREE_ELEMENT *where, GWEN_TREE_ELEMENT *el)
GWENHYWFAR_API int GWEN_Tree_GetCount(const GWEN_TREE *l)
GWENHYWFAR_API void * GWEN_TreeElement_GetBelow(const GWEN_TREE_ELEMENT *el)
GWENHYWFAR_API void GWEN_TreeElement_free(GWEN_TREE_ELEMENT *el)
GWENHYWFAR_API void GWEN_Tree_free(GWEN_TREE *l)
GWENHYWFAR_API void * GWEN_TreeElement_GetParent(const GWEN_TREE_ELEMENT *el)
GWENHYWFAR_API void * GWEN_Tree_GetLast(const GWEN_TREE *l)
GWENHYWFAR_API GWEN_TREE_ELEMENT * GWEN_TreeElement_new(void *d)
GWENHYWFAR_API void GWEN_Tree_Insert(GWEN_TREE *l, GWEN_TREE_ELEMENT *el)
GWENHYWFAR_API void GWEN_Tree_AddChild(GWEN_TREE_ELEMENT *where, GWEN_TREE_ELEMENT *el)
GWENHYWFAR_API void * GWEN_Tree_GetFirst(const GWEN_TREE *l)