Boost.Range

Rangeをconcatする

adobeにすでにあった・・・segmented_iterator これだけ変えれば怒られないだろう・・・concatenate_iterator 関係ないですが、やはり使うらしい・・・overload型 さて、*itがrangeを返すようなitをTopIterator、返されたrangeをBottomRangeと呼ぶことに(勝…

rangeをメモ化する

何重にもadaptorを重ねたrangeに複雑なアルゴリズムを適用するとすごく遅くなる そこで、memoize_range・・・ソースコード 実装に使ったspirit::multi_pass iteratorが謎だらけなので怪しい 要件がちょっと特殊なようでそのままでは使えなかった []using[] […

LambdaとRangeを混ぜてみる

ソースはこれのoven/apply_range.hppあたり Boost.Lambdaのドキュメントはしみじみひどいと思う []{[] []BOOST_CHECK[][](([] []oven[][]::[][]equals[][]([] []std[][]::[][]string[][]([][]"efghijk"[][]),[] []oven[][]::[][]make_apply_range[][]([][]sr…

enumerate_range

id:y-hamigaki:20060409のスレッドを使ったiteratorのおかげでid:mb2sync:20060408に意味が出てきた? Enumerableという概念を勝手に作って、このiteratorでSinglePassRangeを作る やれることはenumerateを使っても変わらないが、BOOST_FOREACHが使えるのは…

iterator_rangeのoperator==

なんとstd::equalを呼び出す・・・参照 メンバのequalを呼ぶこと

Boost.Rangeにタグディスパッチを付ける

Boost.RangeやBoost.Serializationのカスタマイズは同じような型がたくさんある場合、無駄に大変だ マクロで何とかしてみてはどうだろう・・・ダウンロード 使い方は以下のような感じで []struct[] []std_container_tag[] []{ };[][]struct[] []my_string_ta…

Boost.Sequence?

昨日の続きですが、普通にresizeを提供した方がいい気がする このような感じで []TCHAR[] []szSrc[][][] = [][]_T[][]([][]"hello, cstring_begin!"[][]);[] []std[][]::[][]basic_string[][]<[][]TCHAR[][]> [][]ans[][]([][]szSrc[][]);[] []{[] []std[][]…

boost::iterator_castとauto_base

Boost.RangeExに含まれ、Boost.IteratorのIterator adaptorの元になったiteratorを取り出します auto_baseはcast先の型としてauto_baseを渡す関数の仮引数の型を使います 実装は、「cast先の型と一致するまで、再帰的にbase()メンバ関数を呼び出す」というこ…

Range adapters

Rangeを受け取りRangeを返す関数を連続で呼び出すとき h(g(f(rng))) を rng | f | g | h のように"手続き的に"書ける Boost.RangeExのboost::adaptor名前空間にあります 名前が提案と違って過去分詞ではないので注意 見た目に反して、あるRangeへの実装はす…

boost::iterator_rangeとboost::sub_rangeの違い

戻り値にsub_rangeを使うと、一時オブジェクトによって意図しないconst性が付加されてしまう iterator_rangeのconst性は、それが保持するiteratorのconst性に関与しない Boost.StringAlgorithmのように、戻り値には必ずiterator_rangeを使うこと sub_rangeは…

Boost.ForeachとBoost.RangeEx

Boost.Iteratorのboost::filter_iteratorは使い方がめんどう Boost.RangeExのboost::make_filter_rangeでその作業を自動化できる そのままBoost.RangeExの関数はもちろん、BOOST_FOREACHにも渡せる 以下のfind_fileの実装はKetchup Version1.02にあります []…

Boost.Rangeの実装の仕方

古いコンパイラの場合は、boost::beginではなく、boost_range_beginをオーバーロードしないとコンパイルできない そのことがドキュメントされていない・・・参考 VC6で動くようにするためにはドキュメントされていない部分を実装しないといけない ATL/WTL CS…

Boost.Rangeとchar配列

char配列をboost::endやboost::sizeに渡すと、文字列と見なして、存在しない終端文字'\0'を探しに行く Boost.Arrayで回避できる Boost.RangeはMFCのCString用のrange関数をやる気がなさそうに持っている 参考

Boost.Range

STLのコンテナの要件を緩めたConcept 日常書くコードへの影響の大きいライブラリ begin(),end()をユーザに書かせなくてよくなる istream_iteratorのような変わった使い方をユーザに要求しなくてよくなる リソースの管理をrangeにまかせることができる ソース…