X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=container_of%2Fcontainer_of.h;h=1f4b18e4426a1c3c0bfc5c47e2a4e807ae7e2a52;hb=4cdcc6486e0f406c2ef98e37935f529250d1dbb3;hp=49f20b5670c99ddf5e6d98903c49e62912abf6ed;hpb=fdfcdafbfa7957b6ca393bb4000fbaad3813a61a;p=ccan diff --git a/container_of/container_of.h b/container_of/container_of.h index 49f20b56..1f4b18e4 100644 --- a/container_of/container_of.h +++ b/container_of/container_of.h @@ -5,10 +5,61 @@ #include "config.h" #include "check_type/check_type.h" +/** + * container_of - get pointer to enclosing structure + * @member_ptr: pointer to the structure member + * @containing_type: the type 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) + * { + * return container_of(foo, struct info, my_foo); + * } + */ #define container_of(member_ptr, containing_type, member) \ ((containing_type *) \ ((char *)(member_ptr) - offsetof(containing_type, member)) \ - 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 */