-void hashtable_traverse(struct hashtable *ht, bool (*cb)(void *p, void *cbarg),
- void *cbarg);
+#define hashtable_traverse(ht, type, cb, cbarg) \
+ _hashtable_traverse(ht, cast_if_type(bool (*)(void *, void *), \
+ cast_if_any(bool (*)(void *, \
+ void *), \
+ (cb), &*(cb), \
+ bool (*)(const type *, \
+ const typeof(*cbarg) *), \
+ bool (*)(type *, \
+ const typeof(*cbarg) *), \
+ bool (*)(const type *, \
+ typeof(*cbarg) *)), \
+ &*(cb), \
+ bool (*)(type *, typeof(*cbarg) *)), \
+ (cbarg))
+
+void _hashtable_traverse(struct hashtable *ht,
+ bool (*cb)(void *p, void *cbarg), void *cbarg);