summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorLynx Zhou <[email protected]>2018-07-04 15:50:31 +0800
committerGitHub <[email protected]>2018-07-04 15:50:31 +0800
commit3b9dfc6aed4c04347ef2f4b4b005e8561e285c6a (patch)
treeeb57da0b0c6713979c7ba4cb527c18f7b15852b8 /include
parente6a34ead5d6f3bc3aa97f96f38983c557afa0288 (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')
-rw-r--r--include/rtservice.h26
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.