続々seek
今度こそ本題のbackground_copyの場合を考えます。
template<typename ExceptionStorage = hamigaki::thread::exception_storage> class basic_background_copy { public: template<typename Source, typename Sink> void copy(Source src, Sink sink); // 以下略 }; typedef basic_background_copy<> background_copy;
background_copyはSink/Sourceの組を持ちますが、クラスのテンプレート引数ではなく、メンバテンプレートで指定するようになっています。これはObject GeneratorsやExpression Templateで生成したデバイスの型を書かなくてよいようにするためです。
Sink/Sourceはcopyを呼ぶ度に違う型になり得るので、seekできるヘッドも動的に変化します。通常SinkとSourceは別物ですから、それぞれseek可能/不可能な場合があります。つまり、(2つの組をデバイスと考えると)BidirectionalかつInput-seekableだけれどOutput-seekableでないような場合があるわけです。
さて、そんなbackground_copyに対してin|outなseekをした場合、エラーとすべきでしょうか?outのseekは無視するべきでしょうか?SinkもSourceもシーク可能でない場合はエラーになるのが自然なことを考えると、自分はこれもエラーとしたほうがよいと思います。
そうすると、デフォルトでin|outなシークをするBoost.Iostreamのseekインタフェースではマズいのです。ここもやはりシークするデバイスを明示的に指定させる方法をとることにします。
なお、SinkとSourceが同じデバイスを指している場合は、Bidirectionalでないとコピーになりません。この状況は無視して構わないでしょう。