Текущая версия Boost 1.55 предлагает два вида однонаправленных сопрограмм. Одним из них является pull-type, который является сопрограммой, которая не принимает параметров и возвращает значение в основной контекст; другой - push-type, который является сопрограммой, которая принимает параметр из основного контекста, но не возвращает никакого значения.
Как я могу объединить эти два, чтобы создать двунаправленную сопрограмму, которая принимает параметр и возвращает значение? На первый взгляд кажется, что это должно быть возможно, но я не могу понять, как это сделать со строительными блоками, которые у меня есть в boost::coroutine
. Раньше существовала двунаправленная сопрограмма в старших Boosts, но теперь она устарела и недокументирована, поэтому я не должен полагаться на нее.
т.е. мне хотелось бы что-то подобное:
void accumulate( pull_func &in, push_func &out )
{
int x = 0;
while ( in )
{
x += in.get() ; // transfers control from main context
out(x); // yields control to main context
}
}
void caller( int n )
{
bidirectional_coro( accumulate );
for ( int i = 0 ; i < n ; ++i )
{
int y = accumulate(i);
printf( "%d ", y ); // "0 1 3 6 10" etc
}
}