boost

Boost.Context について調べた

この記事は Boost Advent Calendar 13 日目の記事です。 Boost.Context は、跋扈するコンテキスト切り替えの利用を統一するべく颯爽と現れた救世主です(大げさ)。 そもそもコンテキスト切り替えって何ぞや?という場合は、適当にググるか、自分の Boost.Co…

Boost.勉強会 #2 に参加してきました

ついでに発表もしてきました。 Boost.Interfaces という、Boost 入りしていないというか一度提案して蹴られたらしいのと、あとこれの作者は Boost.Iostreams の作者と同じなんですけど、この人は半音信不通らしいというライブラリです。 ustream はこちら ht…

リファレンスに対する add_const

以下のソースは正常にコンパイルすることができます。 BOOST_STATIC_ASSERT((is_same<add_const<int&>::type, int&>::value)); int& に const 修飾すると int& になるということです。 これは不思議で仕方がなかったので、調べてみました。 ポインタの場合はどうなるかという</add_const<int&>…

プリプロセッサデバッガ

昨日のことを適当にまとめてみる。 始まりはこのつぶやきから。 【急募】このコードがうまく動く理由 http://codepad.org/IwJ4sqA9 http://twitter.com/DecimalBloat/status/9965596581 これを見て、そういえば id:y-hamigaki さんが Boost.Wave を使ってプ…

Boost.勉強会の資料

アップしておきました。 Boost.Coroutine View more presentations from melpon メモメモ http://blog.think-async.com/2009/08/composed-operations-coroutines-and-code.html http://www.okws.org/doku.php?id=okws:tame http://d.hatena.ne.jp/shinichiro…

Boost.勉強会

12/12 の Boost.勉強会で 30 分ほど Boost.Coroutine について話す予定です。 Boost.勉強会 : ATND 入るかどうか分からないライブラリなのでインターフェース部分の話じゃなくて実装の話をメインにやりたいと思います。 まだ資料作ってる途中ですががが

Boost 1.40.0 の function

Boost 1.40.0 で Boost.Function が更新されました。 更新内容を見てみると、 Optimize the use of small target objects. Make Boost.Function compile under BOOST_NO_EXCEPTIONS (#2499, #2494, #2469, #2466, #2900) Various minor fixes (#2642, #2847,…

Boost.Variant の assign の処理

かなり面白かったので書いてみます。 代入する型が一致する場合 まずは小手調べ。簡単に代入できる場合までの処理。 Boost 1.40.0 では以下の実装になっています。 void variant_assign(const variant& rhs) { if (which_ == rhs.which_) { detail::variant:…

Boost.Coroutine を組み込み環境向けに移植してみた

ある程度動いてる感じがするので公開してみます。 BREW で人柱になってくれる方を募集中です。 ソースとか いつもの場所に置いときました。 http://melpon.tank.jp/pukiwiki147/index.php?cmd=read&page=Memo%2F%CA%AA%C3%D6%2Fmoost 移植にあたって Boost.C…

Boost.Optional を組み込み環境向けに移植してみた

アライメント系があまり理解できず、Boost.PP のマクロを展開して貼り付けるだけになってしまいました。 ただまあ、optional クラスはできる限り無駄な処理が出ないように実装したつもりです。 以下のページに置いておきました。 http://melpon.tank.jp/puki…

Boost.Coroutine 移植中

とりあえず boost::coroutines::coroutine は一通り移植できて、こんな感じに使えるようになってきました。 int fib(coroutine<int ()>::self& self) { // 初項 int n = 0; self.yield(n); // 2項 int m = 1; self.yield(m); // 3項以降 while (true) { int v = m + </int>…

RTTI を使わずに Boost.Any を実装する方法

Boost.Any は any_cast<> 内で type_info を使って変換しようとしている型が一致しているかどうかを判断してるんだけど、RTTI を使いたくないので type_info を使わずに any を実装してみる。 これは要するに型単位でユニークな値が取れればいいだけなので、…

Boost.Function とか Boost.Bind を組み込み環境向けに移植してみた

といっても BREW で使えるようにしただけなので他の環境で使えるかどうかは知りません。 あとバイナリサイズがどうなっても知りません(といっても自分で関数オブジェクト作って格納して呼び出した場合のコードサイズと大して変わらない気もしますが)。 以…

function_allows_small_object_optimization

というメタ関数が boost/function/function_base.hpp に定義されています。 これが何かというと名前の通りで、このメタ関数が true を返す場合には、boost::function に渡す関数オブジェクトが十分に小さい(かつ正しい場所にオブジェクトが配置できる)ので…

boost::mpl::push_back

#include <boost/mpl/push_back.hpp> #include <boost/mpl/push_front.hpp> #include <boost/mpl/list.hpp> using namespace boost::mpl; void main() { typedef list<int, char> list2; //typedef push_back<list2, void*>::type list3; // ↑コンパイルエラー typedef push_front<list2, void*>::type list3; // ↑こっちなら通る } 謎だ...。</list2,></list2,></int,></boost/mpl/list.hpp></boost/mpl/push_front.hpp></boost/mpl/push_back.hpp>

property_tree

何をやるクラスなのかまったく理解してないんだけど、 xml_parser_read_spirit.hpp ここの xml_grammar クラスだけ切り取ってゴニョゴニョしてみたい衝動に駆られた。 でもよく考えてみると XML って DTD とか XML Schema がないと無用の長物だよなぁとか思…

多重ラムダ

using namespace boost::lambda; template<class F, class T> void apply(F f, T v) { f(v); } void func(std::vector<int>& v) { std::for_each(v.begin(), v.end(), _1 *= 2); } void main() { std::vector<int> v; apply(func, boost::ref(v)); } これを、func 関数を作らずにやるとど</int></int></class>…

Registrar Script の BNF が腐っている件

Boost.Spirit で何か試しに解析してみようと思って、ちょうどパース ツリーについて (ATL)辺りに BNF で書かれた文法があったので、これを使ってみることにしてみた。 <root key>{<registry expression>}+ <root key> ::= HKEY_CLASSES_ROOT | HKEY_CURRENT_USER | HKEY_LOCAL_MACHINE | HKEY_USERS | </root></registry></root>…

Boost.Spirit を扱う上で絶対に読むべき情報

Debugging この辺のマクロを定義しておかないと、意図しない解析をした場合にエラーの原因を突き止めるのがものすごく困難になる。 実際に困難を極めた人がここにいるので間違いない。

Boost.Spirit に手を出してみた

まずは情報を調べるところから、と思ったらまとめていらっしゃる方がいるようで。http://www5d.biglobe.ne.jp/~y0ka/2006-05-14-1.html で、いろいろ調べた感じ、LL(k) 文法なのでバックトラックが起こったときのセマンティックアクションがなかなか手強いっ…

boost::enable_shared_from_this

boost::shared_ptr を使ってると時々問題になるのが、this の扱い。this は生のポインタなので出来る限り触りたくない、けれどもどうしても this が必要になる場合があったりする。例えばダブルディスパッチとか。 そういった this のスマートポインタが欲し…

random_range_generator

ある一意な確率で出現する範囲の乱数を得るために variate_generator を使って乱数を取り出してたんだけど、variate_generator は一度作ったら範囲を変更できない。 なので、 // [first, last) int rnd = boost::variate_generator<boost::mt19937, boost::uniform_int<int> >(mt_, boost::uniform_int<int></int></boost::mt19937,>…

Boost.Bind のプレースホルダーの仕組み

を調べるために、超簡単な Boost.Bind を作ってみた。 namespace my_boost { // arg template<int I> class arg { }; template<int I> bool operator==(arg<I> const &, arg<I> const &) { return true; } // type template<class T> class type { }; namespace _bi { // storage1 template<class A1></class></class></i></i></int></int>…

Boost.Bind を C# で作りたい(3)

public static class Boost { public class PlaceHolder { public PlaceHolder(int v) { Value = v; } public int Value; } public static PlaceHolder _1 = new PlaceHolder(1); public static PlaceHolder _2 = new PlaceHolder(2); public static PlaceHo…

Boost.Bind を C# で作りたい(2)

とりあえず全部の引数を束縛するのであれば簡単に作れるようだ。 delegate R Function<R>(); delegate R Function<R, T1>(T1 t1); delegate R Function<R, T1, T2>(T1 t1, T2 t2); // 以下略 Function<R> Bind<R>(Function<R> f) { return delegate { return f(); }; } Function<R> Bind<R, T1>(Funct</r,></r></r></r></r></r,></r,></r>…

Boost.Bind を C# で作りたい

と思ったんだけどどうすればいいんだろう。

Boost.WeakPtr を通常のポインタの代替として使う

例えば数百万行ぐらいの大きいソースがあって、そこでは生のポインタがバリバリ使われていたとする。 で、あるマネージャクラスが生成したオブジェクトのポインタをいろんなところにコピーしているので、終了時にマネージャクラスがそのポインタを先に削除す…

Before/After クラス

デザインパターンの一つに Before/After パターンというのがあるらしくて、これは Before 処理をしたら After 処理を必ず行うように保証するパターンらしい。 Java ならこんな風に書ける public void func() { hoge.before(); try { doSomething(); } finall…

final クラス

Java のマルチスレッドなコードを読んでいると、不変性を保つために final が使用されていることが多い。 public final class Immutable { private final String field1; private final String field2; ... } final メンバは const で代用できるとして、fina…

とりあえず Boost.Function で

id:melpon:20071208 でこんな関数を書いた。 template<class TObject> boost::_bi::bind_t< void, void (*)(TObject*, boost::function<void (TObject*)>), boost::_bi::list2< boost::arg<1>, boost::_bi::value< boost::function<void (TObject*)> > > > null_check_deleter(boost::function<void (TObject*)> f) { return boo</void></void></void></class>…