diff options
Diffstat (limited to 'shared/helpers.h')
-rw-r--r-- | shared/helpers.h | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/shared/helpers.h b/shared/helpers.h index 83f79b11..1d1e4589 100644 --- a/shared/helpers.h +++ b/shared/helpers.h @@ -52,6 +52,43 @@ extern "C" { #define MIN(x,y) (((x) < (y)) ? (x) : (y)) #endif +/** + * Returns a pointer the the containing struct of a given member item. + * + * To demonstrate, the following example retrieves a pointer to + * `example_container` given only its `destroy_listener` member: + * + * @code + * struct example_container { + * struct wl_listener destroy_listener; + * // other members... + * }; + * + * void example_container_destroy(struct wl_listener *listener, void *data) + * { + * struct example_container *ctr; + * + * ctr = wl_container_of(listener, ctr, destroy_listener); + * // destroy ctr... + * } + * @endcode + * + * @param ptr A valid pointer to the contained item. + * + * @param type A pointer to the type of content that the list item + * stores. Type does not need be a valid pointer; a null or + * an uninitialised pointer will suffice. + * + * @param member The named location of ptr within the sample type. + * + * @return The container for the specified pointer. + */ +#ifndef container_of +#define container_of(ptr, type, member) ({ \ + const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) +#endif + #ifdef __cplusplus } #endif |