История изменений
Исправление fsb4000, (текущая версия) :
Поскольку тебе это вообще не нужно и ты лишь хочешь поржать над убогой сишкой, то покажу лишь использование.
begin_context(simple_generator)
int val;
end_context(simple_generator)
static int next(simple_generator* gen)
{
begin(gen);
while(gen->val > 0)
{
yield(gen, gen->val);
--gen->val;
}
end(gen);
return 0;
}
int main(void)
{
int i;
simple_generator gen_iter = {5};
while((void)(i = next(&gen_iter)),
errno != STOP_ITERATION)
{
printf("%d\n", i);
}
errno = 0;
}
begin_context создаёт структуру, которая используется как context для генератора, никаких проблем с многопоточностью нет, так как текущее состояние хранится в структуре.
yield может быть сколько угодно между begin и end.
макрос end также устанавливает errno в STOP_ITERATION.
Работает на С89: https://imgur.com/a/tf4tnsG
Вот и всё. Обычная простая вещь из 5 макросов, которая может быть удобной.
Исходная версия fsb4000, :
Поскольку тебе это вообще не нужно и ты лишь хочешь поржать над убогой сишкой, то покажу лишь использование.
begin_context(simple_generator)
int val;
end_context(simple_generator)
static int next(simple_generator* gen)
{
begin(gen);
while(gen->val > 0)
{
yield(gen, gen->val);
--gen->val;
}
end(gen);
return 0;
}
int main(void)
{
int i;
simple_generator gen_iter = {5};
while((void)(i = next(&gen_iter)),
errno != STOP_ITERATION)
{
printf("%d\n", i);
}
errno = 0;
}
begin_context создаёт структуру, которая используется как context для генератора, никаких проблем с многопоточностью нет, так как текущее состояние хранится в структуре.
yield может быть сколько угодно между begin и end.
макрос end также устанавливает errno в STOP_ITERATION.
Работает на С89: https://imgur.com/a/tf4tnsG
Вот и всё. Обычная простая вещь, которая может быть удобной.