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