|
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_ */
|