35 lines1.1 KB
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 *yielded_coroutine;
15 Coroutine *caller;
16 void *(*start)(void *);
17 void *param;
18 Generator_State state;
19} Generator;
20
21extern void Generator_ctor(Generator *gen, size_t min_stack, size_t min_stack_headroom, void *(*start)(void *), void *param);
22extern Generator *Generator_New(size_t min_stack, size_t min_stack_headroom, void *(*)(void *), void *);
23extern void Generator_dtor(Generator *gen);
24extern void Generator_Delete(Generator *);
25
26// Returns true if generator yielded a value, false if generator is complete
27// *value is set to generator's value (yield / return value from exit)
28extern bool Generator_Next(Generator *, void **value);
29
30// Yield a value from the generator
31// Returns true if generator should continue, false for generator to exit PDQ
32extern bool Generator_Yield(void *);
33
34#endif
35