15 typedef struct girara_tree_node_data_s
37 return g_try_malloc0(
sizeof(girara_list_t));
79 g_return_if_fail(list);
86 if (list == NULL || list->start == NULL) {
90 if (list->free != NULL) {
91 g_list_free_full(list->start, list->free);
93 g_list_free(list->start);
112 g_return_if_fail(list != NULL);
114 if (list->cmp != NULL) {
115 list->start = g_list_insert_sorted(list->start, data, list->cmp);
117 list->start = g_list_append(list->start, data);
124 g_return_if_fail(list != NULL);
126 if (list->cmp != NULL) {
129 list->start = g_list_prepend(list->start, data);
136 g_return_if_fail(list != NULL);
137 if (list->start == NULL) {
141 GList* tmp = g_list_find(list->start, data);
146 if (list->free != NULL) {
147 (list->free)(tmp->data);
149 list->start = g_list_delete_link(list->start, tmp);
155 g_return_val_if_fail(list != NULL, NULL);
156 g_return_val_if_fail(list->start != NULL && (n < g_list_length(list->start)), NULL);
158 GList* tmp = g_list_nth(list->start, n);
159 g_return_val_if_fail(tmp != NULL, NULL);
167 g_return_val_if_fail(list != NULL,
false);
172 GList* tmp = g_list_find(list->start, data);
183 g_return_val_if_fail(list != NULL && compare != NULL, NULL);
184 if (list->start == NULL) {
188 GList* element = g_list_find_custom(list->start, data, compare);
189 if (element == NULL) {
193 return element->data;
197 girara_list_iterator_t*
200 g_return_val_if_fail(list != NULL, NULL);
202 if (list->start == NULL) {
206 girara_list_iterator_t* iter = g_try_malloc0(
sizeof(girara_list_iterator_t));
212 iter->element = list->start;
217 girara_list_iterator_t*
220 g_return_val_if_fail(iter != NULL, NULL);
222 girara_list_iterator_t* iter2 = g_try_malloc0(
sizeof(girara_list_iterator_t));
227 iter2->list = iter->list;
228 iter2->element = iter->element;
232 girara_list_iterator_t*
239 iter->element = g_list_next(iter->element);
240 if (iter->element == NULL) {
254 return g_list_next(iter->element);
257 girara_list_iterator_t*
264 iter->element = g_list_previous(iter->element);
265 if (iter->element == NULL) {
279 return g_list_previous(iter->element);
288 GList* el = iter->element;
289 if (iter->list != NULL && iter->list->free != NULL) {
290 (iter->list->free)(iter->element->data);
293 iter->element = el->next;
294 iter->list->start = g_list_delete_link(iter->list->start, el);
300 return iter != NULL && iter->element != NULL;
308 return iter->element->data;
315 g_return_if_fail(iter->list->cmp == NULL);
317 if (iter->list->free != NULL) {
318 (*iter->list->free)(iter->element->data);
321 iter->element->data = data;
337 g_return_val_if_fail(list, 0);
339 if (list->start == NULL) {
343 return g_list_length(list->start);
349 g_return_val_if_fail(list != NULL, -1);
351 if (list->start == NULL) {
370 g_return_if_fail(list != NULL);
371 if (list->start == NULL || compare == NULL) {
375 list->start = g_list_sort(list->start, compare);
381 g_return_if_fail(list && list->start && callback);
383 g_list_foreach(list->start, callback, data);
396 if (list->free != other->free) {
397 girara_warning(
"girara_list_merge: merging lists with different free functions!");
410 girara_tree_node_t* node = g_try_malloc0(
sizeof(girara_tree_node_t));
416 if (nodedata == NULL) {
421 nodedata->
data = data;
422 nodedata->
node = node;
423 node->node = g_node_new(nodedata);
425 if (node->node == NULL) {
437 g_return_if_fail(node);
448 g_return_if_fail(node->node);
450 g_return_if_fail(nodedata);
452 if (node->free != NULL) {
453 (*node->free)(nodedata->
data);
458 GNode* childnode = node->node->children;
459 while (childnode != NULL) {
462 childnode = childnode->next;
465 g_node_destroy(node->node);
472 g_return_if_fail(parent && child);
473 g_node_append(parent->node, child->node);
479 g_return_val_if_fail(parent, NULL);
481 g_return_val_if_fail(child, NULL);
482 child->free = parent->free;
491 g_return_val_if_fail(node && node->node, NULL);
493 if (node->node->parent == NULL) {
498 g_return_val_if_fail(nodedata, NULL);
500 return nodedata->
node;
506 g_return_val_if_fail(node && node->node, NULL);
508 if (node->node->parent == NULL) {
512 GNode* root = g_node_get_root(node->node);
513 g_return_val_if_fail(root, NULL);
515 g_return_val_if_fail(nodedata, NULL);
517 return nodedata->
node;
523 g_return_val_if_fail(node, NULL);
525 g_return_val_if_fail(list, NULL);
527 GNode* childnode = node->node->children;
528 while (childnode != NULL) {
531 childnode = childnode->next;
540 g_return_val_if_fail(node && node->node, 0);
542 return g_node_n_children(node->node);
548 g_return_val_if_fail(node && node->node, NULL);
550 g_return_val_if_fail(nodedata, NULL);
552 return nodedata->
data;
558 g_return_if_fail(node && node->node);
560 g_return_if_fail(nodedata);
562 if (node->free != NULL) {
563 (*node->free)(nodedata->
data);
566 nodedata->
data = data;
void girara_list_remove(girara_list_t *list, void *data)
void * girara_list_nth(girara_list_t *list, size_t n)
void girara_list_sort(girara_list_t *list, girara_compare_function_t compare)
girara_free_function_t free
void girara_list_foreach(girara_list_t *list, girara_list_callback_t callback, void *data)
girara_tree_node_t * girara_node_append_data(girara_tree_node_t *parent, void *data)
girara_tree_node_t * girara_node_get_root(girara_tree_node_t *node)
girara_list_t * girara_node_get_children(girara_tree_node_t *node)
void girara_list_append(girara_list_t *list, void *data)
bool girara_list_iterator_has_next(girara_list_iterator_t *iter)
ssize_t girara_list_position(girara_list_t *list, void *data)
void(* girara_free_function_t)(void *data)
size_t girara_list_size(girara_list_t *list)
girara_list_t * girara_list_new2(girara_free_function_t gfree)
void girara_node_set_data(girara_tree_node_t *node, void *data)
size_t girara_node_get_num_children(girara_tree_node_t *node)
void girara_list_free(girara_list_t *list)
void girara_list_iterator_set(girara_list_iterator_t *iter, void *data)
void * girara_list_find(girara_list_t *list, girara_compare_function_t compare, const void *data)
void girara_list_set_free_function(girara_list_t *list, girara_free_function_t gfree)
int(* girara_compare_function_t)(const void *data1, const void *data2)
bool girara_list_iterator_has_previous(girara_list_iterator_t *iter)
void girara_node_append(girara_tree_node_t *parent, girara_tree_node_t *child)
void girara_node_set_free_function(girara_tree_node_t *node, girara_free_function_t gfree)
girara_tree_node_t * girara_node_new(void *data)
girara_tree_node_t * node
girara_list_t * girara_list_new(void)
void(* girara_list_callback_t)(void *data, void *userdata)
girara_list_t * girara_sorted_list_new(girara_compare_function_t cmp)
void girara_list_iterator_free(girara_list_iterator_t *iter)
girara_compare_function_t cmp
girara_free_function_t free
girara_list_t * girara_sorted_list_new2(girara_compare_function_t cmp, girara_free_function_t gfree)
void girara_list_prepend(girara_list_t *list, void *data)
girara_list_iterator_t * girara_list_iterator_copy(girara_list_iterator_t *iter)
#define girara_warning(...)
girara_tree_node_t * girara_node_get_parent(girara_tree_node_t *node)
bool girara_list_contains(girara_list_t *list, void *data)
void * girara_node_get_data(girara_tree_node_t *node)
girara_list_iterator_t * girara_list_iterator(girara_list_t *list)
void * girara_list_iterator_data(girara_list_iterator_t *iter)
girara_list_iterator_t * girara_list_iterator_previous(girara_list_iterator_t *iter)
girara_list_iterator_t * girara_list_iterator_next(girara_list_iterator_t *iter)
girara_list_t * girara_list_merge(girara_list_t *list, girara_list_t *other)
bool girara_list_iterator_is_valid(girara_list_iterator_t *iter)
void girara_list_clear(girara_list_t *list)
void girara_list_iterator_remove(girara_list_iterator_t *iter)
void girara_node_free(girara_tree_node_t *node)
#define GIRARA_LIST_FOREACH_END(list, type, iter, data)
#define GIRARA_LIST_FOREACH(list, type, iter, data)