restrictとseek()

とりあえす、LZHのLevel 0/1ヘッダーをサポートしました。
<hamigaki/iostreams/device/lzh_file.hpp>
仕様の確認などにも手間取って、LZHUFの組み込みまではできていません。


Level1ヘッダの実装中にboost::restriction::seek()の戻り値が変なことに気が付きました。
最初はバグかと思ったのですが、どうもboost::restrictionは元のデバイスのストリームオフセットが0であることを要求するようです。
そもそも想定されている使用法は、

io::copy(
    io::restrict(some_device("some"), 10, 20),
    other_device("other")
);

のようなものですし、close()すると元のデバイスもclose()することから考えても、そういうものだと諦めるしかありません。
自分の必要な機能としては、

  • Sourceの一部を仮想的にSourceとして見せたい
  • 元のSourceをclose()して欲しくない
  • 一つのSourceを何度も使いたい
  • 元のSourceをコピーしない (今はrestrictに渡した後で、コピー元Sourceを使うインチキをやっている)

なので、別の簡易クラスを考えることにします。
restrictの別バージョンはこれで3つ目です。