tbz2_file_source

extractを調整中です。
tar.gzやtar.bz2はよく使うので、ラッパークラスを用意しました。
<hamigaki/iostreams/device/tbz2_file.hpp>
<hamigaki/iostreams/device/tgz_file.hpp>
tar.bz2の短縮形は、日本のアーカイバを見る限りtbzが多いようですが、Wikipediabzip2のページJakarta CommonsのVFSではtbz2になっているので、クラス名にはこちらを採用しました。
extractでは.tbz/.tbz2/.tb2を認識するようにしています。
extract.cppの差分
昨日のバージョンでは、

// Sourceの型ごとに用意
template<class Source>
struct extractor_traits<
    io_ex::basic_lzh_file_source<Source>
>
{
    static entry do_current_entry(
        const io_ex::basic_lzh_file_source<Source>& src);
};

// 継承関係があってもこれが必要
template<>
struct extractor_traits<io_ex::lzh_file_source>
{
    static entry do_current_entry(const io_ex::lzh_file_source& src)
    {
        return extractor_traits<
            io_ex::basic_lzh_file_source<io_ex::file_source>
        >::do_current_entry(src);
    }
};

template<class Source>
class extractor : public extractor_base
{
    // ...

    entry do_current_entry() const // virtual
    {
        return extractor_traits<Source>::do_current_entry(src_);
    }
};

となっていたところを、各アーカイバSourceにheader_typeのtypedefを追加して、

// ヘッダの型ごとに用意
template<> 
struct header_traits<io_ex::lha::header>
{
    static entry to_entry(const io_ex::lha::header& head);
};

template<class Source>
class extractor : public extractor_base
{
    // ...

    entry do_current_entry() const // virtual
    {
        typedef typename Source::header_type header_type;
        return header_traits<header_type>::to_entry(src_.header());
    }
};

と変更しました。
そのうち、この辺の枠組みはライブラリ側に移動します。