Commit cc3db07e authored by David Gibson's avatar David Gibson

tcon: Add tcon_sizeof() helper

Add a new tcon_sizeof() helper macro which returns the size of a type for
which a canary has been constructed with TCON or TCON_WRAP.
Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
parent 43992de4
...@@ -159,6 +159,13 @@ ...@@ -159,6 +159,13 @@
#define tcon_type(x, canary) void * #define tcon_type(x, canary) void *
#endif #endif
/**
* tcon_sizeof - the size of type within a container
* @x: the structure containing the TCON.
* @canary: which canary to check against.
*/
#define tcon_sizeof(x, canary) sizeof((x)->_tcon[0].canary)
/** /**
* tcon_ptr_type - pointer to the type within a container (or void *) * tcon_ptr_type - pointer to the type within a container (or void *)
* @x: the structure containing the TCON. * @x: the structure containing the TCON.
......
#include <ccan/tcon/tcon.h>
#include <ccan/build_assert/build_assert.h>
#include <stdlib.h>
struct container {
void *p;
};
struct int_container {
struct container raw;
TCON(int tc);
};
struct charp_and_int_container {
struct container raw;
TCON(int tc1; char *tc2);
};
int main(int argc, char *argv[])
{
struct int_container icon;
struct charp_and_int_container cicon;
TCON_WRAP(struct container, int tc) iconw;
TCON_WRAP(struct container, int tc1; char *tc2) ciconw;
BUILD_ASSERT(tcon_sizeof(&icon, tc) == sizeof(int));
BUILD_ASSERT(tcon_sizeof(&cicon, tc1) == sizeof(int));
BUILD_ASSERT(tcon_sizeof(&cicon, tc2) == sizeof(char *));
BUILD_ASSERT(tcon_sizeof(&iconw, tc) == sizeof(int));
BUILD_ASSERT(tcon_sizeof(&ciconw, tc1) == sizeof(int));
BUILD_ASSERT(tcon_sizeof(&ciconw, tc2) == sizeof(char *));
return 0;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment