iterating_range

みょみょみょ.あくまで自分向けのメモな段階でのドキュメント.
http://cradle.sourceforge.jp/doc/range/iterating.html
一応,暫定で仕上げた take_while と組み合わせて,
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/*checkout*/cradle/cradle/libs/range/test/integration/collatz_conjecture_utf.cpp?content-type=text%2Fplain
こんな感じのテストコードは MSVC 7.1, 8.0 と GCC 4.0.3, 4.1.1 で通るけれど. range view (今まで range adaptor と書き続けてきたもの) や take_while のドキュメントを早く書かないとっとっと.
BOOST_FOREACH が一番外側の一時オブジェクトの寿命しか延命しないために, range view と組み合わせて使うと dangling reference を生じるコードを簡単に書けてしまう問題があるのだけれど,これを解消するための苦肉の策として, operand のコピーを保持する composition と operand のコピーを保持しない composition を分けるっつー,めちゃくちゃいやんなことしてるうううぅぅぅ.しかし,もう1年以上この問題考え続けてきたけれど現状の問題解決策としては恐らくこれが限界ぃ,かつこれが多分 suboptimal. operand をコピーしたくないなら明示的に boost::ref 使ってね的な感じがとってもいやん.
今までずっと range に関しては
「counting (あるいは上記の iterating) のような,イテレータオブジェクトの寿命が dereference で返す参照の指示先のオブジェクトの寿命を enclose するようなイテレータを, reverse したり concat (joint) したりするときに dangling reference に気をつけないといけないよ問題 (個人的に reversed counting 問題と呼んでる.たとえばここで言及されている類の問題)」
と,上記の
「range view を BOOST_FOREACH で (もしくは composition によって生成した view/range を full-expression を超えて) 使おうとすると dangling reference が生じやすい問題 (ここで言及されている類の問題)」
が2大懸案事項だったけれど,前者はおよそ8割9割方解決できているし,これでようやく問題を整理してドキュメント化できる段階まで落ち着いてきたにょ.