40 #if !defined(__OCS_LIST_H__)
41 #define __OCS_LIST_H__
43 #define OCS_LIST_DEBUG
45 #if defined(OCS_LIST_DEBUG)
49 #define ocs_list_magic_decl uint32_t magic;
50 #define OCS_LIST_LIST_MAGIC 0xcafe0000
51 #define OCS_LIST_LINK_MAGIC 0xcafe0001
52 #define ocs_list_set_list_magic list->magic = OCS_LIST_LIST_MAGIC
53 #define ocs_list_set_link_magic list->magic = OCS_LIST_LINK_MAGIC
55 #define ocs_list_assert(cond, ...) \
57 _ocs_list_assertmsg(#cond, __FILE__, __LINE__); \
61 #define ocs_list_magic_decl
62 #define ocs_list_assert(cond, ...)
63 #define ocs_list_set_list_magic
64 #define ocs_list_set_link_magic
87 #define item2link(list, item) ((ocs_list_t*) (((uint8_t*)(item)) + (list)->offset))
90 #define link2item(list, link) ((void*) (((uint8_t*)(link)) - (list)->offset))
111 list->offset = offset;
113 #define ocs_list_init(head, type, link) _ocs_list_init(head, offsetof(type, link))
124 static inline int32_t
129 return list->next == list;
140 static inline int32_t
196 #if defined(OCS_LIST_DEBUG)
216 if (link->magic == 0) {
218 link->offset = list->offset;
224 #define ocs_list_init_link(...)
359 if ((link->next) == list) {
374 #define ocs_list_remove_head(list) ocs_list_remove(list, ocs_list_get_head(list))
410 link->next = link->prev = NULL;
428 #define ocs_list_foreach(list, item) \
429 for (item = ocs_list_get_head((list)); item; item = ocs_list_next((list), item) )
446 #define ocs_list_foreach_safe(list, item, nxt) \
447 for (item = ocs_list_get_head(list), nxt = item ? ocs_list_next(list, item) : NULL; item; \
448 item = nxt, nxt = ocs_list_next(list, item))
459 static inline int32_t
462 return (link->next != NULL);
465 #endif // __OCS_LIST_H__
#define item2link(list, item)
static int32_t ocs_list_on_list(ocs_list_link_t *link)
Test if object is on a list.
ocs_list_t ocs_list_link_t
ocs_list_magic_decl ocs_list_t * next
static void _ocs_list_init(ocs_list_t *list, uint32_t offset)
Initialize a list.
static int32_t ocs_list_empty(ocs_list_t *list)
Test if a list is empty.
#define ocs_list_assert(cond,...)
static void * ocs_list_get_head(ocs_list_t *list)
Return the first item in the list.
static int32_t ocs_list_is_singular(ocs_list_t *list)
Test if a list has single entry.
#define ocs_list_set_list_magic
#define OCS_LIST_LIST_MAGIC
void _ocs_list_assertmsg(const char *label, const char *filename, int linenum)
static void * ocs_list_remove(ocs_list_t *list, void *item)
Remove an item from the list.
static void * ocs_list_get_tail(ocs_list_t *list)
Return the first item in the list.
static int ocs_list_valid(ocs_list_t *list)
Test if a list is valid (ready for use)
#define OCS_LIST_LINK_MAGIC
static void _ocs_list_insert_link(ocs_list_t *a, ocs_list_t *b, ocs_list_t *c)
Insert link between two other links.
static void ocs_list_add_tail(ocs_list_t *list, void *item)
Add an item to the tail of the list.
static void ocs_list_add_head(ocs_list_t *list, void *item)
Add an item to the head of the list.
static void * ocs_list_tail(ocs_list_t *list)
Return the last item in the list.
static void * ocs_list_next(ocs_list_t *list, void *item)
Get the next item on the list.
#define ocs_list_magic_decl
#define link2item(list, link)
static void ocs_list_init_link(ocs_list_t *list, ocs_list_t *link)
Initialize a list link for debug purposes.