summaryrefslogtreecommitdiff
path: root/ccan/container_of
diff options
context:
space:
mode:
Diffstat (limited to 'ccan/container_of')
l---------ccan/container_of/LICENSE1
-rw-r--r--ccan/container_of/_info65
-rw-r--r--ccan/container_of/container_of.h145
-rw-r--r--ccan/container_of/test/compile_fail-bad-type.c22
-rw-r--r--ccan/container_of/test/compile_fail-types.c22
-rw-r--r--ccan/container_of/test/compile_fail-var-types.c25
-rw-r--r--ccan/container_of/test/run.c30
7 files changed, 0 insertions, 310 deletions
diff --git a/ccan/container_of/LICENSE b/ccan/container_of/LICENSE
deleted file mode 120000
index b7951da..0000000
--- a/ccan/container_of/LICENSE
+++ /dev/null
@@ -1 +0,0 @@
-../../licenses/CC0 \ No newline at end of file
diff --git a/ccan/container_of/_info b/ccan/container_of/_info
deleted file mode 100644
index b116052..0000000
--- a/ccan/container_of/_info
+++ /dev/null
@@ -1,65 +0,0 @@
-#include "config.h"
-#include <stdio.h>
-#include <string.h>
-
-/**
- * container_of - routine for upcasting
- *
- * It is often convenient to create code where the caller registers a pointer
- * to a generic structure and a callback. The callback might know that the
- * pointer points to within a larger structure, and container_of gives a
- * convenient and fairly type-safe way of returning to the enclosing structure.
- *
- * This idiom is an alternative to providing a void * pointer for every
- * callback.
- *
- * Example:
- * #include <stdio.h>
- * #include <ccan/container_of/container_of.h>
- *
- * struct timer {
- * void *members;
- * };
- *
- * struct info {
- * int my_stuff;
- * struct timer timer;
- * };
- *
- * static void my_timer_callback(struct timer *timer)
- * {
- * struct info *info = container_of(timer, struct info, timer);
- * printf("my_stuff is %u\n", info->my_stuff);
- * }
- *
- * static void register_timer(struct timer *timer)
- * {
- * (void)timer;
- * (void)my_timer_callback;
- * //...
- * }
- *
- * int main(void)
- * {
- * struct info info = { .my_stuff = 1 };
- *
- * register_timer(&info.timer);
- * // ...
- * return 0;
- * }
- *
- * License: CC0 (Public domain)
- * Author: Rusty Russell <rusty@rustcorp.com.au>
- */
-int main(int argc, char *argv[])
-{
- if (argc != 2)
- return 1;
-
- if (strcmp(argv[1], "depends") == 0) {
- printf("ccan/check_type\n");
- return 0;
- }
-
- return 1;
-}
diff --git a/ccan/container_of/container_of.h b/ccan/container_of/container_of.h
deleted file mode 100644
index 47a34d8..0000000
--- a/ccan/container_of/container_of.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/* CC0 (Public domain) - see LICENSE file for details */
-#ifndef CCAN_CONTAINER_OF_H
-#define CCAN_CONTAINER_OF_H
-#include <stddef.h>
-
-#include "config.h"
-#include <ccan/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 foo {
- * int fielda, fieldb;
- * // ...
- * };
- * struct info {
- * int some_other_field;
- * struct foo my_foo;
- * };
- *
- * static struct info *foo_to_info(struct foo *foo)
- * {
- * return container_of(foo, struct info, my_foo);
- * }
- */
-#define container_of(member_ptr, containing_type, member) \
- ((containing_type *) \
- ((char *)(member_ptr) \
- - container_off(containing_type, member)) \
- + check_types_match(*(member_ptr), ((containing_type *)0)->member))
-
-
-/**
- * container_of_or_null - get pointer to enclosing structure, or NULL
- * @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, unless it
- * is given NULL, in which case it also returns NULL.
- *
- * Example:
- * struct foo {
- * int fielda, fieldb;
- * // ...
- * };
- * struct info {
- * int some_other_field;
- * struct foo my_foo;
- * };
- *
- * static struct info *foo_to_info_allowing_null(struct foo *foo)
- * {
- * return container_of_or_null(foo, struct info, my_foo);
- * }
- */
-static inline char *container_of_or_null_(void *member_ptr, size_t offset)
-{
- return member_ptr ? (char *)member_ptr - offset : NULL;
-}
-#define container_of_or_null(member_ptr, containing_type, member) \
- ((containing_type *) \
- container_of_or_null_(member_ptr, \
- container_off(containing_type, member)) \
- + check_types_match(*(member_ptr), ((containing_type *)0)->member))
-
-/**
- * container_off - get offset to enclosing structure
- * @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
- * typechecking and figures out the offset to the enclosing type.
- *
- * Example:
- * struct foo {
- * int fielda, fieldb;
- * // ...
- * };
- * struct info {
- * int some_other_field;
- * struct foo my_foo;
- * };
- *
- * static struct info *foo_to_info(struct foo *foo)
- * {
- * size_t off = container_off(struct info, my_foo);
- * return (void *)((char *)foo - off);
- * }
- */
-#define container_off(containing_type, member) \
- offsetof(containing_type, member)
-
-/**
- * container_of_var - get pointer to enclosing structure using a variable
- * @member_ptr: pointer to the structure member
- * @container_var: a pointer of same type as this member's container
- * @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:
- * static struct info *foo_to_i(struct foo *foo)
- * {
- * struct info *i = container_of_var(foo, i, my_foo);
- * return i;
- * }
- */
-#if HAVE_TYPEOF
-#define container_of_var(member_ptr, container_var, member) \
- container_of(member_ptr, typeof(*container_var), member)
-#else
-#define container_of_var(member_ptr, container_var, member) \
- ((void *)((char *)(member_ptr) - \
- container_off_var(container_var, member)))
-#endif
-
-/**
- * container_off_var - get offset of a field in enclosing structure
- * @container_var: a pointer to a container structure
- * @member: the name of a member within the structure.
- *
- * Given (any) pointer to a structure and a its member name, this
- * macro does pointer subtraction to return offset of member in a
- * structure memory layout.
- *
- */
-#if HAVE_TYPEOF
-#define container_off_var(var, member) \
- container_off(typeof(*var), member)
-#else
-#define container_off_var(var, member) \
- ((const char *)&(var)->member - (const char *)(var))
-#endif
-
-#endif /* CCAN_CONTAINER_OF_H */
diff --git a/ccan/container_of/test/compile_fail-bad-type.c b/ccan/container_of/test/compile_fail-bad-type.c
deleted file mode 100644
index 55a911a..0000000
--- a/ccan/container_of/test/compile_fail-bad-type.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <ccan/container_of/container_of.h>
-#include <stdlib.h>
-
-struct foo {
- int a;
- char b;
-};
-
-int main(void)
-{
- struct foo foo = { .a = 1, .b = 2 };
- int *intp = &foo.a;
- 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;
-#endif
- return p == NULL;
-}
diff --git a/ccan/container_of/test/compile_fail-types.c b/ccan/container_of/test/compile_fail-types.c
deleted file mode 100644
index fbb97a9..0000000
--- a/ccan/container_of/test/compile_fail-types.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <ccan/container_of/container_of.h>
-#include <stdlib.h>
-
-struct foo {
- int a;
- char b;
-};
-
-int main(void)
-{
- 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(intp, struct foo, b);
-#else
- foop = NULL;
-#endif
- (void) foop; /* Suppress unused-but-set-variable warning. */
- return intp == NULL;
-}
diff --git a/ccan/container_of/test/compile_fail-var-types.c b/ccan/container_of/test/compile_fail-var-types.c
deleted file mode 100644
index ecdd909..0000000
--- a/ccan/container_of/test/compile_fail-var-types.c
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <ccan/container_of/container_of.h>
-#include <stdlib.h>
-
-struct foo {
- int a;
- char b;
-};
-
-int main(void)
-{
- 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);
-#if !HAVE_TYPEOF
-#error "Unfortunately we don't fail if we don't have typeof."
-#endif
-#else
- foop = NULL;
-#endif
- (void) foop; /* Suppress unused-but-set-variable warning. */
- return intp == NULL;
-}
diff --git a/ccan/container_of/test/run.c b/ccan/container_of/test/run.c
deleted file mode 100644
index 3255729..0000000
--- a/ccan/container_of/test/run.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include <ccan/container_of/container_of.h>
-#include <ccan/tap/tap.h>
-
-struct foo {
- int a;
- char b;
-};
-
-int main(void)
-{
- struct foo foo = { .a = 1, .b = 2 };
- int *intp = &foo.a;
- char *charp = &foo.b;
-
- plan_tests(12);
- ok1(container_of(intp, struct foo, a) == &foo);
- ok1(container_of(charp, struct foo, b) == &foo);
- ok1(container_of_or_null(intp, struct foo, a) == &foo);
- ok1(container_of_or_null(charp, struct foo, b) == &foo);
- ok1(container_of_or_null((int *)NULL, struct foo, a) == NULL);
- ok1(container_of_or_null((char *)NULL, struct foo, b) == NULL);
- ok1(container_of_var(intp, &foo, a) == &foo);
- ok1(container_of_var(charp, &foo, b) == &foo);
-
- ok1(container_off(struct foo, a) == 0);
- ok1(container_off(struct foo, b) == offsetof(struct foo, b));
- ok1(container_off_var(&foo, a) == 0);
- ok1(container_off_var(&foo, b) == offsetof(struct foo, b));
- return exit_status();
-}