shl: dlist: add *_but_one() loops

The *_but_one() variants of dlist-loops start from within a loop instead
of at the head and iterate over all elements except the start-element. The
start element is skipped as we would need a temporary variable to include
it and in most times you want to skip the start-element, anyway.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-10-15 17:56:44 +02:00
parent 52edafe08c
commit 22e63dbdba

View File

@ -105,6 +105,13 @@ static inline bool shl_dlist_empty(struct shl_dlist *head)
#define shl_dlist_for_each(iter, head) \
for (iter = (head)->next; iter != (head); iter = iter->next)
#define shl_dlist_for_each_but_one(iter, start, head) \
for (iter = ((start)->next == (head)) ? \
(start)->next->next : \
(start)->next; \
iter != (start); \
iter = (iter->next == (head)) ? iter->next->next : iter->next)
#define shl_dlist_for_each_safe(iter, tmp, head) \
for (iter = (head)->next, tmp = iter->next; iter != (head); \
iter = tmp, tmp = iter->next)
@ -112,6 +119,13 @@ static inline bool shl_dlist_empty(struct shl_dlist *head)
#define shl_dlist_for_each_reverse(iter, head) \
for (iter = (head)->prev; iter != (head); iter = iter->prev)
#define shl_dlist_for_each_reverse_but_one(iter, start, head) \
for (iter = ((start)->prev == (head)) ? \
(start)->prev->prev : \
(start)->prev; \
iter != (start); \
iter = (iter->prev == (head)) ? iter->prev->prev : iter->prev)
#define shl_dlist_for_each_reverse_safe(iter, tmp, head) \
for (iter = (head)->prev, tmp = iter->prev; iter != (head); \
iter = tmp, tmp = iter->prev)