modified_lzss_compressor

昨日探していたLZSSの派生バージョンの名前ですが、「modified LZSS」(変形LZSS)と呼んでいる人がいたので、これを採用しました。(modifiedなんたらの例に漏れず、多分いろんなmodified LZSSがあるとは思います。)
<hamigaki/iostreams/filter/modified_lzss.hpp>
変形LZSSだとSourceのEOFとビットストリームのEOFが一致する(ビットの余りがない)ので、modified_lzss_decompressorはlzss_decompressorと違い、EOFを認識できます。


また、バッファリングの実装用にバッファ付きフィルタも作りました。
<hamigaki/iostreams/filter/buffered.hpp>
ただし、LZSS用にインチキな裏口を用意してあります。

class output_buffered_filter
{
public:
    // バッファの空き容量を取得する
    std::size_t buffer_space() const;

    // バッファに空きがある前提で書き込む
    template<class Sink>
    void write_buffer(Sink& sink, const char* s, std::streamsize n);
};

これは、バッファに空きが25バイト以上なかったらflush()するUNLHA32.DLLの仕様に合わせるために必要です。
もちろん書き込み側でバッファのサイズをカウントしても出来るんですが、同じカウンタを二つも持つのが嫌でこうなりました。


現在想定している流れは、sliding_window_compressの出力をmodified_lzss_outputに渡して一旦バッファに貯めます。その後、flush()されたデータをハフマン符号の決定とハフマン符号化の2回で利用することになります。
明日こそはハフマンに渡すところまで進めたいですね。