(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);
/** 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)
{