From 22e63dbdbad21ca0ae0a328da28db07d1654f41c Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Mon, 15 Oct 2012 17:56:44 +0200 Subject: [PATCH] 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 --- src/shl_dlist.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/shl_dlist.h b/src/shl_dlist.h index 8887f7f..cc6a1f2 100644 --- a/src/shl_dlist.h +++ b/src/shl_dlist.h @@ -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)