26 #define ITERATOR(p) ((struct iterator *) (p))
73 #define generic_iterate(TYPE_it, TYPE_a, NAME_a, FUNC_size, FUNC_init, ...) \
75 char MY_mem_##NAME_a[FUNC_size()]; \
76 struct iterator *MY_it_##NAME_a; \
79 FUNC_init((TYPE_it *) (void *) MY_mem_##NAME_a, ##__VA_ARGS__); \
80 for (; iterator_valid(MY_it_##NAME_a); iterator_next(MY_it_##NAME_a)) { \
81 NAME_a = (TYPE_a) iterator_get(MY_it_##NAME_a);
83 #define generic_iterate_end \
static bool iterator_valid(const struct iterator *it)
static void * iterator_get(const struct iterator *it)
static void iterator_next(struct iterator *it)
struct iterator * invalid_iter_init(struct iterator *it)
Initializes the iterator vtable so that generic_iterate assumes that the iterator is invalid.
bool(* valid)(const struct iterator *it)
void *(* get)(const struct iterator *it)
void(* next)(struct iterator *it)