X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=container_of%2Fcontainer_of.h;h=1f4b18e4426a1c3c0bfc5c47e2a4e807ae7e2a52;hp=bdb23d07a163e2e0933568db35f0892c1dce7b5c;hb=53edefb8b2de84c873f8ecc35b61003d559b18dd;hpb=7bbd49fdb03503688dd34ab860e0e02e852ed267 diff --git a/container_of/container_of.h b/container_of/container_of.h index bdb23d07..1f4b18e4 100644 --- a/container_of/container_of.h +++ b/container_of/container_of.h @@ -32,4 +32,34 @@ - check_types_match(*(member_ptr), ((containing_type *)0)->member)) +/** + * container_of_var - get pointer to enclosing structure using a variable + * @member_ptr: pointer to the structure member + * @var: a pointer to a structure of same type as this member is within + * @member: the name of this member within the structure. + * + * Given a pointer to a member of a structure, this macro does pointer + * subtraction to return the pointer to the enclosing type. + * + * Example: + * struct info + * { + * int some_other_field; + * struct foo my_foo; + * }; + * + * struct info *foo_to_info(struct foo *foop) + * { + * struct info *i = container_of_var(foo, i, my_foo); + * return i; + * } + */ +#ifdef HAVE_TYPEOF +#define container_of_var(member_ptr, var, member) \ + container_of(member_ptr, typeof(*var), member) +#else +#define container_of_var(member_ptr, var, member) \ + ((void *)((char *)(member_ptr) - offsetof(containing_type, member))) +#endif + #endif /* CCAN_CONTAINER_OF_H */