summaryrefslogtreecommitdiff
path: root/git-compat-util.h
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-10-06 23:30:35 (GMT)
committerJunio C Hamano <gitster@pobox.com>2019-10-07 01:20:10 (GMT)
commitf0e63c41139f8982add435536d39aff6f3d4ca98 (patch)
tree6ed9e3afe2081c8201d6c6c9a0d9b8c9439d3a6e /git-compat-util.h
parent6bcbdfb277bdc81b5ad6996b3fb005382a35c2ee (diff)
downloadgit-f0e63c41139f8982add435536d39aff6f3d4ca98.zip
git-f0e63c41139f8982add435536d39aff6f3d4ca98.tar.gz
git-f0e63c41139f8982add435536d39aff6f3d4ca98.tar.bz2
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.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/git-compat-util.h b/git-compat-util.h
index 4cc2c82..4a23b90 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