Boost.Range

Oven 1.0

1.0だからどうということもないですがリリースしました ドキュメントとダウンロード

1.35での変更点

Boost.RangeはBoost1.35で破壊的に変更されるのでまとめます null-terminatedな char const* はRangeではない boost::as_literalでRangeにする charの配列は、\0は考慮されず普通の配列として扱われる つまりboost::size("123")は4を返す null-terminatedと…

OutputIterator Adaptorsの実装

いくつか実装しました… 実装とドキュメント OutputIteratorはAssignableでないといけない

OutputIterator Adaptors 追記

よく考えると、singleで入力をRangeにしてRange Adaptorに渡せば、OutputIterator Adaptorに変換できる copy(frng|utf8_decoded, outputter(make_utf8_encoded)|=std::back_inserter(v1));

OutputIterator Adaptors

OutputIteratorは実装が簡単なので誰かが作っているはずだがあまり見つからない MultiOut trotter (を拡張したようなライブラリ) 以下のような感じにする予定 copy(file_range<>("data.txt")|utf8_decoded, copier(utf8_encoder|=stream_writer(fout)) |=cop…

rangeをmapにする

"range expression"を型をキーにした連想配列にする (実装) iteratorにデータを持たせて、あとで取り出す 使い道はまだ不明

Unrolled Algorithms

保存していたBoost.Sequenceから拝借 (実装) 早くなったり遅くなったり、使いどころが難しい oven::unrolled_copy_c<7>(b, &a[0]);

any_output_iterator

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>…

tupleをiterateする

使い道があるのか分かりませんが… 大胆な実装 同じ型に変換しないと使えない 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*,>

List Comprehensions in C++ その2

よく考えると、"子Range"は"親Range"の要素にアクセスできなければいけない 結局、Rangeを返す関数オブジェクトを渡す、という苦しいことになった (実装) ちなみに実装は、本当にモナドから作った 複雑なiteratorがいろいろ必要なので、STLが最後にたどりつ…

List Comprehensions in C++

List Comprehensionのエミュレートを試みた これがRangeに関する一番ややこしい課題なのではないかと思う 怪しい実装とサンプル FC++も参照

Parallel Algorithms

前回のは少しおかしかったので訂正 parallel_xxxはこの辺りに (サンプル) parallel_for(for_eachじゃない)の必要性が良く分からなかった

Parallel Iteration

[id:tueda_wolf:20070725]を参照 parallelなアルゴリズムの実装を試みた (怪しいparallel_sort) TBBは分割した後sortしているようだ

Iterator blocks in C++

これはボツにしてovenに組み込むことにした 用語はC#から拝借した in_blockについてはもっと良い名前が思いつかなかった オリジナルのiteratorのコード これを使ってyield流のunfoldr

unfold_iterator

[id:siokoshou:20070723]にインスパイアされて 実装とサンプル これでiterate_iterator(ややこしい)とgenerator_iteratorが必要なくなった unfoldr_iteratorも作ったが、それでは抽象度が足りないようだ anamorphismなるものについて

pop_iterator

pop_backをrange adaptorで表現する 定数時間で返すために"rangeをendの手前まで走査する"ということは出来ないことに注意 TraversalCategoryに応じて異なるiterator adaptorが必要になる SinglePassの場合 Forwardの場合 これをRangeなしで使いやすいインタ…

クイックソート in C++

おまけのサンプル (全体のコード) 5個並べるのもしばらく待たなければならないほど遅い []typedef[] []any_range[][]<[][]int[][]&, [][]boost[][]::[][]forward_traversal_tag[][]>[] []range[][];[][]range[] []quick_sort[][]([][]range[] []rng[][])[] […

Oven Range Library

だいたい完成(に近づいた)かもしれない (ドキュメント) 結局二年くらいかかってしまった これでFizzBuzz in C++ ([id:takatoh:20070509:fizzbuzz]を参照) boost::zip_iteratorは*itが参照型でないForwardTraversalIteratorをzipできない これは仕様なのかバ…

Boost.TypeofとRange++

昨日の続き 要するに、nativeなtypeofが無い時だけtype erasureする 結局こうなった (実装とサンプル) これを使ってITER_FOREACHを作ってみる (実装とサンプル)

Boost.TypeofとRange

ネストされたiterator型に使えないらしい つまり役に立たない が、any_rangeにすれば大丈夫なので、ポータブルなマクロが作れる (実装) []PSTADE_OVEN_AUTO[][]([][]factorials[][],[] []counting_from[][]([][]1[][])|[][]scanned[][]([][]1[][], [][]regul…

any_iterator更新

Thomas Beckerによるany_iteratorがかなり本格的なものに書き直されている Boostに入る? any_iterator_abstract_base.hppが面白い

memoize_iterator

spirit::multi_passをちゃんと書き直したつもりの実装 メモ化は効果が強烈である(何十倍も速くなったりする)

再帰Rangeをメモ化する

前回のfibonacciは20番目くらいでシステムに支障を来たしてしまうほど遅い メモ化するといい メモ化の実装であるmulti_passは、デフォルトで、メモ用のコンテナに参照カウントを使うのだが、見てのとおり循環参照が起きてリークする first_ownerというポリシ…

Rangeも再帰する

かつてなく怪しい実装 以下、コンパイルするのも大変なフィボナッチ数列 []using[] []namespace[] []pstade[][]::[][]oven[][];[]

Range AdaptorをBoost.Spirit風にする

開発中のBoost.Protoを使って演算子のオーバーロードをしてみる (実装) result_ofにはまだちゃんと対応してないようだ 以前の使い方([id:mb2sync:20051025])とは、かなり変わっている []#include[] []<pstade/oven/compile.hpp>[]</pstade/oven/compile.hpp>

MFC/ATLのコレクションクラスと文字列クラスをRangeにする

今度こそ完成した、はず (ドキュメント) こういうものを作ると、これらのクラスは使ってはいけないとよく分かる! ただCSimpleArrayと文字列クラスは役に立つかもしれない ついでにWTLも サンプルコード

tupled関数

関数をboost::tupleを取る関数に変更しよう (実装) HaskellでいうzipWithをするRangeに必要になった ([id:Cryolite:20061124]を参照) tie(xs, ys)|zipped|transformed(tupled(f)) を短く書ける Haskellでは map (uncurry f) (zip xs ys) になるようだ C++にc…

Concept vs ADL

decltype(typeof)のような機能があってもなお、ADLより明示的なカスタマイズの方がいいぞという提案 それをエミュレートする物のソースと例 なかなかうまくいった

終わらないRange

よく考えると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>

iterator_castの力

Boost.RangeExにあるiterator_castは、adaptorからbaseとなったiteratorを取り出すのだが、名前に反してもっと汎用的なものだと思われる baseメンバ関数を介して、複雑に"修飾された"型のオブジェクトから欲しい型のオブジェクトを取り出す shared_ptrやopti…