coroutineの引数対応
pthread_contextに引き続き、fiber_contextも作成しました。
<hamigaki/coroutine/detail/fiber_context.hpp>
これに合わせて、coroutineも変更です。
<hamigaki/coroutine/detail/coroutine0.hpp>
ここまでは、クラス構成を変更しただけです。
次に1引数の場合、
<hamigaki/coroutine/detail/coroutine1.hpp>
operator()の引数とyield()の戻り値が加わります。
2引数になると、
<hamigaki/coroutine/detail/coroutine2.hpp>
template<class R, class T1, class T2, class ContextImpl=detail::default_context_impl> class coroutine2 { public: class self { public: boost::tuple<T1,T2> yield(R r); }; R operator()(T1 t1, T2 t2); };
operator()の引数が増えて、yield()の戻り値がtupleになります。
operator()とyield()で引数/戻り値の型が逆になるわけですが、2つの値をそのまま返すことはできないのでtupleを返しています。
コルーチンの戻り値がtupleの場合はこれと逆の状況で、yield()に複数の値を並べて渡したくなります。
class self { public: T yield(R1 r2, R2 r2); // こう書きたい };
ただ、これを実現するのはちょっと厳しいようで、Boost.Coroutineでは特殊な型(coro::tuple_traits)を使って判別するようになっています。
http://h1.ripway.com/gpderetta/html/coroutine/coroutines.html#coroutines.multiple_arguments_and_return_values
まぁ、そこまでこだわる気はないのでHamigaki.Coroutineではそのままにしてあります。
引数0,1,2ときて、3以降は2の場合と同じなので場合分けはこれでおしまいです。
あとはBoost.Preprocessorの出番ですかね。
#Borland 5.82のサポートはそろそろ限界です。
#テストコードだけ通っても、別のコードと混ぜると動かなかったりで、サポートする意味がほとんどないです、、、。