1#pragma once
2
3#include <stdbool.h>
4#include <stdlib.h>
5
6struct list_node_t;
7typedef struct list_node_t list_node_t;
8
9struct list_t;
10typedef struct list_t list_t;
11
12typedef void (*list_free_cb)(void *data);
13typedef bool (*list_iter_cb)(void *data);
14
15// Lifecycle.
16list_t *list_new(list_free_cb callback);
17void list_free(list_t *list);
18
19// Accessors.
20bool list_is_empty(const list_t *list);
21size_t list_length(const list_t *list);
22void *list_front(const list_t *list);
23void *list_back(const list_t *list);
24
25// Mutators.
26bool list_insert_after(list_t *list, list_node_t *prev_node, void *data);
27bool list_prepend(list_t *list, void *data);
28bool list_append(list_t *list, void *data);
29bool list_remove(list_t *list, void *data);
30void list_clear(list_t *list);
31
32// Iteration.
33void list_foreach(const list_t *list, list_iter_cb callback);
34
35list_node_t *list_begin(const list_t *list);
36list_node_t *list_end(const list_t *list);
37list_node_t *list_next(const list_node_t *node);
38void *list_node(const list_node_t *node);
39