Boost

Boost 1.34.1リリース

なんだか存在が空気なBoost 1.34.1がリリースされました。 MLでもRC1〜RC3の頃からほとんど反応ないです。 とりあえずダウンロードしましたが、以後の作業は1.35向けのHEADで行うことにします。 まぁ、もうすぐSVNに移行するんでしょうけど。

複数のツールセットからICUを使う

今日も引き続きビルド環境の整備中です。 Boost.RegexにはICUを使うオプションがあるのですが、ツールセット毎に設定を行えるわけではないので困ります。 そこでこれを無理やりカスタマイズする方法を考えました。 以下はVC7.1用のビルド済みICUをC:\tools\i…

Boost.Optional on Visual Studio IDE

以前書いた、Boost.Optionalの中身がVisual Studioのデバッガで覗けなくて不便という件ですが、調べたらそのものズバリな話題が少し前にMLに投稿されていました。 boost::optional<*>{ preview ( #if( !$c.m_initialized ) ( #( "Uninitialized" ) ) #else (…

phoenix::logical_not_op

Safe Bool Idiomを使って、string_listをbjamの変数と同じように成否判定できるようにしてみました。 要するに、 string_list a("true"), b; if (a) std::cout << "if (a)" << std::endl; if (!b) std::cout << "if (!b)" << std::endl; のように書けるよう…

shared_ptrでCOW

昨日はベクタのコピーを避けるようにしたわけですが、bjam_grammarでクロージャを使い出すとどうしてもコピーが発生してしまうので、Copy On Write(COW)の最適化を施すことにしました。 <hamigaki/bjam/util/list.hpp> 実装にはboost::shared_ptrを使っていて、必要に応じてオブジェクトを</hamigaki/bjam/util/list.hpp>…

1.34

Boost 1.34がリリースされました。 Hamigakiライブラリも1.34の新機能に対応したいところですが、CygwinやFedoraのパッケージが揃うまで1.33.1との両対応でいきたいと思います。 TODO: BOOST_FILESYSTEM_NO_DEPRECATEDを定義した状態でコンパイルできるよう…

nocalc

Boost.Spiritの利用例としてBoost.Waveのソースを少し読みました。(Waveの存在自体を忘れていました。) Boost.Spiritのサンプルでは単純すぎる場合が多いので、いろいろと参考になります。 Boost.Waveでもパースと値の評価を同時進行で行っているようで、「…

bjam_win その16 クロージャの初期値

bjam_grammarのwhile、ルールの名前付き引数、ローカル変数/ルールを実装しました。 bjam_grammar.hppの差分 これでBoost.SerializationやBoost.Statechart等の複雑なJamfileでもターゲットのリストを取得できるようになりました。 今日気が付いたことは、ク…

bjam_win その15 Grammarの戻り値

bjam_grammarのブロック、if、forを実装しました。 bjam_grammar.hppの差分 変数とルールのスコープがおかしかったバグとルール呼び出しの結果が常に空になるバグも修正しています。 今日ハマったのはSpiritのGrammarの戻り値に関してです。 struct bjam_gra…

短絡評価の実装

引き続きbjamインタプリタの実装中です。 現在、if/whileの条件部分と変数の代入までは出来ていて、あとはルール呼び出しを実装できればそれなりに動くはずというところです。 bjamの「&&」と「||」は優先順位が同じで、短絡評価もされるので次のようになり…

no_actions_d

前にno_actions_dは使わないと書いてましたが、使い方が分かったので、これを使ってbjam_grammarを書き直しています。 no_actions_dディレクティブを使う場合、対象となるパーサーのスキャナがno_actions_scanner<Scanner>::typeである必要があります。 この制約は再</scanner>…

var_expand_grammar その3

今日は残りの変数展開修飾子を実装しました。 差分 :D (親ディレクトリの選択) :D=path (親ディレクトリの置換) :B (ベースファイル名の選択) :B=base (ベースファイル名の置換) :S (拡張子の選択) :S=suf (拡張子の置換) :M (アーカイブメンバの選択) :M=me…

var_expand_grammar その2

var_expand_grammarをいくつかの修飾子に対応させました。 今日の成果物 修飾子は変数を展開するときに適用されるフィルタのようなもので、 X = abc ; ECHO $(X:U) ; # 「ABC」を出力のように使います。 実装した修飾子は以下の通りです。 [n]、[n-]、[n-m] …

1.34 beta

ここを読んでる人には言わずもがなですが、Boost 1.34のベータ版がリリースされました。 CVS追ってるので、今更感はありますが。 一時期Boost.Asioが間違って1.34ツリーに入ってたんで、ちょっと前まで1.34に入るとばかり思ってましたが、1.35まで入りません…

var_expand_grammar

簡易bjamインタプリタ実装の手始めとして、変数の展開を行うパーサー(?)var_expand_grammarを作りました。 bjam(というかjam)の変数展開は直積集合を形成するのが特徴的です。 X = a b c ; ECHO t$(X) ; # 「ta tb tc」を出力これを素直に表現するため、変数…

bjam_win その10

今度はBoostのルートJamfile.v2で問題が発生しました。 libraries = [ libraries-to-install $(all-libraries) ] ;これが、スキップパーサーのせいで、 lib raries = [ lib raries-to-install $(all-libraries) ] ;のように分割されてしまいました。 libルー…

bjam_win その9

昨日の予想通りの方法で、テストのターゲット名取得を実装しました。 これでBoostのtest用Jamfile.v2の大半はパースできるようになりました。 以下、実装の解説です。

Boost 1.34 のスキップパーサー

昨日のBoost 1.34で上手くパースできない問題ですが、CVSの履歴を二分探索で追ったところ、2005/10/18の変更が影響していました。 http://boost.cvs.sourceforge.net/boost/boost/boost/spirit/core/scanner/impl/skipper.ipp?r1=1.8&r2=1.9 Boost 1.33.1ま…

bjam_win その6

bjam_grammarがそれなりに動くようになったので、bjam_winに組み込んでみました。 今日の差分 名前はbjam_grammarですが、exe/libのターゲット名を取り出すことにしか使えません。 exe = "exe" >> literal[push_back_a(self.storage)] >> ':' >> *( varexp |…

bjam_grammar

bjamのパーサーをBoost.Spiritで書いています。 これまでBoost.Spiritで大きなパーサーは書いたことなかったので四苦八苦しています。 ↓とりあえず、これでかなり悩みました。 Boost.Spirit FAQ: The lexeme_d directive and rules FAQに従うと、jamのリテラ…

Boost.Processを試す

ふと新たなアプリのネタを思いついたのですが、それで子プロセスと通信する必要があったので、Boost.Processを試してみました。 以下のコードは、Boost Vaultにアップされているバージョンではなく、SoCのSVNリポジトリの最新trunkバージョンです。 #include <boost/process.hpp></boost/process.hpp>…

のんびり調整中

Boostのinspect(ソースコードやドキュメントがBoostのガイドラインに従っているかチェックするツール)が1.34でかなり手を加えられているので、久々にチェックしてみました。 結果、一部のドキュメントでbroken linksが検出されたので修正しておきました。 相…

library-path feature

昨日の<search>に関する問題は、BBv1同様<library-path>を使うことで解決できました。 <library-path>はマニュアルに記述がありませんが、BBv1のものと同じと考えてよさそうです。 これを使うと、昨日の例も素直に実装できます。 # site-config.jam # 前半部は略 # 汎用 alias dxsdk : : : : <include>$(DX</include></library-path></library-path></search>…

search feature

昨日の<search>が動かない問題は、<search>の使い方を間違えていただけでした。 BBv1の<library-path>に相当するものだと思って使っていたのですが、どうも<search>は<name>と一緒に使わなくてはいけないようです。 ドキュメントでも、 The name property specifies the name that should be passed to th</name></search></library-path></search></search>…

続々 BBv2に移行中

昨日はHamigaki.Iostreamsと間違えてHamigaki.ArchiversのJamfileをコミットしていたので、改めてHamigaki.IostreamsのJamfileとHamigaki.Archiversの修正版Jamfileをコミットいました。 archivers/test/Jamfile.v2 iostreams/build/Jamfile.v2 iostreams/te…

続 BBv2に移行中

BBv2でライブラリのビルドができました。 Hamigaki.FilesystemのJamfile.v2 昨日動かなかったのは、プロジェクトのルートにあるJamfile.v2がバグっていたせいでした。 Jamfile.v2の差分 projectのrequirementsに書いた「$(BOOST_LIBPATH)」が邪魔だったよう…

BBv2に移行中

ビルド不要のライブラリのユニットテストのみBBv2用のJamfileを用意しました。 Hamigaki.BinaryのJamfile.v2 boost-1_34というブランチを作ってみたんですが、ViewCVSだと探しにくいですね。 trunkのリビジョンのまま、branches配下を覗くと空っぽだったので…

Boost1.34 移行準備開始

ちょうど切りがいいので、そろそろBoost1.34へ移行準備を始めようと思います。 1.34からはビルドシステムがBoost.Build V2になりますが、HamigakiライブラリのJamfileをV2に移行するのは面倒なので、ひとまずヘッダとライブラリだけ1.34、Boost.Buildは1.33.…

タイムゾーンオフセット

タイムゾーンオフセットを取得しようとして詰まりました。 POSIXならtimezone、Windowsなら_timezoneを見れば済むと思っていたのですが、このグローバル変数はtzset()やlocaltime()などを呼ぶまで設定されないようになっています。 それでもシングルスレッド…

date_time

予定通りBoost.DateTimeを使ってiso9660::date_timeとfilesystem::timestampの相互変換を実装してみました。 date_time.hppの差分binary_date_time→timestampの場合はこんな感じです。 struct binary_date_time { boost::optional<filesystem::timestamp> to_timestamp() const { us</filesystem::timestamp>…