Boost.Range
1.0だからどうということもないですがリリースしました ドキュメントとダウンロード
Boost.RangeはBoost1.35で破壊的に変更されるのでまとめます null-terminatedな char const* はRangeではない boost::as_literalでRangeにする charの配列は、\0は考慮されず普通の配列として扱われる つまりboost::size("123")は4を返す null-terminatedと…
いくつか実装しました… 実装とドキュメント OutputIteratorはAssignableでないといけない
よく考えると、singleで入力をRangeにしてRange Adaptorに渡せば、OutputIterator Adaptorに変換できる copy(frng|utf8_decoded, outputter(make_utf8_encoded)|=std::back_inserter(v1));
OutputIteratorは実装が簡単なので誰かが作っているはずだがあまり見つからない MultiOut trotter (を拡張したようなライブラリ) 以下のような感じにする予定 copy(file_range<>("data.txt")|utf8_decoded, copier(utf8_encoder|=stream_writer(fout)) |=cop…
"range expression"を型をキーにした連想配列にする (実装) iteratorにデータを持たせて、あとで取り出す 使い道はまだ不明
保存していたBoost.Sequenceから拝借 (実装) 早くなったり遅くなったり、使いどころが難しい oven::unrolled_copy_c<7>(b, &a[0]);
OutputIteratorを何でも保持するany_output_iterator (実装) この実装が正しいのかどうか分からない any_iteratorと違うクラスにするのは正しいと思う std::vector<char> v; any_output_iterator<char &> oi(std::back_inserter(v)); std::string src("abcdefg"); std::cop</char></char>…
使い道があるのか分かりませんが… 大胆な実装 同じ型に変換しないと使えない rectangle r; triangle t; circle c; boost::tuple<rectangle*, triangle*, circle*> tup(&r, &t, &c); BOOST_FOREACH (shape *s, oven::hetero<shape *>(tup)) { s->draw(); }</shape></rectangle*,>
よく考えると、"子Range"は"親Range"の要素にアクセスできなければいけない 結局、Rangeを返す関数オブジェクトを渡す、という苦しいことになった (実装) ちなみに実装は、本当にモナドから作った 複雑なiteratorがいろいろ必要なので、STLが最後にたどりつ…
List Comprehensionのエミュレートを試みた これがRangeに関する一番ややこしい課題なのではないかと思う 怪しい実装とサンプル FC++も参照
前回のは少しおかしかったので訂正 parallel_xxxはこの辺りに (サンプル) parallel_for(for_eachじゃない)の必要性が良く分からなかった
[id:tueda_wolf:20070725]を参照 parallelなアルゴリズムの実装を試みた (怪しいparallel_sort) TBBは分割した後sortしているようだ
これはボツにしてovenに組み込むことにした 用語はC#から拝借した in_blockについてはもっと良い名前が思いつかなかった オリジナルのiteratorのコード これを使ってyield流のunfoldr
[id:siokoshou:20070723]にインスパイアされて 実装とサンプル これでiterate_iterator(ややこしい)とgenerator_iteratorが必要なくなった unfoldr_iteratorも作ったが、それでは抽象度が足りないようだ anamorphismなるものについて
pop_backをrange adaptorで表現する 定数時間で返すために"rangeをendの手前まで走査する"ということは出来ないことに注意 TraversalCategoryに応じて異なるiterator adaptorが必要になる SinglePassの場合 Forwardの場合 これをRangeなしで使いやすいインタ…
おまけのサンプル (全体のコード) 5個並べるのもしばらく待たなければならないほど遅い []typedef[] []any_range[][]<[][]int[][]&, [][]boost[][]::[][]forward_traversal_tag[][]>[] []range[][];[][]range[] []quick_sort[][]([][]range[] []rng[][])[] […
だいたい完成(に近づいた)かもしれない (ドキュメント) 結局二年くらいかかってしまった これでFizzBuzz in C++ ([id:takatoh:20070509:fizzbuzz]を参照) boost::zip_iteratorは*itが参照型でないForwardTraversalIteratorをzipできない これは仕様なのかバ…
昨日の続き 要するに、nativeなtypeofが無い時だけtype erasureする 結局こうなった (実装とサンプル) これを使ってITER_FOREACHを作ってみる (実装とサンプル)
ネストされたiterator型に使えないらしい つまり役に立たない が、any_rangeにすれば大丈夫なので、ポータブルなマクロが作れる (実装) []PSTADE_OVEN_AUTO[][]([][]factorials[][],[] []counting_from[][]([][]1[][])|[][]scanned[][]([][]1[][], [][]regul…
Thomas Beckerによるany_iteratorがかなり本格的なものに書き直されている Boostに入る? any_iterator_abstract_base.hppが面白い
spirit::multi_passをちゃんと書き直したつもりの実装 メモ化は効果が強烈である(何十倍も速くなったりする)
前回のfibonacciは20番目くらいでシステムに支障を来たしてしまうほど遅い メモ化するといい メモ化の実装であるmulti_passは、デフォルトで、メモ用のコンテナに参照カウントを使うのだが、見てのとおり循環参照が起きてリークする first_ownerというポリシ…
かつてなく怪しい実装 以下、コンパイルするのも大変なフィボナッチ数列 []using[] []namespace[] []pstade[][]::[][]oven[][];[]
開発中のBoost.Protoを使って演算子のオーバーロードをしてみる (実装) result_ofにはまだちゃんと対応してないようだ 以前の使い方([id:mb2sync:20051025])とは、かなり変わっている []#include[] []<pstade/oven/compile.hpp>[]</pstade/oven/compile.hpp>
今度こそ完成した、はず (ドキュメント) こういうものを作ると、これらのクラスは使ってはいけないとよく分かる! ただCSimpleArrayと文字列クラスは役に立つかもしれない ついでにWTLも サンプルコード
関数をboost::tupleを取る関数に変更しよう (実装) HaskellでいうzipWithをするRangeに必要になった ([id:Cryolite:20061124]を参照) tie(xs, ys)|zipped|transformed(tupled(f)) を短く書ける Haskellでは map (uncurry f) (zip xs ys) になるようだ C++にc…
decltype(typeof)のような機能があってもなお、ADLより明示的なカスタマイズの方がいいぞという提案 それをエミュレートする物のソースと例 なかなかうまくいった
よく考えるとistream_iteratorのRangeも永遠に入力しつづければ無限なので問題がない 以下のソースコードはこの辺り any_iteratorについては、ここやここ []#include[] []<boost/range.hpp>[] []#include[] []<pstade/oven/functions.hpp>[] []#include[] []<pstade/oven/ranges.hpp>[] []#include[] []<boost/lambda/lambda.hpp>[] []#include[] []<boost/lambda/core.hpp>[]</boost/lambda/core.hpp></boost/lambda/lambda.hpp></pstade/oven/ranges.hpp></pstade/oven/functions.hpp></boost/range.hpp>
Boost.RangeExにあるiterator_castは、adaptorからbaseとなったiteratorを取り出すのだが、名前に反してもっと汎用的なものだと思われる baseメンバ関数を介して、複雑に"修飾された"型のオブジェクトから欲しい型のオブジェクトを取り出す shared_ptrやopti…