girara
Loading...
Searching...
No Matches
datastructures.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: Zlib */
2
3#ifndef GIRARA_DATASTRUCTURES_H
4#define GIRARA_DATASTRUCTURES_H
5
6#include <stddef.h>
7#include <stdbool.h>
8#include <sys/types.h>
9
10#include "macros.h"
11#include "types.h"
12
19
27
28#define girara_list_new2 girara_list_new_with_free
29
37
48
49#define girara_sorted_list_new2 girara_sorted_list_new_with_free
50
58
65
72
80
88
96
105
113void girara_list_set_nth(girara_list_t* list, size_t n, void* data) GIRARA_VISIBLE;
114
123
131
140
148
157void* girara_list_find(const girara_list_t* list, girara_compare_function_t compare, const void* data) GIRARA_VISIBLE;
158
166
174
182
190
198
206
214
222
230
238
245
254
255#define GIRARA_LIST_FOREACH(list, type, iter, data) \
256 do { \
257 girara_list_iterator_t* iter = girara_list_iterator(list); \
258 while (girara_list_iterator_is_valid(iter)) { \
259 type data = (type)girara_list_iterator_data(iter);
260
261#define GIRARA_LIST_FOREACH_END(list, type, iter, data) \
262 girara_list_iterator_next(iter); \
263 } \
264 girara_list_iterator_free(iter); \
265 } \
266 while (0)
267
268#define GIRARA_LIST_FOREACH_BODY_WITH_ITER(list, type, iter, data, ...) \
269 GIRARA_LIST_FOREACH(list, type, iter, data) \
270 __VA_ARGS__ \
271 GIRARA_LIST_FOREACH_END(list, type, iter, data)
272
273#define GIRARA_LIST_FOREACH_BODY(list, type, data, ...) \
274 do { \
275 for (size_t GIRARA_LIST_FOREACH_BODY_IDX = 0; GIRARA_LIST_FOREACH_BODY_IDX < girara_list_size(list); \
276 ++GIRARA_LIST_FOREACH_BODY_IDX) { \
277 type data = (type)girara_list_nth(list, GIRARA_LIST_FOREACH_BODY_IDX); \
278 __VA_ARGS__ \
279 } \
280 } while (0)
281
291
299
307
315
323
332
340
348
356
364
372
380
381#endif
void girara_list_clear(girara_list_t *list) GIRARA_VISIBLE
girara_list_t * girara_list_new_with_free(girara_free_function_t gfree) GIRARA_VISIBLE
girara_tree_node_t * girara_node_get_root(girara_tree_node_t *node) GIRARA_VISIBLE
void girara_node_append(girara_tree_node_t *parent, girara_tree_node_t *child) GIRARA_VISIBLE
size_t girara_list_size(girara_list_t *list) GIRARA_VISIBLE
girara_list_iterator_t * girara_list_iterator(girara_list_t *list) GIRARA_VISIBLE
girara_list_t * girara_list_new(void) GIRARA_VISIBLE
void girara_list_foreach(girara_list_t *list, girara_list_callback_t callback, void *data) GIRARA_VISIBLE
girara_list_t * girara_list_merge(girara_list_t *list, girara_list_t *other) GIRARA_VISIBLE
void * girara_list_nth(girara_list_t *list, size_t n) GIRARA_VISIBLE
ssize_t girara_list_position(girara_list_t *list, void *data) GIRARA_VISIBLE
girara_tree_node_t * girara_node_get_parent(girara_tree_node_t *node) GIRARA_VISIBLE
void girara_list_append(girara_list_t *list, void *data) GIRARA_VISIBLE
girara_tree_node_t * girara_node_append_data(girara_tree_node_t *parent, void *data) GIRARA_VISIBLE
bool girara_list_iterator_has_next(girara_list_iterator_t *iter) GIRARA_VISIBLE
void girara_list_set_free_function(girara_list_t *list, girara_free_function_t gfree) GIRARA_VISIBLE
void girara_list_free(girara_list_t *list) GIRARA_VISIBLE
void girara_node_free(girara_tree_node_t *node) GIRARA_VISIBLE
size_t girara_node_get_num_children(girara_tree_node_t *node) GIRARA_VISIBLE
void girara_node_set_free_function(girara_tree_node_t *node, girara_free_function_t gfree) GIRARA_VISIBLE
bool girara_list_contains(girara_list_t *list, void *data) GIRARA_VISIBLE
girara_list_iterator_t * girara_list_iterator_copy(girara_list_iterator_t *iter) GIRARA_VISIBLE
void girara_list_prepend(girara_list_t *list, void *data) GIRARA_VISIBLE
girara_list_iterator_t * girara_list_iterator_next(girara_list_iterator_t *iter) GIRARA_VISIBLE
void * girara_list_iterator_data(girara_list_iterator_t *iter) GIRARA_VISIBLE
bool girara_list_iterator_has_previous(girara_list_iterator_t *iter) GIRARA_VISIBLE
girara_tree_node_t * girara_node_new(void *data) GIRARA_VISIBLE
void girara_list_iterator_free(girara_list_iterator_t *iter) GIRARA_VISIBLE
girara_list_t * girara_sorted_list_new_with_free(girara_compare_function_t cmp, girara_free_function_t gfree) GIRARA_VISIBLE
girara_list_t * girara_node_get_children(girara_tree_node_t *node) GIRARA_VISIBLE
void girara_list_iterator_remove(girara_list_iterator_t *iter) GIRARA_VISIBLE
void girara_list_sort(girara_list_t *list, girara_compare_function_t compare) GIRARA_VISIBLE
girara_list_t * girara_sorted_list_new(girara_compare_function_t cmp) GIRARA_VISIBLE
void girara_node_set_data(girara_tree_node_t *node, void *data) GIRARA_VISIBLE
void girara_list_remove(girara_list_t *list, void *data) GIRARA_VISIBLE
void * girara_node_get_data(girara_tree_node_t *node) GIRARA_VISIBLE
void girara_list_iterator_set(girara_list_iterator_t *iter, void *data) GIRARA_VISIBLE
void girara_list_set_nth(girara_list_t *list, size_t n, void *data) GIRARA_VISIBLE
girara_list_iterator_t * girara_list_iterator_previous(girara_list_iterator_t *iter) GIRARA_VISIBLE
void * girara_list_find(const girara_list_t *list, girara_compare_function_t compare, const void *data) GIRARA_VISIBLE
bool girara_list_iterator_is_valid(girara_list_iterator_t *iter) GIRARA_VISIBLE
#define GIRARA_VISIBLE
Definition macros.h:52
int(* girara_compare_function_t)(const void *data1, const void *data2)
Definition types.h:119
struct girara_list_iterator_s girara_list_iterator_t
Definition types.h:11
struct girara_tree_node_s girara_tree_node_t
Definition types.h:9
struct girara_list_s girara_list_t
Definition types.h:10
void(* girara_free_function_t)(void *data)
Definition types.h:103
void(* girara_list_callback_t)(void *data, void *userdata)
Definition types.h:111