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 やそんなん向け ) も定義できそうだな、と今思った。