96 lines
2.4 KiB
C
96 lines
2.4 KiB
C
/**
|
|
* @file re_list.h Interface to Linked List
|
|
*
|
|
* Copyright (C) 2010 Creytiv.com
|
|
*/
|
|
|
|
|
|
/** Linked-list element */
|
|
struct le {
|
|
struct le *prev; /**< Previous element */
|
|
struct le *next; /**< Next element */
|
|
struct list *list; /**< Parent list (NULL if not linked-in) */
|
|
void *data; /**< User-data */
|
|
};
|
|
|
|
/** List Element Initializer */
|
|
#define LE_INIT {NULL, NULL, NULL, NULL}
|
|
|
|
|
|
/** Defines a linked list */
|
|
struct list {
|
|
struct le *head; /**< First list element */
|
|
struct le *tail; /**< Last list element */
|
|
};
|
|
|
|
/** Linked list Initializer */
|
|
#define LIST_INIT {NULL, NULL}
|
|
|
|
|
|
/**
|
|
* Defines the list apply handler
|
|
*
|
|
* @param le List element
|
|
* @param arg Handler argument
|
|
*
|
|
* @return true to stop traversing, false to continue
|
|
*/
|
|
typedef bool (list_apply_h)(struct le *le, void *arg);
|
|
|
|
/**
|
|
* Defines the list sort handler
|
|
*
|
|
* @param le1 Current list element
|
|
* @param le2 Next list element
|
|
* @param arg Handler argument
|
|
*
|
|
* @return true if sorted, otherwise false
|
|
*/
|
|
typedef bool (list_sort_h)(struct le *le1, struct le *le2, void *arg);
|
|
|
|
|
|
void list_init(struct list *list);
|
|
void list_flush(struct list *list);
|
|
void list_clear(struct list *list);
|
|
void list_append(struct list *list, struct le *le, void *data);
|
|
void list_prepend(struct list *list, struct le *le, void *data);
|
|
void list_insert_before(struct list *list, struct le *le, struct le *ile,
|
|
void *data);
|
|
void list_insert_after(struct list *list, struct le *le, struct le *ile,
|
|
void *data);
|
|
void list_unlink(struct le *le);
|
|
void list_sort(struct list *list, list_sort_h *sh, void *arg);
|
|
struct le *list_apply(const struct list *list, bool fwd, list_apply_h *ah,
|
|
void *arg);
|
|
struct le *list_head(const struct list *list);
|
|
struct le *list_tail(const struct list *list);
|
|
uint32_t list_count(const struct list *list);
|
|
|
|
|
|
/**
|
|
* Get the user-data from a list element
|
|
*
|
|
* @param le List element
|
|
*
|
|
* @return Pointer to user-data
|
|
*/
|
|
static inline void *list_ledata(const struct le *le)
|
|
{
|
|
return le ? le->data : NULL;
|
|
}
|
|
|
|
|
|
static inline bool list_contains(const struct list *list, const struct le *le)
|
|
{
|
|
return le ? le->list == list : false;
|
|
}
|
|
|
|
|
|
static inline bool list_isempty(const struct list *list)
|
|
{
|
|
return list ? list->head == NULL : true;
|
|
}
|
|
|
|
|
|
#define LIST_FOREACH(list, le) \
|
|
for ((le) = list_head((list)); (le); (le) = (le)->next)
|