iso_directory_parser

おおよそ機能の方針で実装できました。
iso_directory_parser.hpp
iso9660_directory_parser.hpp
joliet_directory_parser.hpp
rock_ridge_directory_parser.hpp


iso_directory_parserのインタフェースは少し変わりました。

class iso_directory_parser : private boost::noncopyable
{
public:
    virtual ~iso_directory_parser(){}

    void fix_records(std::vector<iso_directory_record>& records)
    {
        this->do_fix_records(records);
    }

    iso::header make_header(const iso_directory_record& rec)
    {
        return this->do_make_header(rec);
    }

private:
    // ディレクトリレコードの配列を修正する
    virtual void do_fix_records(std::vector<iso_directory_record>& records) = 0;

    // iso_directory_recordからiso::headerに変換する (Rock Ridgeをパースする)
    virtual iso::header do_make_header(const iso_directory_record& rec) = 0;
};

iso_directory_recordにはRock Ridge用のメンバがなく、iso::headerにはエクステント位置のメンバがないため、do_fix_records()でディレクトリトラバースに必要な分だけパースして、残りはdo_make_header()でパースすることにしました。


iso_directory_parserとその派生クラスの実装は素直に書けたのですが、それを使う側のコードがグチャグチャになってしまいました。
iso_file_reader.hpp
iso_file_source_impl.hppの差分
もう少し調整が必要です。