OFFSETOF_VAR macro to simplify hashmap iterators

While we cannot rely on a `__typeof__' operator being portable
to use with `offsetof'; we can calculate the pointer offset
using an existing pointer and the address of a member using
pointer arithmetic for compilers without `__typeof__'.

This allows us to simplify usage of hashmap iterator macros
by not having to specify a type when a pointer of that type
is already given.

In the future, list iterator macros (e.g. list_for_each_entry)
may also be implemented using OFFSETOF_VAR to save hackers the
trouble of using container_of/list_entry macros and without
relying on non-portable `__typeof__'.

v3: use `__typeof__' to avoid clang warnings

Signed-off-by: Eric Wong <e@80x24.org>
Reviewed-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Eric Wong
2019-10-06 23:30:41 +00:00
committed by Junio C Hamano
parent c8e424c9c9
commit 23dee69f53
15 changed files with 56 additions and 45 deletions

View File

@ -42,11 +42,11 @@ static void dump_run(void)
}
hashmap_for_each_entry(&the_index.dir_hash, &iter_dir, dir,
struct dir_entry, ent /* member name */)
ent /* member name */)
printf("dir %08x %7d %s\n", dir->ent.hash, dir->nr, dir->name);
hashmap_for_each_entry(&the_index.name_hash, &iter_cache, ce,
struct cache_entry, ent /* member name */)
ent /* member name */)
printf("name %08x %s\n", ce->ent.hash, ce->name);
discard_cache();