Hamigaki

xor_listの実装

http://d.hatena.ne.jp/y-hamigaki/20100118 の解説です。 やたら長くなったので続きを読む記法。

xor_list

暇つぶしにSTL風にXOR連結リストを書いてみました。 <hamigaki/xor_list.hpp> ドキュメント wikipedia:XOR連結リスト 要するに、某巨大掲示板で昔話題になった「マジックリスト」のことです。 そのときアップされていた某氏のコードを参考にしました。 自分も途中まで書いていたので</hamigaki/xor_list.hpp>…

cdecl_thunk on x64

__cdecl呼び出し規約用メソッドサンクcdecl_thunkをx64に対応させました。 <hamigaki/detail/x64/cdecl_thunk.hpp> x64呼び出し規約に関してはMSDNに記載されています。 http://msdn.microsoft.com/ja-jp/library/7kcdt6fy(VS.80).aspx 概要だけ書くと、 引数は可能な限りレジスタ渡し、乗らない場</hamigaki/detail/x64/cdecl_thunk.hpp>…

Hamigaki.Coroutine on x64

手始めにHamigaki.Coroutineをx64に移植しました。 差分 Win32ではファイバーデータのポインタがfs:[0x10]に入っていましたが、Win64ではgs:[0x20]になるようです。 また、ファイバーでないスレッド用のダミーポインタ値は0x00001E00のままで動いているので…

make_project

trunkのBBv2でHamigakiライブラリをビルドできなくなっていたので、jamファイルを修正しました。 差分 project.initializeが__binding__変数を要求するようになったようです。

1.39.0対応

Boost 1.39.0が出てたのでSVN trunkで再テストしました。 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi/hamigaki/trunk/status/cs-win32.html?revision=1748&root=hamigaki 修正なしで全てpassしました。

stop()後のノイズ削除

direct_sound_sinkでstop()した後ノイズが再生されるとのバグ報告を受け、close()を修正しました。 差分 ↓バグはこういう状況でした。 // 現在のバッファが書き込み中だったら if (offset_ % buffer_size_ != 0) { // 残りを0で埋める std::streamsize amt =…

DirectInput8対応

久々にDirectX SDKを更新したところ、dinput.libがなくなっていたのでDirectInput8に対応しました。 差分 CygwinとMinGWはlibdinput8.aだけあってヘッダがないので、SDL用の古いバージョンのままです。 Jamfileでは、gccだけDIRECTINPUT_VERSION=0x0500を定…

Boost 1.38 devel対応

ようやく遅い夏休みです。 昨日は一日中ぼーとしてましたが、今日は少しコーディングできました。 サボってる間にBoost 1.37も出てしまったので、SVN trunkの1.38系に対応しました。 差分 cs-win32.html というか、Boost.Date_Time内のインクルードが足りて…

tar_replace_test

フォーラムで質問があったtarファイルの部分書き換えのテストを追加しました。 libs/archivers/test/tar_replace_test.cpp lzh_replace_test.cppを書き換えただけなので、実質作業時間は2〜3分程度です。 なかなか作業時間がとれない、、、。

Compiler Status 更新

ネットが復活したところで、Win32だけRegression Testsを走らせてみました。 http://hamigaki.sourceforge.jp/status/ BoostのSVN trunkは既に1.37に移行していて、 一部コンパイルが通らなくなっていたのでついでに修正しました。 <boost/strong_typedef.hpp>を<boost/serialization/strong_typedef.hpp>に変更 gcc 3.4.5でL"\u</boost/serialization/strong_typedef.hpp></boost/strong_typedef.hpp>…

Boost 1.36.0対応

光開通は来週末になりそうですが、 ここ1週間ほどはD4の通信が安定しているので、Boost 1.36.0対応差分をコミットしました。 差分 Boost.Filesystemで関数名が変更された箇所の対応が主なので、 http://svn.boost.org/trac/boost/wiki/ReleasePractices/Hot…

optional_iteratorの除去

逆アセンブルリストを比較しているとインライン化の妨げになっているようだったので、optional_iteratorを使わないようにしました。 差分 COWベースのstring_list(注:名前はlistだけど実体はvector)で、リストが空でvectorが作成されていない状態のbegin()/e…

BOOST_SPIRIT_USE_LIST_FOR_TREES

マクロBOOST_SPIRIT_USE_LIST_FOR_TREESを定義した場合にコンパイルできない問題だけ修正しました。 差分 通常、Boost.Spiritの構文木は、 template<class T> struct tree_node { typedef std::vector<tree_node<T> > children_t; T value; children_t children; }; のような構造体</tree_node<t></class>…

続々 ドキュメントのビルド方法

FOPの説明を追加しました。 http://hamigaki.sourceforge.jp/doc/html/installation/documents.html ついでにindex.htmlにWeb上の「ドキュメントのビルド方法」へリンクを張っておきました。 これでビルド方法を調べるためにビルドしなければいけない問題も…

続 ドキュメントのビルド方法

ツールセットのオプションについての説明を追加しました。 http://hamigaki.sourceforge.jp/doc/html/installation/documents.html あとFOPの説明が抜けてます。

ドキュメントのビルド方法

ドキュメントのビルド方法について、必要最低限のことだけドキュメントに追加しました。 http://hamigaki.sourceforge.jp/doc/html/installation/documents.html あー、これを読むためにはドキュメントのビルドが必要でした、、、。 TODO: 設定の詳細追加 re…

パースエラー

今日は全然縮まなかったので、以前デバッグ中に見つけたクラッシュするパターンを調査しました。 原因はデバッガで覗くとすぐに判明。include文で読み込んだjamファイルのパースが成功したかどうかチェックしていないだけでした。 とりあえず適当な例外を投…

Re: bjam高速化 その5

string_listの要素アクセスで、 const std::string& string_list::operator[](size_type n) const { if (n < size()) return (*pimpl_)[n]; else return dummy; } みたいなことをしていると勘違いして、ループ内部でアクセスする場合にサイズチェックが無駄…

bjam高速化 その8

今日も測定に時間がかかってあまり進んでません。 ローカル変数は「値の設定時に古い値を取っておいて、後で元に戻す」ことで実装しているのですが、元に戻す際にmapを探索するのが無駄なのでポインタを覚えて置くようにしました。 差分 実行時間はこうなり…

bjam高速化 その7

TICKを仕込む範囲を狭めていって、コードを調べていたところ、変数の展開処理に明らかな無駄があったので修正しました。 差分 jam言語の変数展開では修飾子によって変数の値を加工できるため、変数展開の度に文字列リストを生成していたのですが、 X = $(HOG…

bjam高速化 その6

Hamigaki.Bjamでは組み込みルールを自分で追加できるので、これを使ってjamファイルの計測をしてみました。 namespace bjam = hamigaki::bjam2; bjam::string_list tick(bjam::context& ctx) { std::cout << ::GetTickCount() << std::endl; return bjam::st…

bjam高速化 その5

今日は単純なループの手抜きを直しました。 差分 for (std::size_t i = 0; i < vec.size(); ++i) ... を for (std::size_t i = 0, size = vec.size(); i < size; ++i) ... に変えただけです。 「STLアルゴリズムを使え!」という感じですが、途中で抜ける条…

bjam高速化 その4

文字列キャッシュを作ろうと思ったんですけど、bjamのソースを見るとBoost.Flyweight同様に一旦文字列をコピーしているようで、あまり効果がないかもしれず取りやめました。 結局、今日はほんの少ししか改善できませんでした。 差分 う〜ん、後は片っ端から…

Boost SVN r45117 対応

Boost.Flyweightビルド時にコンパイルが通らず、久々にsvn updateしたらexec.jamが動かなくなっていたので直しておきました。 差分 importを追加しただけです。 ルールを別モジュールにIMPORTした場合、そのルールはIMPORT先のモジュール内で動作するため、…

bjam高速化 その3

文字列をキャッシュしてどれくらい速くなるかのテストとして、文字列リスト(hamigaki::bjam2::string_list)の要素をBoost.Flyweightに差し替えてみました。(参考: wikipedia:Flyweight パターン) まだSVN trunkにコミットされていない キャッシュは静的変数…

bjam高速化 その2

今日もいくつか変更を加えたんですが、実行時間は誤差程度しか変化ありませんでした。 プロファイリングの上位にある関数に手を加えてもあまり変わらないということは、ボトルネックの部分がインライン化されて多くの関数に分散しているということかもしれま…

bjam高速化 その1

Windows版もSolaris版の速度に近づいてきたので、今日はSolarisでのプロファイリング結果を参考にしながら高速化していました。 skip_parserをruleを使わない独自実装に置き換えた expand_variable()で直積を作る必要がない場合に関数を中断するように変更 t…

_SECURE_SCL

VC++用のまともなプロファイラが手元にないので、結果に影響ない範囲で同じ関数を二度呼ぶ手法で所要時間の概算を調査しています。 例えばnew/deleteの時間を測るには、 #include <new> #include <cstdlib> void* operator new(std::size_t size) throw(std::bad_alloc) { </cstdlib></new>…

file_status_cache

boost::filesystem::statusとディレクトリリストをキャッシュするfile_status_cacheを実装してみました。 今日の差分 このキャッシュは期限も容量制限もなく、単に蓄積されます。 更新時間のチェックもしていないので、bjam実行中に追加や削除が行われても反…