Browse Source

tlist: implement tlist_for_each_rev

Rusty Russell 14 years ago
parent
commit
6a906358d9
2 changed files with 36 additions and 1 deletions
  1. 20 1
      ccan/tlist/test/run.c
  2. 16 0
      ccan/tlist/tlist.h

+ 20 - 1
ccan/tlist/test/run.c

@@ -22,7 +22,7 @@ int main(int argc, char *argv[])
 	unsigned int i;
 	unsigned int i;
 	struct tlist_children tlist = TLIST_INIT(tlist);
 	struct tlist_children tlist = TLIST_INIT(tlist);
 
 
-	plan_tests(44);
+	plan_tests(48);
 	/* Test TLIST_INIT, and tlist_empty */
 	/* Test TLIST_INIT, and tlist_empty */
 	ok1(tlist_empty(&tlist));
 	ok1(tlist_empty(&tlist));
 	ok1(tlist_check(&tlist, NULL));
 	ok1(tlist_check(&tlist, NULL));
@@ -97,6 +97,25 @@ int main(int argc, char *argv[])
 	}
 	}
 	ok1(i == 3);
 	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. */
 	/* Test tlist_for_each_safe, tlist_del and tlist_del_from. */
 	i = 0;
 	i = 0;
 	tlist_for_each_safe(&parent.children, c, n, list) {
 	tlist_for_each_safe(&parent.children, c, n, list) {

+ 16 - 0
ccan/tlist/tlist.h

@@ -221,6 +221,22 @@
 #define tlist_for_each(h, i, member)					\
 #define tlist_for_each(h, i, member)					\
 	list_for_each(tlist_raw((h), (i)), (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
  * tlist_for_each_safe - iterate through a list, maybe during deletion
  * @h: the tlist
  * @h: the tlist