seek

id:y-hamigaki:20060206 や id:y-hamigaki:20060209 辺りで書いていたbackground_copyのseek操作を考えています。
インタフェースはBoost.Iostreamsのseek()をモデルにするつもりですが、これがまた混沌としています。

namespace boost { namespace iostreams {
              
template<typename T>
std::streampos 
seek( T&, stream_offset  off, std::ios_base::seekdir way,
      std::ios_base::openmode which =
          std::ios_base::in | std::ios_base::out );

} } // End namespace boost::io

ここで問題になるのは、whichです。
バイスがdual_seekableかbidirectional_seekableの場合、whichでシークするヘッドを選択できるようになっています。しかし、それ以外の場合はwhichは無視されます。(stream、streambufは除く)
なので、次のコード

io::file_source src(filename);
io::seek(src, off, way, std::ios_base::out);

は、入力シーケンスのヘッドがシークされます。
コンパイルエラーにできないのは仕方ないですが、実際にシークされてしまうのは変な感じです。