続々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でないとコピーになりません。この状況は無視して構わないでしょう。