gwenhywfar  5.11.1beta
Macros
tree2.h File Reference
#include <gwenhywfar/gwenhywfarapi.h>
#include <gwenhywfar/types.h>
#include <assert.h>

Go to the source code of this file.

Macros

#define GWEN_DUMMY_EMPTY_ARG
 
Typesafe Macros
#define GWEN_TREE2_ELEMENT(t)   GWEN_TREE2_ELEMENT *_tree2_element;
 
#define GWEN_TREE2_FINI(t, element, pr)
 
#define GWEN_TREE2_FUNCTION_DEFS(t, pr)    GWEN_TREE2_FUNCTION_LIB_DEFS(t, pr, GWEN_DUMMY_EMPTY_ARG)
 
#define GWEN_TREE2_FUNCTION_DEFS_CONST(t, pr)    GWEN_TREE2_FUNCTION_LIB_DEFS_CONST(t, pr, GWEN_DUMMY_EMPTY_ARG)
 
#define GWEN_TREE2_FUNCTION_DEFS_NOCONST(t, pr)    GWEN_TREE2_FUNCTION_LIB_DEFS_NOCONST(t, pr, GWEN_DUMMY_EMPTY_ARG)
 
#define GWEN_TREE2_FUNCTION_LIB_DEFS(t, pr, decl)
 
#define GWEN_TREE2_FUNCTION_LIB_DEFS_CONST(t, pr, decl)
 
#define GWEN_TREE2_FUNCTION_LIB_DEFS_NOCONST(t, pr, decl)
 
#define GWEN_TREE2_FUNCTIONS(t, pr)
 
#define GWEN_TREE2_INIT(t, element, pr)    element->_tree2_element=GWEN_Tree2Element_new(element);
 

Internal Functions

All functions and structs within this group should be considered internal. They just implement the functionality behind the typesafe list macros (see GWEN_TREE2_FUNCTION_LIB_DEFS and following).

GWENHYWFAR_API void GWEN_Tree2_AddChild (GWEN_TREE2_ELEMENT *where, GWEN_TREE2_ELEMENT *el)
 
typedef struct GWEN_TREE2_ELEMENT GWEN_TREE2_ELEMENT
 
GWENHYWFAR_API void * GWEN_Tree2_GetFirstChild (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)
 
GWENHYWFAR_API void GWEN_Tree2_Replace (GWEN_TREE2_ELEMENT *elToReplace, GWEN_TREE2_ELEMENT *elReplacement)
 
GWENHYWFAR_API void GWEN_Tree2_Unlink (GWEN_TREE2_ELEMENT *el)
 
GWENHYWFAR_API void GWEN_Tree2Element_free (GWEN_TREE2_ELEMENT *el)
 
GWENHYWFAR_API void * GWEN_Tree2Element_GetBelow (const GWEN_TREE2_ELEMENT *el)
 
GWENHYWFAR_API uint32_t GWEN_Tree2Element_GetChildrenCount (const GWEN_TREE2_ELEMENT *el)
 
GWENHYWFAR_API void * GWEN_Tree2Element_GetFirstChild (const GWEN_TREE2_ELEMENT *el)
 
GWENHYWFAR_API void * GWEN_Tree2Element_GetLastChild (const GWEN_TREE2_ELEMENT *el)
 
GWENHYWFAR_API void * GWEN_Tree2Element_GetNext (const GWEN_TREE2_ELEMENT *el)
 
GWENHYWFAR_API void * GWEN_Tree2Element_GetParent (const GWEN_TREE2_ELEMENT *el)
 
GWENHYWFAR_API void * GWEN_Tree2Element_GetPrevious (const GWEN_TREE2_ELEMENT *el)
 
GWENHYWFAR_API GWEN_TREE2_ELEMENTGWEN_Tree2Element_new (void *d)
 

Macro Definition Documentation

◆ GWEN_DUMMY_EMPTY_ARG

#define GWEN_DUMMY_EMPTY_ARG

Necessary for MSVC compiler because it does not accept a left-out macro argument.

Definition at line 37 of file tree2.h.

◆ GWEN_TREE2_ELEMENT

#define GWEN_TREE2_ELEMENT (   t)    GWEN_TREE2_ELEMENT *_tree2_element;

Use this inside the declaration of a struct for which you want to create lists.

Definition at line 251 of file tree2.h.

◆ GWEN_TREE2_FINI

#define GWEN_TREE2_FINI (   t,
  element,
  pr 
)
Value:
if (element && element->_tree2_element) { \
pr##_Tree2_ClearChildren(element);\
pr##_Tree2_Unlink(element);\
GWEN_Tree2Element_free(element->_tree2_element); \
element->_tree2_element=0; \
}

Use this in your code file (*.c) inside the fini code for the struct you want to use in lists (in GWEN these are the functions which end with "_free". t is the base type id (e.g. "AF_ACCOUNT") element is the pointer to the element to fini pr ist the prefix of functions for this type (e.g. "AF_Account")

Definition at line 457 of file tree2.h.

◆ GWEN_TREE2_FUNCTION_DEFS

#define GWEN_TREE2_FUNCTION_DEFS (   t,
  pr 
)     GWEN_TREE2_FUNCTION_LIB_DEFS(t, pr, GWEN_DUMMY_EMPTY_ARG)

This macro should be used in applications, not in libraries. In libraries please use the macro GWEN_TREE2_FUNCTION_LIB_DEFS.

Definition at line 345 of file tree2.h.

◆ GWEN_TREE2_FUNCTION_DEFS_CONST

#define GWEN_TREE2_FUNCTION_DEFS_CONST (   t,
  pr 
)     GWEN_TREE2_FUNCTION_LIB_DEFS_CONST(t, pr, GWEN_DUMMY_EMPTY_ARG)

Definition at line 282 of file tree2.h.

◆ GWEN_TREE2_FUNCTION_DEFS_NOCONST

#define GWEN_TREE2_FUNCTION_DEFS_NOCONST (   t,
  pr 
)     GWEN_TREE2_FUNCTION_LIB_DEFS_NOCONST(t, pr, GWEN_DUMMY_EMPTY_ARG)

Definition at line 285 of file tree2.h.

◆ GWEN_TREE2_FUNCTION_LIB_DEFS

#define GWEN_TREE2_FUNCTION_LIB_DEFS (   t,
  pr,
  decl 
)
Value:
GWEN_TREE2_FUNCTION_LIB_DEFS_NOCONST(t, pr, decl)
#define GWEN_TREE2_FUNCTION_LIB_DEFS_CONST(t, pr, decl)
Definition: tree2.h:260

Use this in public header files to define some prototypes for list functions. Let's assume the type of your list elements is "MYTYPE" and you want to use the prefix "MyType_" for the list functions. The following function prototypes will then be created:

  • void MyType_Tree2_Add(MYTYPE *element, MYTYPE_TREE *list);
    Adds (appends) a MYTYPE struct at the end of the given list. (We apologize for the unusual argument order here.)
  • void MyType_Tree2_Unlink(MYTYPE *element);
    Removes a MyType struct from the list it is enlisted to.
  • MYTYPE *MyType_Tree2_FirstChild(MYTYPE *element);
    Returns the first element of the given list.
  • MYTYPE* MyType_Tree2_Next(const MYTYPE *element);
    Returns the next list element to the given one (the successor) in its list.
  • MYTYPE* MyType_Tree2_Previous(const MYTYPE *element);
    Returns the previous list element to the given one (the predecessor) in its list.
  • void MyType_Tree2_Clear(MYTYPE *element);
    Frees all entries of the given list. This function assumes that there is a function Mytype_free().
  • MYTYPE_TREE *MyType_Tree2_new();
    Creates a new list of elements of MYTYPE type.
  • void MyType_Tree2_free(MYTYPE_TREE *l);
    Clears and frees a list of elements of MYTYPE type. All objects inside the list are freed.

Definition at line 336 of file tree2.h.

◆ GWEN_TREE2_FUNCTION_LIB_DEFS_CONST

#define GWEN_TREE2_FUNCTION_LIB_DEFS_CONST (   t,
  pr,
  decl 
)
Value:
decl t* pr##_Tree2_GetNext(const t *element); \
decl t* pr##_Tree2_GetPrevious(const t *element); \
decl t* pr##_Tree2_GetBelow(const t *element); \
decl t* pr##_Tree2_GetFirstChild(const t *element); \
decl t* pr##_Tree2_GetLastChild(const t *element); \
decl t* pr##_Tree2_GetParent(const t *element);

Use this macro in your public header files to export only list functions which do not modify a list. This allows your code to return lists which can not be modified by callers. It also prevents callers from creating their own lists (this is sometimes needed).

Definition at line 260 of file tree2.h.

◆ GWEN_TREE2_FUNCTION_LIB_DEFS_NOCONST

#define GWEN_TREE2_FUNCTION_LIB_DEFS_NOCONST (   t,
  pr,
  decl 
)
Value:
typedef GWEN_TREE2_ELEMENT t##_TREE2_ELEMENT; \
\
decl void pr##_Tree2_Unlink(t *element); \
decl void pr##_Tree2_Replace(t *elToReplace, t *elReplacement); \
\
decl void pr##_Tree2_AddChild(t *where, t *element); \
decl void pr##_Tree2_InsertChild(t *where, t *element); \
\
decl void pr##_Tree2_ClearChildren(t *element); \
decl void pr##_Tree2_free(t *element);
struct GWEN_TREE2_ELEMENT GWEN_TREE2_ELEMENT
Definition: tree2.h:155

Definition at line 269 of file tree2.h.

◆ GWEN_TREE2_FUNCTIONS

#define GWEN_TREE2_FUNCTIONS (   t,
  pr 
)

Use this inside your code files (*.c). Actually implements the functions for which the prototypes have been defined via GWEN_TREE2_FUNCTION_DEFS.

Definition at line 354 of file tree2.h.

◆ GWEN_TREE2_INIT

#define GWEN_TREE2_INIT (   t,
  element,
  pr 
)     element->_tree2_element=GWEN_Tree2Element_new(element);

Use this in your code file (*.c) inside the init code for the struct you want to use in lists (in GWEN these are the functions which end with "_new".

Definition at line 445 of file tree2.h.

Typedef Documentation

◆ GWEN_TREE2_ELEMENT

Definition at line 1 of file tree2.h.

Function Documentation

◆ GWEN_Tree2_AddChild()

GWENHYWFAR_API void GWEN_Tree2_AddChild ( GWEN_TREE2_ELEMENT where,
GWEN_TREE2_ELEMENT el 
)

Add a child below the given element.

◆ GWEN_Tree2_GetFirstChild()

GWENHYWFAR_API void* GWEN_Tree2_GetFirstChild ( const GWEN_TREE2_ELEMENT el)

Returns the data pointer of the first list element.

◆ GWEN_Tree2_GetLastChild()

GWENHYWFAR_API void* GWEN_Tree2_GetLastChild ( const GWEN_TREE2_ELEMENT el)

Returns the data pointer of the last list element.

◆ GWEN_Tree2_InsertChild()

GWENHYWFAR_API void GWEN_Tree2_InsertChild ( GWEN_TREE2_ELEMENT where,
GWEN_TREE2_ELEMENT el 
)

Insert a child below the given element.

◆ GWEN_Tree2_Replace()

GWENHYWFAR_API void GWEN_Tree2_Replace ( GWEN_TREE2_ELEMENT elToReplace,
GWEN_TREE2_ELEMENT elReplacement 
)

Replaces a tree element with another one, so the replacement takes the place of the given element. The given element to replace is unlinked in the process and can be free'd. The replacement MUST NOT be part of any tree.

◆ GWEN_Tree2_Unlink()

GWENHYWFAR_API void GWEN_Tree2_Unlink ( GWEN_TREE2_ELEMENT el)

Unlinks (removes) a tree element from the tree it used to belong to. The tree element is not free'd or anything, it is only removed from the tree it used to belong to. (This operation is also called "remove" elsewhere.)

◆ GWEN_Tree2Element_free()

GWENHYWFAR_API void GWEN_Tree2Element_free ( GWEN_TREE2_ELEMENT el)

Free (delete) a list element structure.

◆ GWEN_Tree2Element_GetBelow()

GWENHYWFAR_API void* GWEN_Tree2Element_GetBelow ( const GWEN_TREE2_ELEMENT el)

Returns the element which is logically below the given one. The order of search is this:

  • first child of the given element
  • next neighbour of the given element
  • loop for every parent: check next neighbour of the given element's parent (if any)

◆ GWEN_Tree2Element_GetChildrenCount()

GWENHYWFAR_API uint32_t GWEN_Tree2Element_GetChildrenCount ( const GWEN_TREE2_ELEMENT el)

Returns the number of children of the given element

◆ GWEN_Tree2Element_GetFirstChild()

GWENHYWFAR_API void* GWEN_Tree2Element_GetFirstChild ( const GWEN_TREE2_ELEMENT el)

Returns the first child of the given element.

◆ GWEN_Tree2Element_GetLastChild()

GWENHYWFAR_API void* GWEN_Tree2Element_GetLastChild ( const GWEN_TREE2_ELEMENT el)

Returns the last child of the given element.

◆ GWEN_Tree2Element_GetNext()

GWENHYWFAR_API void* GWEN_Tree2Element_GetNext ( const GWEN_TREE2_ELEMENT el)

Returns the data pointer of the list element that is the next one (successor) to the given one in its list. If there is no such prepending list element, returns NULL.

◆ GWEN_Tree2Element_GetParent()

GWENHYWFAR_API void* GWEN_Tree2Element_GetParent ( const GWEN_TREE2_ELEMENT el)

◆ GWEN_Tree2Element_GetPrevious()

GWENHYWFAR_API void* GWEN_Tree2Element_GetPrevious ( const GWEN_TREE2_ELEMENT el)

Returns the data pointer of the list element that is the previous (predecessor) to the given one in its list. If there is no such prepending list element, returns NULL.

◆ GWEN_Tree2Element_new()

GWENHYWFAR_API GWEN_TREE2_ELEMENT* GWEN_Tree2Element_new ( void *  d)

Allocate (create) a new list element structure.