* #include <stdlib.h>
* #include <ccan/tlist/tlist.h>
*
- * // We could use TLIST_TYPE(children, struct child) to define this.
- * struct tlist_children {
- * struct list_head raw;
- * TCON(struct child *canary);
- * };
+ * TLIST_TYPE(children, struct child);
* struct parent {
* const char *name;
* unsigned int num_children;
tlist_add(&parent.children, &c2, list);
/* Test tlist_add and !tlist_empty. */
ok1(!tlist_empty(&parent.children));
- ok1(c2.list.next == &parent.children.raw.n);
- 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(c2.list.next == &tcon_unwrap(&parent.children)->n);
+ ok1(c2.list.prev == &tcon_unwrap(&parent.children)->n);
+ ok1(tcon_unwrap(&parent.children)->n.next == &c2.list);
+ ok1(tcon_unwrap(&parent.children)->n.prev == &c2.list);
ok1(tlist_next(&parent.children, &c2, list) == NULL);
ok1(tlist_prev(&parent.children, &c2, list) == NULL);
/* Test tlist_check */
tlist_add(&parent.children, &c1, list);
/* Test list_add and !list_empty. */
ok1(!tlist_empty(&parent.children));
- ok1(c2.list.next == &parent.children.raw.n);
+ ok1(c2.list.next == &tcon_unwrap(&parent.children)->n);
ok1(c2.list.prev == &c1.list);
- ok1(parent.children.raw.n.next == &c1.list);
- ok1(parent.children.raw.n.prev == &c2.list);
+ ok1(tcon_unwrap(&parent.children)->n.next == &c1.list);
+ ok1(tcon_unwrap(&parent.children)->n.prev == &c2.list);
ok1(c1.list.next == &c2.list);
- ok1(c1.list.prev == &parent.children.raw.n);
+ ok1(c1.list.prev == &tcon_unwrap(&parent.children)->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);
tlist_add_tail(&parent.children, &c3, list);
/* Test list_add_tail and !list_empty. */
ok1(!tlist_empty(&parent.children));
- ok1(parent.children.raw.n.next == &c1.list);
- ok1(parent.children.raw.n.prev == &c3.list);
+ ok1(tcon_unwrap(&parent.children)->n.next == &c1.list);
+ ok1(tcon_unwrap(&parent.children)->n.prev == &c3.list);
ok1(c1.list.next == &c2.list);
- ok1(c1.list.prev == &parent.children.raw.n);
+ ok1(c1.list.prev == &tcon_unwrap(&parent.children)->n);
ok1(c2.list.next == &c3.list);
ok1(c2.list.prev == &c1.list);
- ok1(c3.list.next == &parent.children.raw.n);
+ ok1(c3.list.next == &tcon_unwrap(&parent.children)->n);
ok1(c3.list.prev == &c2.list);
ok1(tlist_next(&parent.children, &c1, list) == &c2);
ok1(tlist_next(&parent.children, &c2, list) == &c3);
* @suffix: the name to use (struct tlist_@suffix)
* @type: the type the list will contain (void for any type)
*
- * This declares a structure "struct tlist_@suffix" to use for
- * lists containing this type. The actual list can be accessed using
- * ".raw" or tlist_raw(). For maximum portability, place tlists
- * embedded in structures as the last member.
+ * This declares a structure "struct tlist_@suffix" to use for lists
+ * containing this type. The actual list can be accessed using
+ * tlist_raw(). For maximum portability, place tlists embedded in
+ * structures as the last member.
*
* Example:
* // Defines struct tlist_children
*/
#define TLIST_TYPE(suffix, type) \
struct tlist_##suffix { \
- struct list_head raw; \
- TCON(type *canary); \
+ TCON_WRAP(struct list_head, type *canary); \
}
/**
* Example:
* static struct tlist_children my_list = TLIST_INIT(my_list);
*/
-#define TLIST_INIT(name) { LIST_HEAD_INIT(name.raw) }
+#define TLIST_INIT(name) TCON_WRAP_INIT(LIST_HEAD_INIT(*tcon_unwrap(&name)))
/**
* tlist_check - check head of a list for consistency
* }
*/
#define tlist_check(h, abortstr) \
- list_check(&(h)->raw, (abortstr))
+ list_check(tcon_unwrap(h), (abortstr))
/**
* tlist_init - initialize a tlist
* tlist_init(&parent->children);
* parent->num_children = 0;
*/
-#define tlist_init(h) list_head_init(&(h)->raw)
+#define tlist_init(h) list_head_init(tcon_unwrap(h))
/**
* tlist_raw - unwrap the typed list and check the type
* variable is of an unexpected type. It is used internally where we
* need to access the raw underlying list.
*/
-#define tlist_raw(h, expr) (&tcon_check((h), canary, (expr))->raw)
+#define tlist_raw(h, expr) tcon_unwrap(tcon_check((h), canary, (expr)))
/**
* tlist_add - add an entry at the start of a linked list.
* Example:
* assert(tlist_empty(&parent->children) == (parent->num_children == 0));
*/
-#define tlist_empty(h) list_empty(&(h)->raw)
+#define tlist_empty(h) list_empty(tcon_unwrap(h))
/**
* tlist_top - get the first entry in a list
*/
#define tlist_top(h, member) \
((tcon_type((h), canary)) \
- list_top_(&(h)->raw, \
+ list_top_(tcon_unwrap((h)), \
(char *)(&(h)->_tcon[0].canary->member) - \
(char *)((h)->_tcon[0].canary)))
*/
#define tlist_tail(h, member) \
((tcon_type((h), canary)) \
- list_tail_(&(h)->raw, \
+ list_tail_(tcon_unwrap(h), \
(char *)(&(h)->_tcon[0].canary->member) - \
(char *)((h)->_tcon[0].canary)))