Boost.Egg

ぎりぎりで完成…ドキュメント おかしいところがあれば教えてください たぶんBoost1.36からboost::functionのtemplate parameterからAllocator部分がなくなります

using directiveは駄目かもしれない

using directiveはどこで使っても安全にならない placeholderなどの名前をまとめてインポートしたいときは、結局using declarationに展開するマクロが必要かもしれない

nested lambda

lazyにおまけでbind関数を変更するためのパラメータ(Bind)を付けて置いたがこれが重要だった Bindにresult_of_lazy::typeを渡すとネストされたlazyな関数を作れる (実装) これで機械的に複雑なlambda式が作れるようになった、かも lvNはbll::protectをN回呼…

PP_ARRAY_ITERATE

C++

数字じゃなくarrayをfile iterationするマクロ…実装とサンプル 実装はBOOST_PP_ITERATEをラップしただけ これでhorizontalなmacroは一掃してしまおう

Variadic functions in C++98

C++

fuse/unfuseを使ってvariadic functionのエミュレートを試みた…実装 Argsに何を渡すかだが、将来的にはfusion::vector固定でいいと思う FusionSequenceはRangeのようにviewを取り出せる

vc-9.0のADLのバグ

C++

親のnamespaceが子のnamespaceの型にassociateされてしまう これによってboost::noncopyableを継承する全ての型はboost名前空間にassociateされると思われる

vs msvc-7.1 const array

C++

deduceされた配列にconstを付けるとpartial specializationがいっさい効かなくなるvc-7.1のバグの回避策を発見…実装 これでようやくconstと書くことができる 今まではconstの代わりにboost::add_constを関数の宣言のところに書かなければいけなかった

bind

実装とサンプル Boost.Lambdaよりプリプロセッサの分だけコンパイルが遅いという結果になってしまった ネストされたPP_ITERATEではPP_SLOTが必要 Boost.BindとBoost.Lambdaではplaceholderの置換ルールが少し違うみたいである Boost.Bindの方がEBOをしている…

class invariant

C++

前に作ったこれは、不気味で使う気が起こらない 結局素朴なものに変更した…ソースとサンプル フリー関数のpre/postconditionはボツ

vs Intel C++ Compiler 10.1 for Windows

C++

評価版をインストールした 30日以内になんとかしなければならない workaroundはほとんど必要なさそう 以下、バグと思われるもの

mono v2

v1は格好が悪かった 関数型を使うことにした…実装 result_ofを利用するときは戻り値型にuse_defaultを指定する void test() { namespace bll = boost::lambda; BOOST_CHECK( std::not1( egg::mono<bool(int)>(bll::_1 != 12) ) (12) ); BOOST_CHECK( std::bind1st( egg:</bool(int)>…

(オブジェクトではない)関数を作る

C++

これについて こんなのがありました…c_function 一般には、こんな風にvtableを自前で作ったりも出来ます Boost.Functionも自前で作っています もっとすごそうなライブラリ…Boost.Vtable

msvc-8.0 vs msvc-9.0

C++

Visual C++ 2008 Express Edition(英語版)をインストールした Visual C++ 2005 Express Edition(日本語版)と共存できている模様 Visual C++ .NET Version 7.1とも共存できている これは直っている これは直っていない もう直せないのかもしれない 回避策はこ…

Oven 1.0

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

PEG, Parsing expression grammar

ちゃんと名前がついていた…参照 Biscuitは静的な文法のためのPEGパーサ生成器である、ということになった XMLパーサはこんな感じになる Javaによる実装の解説(pdf) C#による実装がcatの実装の中にこっそりある

gccのcopy-initializationのバグ

C++

copy-initializationにおいて、const参照がconstオブジェクトから初期化されるとき、コピーされたオブジェクトで初期化されてしまう (gcc-3.4と4.1で確認) 組み込み型の場合のみらしい 関数の引数のcopy-initializationは大丈夫らしい

bindの定義

いつも使うときに混乱するbind等の定義を試みた

1.35での変更点

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

value_based

C++

スマートポインタを値のように振舞うようにするクラステンプレート 実装は、この辺り (コピーしてnewするだけである) これで、元々"value-based"であるpolyと、スマートポインタを同じように扱えるようにする any_iteratorはこうなった…参照 (content_ofに注…

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…

型がPODかどうかチェックする方法

boost::is_podはほとんどのコンパイラで動かないようだ 以下のようにすると少なくとも警告が出せる (Comeauやgccなど) Boost.Xpressiveが利用していると思われる inline void pod_check(...) {} struct A {}; struct B : A {}; inline void pod_check_of_AB(…

adobe::poly

C++

これはadobeのtype erasureライブラリであるらしい…ドキュメント(されてないけど)と記事(pdf) いわゆるclone_ptrと違ってCopyConstructibleを要求するが、copyにheapを使わないような最適化が出来る 実装を試みた…実装 そのほか気になる記事(pdf) A Language…

右結合のpipe

関数呼び出しのシンタックスは醜い f(g(h(x)) を f $ g $ h $ x の様な感じに書けるようにしたい これはpipableを逆にしただけなので、何か右結合のoperator overloadをこの実装に追加すればいい Pipableの概念に組み込むのがいいかもしれない これを使ってO…

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

any_ref

参照を何でも保持するany_ref (実装) boost::tuple<int, char, std::string> tup(1, 'a', "hello"); BOOST_FOREACH (any_ref a, oven::hetero<any_ref>(tup)) { if (a.type() == typeid(std::string)) { std::string &s = pstade::any_ref_cast<std::string>(a); s = "goodbye"; break; } } BOOST_CHECK( bo</std::string></any_ref></int,>…

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*,>