59 lines
1.7 KiB
C
59 lines
1.7 KiB
C
#ifndef FX_DS_TREE_H_
|
|
#define FX_DS_TREE_H_
|
|
|
|
#include <fx/macros.h>
|
|
#include <fx/misc.h>
|
|
#include <fx/queue.h>
|
|
#include <fx/string.h>
|
|
|
|
FX_DECLS_BEGIN;
|
|
|
|
#define FX_TYPE_TREE (fx_tree_get_type())
|
|
#define FX_TYPE_TREE_ITERATOR (fx_tree_iterator_get_type())
|
|
|
|
FX_DECLARE_TYPE(fx_tree);
|
|
FX_DECLARE_TYPE(fx_tree_iterator);
|
|
|
|
FX_TYPE_CLASS_DECLARATION_BEGIN(fx_tree)
|
|
FX_TYPE_CLASS_DECLARATION_END(fx_tree)
|
|
|
|
FX_TYPE_CLASS_DECLARATION_BEGIN(fx_tree_iterator)
|
|
FX_TYPE_CLASS_DECLARATION_END(fx_tree_iterator)
|
|
|
|
#define FX_TREE_NODE_INIT ((fx_tree_node) {0})
|
|
|
|
#define FX_TREE_CONTAINER(t, m, v) \
|
|
((void *)((v) ? (uintptr_t)(v) - (offsetof(t, m)) : 0))
|
|
|
|
typedef struct fx_tree_node {
|
|
struct fx_tree_node *__p01, *__p02, *__p03;
|
|
struct fx_queue_entry __q01;
|
|
} fx_tree_node;
|
|
|
|
FX_API fx_type fx_tree_get_type(void);
|
|
FX_API fx_type fx_tree_iterator_get_type(void);
|
|
|
|
FX_TYPE_DEFAULT_CONSTRUCTOR(fx_tree, FX_TYPE_TREE);
|
|
|
|
FX_API void fx_tree_set_root(fx_tree *tree, struct fx_tree_node *node);
|
|
|
|
FX_API void fx_tree_node_add_child(fx_tree_node *parent, fx_tree_node *child);
|
|
FX_API void fx_tree_node_add_sibling(fx_tree_node *node, fx_tree_node *to_add);
|
|
|
|
FX_API fx_tree_node *fx_tree_node_get_child(fx_tree_node *node, size_t at);
|
|
FX_API fx_tree_node *fx_tree_node_get_parent(fx_tree_node *node);
|
|
|
|
FX_API fx_iterator *fx_tree_begin(fx_tree *tree);
|
|
FX_API const fx_iterator *fx_tree_cbegin(const fx_tree *tree);
|
|
|
|
FX_API fx_iterator *fx_tree_node_begin(fx_tree_node *node);
|
|
FX_API const fx_iterator *fx_tree_node_cbegin(const fx_tree_node *node);
|
|
|
|
FX_API fx_iterator *fx_tree_node_begin_recursive(fx_tree_node *node);
|
|
FX_API const fx_iterator *fx_tree_node_cbegin_recursive(
|
|
const fx_tree_node *node);
|
|
|
|
FX_DECLS_END;
|
|
|
|
#endif
|