1 contributor
34 lines960 bytes
1#ifndef GENERATOR_H
2#define GENERATOR_H
3#include "coroutine.h"
4#include <stdbool.h>
5
6typedef enum Generator_State {
7 Generator_Running,
8 Generator_Deleting,
9 Generator_Complete
10} Generator_State;
11
12typedef struct Generator {
13 Coroutine *coroutine;
14 Coroutine *caller;
15 void *(*start)(void *);
16 void *param;
17 Generator_State state;
18} Generator;
19
20extern void Generator_ctor(Generator *gen, void *(*start)(void *), void *param);
21extern Generator *Generator_New(void *(*)(void *), void *);
22extern void Generator_dtor(Generator *gen);
23extern void Generator_Delete(Generator *);
24
25// Returns true if generator yielded a value, false if generator is complete
26// *value is set to generator's value (yield / return value from exit)
27extern bool Generator_Next(Generator *, void **value);
28
29// Yield a value from the generator
30// Returns true if generator should continue, false for generator to exit PDQ
31extern bool Generator_Yield(void *);
32
33#endif
34