STL algorithm の進捗状況を表示する

とはいっても std::transform だけなんだけど。もうちょっと考えてうまく構造化してやればできるはず。思いつきで書いてます。

例えばどっかの ifstream ( fin とする ) からどっかの ofstream ( fout とする ) へ中身を copy する、というときに単純に以下のように書くと思うんだけどこうするとなっがい file だとしばらく処理が終わらずに実行者を待たせてしまうのでどうにかしたい、というアレ。 raw_type は http://d.hatena.ne.jp/janus_wel/20100618/1276852728 参照。

#include <algorithm>
#include <iostream>
#include <iterator>
#include "algorithm.hpp"

// build objects fin and fout

std::istream_iterator<util::algorithm::raw_type> iitr(fin), end;
std::ostream_iterator<util::algorithm::raw_type> oitr(fout);
std::copy(iitr, end, oitr);

でまぁ以下のように書くといい感じに出てくるようにしてみた。

#include <algorithm>
#include <iostream>
#include <iterator>
#include "algorithm.hpp"

// build objects fin and fout

fin.seekg(0, std::ios_base::end);
const std::streamsize fin_size = fin.tellg();
fin.seekg(0);

std::istream_iterator<util::algorithm::raw_type> iitr(fin), end;
std::ostream_iterator<util::algorithm::raw_type> oitr(fout);
std::transform(
    iitr, end, oitr,
    util::algorithm::basic_progress<util::algorithm::raw_type,
                                    std::streamsize>(
        std::cerr, 1, fin_size));

上記は 1 byte 毎に進捗表示する場合。…んー predicate を取るもの ( std::copy_if やそんなん向け ) も定義できそうだな、と今思った。