Ovenから移植した機能をBoost.Rangeに提案中

Review Request : Boost.Range Extension


ライブラリ丸々の提案ではないので、レビューキューには入らずに現在、非正式レビュー中。
Boost.Range作者からも返信がきて、まだくわしく見てはいないようですが第一印象はよさそうなので、丸々落とされることはなさそう。


RangeExの元を作ったEric NieblerからもC++Now!のときに「元々のOvenはStrange Concept(Eggのこと)だったから昔リジェクトされたけど、これには変なのが入ってないように見える。これならリジェクトされることはないだろう。」という意見をもらってたので、とりあえずは大丈夫そうかな(Eggの時点でリジェクトされたからOvenはレビューもされてなかったと思うけど)。
無限Rangeあたりでかなり議論になりそうと思っていましたが、Boost.Iteratorsにすでにfunction_input_iteratorという無限Rangeが入っていたので、前例ありきだからそんなに大変ではなさそう。


レビューリクエストのFuture Planにも書きましたが、この拡張が無事に入ったら次は、RangeのRange、繰り返しRange、文字列関係のユーティリティの移植を進めようと考えています。
その他には、boost::iterator_rangeのIOに関するデフォルトフォーマットを使いたくないので、IOに関するアダプタを入れようと思ってます。こんな感じ:

cout << (r | prettied) << endl;
// => [a,b,c]

アダプタ名はpretty printから来ています。
カスタムフォーマットは、実装はまだ考えてませんがこんなふうにできたらいいなと妄想してます:

prettied.format("{", ", ", "}");
cout << (r | prettied) << endl;
// => {a, b, c}

それに加えて、できれば出力だけじゃなく入力にも対応したいと考えてます。


あとは、id:DigitalGhostさんが現在、fused_for_each()アルゴリズムのステートメントバージョンを実装してくれてます。

vector<tuple<a, b, c>> v;
FUSED_FOR_EACH((a)(b)(c), v) {
}