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
30#include <gwenhywfar/types.h>
31#include <assert.h>
32
33
34#ifndef GWEN_DUMMY_EMPTY_ARG
37# define GWEN_DUMMY_EMPTY_ARG
38#endif
39
40
41
42#ifdef __cplusplus
43extern "C" {
44#endif
45
46
146
147
156
157
164
165
172
176
180
181
185
189
190
191
195
199
205
211
222
226
230
233
237
239
240
241
246
251#define GWEN_TREE2_ELEMENT(t) \
252GWEN_TREE2_ELEMENT *_tree2_element;
253
260#define GWEN_TREE2_FUNCTION_LIB_DEFS_CONST(t, pr, decl) \
261 decl t* pr##_Tree2_GetNext(const t *element); \
262 decl t* pr##_Tree2_GetPrevious(const t *element); \
263 decl t* pr##_Tree2_GetBelow(const t *element); \
264 decl t* pr##_Tree2_GetFirstChild(const t *element); \
265 decl t* pr##_Tree2_GetLastChild(const t *element); \
266 decl t* pr##_Tree2_GetParent(const t *element);
267
268
269#define GWEN_TREE2_FUNCTION_LIB_DEFS_NOCONST(t, pr, decl) \
270 typedef GWEN_TREE2_ELEMENT t##_TREE2_ELEMENT; \
271 \
272 decl void pr##_Tree2_Unlink(t *element); \
273 decl void pr##_Tree2_Replace(t *elToReplace, t *elReplacement); \
274 \
275 decl void pr##_Tree2_AddChild(t *where, t *element); \
276 decl void pr##_Tree2_InsertChild(t *where, t *element); \
277 \
278 decl void pr##_Tree2_ClearChildren(t *element); \
279 decl void pr##_Tree2_free(t *element);
280
281
282#define GWEN_TREE2_FUNCTION_DEFS_CONST(t, pr) \
283 GWEN_TREE2_FUNCTION_LIB_DEFS_CONST(t, pr, GWEN_DUMMY_EMPTY_ARG)
284
285#define GWEN_TREE2_FUNCTION_DEFS_NOCONST(t, pr) \
286 GWEN_TREE2_FUNCTION_LIB_DEFS_NOCONST(t, pr, GWEN_DUMMY_EMPTY_ARG)
287
288
336#define GWEN_TREE2_FUNCTION_LIB_DEFS(t, pr, decl) \
337 GWEN_TREE2_FUNCTION_LIB_DEFS_CONST(t, pr, decl) \
338 GWEN_TREE2_FUNCTION_LIB_DEFS_NOCONST(t, pr, decl)
339
340
345#define GWEN_TREE2_FUNCTION_DEFS(t, pr) \
346 GWEN_TREE2_FUNCTION_LIB_DEFS(t, pr, GWEN_DUMMY_EMPTY_ARG)
347
348
354#define GWEN_TREE2_FUNCTIONS(t, pr) \
355 \
356 void pr##_Tree2_Unlink(t *element){ \
357 assert(element); \
358 assert(element->_tree2_element);\
359 GWEN_Tree2_Unlink(element->_tree2_element); \
360 }\
361 \
362 void pr##_Tree2_Replace(t *elToReplace, t *elReplacement) { \
363 assert(elToReplace); \
364 assert(elToReplace->_tree2_element);\
365 assert(elReplacement); \
366 assert(elReplacement->_tree2_element);\
367 GWEN_Tree2_Replace(elToReplace->_tree2_element, elReplacement->_tree2_element); \
368 } \
369 \
370 \
371 t* pr##_Tree2_GetNext(const t *element) { \
372 assert(element); \
373 assert(element->_tree2_element);\
374 return (t*)GWEN_Tree2Element_GetNext(element->_tree2_element);\
375 } \
376 \
377 t* pr##_Tree2_GetPrevious(const t *element) { \
378 assert(element); \
379 assert(element->_tree2_element);\
380 return (t*)GWEN_Tree2Element_GetPrevious(element->_tree2_element);\
381 } \
382 \
383 t* pr##_Tree2_GetBelow(const t *element) { \
384 assert(element); \
385 assert(element->_tree2_element);\
386 return (t*)GWEN_Tree2Element_GetBelow(element->_tree2_element);\
387 } \
388 \
389 void pr##_Tree2_AddChild(t *where, t *element) { \
390 assert(where); \
391 assert(where->_tree2_element);\
392 assert(element); \
393 assert(element->_tree2_element);\
394 GWEN_Tree2_AddChild(where->_tree2_element, element->_tree2_element); \
395 } \
396 \
397 void pr##_Tree2_InsertChild(t *where, t *element) { \
398 assert(where); \
399 assert(where->_tree2_element);\
400 assert(element); \
401 assert(element->_tree2_element);\
402 GWEN_Tree2_InsertChild(where->_tree2_element, element->_tree2_element); \
403 } \
404 \
405 void pr##_Tree2_ClearChildren(t *element) { \
406 t* c; \
407 while( (c=GWEN_Tree2Element_GetFirstChild(element->_tree2_element)) ) {\
408 pr##_Tree2_ClearChildren(c);\
409 pr##_Tree2_Unlink(c);\
410 pr##_free(c);\
411 } /* while */ \
412 } \
413 \
414 void pr##_Tree2_free(t *element) { \
415 pr##_Tree2_ClearChildren(element);\
416 pr##_Tree2_Unlink(element);\
417 pr##_free(element);\
418 } \
419 \
420 t* pr##_Tree2_GetFirstChild(const t *element) { \
421 assert(element); \
422 assert(element->_tree2_element);\
423 return (t*)GWEN_Tree2Element_GetFirstChild(element->_tree2_element);\
424 } \
425 \
426 t* pr##_Tree2_GetLastChild(const t *element) { \
427 assert(element); \
428 assert(element->_tree2_element);\
429 return (t*)GWEN_Tree2Element_GetLastChild(element->_tree2_element);\
430 } \
431 \
432 t* pr##_Tree2_GetParent(const t *element) { \
433 assert(element); \
434 assert(element->_tree2_element);\
435 return (t*)GWEN_Tree2Element_GetParent(element->_tree2_element);\
436 } \
437 \
438
439
445#define GWEN_TREE2_INIT(t, element, pr) \
446 element->_tree2_element=GWEN_Tree2Element_new(element);
447
448
457#define GWEN_TREE2_FINI(t, element, pr) \
458 if (element && element->_tree2_element) { \
459 pr##_Tree2_ClearChildren(element);\
460 pr##_Tree2_Unlink(element);\
461 GWEN_Tree2Element_free(element->_tree2_element); \
462 element->_tree2_element=0; \
463 }
464
466
467 /* defgroup */
469
470
471#ifdef __cplusplus
472}
473#endif
474
475
476#endif
477
478
#define GWENHYWFAR_API
GWENHYWFAR_API void * GWEN_Tree2Element_GetFirstChild(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API uint32_t GWEN_Tree2Element_GetChildrenCount(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void GWEN_Tree2_Replace(GWEN_TREE2_ELEMENT *elToReplace, GWEN_TREE2_ELEMENT *elReplacement)
GWENHYWFAR_API void * GWEN_Tree2Element_GetParent(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API GWEN_TREE2_ELEMENT * GWEN_Tree2Element_new(void *d)
GWENHYWFAR_API void * GWEN_Tree2Element_GetNext(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void * GWEN_Tree2Element_GetPrevious(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void GWEN_Tree2_AddChild(GWEN_TREE2_ELEMENT *where, GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void GWEN_Tree2_Unlink(GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void * GWEN_Tree2Element_GetBelow(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void * GWEN_Tree2Element_GetLastChild(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void * GWEN_Tree2_GetLastChild(const GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void GWEN_Tree2_InsertChild(GWEN_TREE2_ELEMENT *where, GWEN_TREE2_ELEMENT *el)
#define GWEN_TREE2_ELEMENT(t)
Definition tree2.h:251
GWENHYWFAR_API void GWEN_Tree2Element_free(GWEN_TREE2_ELEMENT *el)
GWENHYWFAR_API void * GWEN_Tree2_GetFirstChild(const GWEN_TREE2_ELEMENT *el)