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のサポートはそろそろ限界です。
#テストコードだけ通っても、別のコードと混ぜると動かなかったりで、サポートする意味がほとんどないです、、、。