File indexing completed on 2025-12-22 10:14:06
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 #ifndef __G_NODE_H__
0028 #define __G_NODE_H__
0029
0030 #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
0031 #error "Only <glib.h> can be included directly."
0032 #endif
0033
0034 #include <glib/gmem.h>
0035
0036 G_BEGIN_DECLS
0037
0038 typedef struct _GNode GNode;
0039
0040
0041 typedef enum
0042 {
0043 G_TRAVERSE_LEAVES = 1 << 0,
0044 G_TRAVERSE_NON_LEAVES = 1 << 1,
0045 G_TRAVERSE_ALL = G_TRAVERSE_LEAVES | G_TRAVERSE_NON_LEAVES,
0046 G_TRAVERSE_MASK = 0x03,
0047 G_TRAVERSE_LEAFS = G_TRAVERSE_LEAVES,
0048 G_TRAVERSE_NON_LEAFS = G_TRAVERSE_NON_LEAVES
0049 } GTraverseFlags;
0050
0051
0052 typedef enum
0053 {
0054 G_IN_ORDER,
0055 G_PRE_ORDER,
0056 G_POST_ORDER,
0057 G_LEVEL_ORDER
0058 } GTraverseType;
0059
0060 typedef gboolean (*GNodeTraverseFunc) (GNode *node,
0061 gpointer data);
0062 typedef void (*GNodeForeachFunc) (GNode *node,
0063 gpointer data);
0064
0065
0066
0067 struct _GNode
0068 {
0069 gpointer data;
0070 GNode *next;
0071 GNode *prev;
0072 GNode *parent;
0073 GNode *children;
0074 };
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085 #define G_NODE_IS_ROOT(node) (((GNode*) (node))->parent == NULL && \
0086 ((GNode*) (node))->prev == NULL && \
0087 ((GNode*) (node))->next == NULL)
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098 #define G_NODE_IS_LEAF(node) (((GNode*) (node))->children == NULL)
0099
0100 GLIB_AVAILABLE_IN_ALL
0101 GNode* g_node_new (gpointer data);
0102 GLIB_AVAILABLE_IN_ALL
0103 void g_node_destroy (GNode *root);
0104 GLIB_AVAILABLE_IN_ALL
0105 void g_node_unlink (GNode *node);
0106 GLIB_AVAILABLE_IN_ALL
0107 GNode* g_node_copy_deep (GNode *node,
0108 GCopyFunc copy_func,
0109 gpointer data);
0110 GLIB_AVAILABLE_IN_ALL
0111 GNode* g_node_copy (GNode *node);
0112 GLIB_AVAILABLE_IN_ALL
0113 GNode* g_node_insert (GNode *parent,
0114 gint position,
0115 GNode *node);
0116 GLIB_AVAILABLE_IN_ALL
0117 GNode* g_node_insert_before (GNode *parent,
0118 GNode *sibling,
0119 GNode *node);
0120 GLIB_AVAILABLE_IN_ALL
0121 GNode* g_node_insert_after (GNode *parent,
0122 GNode *sibling,
0123 GNode *node);
0124 GLIB_AVAILABLE_IN_ALL
0125 GNode* g_node_prepend (GNode *parent,
0126 GNode *node);
0127 GLIB_AVAILABLE_IN_ALL
0128 guint g_node_n_nodes (GNode *root,
0129 GTraverseFlags flags);
0130 GLIB_AVAILABLE_IN_ALL
0131 GNode* g_node_get_root (GNode *node);
0132 GLIB_AVAILABLE_IN_ALL
0133 gboolean g_node_is_ancestor (GNode *node,
0134 GNode *descendant);
0135 GLIB_AVAILABLE_IN_ALL
0136 guint g_node_depth (GNode *node);
0137 GLIB_AVAILABLE_IN_ALL
0138 GNode* g_node_find (GNode *root,
0139 GTraverseType order,
0140 GTraverseFlags flags,
0141 gpointer data);
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153 #define g_node_append(parent, node) \
0154 g_node_insert_before ((parent), NULL, (node))
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167 #define g_node_insert_data(parent, position, data) \
0168 g_node_insert ((parent), (position), g_node_new (data))
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181 #define g_node_insert_data_after(parent, sibling, data) \
0182 g_node_insert_after ((parent), (sibling), g_node_new (data))
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193 #define g_node_insert_data_before(parent, sibling, data) \
0194 g_node_insert_before ((parent), (sibling), g_node_new (data))
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205 #define g_node_prepend_data(parent, data) \
0206 g_node_prepend ((parent), g_node_new (data))
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217 #define g_node_append_data(parent, data) \
0218 g_node_insert_before ((parent), NULL, g_node_new (data))
0219
0220
0221
0222
0223
0224
0225 GLIB_AVAILABLE_IN_ALL
0226 void g_node_traverse (GNode *root,
0227 GTraverseType order,
0228 GTraverseFlags flags,
0229 gint max_depth,
0230 GNodeTraverseFunc func,
0231 gpointer data);
0232
0233
0234
0235
0236
0237
0238 GLIB_AVAILABLE_IN_ALL
0239 guint g_node_max_height (GNode *root);
0240
0241 GLIB_AVAILABLE_IN_ALL
0242 void g_node_children_foreach (GNode *node,
0243 GTraverseFlags flags,
0244 GNodeForeachFunc func,
0245 gpointer data);
0246 GLIB_AVAILABLE_IN_ALL
0247 void g_node_reverse_children (GNode *node);
0248 GLIB_AVAILABLE_IN_ALL
0249 guint g_node_n_children (GNode *node);
0250 GLIB_AVAILABLE_IN_ALL
0251 GNode* g_node_nth_child (GNode *node,
0252 guint n);
0253 GLIB_AVAILABLE_IN_ALL
0254 GNode* g_node_last_child (GNode *node);
0255 GLIB_AVAILABLE_IN_ALL
0256 GNode* g_node_find_child (GNode *node,
0257 GTraverseFlags flags,
0258 gpointer data);
0259 GLIB_AVAILABLE_IN_ALL
0260 gint g_node_child_position (GNode *node,
0261 GNode *child);
0262 GLIB_AVAILABLE_IN_ALL
0263 gint g_node_child_index (GNode *node,
0264 gpointer data);
0265
0266 GLIB_AVAILABLE_IN_ALL
0267 GNode* g_node_first_sibling (GNode *node);
0268 GLIB_AVAILABLE_IN_ALL
0269 GNode* g_node_last_sibling (GNode *node);
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280 #define g_node_prev_sibling(node) ((node) ? \
0281 ((GNode*) (node))->prev : NULL)
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292 #define g_node_next_sibling(node) ((node) ? \
0293 ((GNode*) (node))->next : NULL)
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304 #define g_node_first_child(node) ((node) ? \
0305 ((GNode*) (node))->children : NULL)
0306
0307 G_END_DECLS
0308
0309 #endif