lazy_restrict

昨日の日記に書いた通り、boost::iostreams::restrict はオブジェクトの生成時にseekを行います。そのため、一つの式の中で同じデバイスに対してrestrictすることは未定義の動作を引き起こします。要は実際に読み書きするときにseekしてくれればよいのです。
で、作ってみました。

今日の成果物

template<class Device>
class lazy_restriction
{
public:
    lazy_restriction(const Device& dev,
        boost::iostreams::stream_offset off,
        boost::iostreams::stream_offset len=-1);
};

offはrestrictと違い、ストリームの先頭からのオフセットになっています。これは読み書きが発生する時の現在位置を起点にしても意味がないからです。
ほかにも、ユーティリティクラスがいくつか追加されていますが、解説はまた今度。

これで無事、昨日のループ再生が実現できました。
サンプルに某ゲーム用のBGMプレイヤーが追加されています。お持ちの方はお試しあれ。