れんじのじっぷ

複数の range が与えられたときに,それら range の対応する要素同士を tuple とした新たな1つの range に見せる range adaptor,よ〜するに boost::zip_iterator の range 版というか,関数プログラミングな文脈におけるいわゆる zip,が前から欲しかったので,即興で実装してみました的な.
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/*checkout*/cradle/cradle/cradle/range/zipped.hpp?content-type=text%2Fplain
boost::tuple (というか heterogeneous で static size のコンテナ) を PPMP + TMP でごたごた触る実装だけれど,これ思いっきり Boost.Fusion の対象領域なので Boost.Fusion があれば実装をかなり見通しよくできるはずなんだけどにゃー.
たとえば,このテストコードの testLoopWithIndex でやらせてるみたいに index と要素を並列で回すとか,色々使えておもしろそーとかわくわくてかてかしながら実装してみたんだけれど,実際実装してやらせてみたらあんまり面白くなさげっていうかこれ可読性有意に下がってない? const_parameters とか bad know-how 持ち出す羽目になってるし (zipped_range が返す値が非左辺値なので,そのままでは Boost.Lambda の functor の引数にできない.いわゆる the forwarding problem).
BOOST_FOREACH 単体だと複数の range を束ねて並列に回したり, index と並列に回したりとかができなくて,泣く泣く for 文で回すとかいう経験がしばしばあるので,これでうっはーゆめがひろがりんぐとか思っていたんだけれど, BOOST_FOREACH との組み合わせでもまた小ざかしい問題ががががが.
浮動少数の range に \cos(\frac{2\pi i}{n}) な関数出力の range を束ねて on-the-fly で lazy な DCT イテレータだぜぃとか遊ぼうとしてたんだけれど……にゅーん.まぁこっちは binary な transformed (zipWith) で良いけれど.
あ,そうだ. range のサイズが違うときにどうするか考えてない.特に lazy で無限な range が与えられたときの扱い.
次はあれだ.ある range の隣接要素同士を tuple にする range adaptor. (e0, e1, e2,...) が与えられたときに ((e0,e1), (e1,e2), (e2, e3), ...) な感じに見せかける view.関数プログラミングとか他の文脈でこの手のヤツが見つからないからうまい名前が思いつかぬあぁい.