lzh_file.hppの整理中
今日は手直しとバグ修正がメインです。
LZHの圧縮法識別子(5バイト固定文字列)の比較、コピーが煩雑になりがちだったので、大げさな気もしますがラッパーを作りました。
#include <boost/operators.hpp> #include <cstring> struct compress_method : boost::equality_comparable<compress_method , boost::equality_comparable2<compress_method, const char* > > { char id[5]; compress_method() { std::memset(id, 0, 5); } explicit compress_method(const char* s) { std::memcpy(id, s, 5); } compress_method& operator=(const char* s) { std::memcpy(id, s, 5); return *this; } bool operator==(const compress_method& rhs) const { return std::memcmp(id, rhs.id, 5) == 0; } bool operator==(const char* rhs) const { return std::memcmp(id, rhs, 5) == 0; } bool empty() const { return id[0] == '\0'; } };
Boost.Operatorsのおかげで演算子の定義は少しですみます。
サイズを(コンパイル時)可変にすればRIFFのチャンクID等にも利用できそうです。
lzh_file.hppからヘッダの定義を別ファイルに移動したこともあって、多少見通しが良くなりましたが、
#include <hamigaki/checksum/sum8.hpp> #include <hamigaki/iostreams/detail/lha/lzh_header.hpp> #include <hamigaki/iostreams/device/file.hpp> #include <hamigaki/iostreams/filter/lzhuf.hpp> #include <hamigaki/iostreams/binary_io.hpp> #include <hamigaki/iostreams/relative_restrict.hpp> #include <hamigaki/iostreams/tiny_restrict.hpp> #include <boost/iostreams/detail/adapter/non_blocking_adapter.hpp> #include <boost/iostreams/detail/ios.hpp> #include <boost/iostreams/device/back_inserter.hpp> #include <boost/iostreams/close.hpp> #include <boost/iostreams/compose.hpp> #include <boost/iostreams/positioning.hpp> #include <boost/iostreams/flush.hpp> #include <boost/iostreams/read.hpp> #include <boost/iostreams/seek.hpp> #include <boost/iostreams/write.hpp> #include <boost/assert.hpp> #include <boost/crc.hpp> #include <boost/none.hpp> #include <boost/scoped_array.hpp> #include <algorithm> #include <iterator> #include <numeric> #include <sstream>
まだこんなにヘッダをインクルードしています。
明らかに複数の仕事を一つのクラスでやっている証拠です。
半分ぐらいはヘッダのI/Oに使うものなので、これも分離しようと思います。