From be2b527792d574ef8cf506d1a168d92354e23cc5 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Fri, 23 Sep 2011 11:58:52 +0930 Subject: [PATCH] tlist: use ccan/tcon No real change for users. --- ccan/tlist/_info | 11 ++++++----- ccan/tlist/tlist.h | 40 ++++++++++++++++------------------------ 2 files changed, 22 insertions(+), 29 deletions(-) diff --git a/ccan/tlist/_info b/ccan/tlist/_info index 7586fdfc..e18e2efb 100644 --- a/ccan/tlist/_info +++ b/ccan/tlist/_info @@ -9,17 +9,17 @@ * this extends it so you can create list head types which only accomodate * a specific entry type. * - * You use TLIST_TYPE() to define the specific struct tlist_, then use - * the tlist_* variants of the various list_* operations. - * * Example: * #include * #include * #include * #include * - * // Defines struct tlist_children - * TLIST_TYPE(children, struct child); + * // We could use TLIST_TYPE(children, struct child) to define this. + * struct tlist_children { + * struct list_head raw; + * TCON(struct child *canary); + * }; * struct parent { * const char *name; * struct tlist_children children; @@ -66,6 +66,7 @@ int main(int argc, char *argv[]) if (strcmp(argv[1], "depends") == 0) { printf("ccan/list\n"); + printf("ccan/tcon\n"); return 0; } diff --git a/ccan/tlist/tlist.h b/ccan/tlist/tlist.h index 7e43fe29..9f62869b 100644 --- a/ccan/tlist/tlist.h +++ b/ccan/tlist/tlist.h @@ -2,8 +2,8 @@ #ifndef CCAN_TLIST_H #define CCAN_TLIST_H #include +#include -#if HAVE_FLEXIBLE_ARRAY_MEMBER /** * TLIST_TYPE - declare a typed list type (struct tlist) * @suffix: the name to use (struct tlist_@suffix) @@ -27,31 +27,12 @@ * struct list_node list; * }; */ -#define TLIST_TYPE(suffix, type) \ - struct tlist_##suffix { \ - struct list_head raw; \ - const type *tcheck[]; \ +#define TLIST_TYPE(suffix, type) \ + struct tlist_##suffix { \ + struct list_head raw; \ + TCON(type *canary); \ } -/** - * tlist_raw - access the raw list inside a typed list head. - * @h: the head of the typed list (struct tlist_@suffix) - * @test_var: a pointer to the expected element type. - * - * This elaborate macro usually causes the compiler to emit a warning - * if the variable is of an unexpected type. It is used internally - * where we need to access the raw underlying list. - */ -#define tlist_raw(h, test_var) \ - (sizeof((h)->tcheck[0] == (test_var)) ? &(h)->raw : &(h)->raw) -#else -#define TLIST_TYPE(suffix, type) \ - struct tlist_##suffix { \ - struct list_head raw; \ - } -#define tlist_raw(h, test_var) (&(h)->raw) -#endif - /** * TLIST_INIT - initalizer for an empty tlist * @name: the name of the list. @@ -108,6 +89,17 @@ */ #define tlist_init(h) list_head_init(&(h)->raw) +/** + * tlist_raw - unwrap the typed list and check the type + * @h: the tlist + * @expr: the expression to check the type against (not evaluated) + * + * This macro usually causes the compiler to emit a warning if the + * 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) + /** * tlist_add - add an entry at the start of a linked list. * @h: the tlist to add the node to -- 2.39.2