Commit 1e7eb5df authored by Rusty Russell's avatar Rusty Russell

New variant of container_of: container_of_var, for list.h

parent 9c468dc3
......@@ -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 */
......@@ -13,6 +13,7 @@ int main(int argc, char *argv[])
char *p;
#ifdef FAIL
/* p is a char *, but this gives a struct foo * */
p = container_of(intp, struct foo, a);
#else
p = (char *)intp;
......
......@@ -12,6 +12,7 @@ int main(int argc, char *argv[])
int *intp = &foo.a;
#ifdef FAIL
/* b is a char, but intp is an int * */
foop = container_of(intp, struct foo, b);
#else
foop = NULL;
......
#include "container_of/container_of.h"
#include <stdlib.h>
struct foo {
int a;
char b;
};
int main(int argc, char *argv[])
{
struct foo foo = { .a = 1, .b = 2 }, *foop;
int *intp = &foo.a;
#ifdef FAIL
/* b is a char, but intp is an int * */
foop = container_of_var(intp, foop, b);
#else
foop = NULL;
#endif
return intp == NULL;
}
......@@ -12,8 +12,10 @@ int main(int argc, char *argv[])
int *intp = &foo.a;
char *charp = &foo.b;
plan_tests(2);
plan_tests(4);
ok1(container_of(intp, struct foo, a) == &foo);
ok1(container_of(charp, struct foo, b) == &foo);
ok1(container_of_var(intp, &foo, a) == &foo);
ok1(container_of_var(charp, &foo, b) == &foo);
return exit_status();
}
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