From 8267f283dccaf26ccb28a8161c5f4ff703c86cf0 Mon Sep 17 00:00:00 2001 From: Aaron Faanes Date: Tue, 17 Sep 2013 16:42:43 -0500 Subject: [PATCH] utils: Document wl_container_of --- src/wayland-util.h | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/wayland-util.h b/src/wayland-util.h index aa745124..68d91e24 100644 --- a/src/wayland-util.h +++ b/src/wayland-util.h @@ -116,6 +116,41 @@ int wl_list_length(const struct wl_list *list); int wl_list_empty(const struct wl_list *list); void wl_list_insert_list(struct wl_list *list, struct wl_list *other); +/** + * Retrieves a pointer to the containing struct of a given member item. + * + * This macro allows conversion from a pointer to a item to its containing + * struct. This is useful if you have a contained item like a wl_list, + * wl_listener, or wl_signal, provided via a callback or other means and would + * like to retrieve the struct that contains it. + * + * To demonstrate, the following example retrieves a pointer to + * `example_container` given only its `destroy_listener` member: + * + * ~~~ + * struct example_container { + * struct wl_listener destroy_listener; + * \comment{other members...} + * }; + * + * void example_container_destroy(struct wl_listener *listener, void *data) + * { + * struct example_container *ctr = NULL; + * + * ctr = wl_container_of(listener, ctr, destroy_listener); + * \comment{destroy ctr...} + * } + * ~~~ + * + * \param ptr A valid pointer to the contained item. + * + * \param sample A pointer to the type of content that the list item stores. + * Sample does not need be a valid pointer; a null pointer will suffice. + * + * \param member The named location of ptr within the sample type. + * + * \return The container for the specified pointer. + */ #ifdef __GNUC__ #define wl_container_of(ptr, sample, member) \ (__typeof__(sample))((char *)(ptr) - \