path: root/name-hash.c
diff options
authorEric Wong <>2019-10-06 23:30:35 (GMT)
committerJunio C Hamano <>2019-10-07 01:20:10 (GMT)
commitf0e63c41139f8982add435536d39aff6f3d4ca98 (patch)
tree6ed9e3afe2081c8201d6c6c9a0d9b8c9439d3a6e /name-hash.c
parent6bcbdfb277bdc81b5ad6996b3fb005382a35c2ee (diff)
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 <> Reviewed-by: Derrick Stolee <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'name-hash.c')
1 files changed, 5 insertions, 6 deletions
diff --git a/name-hash.c b/name-hash.c
index dbacb34..73b83ad 100644
--- a/name-hash.c
+++ b/name-hash.c
@@ -702,17 +702,16 @@ void adjust_dirname_case(struct index_state *istate, char *name)
struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int icase)
struct cache_entry *ce;
- struct hashmap_entry *ent;
+ unsigned int hash = memihash(name, namelen);
- ent = hashmap_get_from_hash(&istate->name_hash,
- memihash(name, namelen), NULL);
- while (ent) {
- ce = container_of(ent, struct cache_entry, ent);
+ ce = hashmap_get_entry_from_hash(&istate->name_hash, hash, NULL,
+ struct cache_entry, ent);
+ hashmap_for_each_entry_from(&istate->name_hash, ce,
+ struct cache_entry, ent) {
if (same_name(ce, name, namelen, icase))
return ce;
- ent = hashmap_get_next(&istate->name_hash, ent);
return NULL;