From 3dda2c8bfc6430ea97cbb3bc1040df2b793dab91 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Wed, 28 Sep 2011 12:06:35 +0930 Subject: [PATCH] tcon: more help, for making strmap. --- ccan/tcon/tcon.h | 46 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/ccan/tcon/tcon.h b/ccan/tcon/tcon.h index 866c2111..93c3ea6b 100644 --- a/ccan/tcon/tcon.h +++ b/ccan/tcon/tcon.h @@ -61,6 +61,43 @@ #define tcon_check(x, canary, expr) \ (sizeof((x)->_tcon[0].canary == (expr)) ? (x) : (x)) +/** + * tcon_check_ptr - typecheck a typed container + * @x: the structure containing the TCON. + * @canary: which canary to check against. + * @expr: the expression whose type must match &TCON (not evaluated) + * + * This macro is used to check that the expression is a pointer to the type + * expected for this structure (note the "useless" sizeof() argument + * which contains this comparison with the type canary), or NULL. + * + * It evaluates to @x so you can chain it. + */ +#define tcon_check_ptr(x, canary, expr) \ + (sizeof(&(x)->_tcon[0].canary == (expr)) ? (x) : (x)) + + +/** + * tcon_type - the type within a container (or void *) + * @x: the structure containing the TCON. + * @canary: which canary to check against. + */ +#if HAVE_TYPEOF +#define tcon_type(x, canary) __typeof__((x)->_tcon[0].canary) +#else +#define tcon_type(x, canary) void * +#endif + +/** + * tcon_ptr_type - pointer to the type within a container (or void *) + * @x: the structure containing the TCON. + * @canary: which canary to check against. + */ +#if HAVE_TYPEOF +#define tcon_ptr_type(x, canary) __typeof__(&(x)->_tcon[0].canary) +#else +#define tcon_ptr_type(x, canary) void * +#endif /** * tcon_cast - cast to a canary type for this container (or void *) @@ -72,12 +109,7 @@ * platform doesn't HAVE_TYPEOF, then it casts to void * (which will * cause a warning if the user doesn't expect a pointer type). */ -#if HAVE_TYPEOF -#define tcon_cast(x, canary, expr) ((__typeof__((x)->_tcon[0].canary))(expr)) -#define tcon_cast_ptr(x, canary, expr) ((__typeof__(&(x)->_tcon[0].canary))(expr)) -#else -#define tcon_cast(x, canary, expr) ((void *)(expr)) -#define tcon_cast_ptr(x, canary, expr) ((void *)(expr)) -#endif +#define tcon_cast(x, canary, expr) ((tcon_type((x), canary))(expr)) +#define tcon_cast_ptr(x, canary, expr) ((tcon_ptr_type((x), canary))(expr)) #endif /* CCAN_TCON_H */ -- 2.39.2