sliding_window_decompressor
一応、LZSSの展開までできましたが、インタフェースをどうするかで迷っています。
今のところ、インタフェースはこうなっています。
template<class Input> class sliding_window_decompressor { public: typedef char char_type; struct category : public boost::iostreams::input , public boost::iostreams::filter_tag {}; sliding_window_decompressor(const Input& input, std::size_t window_bits); template<class Source> std::char_traits<char>::int_type get(Source& src); };
Inputは次のようなクラス(コンセプト/ポリシー)です。
class Input { public: // 一致長の型 typedef implementation-defined length_type; // 一致位置の型 typedef implementation-defined offset_type; // 一致長の最小値 static const length_type min_match_length = implementation-defined; // 次の(不一致文字)か(一致位置,一致長)を返す // EOFの場合はnoneを返す template<class Source> boost::variant< boost::none_t, char, std::pair<offset_type,length_type> > get(Source& src); };
メンバテンプレートget()は定義通りのインタフェースであるものの、あんまりな気はしています。
このコンセプトに合わせて、
class lz77_input; class lzss_input; class lzhuf_input;
を作ると、
typedef sliding_window_decompressor<lz77_input> lz77_decompressor; typedef sliding_window_decompressor<lzss_input> lzss_decompressor; typedef sliding_window_decompressor<lzhuf_input> lzhuf_decompressor;
で実際の復号フィルタが出来上がる寸法です。
先ほどのget()のインタフェースも問題ですが、目下悩みの種はsliding_window_decompressorという長いクラス名だったりします。
このクラステンプレートのドキュメントをBoostBookで作成すると、sliding_window_decompressor.htmlというファイルができるのですが、これがBoostのガイドライン(ファイル名31文字まで)に引っかかります。(別にこのガイドラインに従う必要はないんですけどね。)
以下候補、
- slide_window_decompressor(英語としては変な気がする)
- sliding_win_decompressor(Win98とか略すので意味は分かりそう)
- sliding_window_decoder(compressという単語は付けたいけど、、、)
- sliding_window::decompressor(これも何か変)
本当はsliding〜の前にbasic_も付けたいんですが、、、。