From 6a906358d922800c7358c5c46c34bf4a5e6863ad Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Wed, 30 Nov 2011 09:03:11 +1030 Subject: [PATCH] tlist: implement tlist_for_each_rev --- ccan/tlist/test/run.c | 21 ++++++++++++++++++++- ccan/tlist/tlist.h | 16 ++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/ccan/tlist/test/run.c b/ccan/tlist/test/run.c index 32bbdd82..027028e6 100644 --- a/ccan/tlist/test/run.c +++ b/ccan/tlist/test/run.c @@ -22,7 +22,7 @@ int main(int argc, char *argv[]) unsigned int i; struct tlist_children tlist = TLIST_INIT(tlist); - plan_tests(44); + plan_tests(48); /* Test TLIST_INIT, and tlist_empty */ ok1(tlist_empty(&tlist)); ok1(tlist_check(&tlist, NULL)); @@ -97,6 +97,25 @@ int main(int argc, char *argv[]) } ok1(i == 3); + /* Test tlist_for_each_rev. */ + i = 0; + tlist_for_each_rev(&parent.children, c, list) { + switch (i++) { + case 0: + ok1(c == &c3); + break; + case 1: + ok1(c == &c2); + break; + case 2: + ok1(c == &c1); + break; + } + if (i > 2) + break; + } + ok1(i == 3); + /* Test tlist_for_each_safe, tlist_del and tlist_del_from. */ i = 0; tlist_for_each_safe(&parent.children, c, n, list) { diff --git a/ccan/tlist/tlist.h b/ccan/tlist/tlist.h index 9f62869b..3576146c 100644 --- a/ccan/tlist/tlist.h +++ b/ccan/tlist/tlist.h @@ -221,6 +221,22 @@ #define tlist_for_each(h, i, member) \ list_for_each(tlist_raw((h), (i)), (i), member) +/** + * tlist_for_each - iterate through a list backwards. + * @h: the tlist + * @i: an iterator of suitable type for this list. + * @member: the list_node member of @i + * + * This is a convenient wrapper to iterate @i over the entire list. It's + * a for loop, so you can break and continue as normal. + * + * Example: + * tlist_for_each_rev(&parent->children, child, list) + * printf("Name: %s\n", child->name); + */ +#define tlist_for_each_rev(h, i, member) \ + list_for_each_rev(tlist_raw((h), (i)), (i), member) + /** * tlist_for_each_safe - iterate through a list, maybe during deletion * @h: the tlist -- 2.39.2