--- /dev/null
+#include <ccan/tlist/tlist.h>
+
+TLIST_TYPE(children, struct child);
+
+struct child {
+ const char *name;
+ struct list_node list;
+};
+
+struct cousin {
+ const char *name;
+ struct list_node list;
+};
+
+int main(int argc, char *argv[])
+{
+ struct tlist_children children;
+ struct child child = { "child" };
+#ifdef FAIL
+#if !HAVE_FLEXIBLE_ARRAY_MEMBER
+#error Need flexible array members to check type
+#endif
+ struct cousin *p;
+#else
+ struct child *p;
+#endif
+
+ tlist_init(&children);
+ tlist_add(&children, &child, list);
+ p = tlist_next(&children, &child, list);
+ (void) p;
+ return 0;
+}
--- /dev/null
+#include <ccan/tlist/tlist.h>
+
+TLIST_TYPE(children, struct child);
+
+struct child {
+ const char *name;
+ struct list_node list;
+};
+
+struct cousin {
+ const char *name;
+ struct list_node list;
+};
+
+int main(int argc, char *argv[])
+{
+ struct tlist_children children;
+ struct child child = { "child" };
+#ifdef FAIL
+#if !HAVE_FLEXIBLE_ARRAY_MEMBER
+#error Need flexible array members to check type
+#endif
+ struct cousin *p = NULL;
+#else
+ struct child *p = NULL;
+#endif
+
+ tlist_init(&children);
+ tlist_add(&children, &child, list);
+ (void)tlist_next(&children, p, list);
+ return 0;
+}
--- /dev/null
+#include <ccan/tlist/tlist.h>
+
+TLIST_TYPE(children, struct child);
+
+struct child {
+ const char *name;
+ struct list_node list;
+};
+
+struct cousin {
+ const char *name;
+ struct list_node list;
+};
+
+int main(int argc, char *argv[])
+{
+ struct tlist_children children;
+ struct child child = { "child" };
+#ifdef FAIL
+#if !HAVE_FLEXIBLE_ARRAY_MEMBER
+#error Need flexible array members to check type
+#endif
+ struct cousin *p;
+#else
+ struct child *p;
+#endif
+
+ tlist_init(&children);
+ tlist_add(&children, &child, list);
+ p = tlist_prev(&children, &child, list);
+ (void) p;
+ return 0;
+}
--- /dev/null
+#include <ccan/tlist/tlist.h>
+
+TLIST_TYPE(children, struct child);
+
+struct child {
+ const char *name;
+ struct list_node list;
+};
+
+struct cousin {
+ const char *name;
+ struct list_node list;
+};
+
+int main(int argc, char *argv[])
+{
+ struct tlist_children children;
+ struct child child = { "child" };
+#ifdef FAIL
+#if !HAVE_FLEXIBLE_ARRAY_MEMBER
+#error Need flexible array members to check type
+#endif
+ struct cousin *p = NULL;
+#else
+ struct child *p = NULL;
+#endif
+
+ tlist_init(&children);
+ tlist_add(&children, &child, list);
+ (void)tlist_prev(&children, p, list);
+ return 0;
+}
unsigned int i;
struct tlist_children tlist = TLIST_INIT(tlist);
- plan_tests(48);
+ plan_tests(60);
/* Test TLIST_INIT, and tlist_empty */
ok1(tlist_empty(&tlist));
ok1(tlist_check(&tlist, NULL));
ok1(c2.list.prev == &parent.children.raw.n);
ok1(parent.children.raw.n.next == &c2.list);
ok1(parent.children.raw.n.prev == &c2.list);
+ ok1(tlist_next(&parent.children, &c2, list) == NULL);
+ ok1(tlist_prev(&parent.children, &c2, list) == NULL);
/* Test tlist_check */
ok1(tlist_check(&parent.children, NULL));
ok1(parent.children.raw.n.prev == &c2.list);
ok1(c1.list.next == &c2.list);
ok1(c1.list.prev == &parent.children.raw.n);
+ ok1(tlist_next(&parent.children, &c1, list) == &c2);
+ ok1(tlist_next(&parent.children, &c2, list) == NULL);
+ ok1(tlist_prev(&parent.children, &c2, list) == &c1);
+ ok1(tlist_prev(&parent.children, &c1, list) == NULL);
/* Test tlist_check */
ok1(tlist_check(&parent.children, NULL));
ok1(c2.list.prev == &c1.list);
ok1(c3.list.next == &parent.children.raw.n);
ok1(c3.list.prev == &c2.list);
+ ok1(tlist_next(&parent.children, &c1, list) == &c2);
+ ok1(tlist_next(&parent.children, &c2, list) == &c3);
+ ok1(tlist_next(&parent.children, &c3, list) == NULL);
+ ok1(tlist_prev(&parent.children, &c3, list) == &c2);
+ ok1(tlist_prev(&parent.children, &c2, list) == &c1);
+ ok1(tlist_prev(&parent.children, &c1, list) == NULL);
/* Test tlist_check */
ok1(tlist_check(&parent.children, NULL));
(char *)(&(h)->_tcon[0].canary->member) - \
(char *)((h)->_tcon[0].canary)))
+/**
+ * tlist_next - get the next entry in a list
+ * @h: the tlist
+ * @n: the list element
+ * @member: the list_node member of the type
+ *
+ * Returns the element of list @h immediately after @n, or NULL, if @n
+ * is the last element in the list.
+ */
+#define tlist_next(h, n, member) \
+ list_next(tlist_raw((h), (n)), (n), member)
+
+/**
+ * tlist_prev - get the previous entry in a list
+ * @h: the tlist
+ * @n: the list element
+ * @member: the list_node member of the type
+ *
+ * Returns the element of list @h immediately before @n, or NULL, if
+ * @n is the first element in the list.
+ */
+#define tlist_prev(h, n, member) \
+ list_prev(tlist_raw((h), (n)), (n), member)
+
/**
* tlist_for_each - iterate through a list.
* @h: the tlist