Lines Matching full:list

9  *    this list of conditions and the following disclaimer.
12 * this list of conditions and the following disclaimer in the documentation
35 * OCS linked list API
49 #define ocs_list_set_list_magic list->magic = OCS_LIST_LIST_MAGIC
50 #define ocs_list_set_link_magic list->magic = OCS_LIST_LINK_MAGIC
64 * @brief list/link structure
66 * used for both the list object, and the link object(s). offset
67 * is specified when the list is initialized; this implies that a list
76 ocs_list_t *next; /*<< pointer to head of list (or next if link) */
77 ocs_list_t *prev; /*<< pointer to tail of list (or previous if link) */
78 uint32_t offset; /*<< offset in bytes to the link element of the objects in list */
83 #define item2link(list, item) ((ocs_list_t*) (((uint8_t*)(item)) + (list)->offset)) argument
86 #define link2item(list, link) ((void*) (((uint8_t*)(link)) - (list)->offset)) argument
89 * @brief Initialize a list
91 * A list object is initialized. Helper define is used to call _ocs_list_init() with
94 * @param list Pointer to list
100 _ocs_list_init(ocs_list_t *list, uint32_t offset) in _ocs_list_init() argument
102 ocs_list_assert(list); in _ocs_list_init()
105 list->next = list; in _ocs_list_init()
106 list->prev = list; in _ocs_list_init()
107 list->offset = offset; in _ocs_list_init()
113 * @brief Test if a list is empty
115 * @param list Pointer to list head
120 ocs_list_empty(ocs_list_t *list) in ocs_list_empty() argument
122 ocs_list_assert(list, 1); in ocs_list_empty()
123 ocs_list_assert(list->magic == OCS_LIST_LIST_MAGIC, 1); in ocs_list_empty()
124 return list->next == list; in ocs_list_empty()
129 * @brief Test if a list is valid (ready for use)
131 * @param list Pointer to list head
133 * @return true if list is usable, false otherwise
136 ocs_list_valid(ocs_list_t *list) in ocs_list_valid() argument
138 return (list->magic == OCS_LIST_LIST_MAGIC); in ocs_list_valid()
179 * @brief Initialize a list link for debug purposes
181 * For debugging a linked list link element has a magic number that is initialized,
185 * @param list Pointer to list head
191 ocs_list_init_link(ocs_list_t *list, ocs_list_t *link) in ocs_list_init_link() argument
193 ocs_list_assert(list); in ocs_list_init_link()
194 ocs_list_assert(list->magic == OCS_LIST_LIST_MAGIC); in ocs_list_init_link()
199 link->offset = list->offset; in ocs_list_init_link()
210 * @brief Add an item to the head of the list
212 * @param list Pointer to list head
216 ocs_list_add_head(ocs_list_t *list, void *item) in ocs_list_add_head() argument
220 ocs_list_assert(list); in ocs_list_add_head()
221 ocs_list_assert(list->magic == OCS_LIST_LIST_MAGIC); in ocs_list_add_head()
224 link = item2link(list, item); in ocs_list_add_head()
225 ocs_list_init_link(list, link); in ocs_list_add_head()
228 ocs_list_assert(link->offset == list->offset); in ocs_list_add_head()
232 _ocs_list_insert_link(list, list->next, item2link(list, item)); in ocs_list_add_head()
237 * @brief Add an item to the tail of the list
239 * @param list Head of the list
243 ocs_list_add_tail(ocs_list_t *list, void *item) in ocs_list_add_tail() argument
247 ocs_list_assert(list); in ocs_list_add_tail()
248 ocs_list_assert(list->magic == OCS_LIST_LIST_MAGIC); in ocs_list_add_tail()
251 link = item2link(list, item); in ocs_list_add_tail()
252 ocs_list_init_link(list, link); in ocs_list_add_tail()
255 ocs_list_assert(link->offset == list->offset); in ocs_list_add_tail()
259 _ocs_list_insert_link(list->prev, list, link); in ocs_list_add_tail()
264 * @brief Return the first item in the list
266 * @param list Head of the list
271 ocs_list_get_head(ocs_list_t *list) in ocs_list_get_head() argument
273 ocs_list_assert(list, NULL); in ocs_list_get_head()
274 ocs_list_assert(list->magic == OCS_LIST_LIST_MAGIC, NULL); in ocs_list_get_head()
275 return ocs_list_empty(list) ? NULL : link2item(list, list->next); in ocs_list_get_head()
280 * @brief Return the first item in the list
282 * @param list head of the list
287 ocs_list_get_tail(ocs_list_t *list) in ocs_list_get_tail() argument
289 ocs_list_assert(list, NULL); in ocs_list_get_tail()
290 ocs_list_assert(list->magic == OCS_LIST_LIST_MAGIC, NULL); in ocs_list_get_tail()
291 return ocs_list_empty(list) ? NULL : link2item(list, list->prev); in ocs_list_get_tail()
296 * @brief Return the last item in the list
298 * @param list Pointer to list head
302 static inline void *ocs_list_tail(ocs_list_t *list) in ocs_list_tail() argument
304 ocs_list_assert(list, NULL); in ocs_list_tail()
305 ocs_list_assert(list->magic == OCS_LIST_LIST_MAGIC, NULL); in ocs_list_tail()
306 return ocs_list_empty(list) ? NULL : link2item(list, list->prev); in ocs_list_tail()
311 * @brief Get the next item on the list
313 * @param list head of the list
318 static inline void *ocs_list_next(ocs_list_t *list, void *item) in ocs_list_next() argument
326 ocs_list_assert(list, NULL); in ocs_list_next()
327 ocs_list_assert(list->magic == OCS_LIST_LIST_MAGIC, NULL); in ocs_list_next()
330 link = item2link(list, item); in ocs_list_next()
333 ocs_list_assert(link->offset == list->offset, NULL); in ocs_list_next()
337 if ((link->next) == list) { in ocs_list_next()
341 return link2item(list, link->next); in ocs_list_next()
346 * @brief Remove and return an item from the head of the list
348 * @param list head of the list
350 * @return pointer to returned item, or NULL if list is empty
352 #define ocs_list_remove_head(list) ocs_list_remove(list, ocs_list_get_head(list)) argument
356 * @brief Remove an item from the list
358 * @param list Head of the list
363 static inline void *ocs_list_remove(ocs_list_t *list, void *item) in ocs_list_remove() argument
372 ocs_list_assert(list, NULL); in ocs_list_remove()
373 ocs_list_assert(list->magic == OCS_LIST_LIST_MAGIC, NULL); in ocs_list_remove()
375 link = item2link(list, item); in ocs_list_remove()
378 ocs_list_assert(link->offset == list->offset, NULL); in ocs_list_remove()
394 * @brief Iterate a linked list
396 * Iterate a linked list.
398 * @param list Pointer to list
401 * note, item is NULL after full list is traversed.
406 #define ocs_list_foreach(list, item) \ argument
407 for (item = ocs_list_get_head((list)); item; item = ocs_list_next((list), item) )
410 * @brief Iterate a linked list safely
412 * Iterate a linked list safely, meaning that the iterated item
413 * may be safely removed from the list.
415 * @param list Pointer to list
419 * note, item is NULL after full list is traversed.
424 #define ocs_list_foreach_safe(list, item, nxt) \ argument
425 for (item = ocs_list_get_head(list), nxt = item ? ocs_list_next(list, item) : NULL; item; \
426 item = nxt, nxt = ocs_list_next(list, item))
429 * @brief Test if object is on a list
431 * Returns True if object is on a list
433 * @param link Pointer to list link
435 * @return returns True if object is on a list