summaryrefslogtreecommitdiff
path: root/shared/helpers.h
diff options
context:
space:
mode:
Diffstat (limited to 'shared/helpers.h')
-rw-r--r--shared/helpers.h37
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