29 #include <gwenhywfar/gwenhywfarapi.h> 30 #include <gwenhywfar/types.h> 34 #ifndef GWEN_DUMMY_EMPTY_ARG 37 # define GWEN_DUMMY_EMPTY_ARG 256 #define GWEN_TREE2_ELEMENT(t) \ 257 GWEN_TREE2_ELEMENT *_tree2_element; 265 #define GWEN_TREE2_FUNCTION_LIB_DEFS_CONST(t, pr, decl) \ 266 decl t* pr##_Tree2_GetNext(const t *element); \ 267 decl t* pr##_Tree2_GetPrevious(const t *element); \ 268 decl t* pr##_Tree2_GetBelow(const t *element); \ 269 decl t* pr##_Tree2_GetFirstChild(const t *element); \ 270 decl t* pr##_Tree2_GetLastChild(const t *element); \ 271 decl t* pr##_Tree2_GetParent(const t *element); 274 #define GWEN_TREE2_FUNCTION_LIB_DEFS_NOCONST(t, pr, decl) \ 275 typedef GWEN_TREE2_ELEMENT t##_TREE2_ELEMENT; \ 277 decl void pr##_Tree2_Unlink(t *element); \ 278 decl void pr##_Tree2_Replace(t *elToReplace, t *elReplacement); \ 280 decl void pr##_Tree2_AddChild(t *where, t *element); \ 281 decl void pr##_Tree2_InsertChild(t *where, t *element); \ 283 decl void pr##_Tree2_ClearChildren(t *element); \ 284 decl void pr##_Tree2_free(t *element); \ 285 decl void pr##_Tree2_SortChildren(const t *element, GWEN_TREE2_COMPARE_CB cb); 288 #define GWEN_TREE2_FUNCTION_DEFS_CONST(t, pr) \ 289 GWEN_TREE2_FUNCTION_LIB_DEFS_CONST(t, pr, GWEN_DUMMY_EMPTY_ARG) 291 #define GWEN_TREE2_FUNCTION_DEFS_NOCONST(t, pr) \ 292 GWEN_TREE2_FUNCTION_LIB_DEFS_NOCONST(t, pr, GWEN_DUMMY_EMPTY_ARG) 342 #define GWEN_TREE2_FUNCTION_LIB_DEFS(t, pr, decl) \ 343 GWEN_TREE2_FUNCTION_LIB_DEFS_CONST(t, pr, decl) \ 344 GWEN_TREE2_FUNCTION_LIB_DEFS_NOCONST(t, pr, decl) 351 #define GWEN_TREE2_FUNCTION_DEFS(t, pr) \ 352 GWEN_TREE2_FUNCTION_LIB_DEFS(t, pr, GWEN_DUMMY_EMPTY_ARG) 360 #define GWEN_TREE2_FUNCTIONS(t, pr) \ 362 void pr##_Tree2_Unlink(t *element){ \ 364 assert(element->_tree2_element);\ 365 GWEN_Tree2_Unlink(element->_tree2_element); \ 368 void pr##_Tree2_Replace(t *elToReplace, t *elReplacement) { \ 369 assert(elToReplace); \ 370 assert(elToReplace->_tree2_element);\ 371 assert(elReplacement); \ 372 assert(elReplacement->_tree2_element);\ 373 GWEN_Tree2_Replace(elToReplace->_tree2_element, elReplacement->_tree2_element); \ 377 t* pr##_Tree2_GetNext(const t *element) { \ 379 assert(element->_tree2_element);\ 380 return (t*)GWEN_Tree2Element_GetNext(element->_tree2_element);\ 383 t* pr##_Tree2_GetPrevious(const t *element) { \ 385 assert(element->_tree2_element);\ 386 return (t*)GWEN_Tree2Element_GetPrevious(element->_tree2_element);\ 389 t* pr##_Tree2_GetBelow(const t *element) { \ 391 assert(element->_tree2_element);\ 392 return (t*)GWEN_Tree2Element_GetBelow(element->_tree2_element);\ 395 void pr##_Tree2_AddChild(t *where, t *element) { \ 397 assert(where->_tree2_element);\ 399 assert(element->_tree2_element);\ 400 GWEN_Tree2_AddChild(where->_tree2_element, element->_tree2_element); \ 403 void pr##_Tree2_InsertChild(t *where, t *element) { \ 405 assert(where->_tree2_element);\ 407 assert(element->_tree2_element);\ 408 GWEN_Tree2_InsertChild(where->_tree2_element, element->_tree2_element); \ 411 void pr##_Tree2_ClearChildren(t *element) { \ 413 while( (c=GWEN_Tree2Element_GetFirstChild(element->_tree2_element)) ) {\ 414 pr##_Tree2_ClearChildren(c);\ 415 pr##_Tree2_Unlink(c);\ 420 void pr##_Tree2_free(t *element) { \ 421 pr##_Tree2_ClearChildren(element);\ 422 pr##_Tree2_Unlink(element);\ 426 t* pr##_Tree2_GetFirstChild(const t *element) { \ 428 assert(element->_tree2_element);\ 429 return (t*)GWEN_Tree2Element_GetFirstChild(element->_tree2_element);\ 432 t* pr##_Tree2_GetLastChild(const t *element) { \ 434 assert(element->_tree2_element);\ 435 return (t*)GWEN_Tree2Element_GetLastChild(element->_tree2_element);\ 438 t* pr##_Tree2_GetParent(const t *element) { \ 440 assert(element->_tree2_element);\ 441 return (t*)GWEN_Tree2Element_GetParent(element->_tree2_element);\ 444 void pr##_Tree2_SortChildren(const t *element, GWEN_TREE2_COMPARE_CB cb) { \ 446 assert(element->_tree2_element);\ 447 GWEN_Tree2Element_SortChildren(element->_tree2_element, cb); \ 455 #define GWEN_TREE2_INIT(t, element, pr) \ 456 element->_tree2_element=GWEN_Tree2Element_new(element); 467 #define GWEN_TREE2_FINI(t, element, pr) \ 468 if (element && element->_tree2_element) { \ 469 pr##_Tree2_ClearChildren(element);\ 470 pr##_Tree2_Unlink(element);\ 471 GWEN_Tree2Element_free(element->_tree2_element); \ 472 element->_tree2_element=0; \ GWENHYWFAR_API uint32_t GWEN_Tree2Element_GetChildrenCount(const GWEN_TREE2_ELEMENT *el)
int(* GWEN_TREE2_COMPARE_CB)(void *p1, void *p2)
GWENHYWFAR_API void GWEN_Tree2_AddChild(GWEN_TREE2_ELEMENT *where, GWEN_TREE2_ELEMENT *el)
struct GWEN_TREE2_ELEMENT GWEN_TREE2_ELEMENT
GWENHYWFAR_API void * GWEN_Tree2Element_GetParent(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void * GWEN_Tree2Element_GetLastChild(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void * GWEN_Tree2_GetFirstChild(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void GWEN_Tree2Element_free(GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void GWEN_Tree2_Unlink(GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void * GWEN_Tree2_GetLastChild(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void GWEN_Tree2Element_SortChildren(GWEN_TREE2_ELEMENT *el, GWEN_TREE2_COMPARE_CB cb)
GWENHYWFAR_API void * GWEN_Tree2Element_GetNext(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void GWEN_Tree2_InsertChild(GWEN_TREE2_ELEMENT *where, GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void GWEN_Tree2_Replace(GWEN_TREE2_ELEMENT *elToReplace, GWEN_TREE2_ELEMENT *elReplacement)
GWENHYWFAR_API void * GWEN_Tree2Element_GetFirstChild(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void * GWEN_Tree2Element_GetBelow(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void * GWEN_Tree2Element_GetPrevious(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API GWEN_TREE2_ELEMENT * GWEN_Tree2Element_new(void *d)