00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef __G_NODE_H__
00028 #define __G_NODE_H__
00029
00030 #include <gmem.h>
00031
00032 G_BEGIN_DECLS
00033
00034 typedef struct _GNode GNode;
00035
00036
00037 typedef enum
00038 {
00039 G_TRAVERSE_LEAFS = 1 << 0,
00040 G_TRAVERSE_NON_LEAFS = 1 << 1,
00041 G_TRAVERSE_ALL = G_TRAVERSE_LEAFS | G_TRAVERSE_NON_LEAFS,
00042 G_TRAVERSE_MASK = 0x03
00043 } GTraverseFlags;
00044
00045
00046 typedef enum
00047 {
00048 G_IN_ORDER,
00049 G_PRE_ORDER,
00050 G_POST_ORDER,
00051 G_LEVEL_ORDER
00052 } GTraverseType;
00053
00054 typedef gboolean (*GNodeTraverseFunc) (GNode *node,
00055 gpointer data);
00056 typedef void (*GNodeForeachFunc) (GNode *node,
00057 gpointer data);
00058
00059
00060
00061 struct _GNode
00062 {
00063 gpointer data;
00064 GNode *next;
00065 GNode *prev;
00066 GNode *parent;
00067 GNode *children;
00068 };
00069
00070 #define G_NODE_IS_ROOT(node) (((GNode*) (node))->parent == NULL && \
00071 ((GNode*) (node))->prev == NULL && \
00072 ((GNode*) (node))->next == NULL)
00073 #define G_NODE_IS_LEAF(node) (((GNode*) (node))->children == NULL)
00074
00075 void g_node_push_allocator (GAllocator *allocato);
00076 void g_node_pop_allocator (void);
00077 GNode* g_node_new (gpointer data);
00078 void g_node_destroy (GNode *root);
00079 void g_node_unlink (GNode *node);
00080 GNode* g_node_copy (GNode *node);
00081 GNode* g_node_insert (GNode *parent,
00082 gint position,
00083 GNode *node);
00084 GNode* g_node_insert_before (GNode *parent,
00085 GNode *sibling,
00086 GNode *node);
00087 GNode* g_node_insert_after (GNode *parent,
00088 GNode *sibling,
00089 GNode *node);
00090 GNode* g_node_prepend (GNode *parent,
00091 GNode *node);
00092 guint g_node_n_nodes (GNode *root,
00093 GTraverseFlags flags);
00094 GNode* g_node_get_root (GNode *node);
00095 gboolean g_node_is_ancestor (GNode *node,
00096 GNode *descendant);
00097 guint g_node_depth (GNode *node);
00098 GNode* g_node_find (GNode *root,
00099 GTraverseType order,
00100 GTraverseFlags flags,
00101 gpointer data);
00102
00103
00104 #define g_node_append(parent, node) \
00105 g_node_insert_before ((parent), NULL, (node))
00106 #define g_node_insert_data(parent, position, data) \
00107 g_node_insert ((parent), (position), g_node_new (data))
00108 #define g_node_insert_data_before(parent, sibling, data) \
00109 g_node_insert_before ((parent), (sibling), g_node_new (data))
00110 #define g_node_prepend_data(parent, data) \
00111 g_node_prepend ((parent), g_node_new (data))
00112 #define g_node_append_data(parent, data) \
00113 g_node_insert_before ((parent), NULL, g_node_new (data))
00114
00115
00116
00117
00118
00119
00120 void g_node_traverse (GNode *root,
00121 GTraverseType order,
00122 GTraverseFlags flags,
00123 gint max_depth,
00124 GNodeTraverseFunc func,
00125 gpointer data);
00126
00127
00128
00129
00130
00131
00132 guint g_node_max_height (GNode *root);
00133
00134 void g_node_children_foreach (GNode *node,
00135 GTraverseFlags flags,
00136 GNodeForeachFunc func,
00137 gpointer data);
00138 void g_node_reverse_children (GNode *node);
00139 guint g_node_n_children (GNode *node);
00140 GNode* g_node_nth_child (GNode *node,
00141 guint n);
00142 GNode* g_node_last_child (GNode *node);
00143 GNode* g_node_find_child (GNode *node,
00144 GTraverseFlags flags,
00145 gpointer data);
00146 gint g_node_child_position (GNode *node,
00147 GNode *child);
00148 gint g_node_child_index (GNode *node,
00149 gpointer data);
00150
00151 GNode* g_node_first_sibling (GNode *node);
00152 GNode* g_node_last_sibling (GNode *node);
00153
00154 #define g_node_prev_sibling(node) ((node) ? \
00155 ((GNode*) (node))->prev : NULL)
00156 #define g_node_next_sibling(node) ((node) ? \
00157 ((GNode*) (node))->next : NULL)
00158 #define g_node_first_child(node) ((node) ? \
00159 ((GNode*) (node))->children : NULL)
00160
00161 G_END_DECLS
00162
00163 #endif