2007-01-01から1年間の記事一覧

Currying in C++

static-initializationのために苦しいマクロを使う羽目になる 8.5.1/14(Working Draft)はsubaggregateにも当てはまると思われるので型が複雑になると大変になる 実装とサンプル Quickbook1.4(Boost1.35相当)がかなりパワーアップしていた

List Comprehensions in C++ その2

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

二項関数をinfixにする

FC++にあって、実装は意外に簡単 実装とサンプル Haskellのマネであるらしい

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なるものについて

noncopyableは駄目かもしれない

EBOが働かない場合があるらしい (参照) もう自分でprivate部を書く方が簡単だと思う

auto_ptrの仕様

auto_ptrはelement_typeが異なるものからはcopy-initializeできないようだ (参照) auto_ptrの初期化の表 Defect Report 84. user-defined conversionが二回必要なので駄目らしい [id:mb2sync:20060808]もコンパイルエラーになるべきだと思われる

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できない これは仕様なのかバ…

型をAssignableにする方法

boost::optionalをresetしてからassignすればいいだけだった (実装)

Deferred Callable Object

名前がついてました (参照)

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…

static_downcast

static_castは何をしているか分からないので駄目である そこで実行時にチェックできる場合はチェックするdowncast (実装) VC++7.1のバグのおかげですごく苦労した cv-qualifierは自動なのがミソ []#include[] []<pstade/static_downcast.hpp>[] []#include[] []<boost/utility/result_of.hpp>[]</boost/utility/result_of.hpp></pstade/static_downcast.hpp>

make_array

boost::arrayをdirect-initializationする方法がないらしい (参照) make_arrayのようなものを作らないといけない Boost.Assignはassignするので少し遅くなる そこでinitializer-list(pdf)のようなもののエミュレートを試みた 実装とサンプル copy_range関数…

error C1055の回避策

C++

VC++7.1 SP1で直ったと思っていたら(デバグモードで)出た .cppにあるのはWinMain1個だった、なんてことがあるのでお手上げになってしまう /ZIを/Ziに変えるのが決め手らしい (参照)

Small Object Optimization

1.34のコードはかなり変更されていて「小さなオブジェクト」の場合は、コピーにheapを使わなくなっている Boost.Lambdaなんかを代入しても速い 以前はboost::is_statelessかどうかで判定していたようだ 大きなオブジェクトの場合も、それがstatelessであるこ…

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[][];[]

detail::functionN

Boost.Accumulatorsに、もうdetail::functionNが含まれていた これは、Forwarding Problemを解決するためのクラステンプレートである boost::result_ofのサポートも勝手にやってくれる これを使ったのモダンな実装がにある []#include[] []<boost/detail/function2.hpp>[] []#include[] []<boost/type_traits/is_same.hpp></boost/type_traits/is_same.hpp></boost/detail/function2.hpp>…

Auxiliary interfaces

Auxiliary class interfacesという提案(pdf)がある operator|を使って実装を試みる 引数がゼロ個の場合は本当に使っていいかもしれない []#include[] []<pstade/auxiliary.hpp>[] []#include[] []<boost/utility/result_of.hpp>[] []#include[] []<cstring>[]</cstring></boost/utility/result_of.hpp></pstade/auxiliary.hpp>

ヌルポインタ再び

なるほど (参照)

型からテンプレート引数を取り出す

mpl::applyは、typeという名前の内部型を持っているかどうか調べるために、結果の型をインスタンス化してしまう(らしい) それによって不正な型が出来上がる場合がある インスタンス化されてもいいようなテンプレートを代役に立ててmpl::applyしたあと、元の…