diff options
author | Junio C Hamano <gitster@pobox.com> | 2019-10-15 13:48:01 +0900 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2019-10-15 13:48:02 +0900 |
commit | 5efabc7ed9e57bb73159d1ad7739c508167ef24a (patch) | |
tree | 9e7de3dfe38dcb92614d11613976d32151925ea2 /blame.c | |
parent | d0ce4d9024882b5363141288979ea3689eab9998 (diff) | |
parent | e2b5038d8793a1d1f92b62dab82acc0d6b7dbcb7 (diff) |
Merge branch 'ew/hashmap'
Code clean-up of the hashmap API, both users and implementation. * ew/hashmap: hashmap_entry: remove first member requirement from docs hashmap: remove type arg from hashmap_{get,put,remove}_entry OFFSETOF_VAR macro to simplify hashmap iterators hashmap: introduce hashmap_free_entries hashmap: hashmap_{put,remove} return hashmap_entry * hashmap: use *_entry APIs for iteration hashmap_cmp_fn takes hashmap_entry params hashmap_get{,_from_hash} return "struct hashmap_entry *" hashmap: use *_entry APIs to wrap container_of hashmap_get_next returns "struct hashmap_entry *" introduce container_of macro hashmap_put takes "struct hashmap_entry *" hashmap_remove takes "const struct hashmap_entry *" hashmap_get takes "const struct hashmap_entry *" hashmap_add takes "struct hashmap_entry *" hashmap_get_next takes "const struct hashmap_entry *" hashmap_entry_init takes "struct hashmap_entry *" packfile: use hashmap_entry in delta_base_cache_entry coccicheck: detect hashmap_entry.hash assignment diff: use hashmap_entry_init on moved_entry.ent
Diffstat (limited to 'blame.c')
-rw-r--r-- | blame.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/blame.c b/blame.c index 6596d8de88..29770e5c81 100644 --- a/blame.c +++ b/blame.c @@ -417,14 +417,15 @@ static void get_fingerprint(struct fingerprint *result, /* Ignore whitespace pairs */ if (hash == 0) continue; - hashmap_entry_init(entry, hash); + hashmap_entry_init(&entry->entry, hash); - found_entry = hashmap_get(&result->map, entry, NULL); + found_entry = hashmap_get_entry(&result->map, entry, + /* member name */ entry, NULL); if (found_entry) { found_entry->count += 1; } else { entry->count = 1; - hashmap_add(&result->map, entry); + hashmap_add(&result->map, &entry->entry); ++entry; } } @@ -432,7 +433,7 @@ static void get_fingerprint(struct fingerprint *result, static void free_fingerprint(struct fingerprint *f) { - hashmap_free(&f->map, 0); + hashmap_free(&f->map); free(f->entries); } @@ -449,10 +450,10 @@ static int fingerprint_similarity(struct fingerprint *a, struct fingerprint *b) struct hashmap_iter iter; const struct fingerprint_entry *entry_a, *entry_b; - hashmap_iter_init(&b->map, &iter); - - while ((entry_b = hashmap_iter_next(&iter))) { - if ((entry_a = hashmap_get(&a->map, entry_b, NULL))) { + hashmap_for_each_entry(&b->map, &iter, entry_b, + entry /* member name */) { + entry_a = hashmap_get_entry(&a->map, entry_b, entry, NULL); + if (entry_a) { intersection += entry_a->count < entry_b->count ? entry_a->count : entry_b->count; } @@ -470,10 +471,12 @@ static void fingerprint_subtract(struct fingerprint *a, struct fingerprint *b) hashmap_iter_init(&b->map, &iter); - while ((entry_b = hashmap_iter_next(&iter))) { - if ((entry_a = hashmap_get(&a->map, entry_b, NULL))) { + hashmap_for_each_entry(&b->map, &iter, entry_b, + entry /* member name */) { + entry_a = hashmap_get_entry(&a->map, entry_b, entry, NULL); + if (entry_a) { if (entry_a->count <= entry_b->count) - hashmap_remove(&a->map, entry_b, NULL); + hashmap_remove(&a->map, &entry_b->entry, NULL); else entry_a->count -= entry_b->count; } |