diff options
author | Eric Wong <e@80x24.org> | 2019-10-06 23:30:35 +0000 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2019-10-07 10:20:10 +0900 |
commit | f0e63c41139f8982add435536d39aff6f3d4ca98 (patch) | |
tree | 6ed9e3afe2081c8201d6c6c9a0d9b8c9439d3a6e /git-compat-util.h | |
parent | 6bcbdfb277bdc81b5ad6996b3fb005382a35c2ee (diff) | |
download | git-f0e63c41139f8982add435536d39aff6f3d4ca98.tar.gz |
hashmap: use *_entry APIs to wrap container_of
Using `container_of' can be verbose and choosing names for
intermediate "struct hashmap_entry" pointers is a hard problem.
So introduce "*_entry" APIs inspired by similar linked-list
APIs in the Linux kernel.
Unfortunately, `__typeof__' is not portable C, so we need an
extra parameter to specify the type.
Signed-off-by: Eric Wong <e@80x24.org>
Reviewed-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'git-compat-util.h')
-rw-r--r-- | git-compat-util.h | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/git-compat-util.h b/git-compat-util.h index 4cc2c8283a..4a23b9090b 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -1322,4 +1322,19 @@ void unleak_memory(const void *ptr, size_t len); #define container_of(ptr, type, member) \ ((type *) ((char *)(ptr) - offsetof(type, member))) +/* + * helper function for `container_of_or_null' to avoid multiple + * evaluation of @ptr + */ +static inline void *container_of_or_null_offset(void *ptr, size_t offset) +{ + return ptr ? (char *)ptr - offset : NULL; +} + +/* + * like `container_of', but allows returned value to be NULL + */ +#define container_of_or_null(ptr, type, member) \ + (type *)container_of_or_null_offset(ptr, offsetof(type, member)) + #endif |