Blame list.h

Packit 400c17
#ifndef LIST_H_
Packit 400c17
#define LIST_H_
Packit 400c17
Packit 400c17
struct list_node {
Packit 400c17
	void *data;
Packit 400c17
	struct list_node *next;
Packit 400c17
	struct list_node *prev;
Packit 400c17
	struct list *list;
Packit 400c17
};
Packit 400c17
Packit 400c17
struct list {
Packit 400c17
	struct list_node *first;
Packit 400c17
	struct list_node *last;
Packit 400c17
	void (*free)(void *data);
Packit 400c17
	int len;
Packit 400c17
};
Packit 400c17
Packit 400c17
struct list *list_new(void (*free)(void *));
Packit 400c17
void list_init(struct list *list, void (*free)(void *));
Packit 400c17
Packit 400c17
/*
Packit 400c17
 * Frees every node contained by list.
Packit 400c17
 * Does not accept NULL value for list.
Packit 400c17
 */
Packit 400c17
void list_clear(struct list *list);
Packit 400c17
Packit 400c17
/*
Packit 400c17
 * Frees list and every node contained by list.
Packit 400c17
 * Does not accept NULL value for list.
Packit 400c17
 */
Packit 400c17
void list_free(struct list *list);
Packit 400c17
Packit 400c17
struct list_node *list_add(struct list *list, void *data);
Packit 400c17
Packit 400c17
/*
Packit 400c17
 * Removes node from the parent list, without freeing it.
Packit 400c17
 */
Packit 400c17
void list_del(struct list_node *node);
Packit 400c17
Packit 400c17
/*
Packit 400c17
 * Appends nodes from src to dst, emptying src.
Packit 400c17
 */
Packit 400c17
void list_concat(struct list *dst, struct list *src);
Packit 400c17
Packit 400c17
#define LIST_FOR_EACH(list, iter) \
Packit 400c17
	for ((iter) = (list)->first; (iter) != NULL; (iter) = (iter)->next)
Packit 400c17
Packit 400c17
Packit 400c17
static inline int list_len(struct list *list)
Packit 400c17
{
Packit 400c17
	return list->len;
Packit 400c17
}
Packit 400c17
Packit 400c17
static inline void *list_node_data(struct list_node *node)
Packit 400c17
{
Packit 400c17
	return node->data;
Packit 400c17
}
Packit 400c17
Packit 400c17
static inline struct list_node *list_node_add(struct list_node *node,
Packit 400c17
					      void *data)
Packit 400c17
{
Packit 400c17
	return list_add(node->list, data);
Packit 400c17
}
Packit 400c17
Packit 400c17
#endif /* LIST_H_ */