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

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

関数の引数を名前付きにする

Boost.Parameterは使うのが恐ろしいので、それに近いことをするhigher-order関数 named (実装とサンプル) 名前無しと名前付きを混ぜられない Boost.Fusionが必要

Egg Functional Library 0.9

少し前にボツになったライブラリを復活させた 関数オブジェクトを静的に構築できるライブラリになりました ドキュメント すでにWorkaroundが4個もあるのが苦しい Quickbook1.4のimport文は強力

static initialization vs ODR violation

まず、ODR violation対策のこれを参照 msvcは、上の_1を(optimizerがないと?)statically-initializeできない gccは、_1はstatically-initializeできるが、placeholder const *p_1 = &_1; のように使った場合、p_1をstatically-initializeできない 結局、sta…

関数を退化させる

高階関数に関数を通すと、どうしても引数がtemplateになってしまう 引数を間違えるとインスタンス化の奥底でエラーが出て困る そこで、引数の型を指定する高階関数 mono (実装とサンプル) ちなみに、Boost.Lambda functorはrvalueを受け付けるようになってい…

関数をlazyにする

Boost.Phoenixには、bindしなくてもlambda式として使えるようにするフレームワークがある Boost.Lambdaのplaceholderでもそれを出来るようにする高階関数lazy (実装) 実装はboost::lambda::bindを呼んでいるだけ boost::lambda::bind自身をlazyにすると、複…

関数をメモ化する

2年かかってしまった (参照) 実装とサンプル これを参考にしてfixから実装した (fixの実装とサンプル) curry化は素朴に実装できて、コンパイル時の負担も少ない(ように感じる)

POD指向プログラミング?

新しいプログラミングパラダイム、かもしれない オブジェクトを静的に作るために全部POD型にする Boost.XpressiveやBoost.Protoがその実践例と考えられる 実際的なメリットとしては、コンパイルが早くなる 初期化に関数を使わないから POD型はユーザー定義の…