C++

Unicodeの相互変換

C++

これも巷に溢れてるけど、Unicodeの変換ってどうなってるのかよく知らなかったから勉強がてらに書いてみた。 //#include <cstdint> namespace std { typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; } #include <utility> #</utility></cstdint>…

汎用的な CSV リーダーを作ってみた

C++

いやまあ、もうこんなの巷にいくらでも溢れてるだろうけど。 こいつの特徴は、どのヘッダにも依存しないってこと。 iterator_traits のために を使いました。まあでも とかそういうバイナリに影響するものじゃないし、これぐらいならいいよね? テンプレート…

プログラムを書くということ

C++

自分にとって、プログラムを書くということは、コンパイラに対して意味を与える作業だと考えるようになりました。 意味というのは型だったりconstだったり。あとプログラムの流れというか文脈とかもあります。 型は具体的であればあるほど、コンパイラが意味…

ローカル変数に対するconst

C++

って付けるべきなのか付けないべきなのかーと少し考えてみました。 constを付けるメリットとしてよく聞くのが、 struct Hoge { int v; void reset(int n) { v = n; } }; void f() { const int n = 100; const Hoge h = { 10 }; ... // いろいろな処理 n = 50…

array の初期化

C++

昔、ネストした配列が初期化できなくて array を使うのを諦めたのですが、 http://d.hatena.ne.jp/nagoya313/20100401/1270137582 を読んで、もしかしていけるんじゃないかと試してみました。 昔は // これは OK const int ar1[3][2] = { { 1, 2 }, { 3, 4 }…

デストラクタを呼ばずに再構築

C++

例えばこういうの。 void* p = new char[sizeof(int)]; int* pn = new (p) int(0); pn = new (p) int(42); // デストラクタを呼ばずに再構築 int の場合は POD 型なので問題ないことは分かりますが、例えばこんな場合はどうなるか。 struct hoge { ~hoge() {…

リファレンスに対する 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 を使ってプ…

並カン行ってきました。

C++

Twitter のまとめ→並カン2010 - Togetter #namikan タグ使った人を多分大体は放り込んでみた→http://twitter.com/melponn/namikan RT を 1 回しただけって人も、並列プログラミングには興味がある人だろうと思って一緒に入れてます。 mootoh さん(Twitter)の…

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 入るかどうか分からないライブラリなのでインターフェース部分の話じゃなくて実装の話をメインにやりたいと思います。 まだ資料作ってる途中ですががが

整数の除算とシフト演算子の仕様

C++

C++ の除算はどうなってるんだろう…後で調べてみよう RT @rane_hs: "割り算の結果はすべて 0 方向に切り捨てる"あとでソースを探した方がいいかも知れない : プログラミング言語 C の新機能 http://seclan.dll.jp/c99d/c99d05.htm http://twitter.com/melpon…

Coroutine を FSM コードへ変換したい

C++

この辺ひどいよね! id:melponがコンパイルタイムCoroutineを作ったので近々公開予定だとか! id:DigitalGhostさんがあらわれた - Faith and Brave - C++で遊ぼう melponさんは、「俺、コンパイル時Coroutine書いたあるぜ」と豪語した 本の虫: 旅日記 めるぽ…

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

名前付きの値

C++

例えば何かの種類を表すときの表現として、int だと何を意味しているのか分からないので typedef int hoge_t; とか書いたりすることはあると思うんだけど、これだと void foo(int v); hoge_t h; foo(h); // OK とかできてしまうのがなんか微妙なので、こんな…

ミリ秒単位で現在時刻を取得する関数

BREW にはいくつかの時間を取得するための関数があります。 GETTIMESECONDS() は 1980年1月6日00:00:00 からの秒数を返します。 GETTIMEMS() は 00:00:00 からの時間を取得します。 この2つの関数を組み合わせれば、1980年1月6日00:00:00からの経過時間をミ…

固定小数点数クラスのデバッグ

以前作った固定小数点数クラスですが、これを使ったプログラムを VisualStudio のデバッグ実行で値を見ようとすると、以下のように表示されます。 この数字は内部の変数が保持している数字なのですが、これは 65536 倍された値なので表現している値は 65536 …

2次元アフィン変換の高速転送(3)

2次元アフィン変換の高速転送(1) 2次元アフィン変換の高速転送(2) 穴あきの問題は解決したので、次は速度が遅いという問題について考えてみます。 前回のプログラム 前回のコードは // 逆行列を求める matrix inv(mat); inv.invert(); for (int y = lt.y; y …

2次元アフィン変換の高速転送(2)

2次元アフィン変換の高速転送(1) 前回でアフィン変換を行うための行列クラスを作ったので、今回は実際に転送を行ってみようと思います。 オレオレ用語 転送元と転送先と書くと、パッと見分かりづらいので、それぞれ src, dst と書くことにします。 とりあえ…

2次元アフィン変換の高速転送(1)

最近、BREW でアフィン変換を掛けながら転送する処理を書きました。 2,3回ぐらいに分けてそれを書いていきたいと思います。 固定小数点数 基本的に計算は全部固定小数で行っています。固定小数点数クラス fixed は以前書きました。 固定小数点数クラス - mel…

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

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>

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

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

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

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