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に使うものなので、これも分離しようと思います。