Skip to content

Commit 5bfb3b5

Browse files
committed
khash: implement map-specific foreach macros
The current foreach map macros simply redirect to the type-indifferent `kh_foreach` macro. As this type-indifferent macro directly accesses the structures, the current implementation makes it impossible to make the stuctures private to the implementation only. And making them private is required to move out the khash include into the implementations to decrease the namespace leak.
1 parent 382b668 commit 5bfb3b5

File tree

4 files changed

+46
-5
lines changed

4 files changed

+46
-5
lines changed

src/offmap.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@ int git_offmap_exists(git_offmap *map, const git_off_t key)
4444
return kh_get(off, map, key) != kh_end(map);
4545
}
4646

47+
int git_offmap_has_data(git_offmap *map, size_t idx)
48+
{
49+
return kh_exist(map, idx);
50+
}
51+
52+
git_off_t git_offmap_key_at(git_offmap *map, size_t idx)
53+
{
54+
return kh_key(map, idx);
55+
}
56+
4757
void *git_offmap_value_at(git_offmap *map, size_t idx)
4858
{
4959
return kh_val(map, idx);

src/offmap.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ size_t git_offmap_lookup_index(git_offmap *map, const git_off_t key);
3131
int git_offmap_valid_index(git_offmap *map, size_t idx);
3232

3333
int git_offmap_exists(git_offmap *map, const git_off_t key);
34+
int git_offmap_has_data(git_offmap *map, size_t idx);
3435

36+
git_off_t git_offmap_key_at(git_offmap *map, size_t idx);
3537
void *git_offmap_value_at(git_offmap *map, size_t idx);
3638
void git_offmap_set_value_at(git_offmap *map, size_t idx, void *value);
3739
void git_offmap_delete_at(git_offmap *map, size_t idx);
@@ -43,7 +45,19 @@ void git_offmap_delete(git_offmap *map, const git_off_t key);
4345
size_t git_offmap_begin(git_offmap *map);
4446
size_t git_offmap_end(git_offmap *map);
4547

46-
#define git_offmap_foreach kh_foreach
47-
#define git_offmap_foreach_value kh_foreach_value
48+
#define git_offmap_foreach(h, kvar, vvar, code) { size_t __i; \
49+
for (__i = git_offmap_begin(h); __i != git_offmap_end(h); ++__i) { \
50+
if (!git_offmap_has_data(h,__i)) continue; \
51+
(kvar) = git_offmap_key_at(h,__i); \
52+
(vvar) = git_offmap_value_at(h,__i); \
53+
code; \
54+
} }
55+
56+
#define git_offmap_foreach_value(h, vvar, code) { size_t __i; \
57+
for (__i = git_offmap_begin(h); __i != git_offmap_end(h); ++__i) { \
58+
if (!git_offmap_has_data(h,__i)) continue; \
59+
(vvar) = git_offmap_value_at(h,__i); \
60+
code; \
61+
} }
4862

4963
#endif

src/oidmap.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ void git_oidmap_delete(git_oidmap *map, const git_oid *key);
4646
size_t git_oidmap_begin(git_oidmap *map);
4747
size_t git_oidmap_end(git_oidmap *map);
4848

49-
#define git_oidmap_foreach_value kh_foreach_value
49+
#define git_oidmap_foreach_value(h, vvar, code) { size_t __i; \
50+
for (__i = git_oidmap_begin(h); __i != git_oidmap_end(h); ++__i) { \
51+
if (!git_oidmap_has_data(h,__i)) continue; \
52+
(vvar) = git_oidmap_value_at(h,__i); \
53+
code; \
54+
} }
5055

5156
#endif

src/strmap.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,20 @@ int git_strmap_put(git_strmap *map, const char *key, int *err);
4242
void git_strmap_insert(git_strmap *map, const char *key, void *value, int *rval);
4343
void git_strmap_delete(git_strmap *map, const char *key);
4444

45-
#define git_strmap_foreach kh_foreach
46-
#define git_strmap_foreach_value kh_foreach_value
45+
#define git_strmap_foreach(h, kvar, vvar, code) { size_t __i; \
46+
for (__i = git_strmap_begin(h); __i != git_strmap_end(h); ++__i) { \
47+
if (!git_strmap_has_data(h,__i)) continue; \
48+
(kvar) = git_strmap_key(h,__i); \
49+
(vvar) = git_strmap_value_at(h,__i); \
50+
code; \
51+
} }
52+
53+
#define git_strmap_foreach_value(h, vvar, code) { size_t __i; \
54+
for (__i = git_strmap_begin(h); __i != git_strmap_end(h); ++__i) { \
55+
if (!git_strmap_has_data(h,__i)) continue; \
56+
(vvar) = git_strmap_value_at(h,__i); \
57+
code; \
58+
} }
4759

4860
size_t git_strmap_begin(git_strmap *map);
4961
size_t git_strmap_end(git_strmap *map);

0 commit comments

Comments
 (0)