summaryrefslogtreecommitdiff
path: root/src/offmap.h
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2018-11-23 18:48:40 +0100
committerPatrick Steinhardt <ps@pks.im>2018-11-28 15:22:27 +0100
commit5bfb3b58e37fc35a0838ca2fa8b38941e056cfcc (patch)
tree34e6117aa1293641fe67864f5f5a7b6d3dda898f /src/offmap.h
parent382b668bf2019eb8fb7c0afc4d6e3132dca9510e (diff)
downloadlibgit2-5bfb3b58e37fc35a0838ca2fa8b38941e056cfcc.tar.gz
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.
Diffstat (limited to 'src/offmap.h')
-rw-r--r--src/offmap.h18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/offmap.h b/src/offmap.h
index bf2b13de4..82ebfb780 100644
--- a/src/offmap.h
+++ b/src/offmap.h
@@ -31,7 +31,9 @@ size_t git_offmap_lookup_index(git_offmap *map, const git_off_t key);
int git_offmap_valid_index(git_offmap *map, size_t idx);
int git_offmap_exists(git_offmap *map, const git_off_t key);
+int git_offmap_has_data(git_offmap *map, size_t idx);
+git_off_t git_offmap_key_at(git_offmap *map, size_t idx);
void *git_offmap_value_at(git_offmap *map, size_t idx);
void git_offmap_set_value_at(git_offmap *map, size_t idx, void *value);
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);
size_t git_offmap_begin(git_offmap *map);
size_t git_offmap_end(git_offmap *map);
-#define git_offmap_foreach kh_foreach
-#define git_offmap_foreach_value kh_foreach_value
+#define git_offmap_foreach(h, kvar, vvar, code) { size_t __i; \
+ for (__i = git_offmap_begin(h); __i != git_offmap_end(h); ++__i) { \
+ if (!git_offmap_has_data(h,__i)) continue; \
+ (kvar) = git_offmap_key_at(h,__i); \
+ (vvar) = git_offmap_value_at(h,__i); \
+ code; \
+ } }
+
+#define git_offmap_foreach_value(h, vvar, code) { size_t __i; \
+ for (__i = git_offmap_begin(h); __i != git_offmap_end(h); ++__i) { \
+ if (!git_offmap_has_data(h,__i)) continue; \
+ (vvar) = git_offmap_value_at(h,__i); \
+ code; \
+ } }
#endif