list,statlist: reverse list walking
authorMarko Kreen <markokr@gmail.com>
Tue, 15 Feb 2011 06:56:49 +0000 (08:56 +0200)
committerMarko Kreen <markokr@gmail.com>
Tue, 15 Feb 2011 07:14:03 +0000 (09:14 +0200)
usual/list.h
usual/statlist.h

index f9f049245ff5775a29ed1d30410cacb6d09527c8..1e65611ed7ce9368c7d37511612d524909003b71 100644 (file)
@@ -118,12 +118,24 @@ static inline struct List *list_last(const struct List *list)
             (item) != (list); \
             (item) = (item)->next)
 
+/** Loop over list backwards */
+#define list_for_each_reverse(item, list) \
+       for ((item) = (list)->prev; \
+            (item) != (list); \
+            (item) = (item)->prev)
+
 /** Loop over list and allow removing item */
 #define list_for_each_safe(item, list, tmp) \
        for ((item) = (list)->next, (tmp) = (list)->next->next; \
             (item) != (list); \
             (item) = (tmp), (tmp) = (tmp)->next)
 
+/** Loop over list backwards and allow removing item */
+#define list_for_each_reverse_safe(item, list, tmp) \
+       for ((item) = (list)->prev, (tmp) = (list)->prev->prev; \
+            (item) != (list); \
+            (item) = (tmp), (tmp) = (tmp)->prev)
+
 /** Comparator function signature for list_sort() */
 typedef int (*list_cmp_f)(const struct List *a, const struct List *b);
 
index ff41dbce336765e67c4a0c1adedd53dee3a0a369..37382b5da4c1b8f64d1cb3d3c3e67f52ca8f4996 100644 (file)
@@ -125,9 +125,15 @@ static inline bool statlist_empty(const struct StatList *list)
 /** Loop over list */
 #define statlist_for_each(item, list) list_for_each(item, &((list)->head))
 
+/** Loop over list backwards */
+#define statlist_for_each_reverse(item, list) list_for_each_reverse(item, &((list)->head))
+
 /** Loop over list safely, so that elements can be removed during */
 #define statlist_for_each_safe(item, list, tmp) list_for_each_safe(item, &((list)->head), tmp)
 
+/** Loop over list backwards safely, so that elements can be removed during */
+#define statlist_for_each_reverse_safe(item, list, tmp) list_for_each_reverse_safe(item, &((list)->head), tmp)
+
 /** Put intem before another */
 static inline void statlist_put_before(struct StatList *list, struct List *item, struct List *pos)
 {