| /** |
| * @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) |