gwenhywfar  5.14.1
tree2.h
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Thu Jul 04 2019
3  copyright : (C) 2019 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * *
8  * This library is free software; you can redistribute it and/or *
9  * modify it under the terms of the GNU Lesser General Public *
10  * License as published by the Free Software Foundation; either *
11  * version 2.1 of the License, or (at your option) any later version. *
12  * *
13  * This library is distributed in the hope that it will be useful, *
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16  * Lesser General Public License for more details. *
17  * *
18  * You should have received a copy of the GNU Lesser General Public *
19  * License along with this library; if not, write to the Free Software *
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21  * MA 02111-1307 USA *
22  * *
23  ***************************************************************************/
24 
25 #ifndef GWEN_TREE2_H
26 #define GWEN_TREE2_H
27 
28 
29 #include <gwenhywfar/gwenhywfarapi.h>
30 #include <gwenhywfar/types.h>
31 #include <assert.h>
32 
33 
34 #ifndef GWEN_DUMMY_EMPTY_ARG
35 
37 # define GWEN_DUMMY_EMPTY_ARG
38 #endif
39 
40 
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46 
146 
147 
156 
157 typedef int (*GWEN_TREE2_COMPARE_CB)(void *p1, void *p2);
158 
159 
166 
167 
173 void GWEN_Tree2_Replace(GWEN_TREE2_ELEMENT *elToReplace, GWEN_TREE2_ELEMENT *elReplacement);
174 
178 
182 
183 
187 
191 
192 
193 
197 
201 
207 
213 
224 
228 
232 
235 
239 
242 
251 
256 #define GWEN_TREE2_ELEMENT(t) \
257 GWEN_TREE2_ELEMENT *_tree2_element;
258 
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);
272 
273 
274 #define GWEN_TREE2_FUNCTION_LIB_DEFS_NOCONST(t, pr, decl) \
275  typedef GWEN_TREE2_ELEMENT t##_TREE2_ELEMENT; \
276  \
277  decl void pr##_Tree2_Unlink(t *element); \
278  decl void pr##_Tree2_Replace(t *elToReplace, t *elReplacement); \
279  \
280  decl void pr##_Tree2_AddChild(t *where, t *element); \
281  decl void pr##_Tree2_InsertChild(t *where, t *element); \
282  \
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);
286 
287 
288 #define GWEN_TREE2_FUNCTION_DEFS_CONST(t, pr) \
289  GWEN_TREE2_FUNCTION_LIB_DEFS_CONST(t, pr, GWEN_DUMMY_EMPTY_ARG)
290 
291 #define GWEN_TREE2_FUNCTION_DEFS_NOCONST(t, pr) \
292  GWEN_TREE2_FUNCTION_LIB_DEFS_NOCONST(t, pr, GWEN_DUMMY_EMPTY_ARG)
293 
294 
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)
345 
346 
351 #define GWEN_TREE2_FUNCTION_DEFS(t, pr) \
352  GWEN_TREE2_FUNCTION_LIB_DEFS(t, pr, GWEN_DUMMY_EMPTY_ARG)
353 
354 
360 #define GWEN_TREE2_FUNCTIONS(t, pr) \
361  \
362  void pr##_Tree2_Unlink(t *element){ \
363  assert(element); \
364  assert(element->_tree2_element);\
365  GWEN_Tree2_Unlink(element->_tree2_element); \
366  }\
367  \
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); \
374  } \
375  \
376  \
377  t* pr##_Tree2_GetNext(const t *element) { \
378  assert(element); \
379  assert(element->_tree2_element);\
380  return (t*)GWEN_Tree2Element_GetNext(element->_tree2_element);\
381  } \
382  \
383  t* pr##_Tree2_GetPrevious(const t *element) { \
384  assert(element); \
385  assert(element->_tree2_element);\
386  return (t*)GWEN_Tree2Element_GetPrevious(element->_tree2_element);\
387  } \
388  \
389  t* pr##_Tree2_GetBelow(const t *element) { \
390  assert(element); \
391  assert(element->_tree2_element);\
392  return (t*)GWEN_Tree2Element_GetBelow(element->_tree2_element);\
393  } \
394  \
395  void pr##_Tree2_AddChild(t *where, t *element) { \
396  assert(where); \
397  assert(where->_tree2_element);\
398  assert(element); \
399  assert(element->_tree2_element);\
400  GWEN_Tree2_AddChild(where->_tree2_element, element->_tree2_element); \
401  } \
402  \
403  void pr##_Tree2_InsertChild(t *where, t *element) { \
404  assert(where); \
405  assert(where->_tree2_element);\
406  assert(element); \
407  assert(element->_tree2_element);\
408  GWEN_Tree2_InsertChild(where->_tree2_element, element->_tree2_element); \
409  } \
410  \
411  void pr##_Tree2_ClearChildren(t *element) { \
412  t* c; \
413  while( (c=GWEN_Tree2Element_GetFirstChild(element->_tree2_element)) ) {\
414  pr##_Tree2_ClearChildren(c);\
415  pr##_Tree2_Unlink(c);\
416  pr##_free(c);\
417  } /* while */ \
418  } \
419  \
420  void pr##_Tree2_free(t *element) { \
421  pr##_Tree2_ClearChildren(element);\
422  pr##_Tree2_Unlink(element);\
423  pr##_free(element);\
424  } \
425  \
426  t* pr##_Tree2_GetFirstChild(const t *element) { \
427  assert(element); \
428  assert(element->_tree2_element);\
429  return (t*)GWEN_Tree2Element_GetFirstChild(element->_tree2_element);\
430  } \
431  \
432  t* pr##_Tree2_GetLastChild(const t *element) { \
433  assert(element); \
434  assert(element->_tree2_element);\
435  return (t*)GWEN_Tree2Element_GetLastChild(element->_tree2_element);\
436  } \
437  \
438  t* pr##_Tree2_GetParent(const t *element) { \
439  assert(element); \
440  assert(element->_tree2_element);\
441  return (t*)GWEN_Tree2Element_GetParent(element->_tree2_element);\
442  } \
443  \
444  void pr##_Tree2_SortChildren(const t *element, GWEN_TREE2_COMPARE_CB cb) { \
445  assert(element); \
446  assert(element->_tree2_element);\
447  GWEN_Tree2Element_SortChildren(element->_tree2_element, cb); \
448  }
449 
455 #define GWEN_TREE2_INIT(t, element, pr) \
456  element->_tree2_element=GWEN_Tree2Element_new(element);
457 
458 
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; \
473  }
474 
478  /* defgroup */
479 
480 
481 #ifdef __cplusplus
482 }
483 #endif
484 
485 
486 #endif
487 
488 
GWENHYWFAR_API uint32_t GWEN_Tree2Element_GetChildrenCount(const GWEN_TREE2_ELEMENT *el)
Definition: tree2.c:195
int(* GWEN_TREE2_COMPARE_CB)(void *p1, void *p2)
Definition: tree2.h:157
GWENHYWFAR_API void GWEN_Tree2_AddChild(GWEN_TREE2_ELEMENT *where, GWEN_TREE2_ELEMENT *el)
Definition: tree2.c:128
struct GWEN_TREE2_ELEMENT GWEN_TREE2_ELEMENT
Definition: tree2.h:155
GWENHYWFAR_API void * GWEN_Tree2Element_GetParent(const GWEN_TREE2_ELEMENT *el)
Definition: tree2.c:231
GWENHYWFAR_API void * GWEN_Tree2Element_GetLastChild(const GWEN_TREE2_ELEMENT *el)
Definition: tree2.c:222
GWENHYWFAR_API void * GWEN_Tree2_GetFirstChild(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void GWEN_Tree2Element_free(GWEN_TREE2_ELEMENT *el)
Definition: tree2.c:57
GWENHYWFAR_API void GWEN_Tree2_Unlink(GWEN_TREE2_ELEMENT *el)
Definition: tree2.c:70
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)
Definition: tree2.c:240
GWENHYWFAR_API void * GWEN_Tree2Element_GetNext(const GWEN_TREE2_ELEMENT *el)
Definition: tree2.c:165
#define GWENHYWFAR_API
Definition: gwenhywfarapi.h:67
GWENHYWFAR_API void GWEN_Tree2_InsertChild(GWEN_TREE2_ELEMENT *where, GWEN_TREE2_ELEMENT *el)
Definition: tree2.c:143
GWENHYWFAR_API void GWEN_Tree2_Replace(GWEN_TREE2_ELEMENT *elToReplace, GWEN_TREE2_ELEMENT *elReplacement)
Definition: tree2.c:96
GWENHYWFAR_API void * GWEN_Tree2Element_GetFirstChild(const GWEN_TREE2_ELEMENT *el)
Definition: tree2.c:213
GWENHYWFAR_API void * GWEN_Tree2Element_GetBelow(const GWEN_TREE2_ELEMENT *el)
Definition: tree2.c:174
GWENHYWFAR_API void * GWEN_Tree2Element_GetPrevious(const GWEN_TREE2_ELEMENT *el)
Definition: tree2.c:156
GWENHYWFAR_API GWEN_TREE2_ELEMENT * GWEN_Tree2Element_new(void *d)
Definition: tree2.c:45