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