@@ -76,18 +76,21 @@ static inline void oidmap_iter_init(struct oidmap *map, struct oidmap_iter *iter
hashmap_iter_init(&map->map, &iter->h_iter);
}
-static inline void *oidmap_iter_next(struct oidmap_iter *iter)
-{
- /* TODO: this API could be reworked to do compile-time type checks */
- return (void *)hashmap_iter_next(&iter->h_iter);
-}
+/*
+ * Returns the next entry, or NULL if there are no more entries.
+ *
+ * The entry is of @type (e.g. "struct foo") and has a member of type struct
+ * oidmap_entry.
+ */
+#define oidmap_iter_next(iter, type) \
+ (type *) hashmap_iter_next(&(iter)->h_iter)
-static inline void *oidmap_iter_first(struct oidmap *map,
- struct oidmap_iter *iter)
-{
- oidmap_iter_init(map, iter);
- /* TODO: this API could be reworked to do compile-time type checks */
- return (void *)oidmap_iter_next(iter);
-}
+/*
+ * Returns the first entry in @map using @iter, where the entry is of @type
+ * (e.g. "struct foo") and has a member of type struct oidmap_entry.
+ */
+#define oidmap_iter_first(map, iter, type) \
+ ({oidmap_iter_init(map, iter); \
+ oidmap_iter_next(iter, type); })
#endif
@@ -96,7 +96,7 @@ int cmd__oidmap(int argc, const char **argv)
struct oidmap_iter iter;
oidmap_iter_init(&map, &iter);
- while ((entry = oidmap_iter_next(&iter)))
+ while ((entry = oidmap_iter_next(&iter, struct test_entry)))
printf("%s %s\n", oid_to_hex(&entry->entry.oid), entry->name);
} else {
87571c3 modified hashmap_iter_next to return a hashmap_entry pointer instead of void pointer. However, oidmap_iter_next is unaware of the struct type containing oidmap_entry and explicilty returns a void pointer. Rework oidmap_iter_* to include struct type and return appropriate pointer. This allows for compile-time type checks. Signed-off-by: Abhishek Kumar <abhishekkumar8222@gmail.com> --- oidmap.h | 27 +++++++++++++++------------ t/helper/test-oidmap.c | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-)