introduce container_of macro

This macro is popular within the Linux kernel for supporting intrusive data structures such as linked lists, red-black trees, and chained hash tables while allowing the compiler to do type checking. Later patches will use container_of() to remove the limitation of "hashmap_entry" being location-dependent. This will complete the transition to compile-time type checking for the hashmap API. This macro already exists in our source as "list_entry" in list.h and making "list_entry" an alias to "container_of" as the Linux kernel has done is a possibility. Signed-off-by: Eric Wong <e@80x24.org> Reviewed-by: Derrick Stolee <stolee@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Eric Wong committed Oct 6, 2019 at 23:30 UTC 973d5eea7455e1053842f7474c8ec34755f3525b
1 file changed +10
git-compat-util.h
+10
@@ -1312,4 +1312,14 @@ void unleak_memory(const void *ptr, size_t len);
1312 */
1313 #include "banned.h"
1314
1315 +/*
1316 + * container_of - Get the address of an object containing a field.
1317 + *
1318 + * @ptr: pointer to the field.
1319 + * @type: type of the object.
1320 + * @member: name of the field within the object.
1321 + */
1322 +#define container_of(ptr, type, member) \
1323 + ((type *) ((char *)(ptr) - offsetof(type, member)))
1324 +
1325 #endif