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

TMP で Maybe モナド

namespace monad { namespace maybe { struct nothing { }; template<class A> struct just { }; template<class A> struct ret { typedef just<A> type; }; template<class M, template<class> class F> struct bind; template<class A, template<class> class F> struct bind<just<A>, F> { typedef typename F<A>::type …</a></just<a></class></class></a></class></class>

inits, scan

メタプロは続くよどこまでも。 // inits // リストのすべての先頭部分リストを長さの増加する順に並べたリストを返す // [α]→[[α]] namespace inits_detail { template<class L1> struct concat_bind { template<class L2> struct f { typedef typename binary_concat<L1, L2>::type type</l1,></class></class>…

zip

こんなのを思いついた。 template<class Pair> struct zip; template<class... S1, class... S2> struct zip<pair<tuple<S1...>, tuple<S2...>>> { typedef tuple<pair<S1, S2>...> type; }; ……けど S1 と S2 の長さが違うとアウトでしたorz なので take を実装して長さを短いほうに合わせてからやってやるといけそうな感じ。 追記: でけ</pair<s1,></s2...></pair<tuple<s1...></class...></class>…

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 に渡す関数オブジェクトが十分に小さい(かつ正しい場所にオブジェクトが配置できる)ので…

intrusive_ptr を楽に定義する

C++

template<class Derived> class intrusive_ptr_facade { friend Derived; std::size_t ref_; friend inline void intrusive_ptr_add_ref(Derived* p) { ++static_cast<intrusive_ptr_facade<Derived>*>(p)->ref_; } friend inline void intrusive_ptr_release(Derived* p) { if (--static_cast</intrusive_ptr_facade<derived></class>

関数プログラミング楽しい

最近アキラさん(id:faith_and_brave)からいろいろ本を借りて読んでるのですが、その中でも関数プログラミング作者: R.バード,P.ワドラー,武市正人出版社/メーカー: 近代科学社発売日: 1991/04/01メディア: 単行本購入: 7人 クリック: 82回この商品を含むブ…

無名 enum をテンプレートに渡す

とエラー吐く。 enum { hoge }; template<class T> void foo(T) { } foo(hoge); // エラー: テンプレート引数は無名の型を参照できません ARM コンパイラの標準の準拠度が高くて目から鱗が落ちまくり。</class>

Visual Studio から実機用のバイナリを作る方法

実機用のバイナリを作る方法についてはstd::vector と例外と+αを使ってる状態で実機用のバイナリを作る方法を参考にして貰うとして、ここでは Visual Studio でどうやって実機用バイナリを作るかというのを説明します。 といっても単純にカスタムビルドを使…

std::vector と例外と+αを使ってる状態で実機用のバイナリを作る方法

とりあえず実機でも一通り動くような感じになってきたので、RVCT3.0 で実機用のバイナリを作る方法をまとめてみようと思います。 事前知識 ずっと勘違いしていたのですが、BREW ではもはやグローバル変数は使えます。 elf2mod というツールが Qualcomm から…

IEnumerable> を全て繋げて IEnumerable に変換する

C#

単純に考えると、 IEnumerable<IEnumerable<int>> values = ...; IEnumerable<int> result = new List<int>(); foreach (IEnumerable<int> v in values) { result = result.Concat(v); } こんな感じなんだろうけど、これって Accumulate じゃん!とか思ったので、こんなのは拡張メソッドにあ</int></int></int></ienumerable<int>…

RVCT3.0 のエラー形式

RVCT3.0 の ARM コンパイラは、ちゃんとコンパイラオプションを指定することで日本語エラーを出力してくれます。英語を直訳したような日本語な感じもするけど、それでも自分にはとっても便利。 以下のフラグを設定すると日本語になります。 --message_locale…

std::vector と例外を使ってる状態でコンパイルを通す方法

まだ実機で動かせないので、とりあえずコンパイルを通すだけ。 まず当然のごとく new と delete は再定義するべき。 void* operator new(std::size_t size) throw(std::bad_alloc) { return MALLOC(size); } void* operator new[](std::size_t size) throw(s…

衝撃の事実

ARM Information Center Table C.2 shows the major features of the language supported by this release of RealView Compilation Tools for BREW C++. Major feature ISO/IEC standard section Support Core language 1 to 13 Yes Templates 14 Templates…

--fpu none が倒せない

を include すると芋づる式に が include されて、そいつが fpu none だとコンパイルエラーになるという罠。 まあ最終的に浮動小数点使ってなければリンク時に解決するんだろうけど……なんかやだなぁ。

RVCT for BREW 3.0 キター!

そしてコンパイルエラー山盛りキター! 出たエラー・ワウォーニングとか。 Warning: 初期化リストが定義の順番じゃない 順番どおりに並べた std::bad_alloc が見つからない を include std::out_of_range が見つからない を include 以下のコードは式が左辺…

RVDS3.0 のドキュメント読み中

で、面白い記述発見。 暗黙のインクルード 暗黙のインクルードがイネーブルになっているとき、.h ファイルで宣言されたテンプレートエンティティのインスタンス生成のために定義が必要な場合は、コンパイラは対応する .cc ファイルを暗黙にインクルードして…

bind にメンバ関数を渡したときに this 以外のオブジェクトでメンバ関数を呼び出してもらう方法

C++

例えば shared_ptr を this の代わりに使うことができる。 struct Hoge { void foo() { } }; boost::shared_ptr<Hoge> h(new Hoge()); boost::bind(&Hoge::foo, h)(); boost::bind(&Hoge::foo, _1)(h); でもこれを自前のクラスにしてしまうと、途端に動作しなくな</hoge>…

BREW で bind と function が使いたい

とは思うものの、容量がかなり増えそうなので怖いところ。 bind はまあ、それぞれ用のストレージクラスを作るのと大して変わらない気はするんだけど、function は結構ごちゃごちゃした処理が多いから怖い。 ただ、function は Type Erasure のせいで大きくな…

デフォルトコンストラクタ以外で配列を構築する

C++

まあいくつか方法はあると思うのです。 デフォルトコンストラクタでとりあえず構築しておいて後でもう一度 init() とか呼んで初期化する2段階初期化とか、バッファだけ用意しておいて後で placement new をしてやる遅延初期化とか、もうあきらめて普通に new…

フォントクラス

昔に作ったライブラリのフォントクラスとあまり違わなかったり。id:melpon:20090324(文字列をテクスチャ化する)で使ってます。 BREW2.x は非対応でつ(多分スモールフォントあたりちょっと弄れば動くけど)。

Excel データから配列データへの変換

C#

例えば Excel のデータで hoge hogehoge mokemokke mokeke となってるデータをこんな風に整形して貼り付けたいわけです。 { hoge, hogehoge, }, { mokemokke, mokeke, },ツールを探せばいくらでもありそうですが、探すより書いたほうが早そうなのでこれを C#…

IShell クラスのラッパー

主に ISHELL_CreateInstance をラップするための存在だったりするのですが。 で、RVCT3.0 は例外が使える(らしい)ので ISHELL_CreateInstance に失敗したら例外を投げてやることにします。 また、BREW API 用の interusive なスマートポインタ(brew_ptr)…

AECHAR の入力

今のライブラリは文字列クラスなんてのは作ってないのだけれども、今のプロジェクトは幸いにして使う文字列が固定なので、事前にテクスチャにして(文字列をテクスチャ化する)おくことで何とかなってる。 でも、やっぱりその固定の文字列を作るために AECHA…

自前のストリームクラスに unzip ストリームを実装する

BREW には IUnzipAStream というのがあるのだけれども、これは IUNZIPASTREAM_SetStream() で IAStream を継承したクラスを渡す必要がある。 しかし、もし何らかの理由(C++ の継承関係を持っている同期的なストリームクラスが欲しい!)で自前のストリーム…

色クラス

色クラスがあると何かと便利なので作ってみた。 struct color { byte b; byte g; byte r; byte a; color() : b(0), g(0), r(0), a(0) { } color(byte r_, byte g_, byte b_, byte a_) : r(r_), g(g_), b(b_), a(a_) { } color(uint32 v) { // リトルエンディ…

文字列をテクスチャ化する

OpenGL ES は文字列が扱えないので、文字列をテクスチャ化するためのクラスを作ってみた。 class string_texture { context_ptr context_; brew_ptr<IDisplay> display_; brew_ptr<IDIB> dib_; // 文字描画用のテンポラリ public: string_texture(const context_ptr& c, IDis</idib></idisplay>…

N2800 - 20.8 Time utilities の翻訳

chrono について調べる必要が出てきたので、理解を深めるために該当箇所を翻訳してみました。 http://melt.sytes.net/pukiwiki147/index.php?Memo%2F%CB%DD%CC%F5%2FN2800%20-%2020.8%20Time%20utilities%28JP%29 duration クラス duration クラスは C# で言…

OpenGL ES のパレットテクスチャを作る

glGenTextures でテクスチャの番号をもらって、glBindTexture でアクティブにして、適当にパラメータを設定して、glCompressedTexImage2D で作るだけ。 GLint texture; GLenum format; int width; int height; void* buf; int bufsize; glGenTextures(1, &te…