diff options
| author | Lynx Zhou <[email protected]> | 2018-07-04 15:50:31 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2018-07-04 15:50:31 +0800 |
| commit | 3b9dfc6aed4c04347ef2f4b4b005e8561e285c6a (patch) | |
| tree | eb57da0b0c6713979c7ba4cb527c18f7b15852b8 /include/rtservice.h | |
| parent | e6a34ead5d6f3bc3aa97f96f38983c557afa0288 (diff) | |
Add list iterators over list elements
Some non-gnu toolchains don't support gnu C extended keyword "typeof", like MDK (if no "gnu" option) and IAR, in this case we can provide list element manipulation macro functions to iterate over the list.
Diffstat (limited to 'include/rtservice.h')
| -rw-r--r-- | include/rtservice.h | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/include/rtservice.h b/include/rtservice.h index f909f17f86..800d4d175b 100644 --- a/include/rtservice.h +++ b/include/rtservice.h @@ -141,6 +141,24 @@ rt_inline unsigned int rt_list_len(const rt_list_t *l) rt_container_of(node, type, member) /** + * rt_list_for_each - iterate over a list + * @pos: the rt_list_t * to use as a loop cursor. + * @head: the head for your list. + */ +#define rt_list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +/** + * rt_list_for_each_safe - iterate over a list safe against removal of list entry + * @pos: the rt_list_t * to use as a loop cursor. + * @n: another rt_list_t * to use as temporary storage + * @head: the head for your list. + */ +#define rt_list_for_each_safe(pos, n, head) \ + for (pos = (head)->next, n = pos->next; pos != (head); \ + pos = n, n = pos->next) + +/** * rt_list_for_each_entry - iterate over list of given type * @pos: the type * to use as a loop cursor. * @head: the head for your list. @@ -255,6 +273,14 @@ rt_inline int rt_slist_isempty(rt_slist_t *l) rt_container_of(node, type, member) /** + * rt_slist_for_each - iterate over a single list + * @pos: the rt_slist_t * to use as a loop cursor. + * @head: the head for your single list. + */ +#define rt_slist_for_each(pos, head) \ + for (pos = (head)->next; &pos->next != (head); pos = pos->next) + +/** * rt_slist_for_each_entry - iterate over single list of given type * @pos: the type * to use as a loop cursor. * @head: the head for your single list. |
