Boost

typeof on VC8

久々にML読んでたら、VC8でもバグを利用してtypeof(native版)が実装できたらしいことを知りました。 http://thread.gmane.org/gmane.comp.lib.boost.devel/152648/focus=152648 なんか、MLでの反応が面白いです。 この修正がBoost 1.34に入らないであろうこ…

SeekableDevice

SeekableSourceかつSeekableSinkなコンセプトを追加しようとして困りました。 Boost.IostreamsだとSeekableDeviceになるんですけど、自分は別の意味(フィルタでないシーク可能なもの)で既に使っていました。 意味が違うと紛らわしいので、Boost.Iostreamsに…

Boost.Testが動かない

急にBoost.Testが動かなくなりました。 Boost.Testの中でSEGVになって無限ループになる場合があれば、普通に動く場合もあり、なんか変です。 多分、昨日Cygwinのバージョンアップしてからだと思います。 一旦バージョン戻してみます。 (12/24 追記) 原因はCy…

64ビットseek

ZIPの4GB超ファイルサポートを実装しようと思って、7-ZIPで6.8GBほどのZIPファイルを作成し、試していたのですが、4GB超のシークがまともに動くSourceがないことに気が付きました。 hamigaki::iostreams::file_source →オフセットがlongの範囲まで(fseekの制…

gzip_params::file_name

archive.cpp/extract.cppで.gz(.tar.gzではない)を扱えるようにしようと思って、いろんなアーカイバの動きを調べていたんですが、展開時になぜかファイル名が復元されてびっくりしました。 gzipの仕様を確認したところ、ファイル名、コメント、最終更新時間…

ReflectIn

実装し忘れていたZIPの暗号化をやっています。 鍵の更新処理にCRC-32が使われているのですが、その初期化でハマリました。 Boost.CRCでの概要はこうです。 template < std::size_t Bits, impl_def TruncPoly = 0u, impl_def InitRem = 0u, impl_def FinalXor…

参照渡しと定数

extractと同じように複数フォーマット対応のアーカイバも作りました。 archive.cpp 実装では、id:mb2sync:20060622 の問題に遭遇しました。 struct entry { boost::optional<boost::uint16_t> attributes; // ... }; struct msdos_attributes { static const boost::uint16_t </boost::uint16_t>…

std::streampos

lzh_file.hppのヘッダI/Oを書き換えるつもりでしたが、面倒くさくなってやめました。 代わりにseek関連の処理をまとめました。 <hamigaki/iostreams/seek.hpp> 多くの32ビット環境ではstd::streamoffが32ビットですが、std::streamposはそれ以上の精度を持っていることがあります。 そのた</hamigaki/iostreams/seek.hpp>…

restrictとseek()

とりあえす、LZHのLevel 0/1ヘッダーをサポートしました。 <hamigaki/iostreams/device/lzh_file.hpp> 仕様の確認などにも手間取って、LZHUFの組み込みまではできていません。 Level1ヘッダの実装中にboost::restriction::seek()の戻り値が変なことに気が付きました。 最初はバグかと思ったのですが、</hamigaki/iostreams/device/lzh_file.hpp>…

optional が欲しい

LHA用にビット単位の読み書きクラスを書いています。 ビット単位の書き込みといえばBoost.CRCにあったなと思い、インタフェースを確認したところ、こうなっていました。 template < std::size_t Bits > class crc_basic { public: void process_bit( bool bi…

non_blocking_adapter for Blocking

Boost.Iostreamsでは、今のところBlockingデバイスとNon-Blockingデバイスを区別する方法がありません。 そのため、ブロック操作が必要な場合は、 io::non_blocking_adapter<Sink> nb(snk); io::write(nb, buf, size);のようにnon_blocking_adapterでラップして強</sink>…

yield_to

coroutine::selfにyield_to()を実装しました。 まずはyield_to()の概要から説明しましょう。 typedef coro::coroutine<void()> coroutine1_type; typedef coro::coroutine<void()> coroutine2_type; void coroutine1_body(coroutine1_type::self& self); void coroutine2_bod</void()></void()>…

shared_coroutine

shared_coroutineもサポートしました。 加えてcoroutineにはmove semanticsっぽいコピー操作(単にauto_ptrに入れただけ)を追加です。 <hamigaki/coroutine/detail/coroutine_template.hpp> coroutineとshared_coroutineの違いはauto_ptrとshared_ptrの違いみたいなものです。 現状のBoost.Coroutineの実装ではin</hamigaki/coroutine/detail/coroutine_template.hpp>…

ContextImplコンセプト

現時点のHamigaki.Coroutineのcoroutineは引数なし戻り値ありのコルーチンのみ対応しています。 coroutineのレベルで複数の実装を吸収しているため、これを汎用化させると実装ごとに汎用化の作業が発生してしまい、よくありません。 coroutineより下のレベル…

bjamデバッグ用メモ

以下はBBv1に関する覚え書き。 bjam --verbose-test テストに失敗しなくても実行結果を表示する。 bjam --debugger=gdb テストの実行時にgdbを起動する。 bjam --debugger=vsjitdebugger テストの実行時にVisual Studioを起動する。

続 Fiberを使ってみる

昨日の続きです。 generatorの実装のため、coroutineに戻り値と中断処理を追加しました。 // コルーチン終了/中断時に投げられる class exit_exception : public std::exception {}; namespace coro_detail { enum state { none, // 通常 exiting, // 呼び出…

Fiberを使ってみる

Boost.Coroutineがacceptされるまで待てないので、勉強がてら簡易版の作成を画策中です。 WindowsのFiberも使ったことなかったので、まずはそちらを弄ってみました。

boost::hashとsize_t/long long

昨日の遅すぎた乱数生成を改良して、そこそこのスピードで動くようにしました。 mt19937&uniform_int&variate_generatorを使うと浮動小数点演算になって遅すぎる→rand48で代用 CRC32も重い→boost::hashで代用 なぜかLinuxで時間系の関数が異様に遅い(VMwar…

続 シードなしで乱数が欲しい

乱数の精度がそれほど必要なく、シードをスレッド固有領域(TSS)に置く場合、Windowsならstd::rand()を使うのが簡単です。なぜなら、少なくともVC++/Borland/CodeWarriorではrand()のシードがTSSに置かれるからです。呼び出し元にstd::srand()を呼んでもらう…

シードなしで乱数が欲しい

Hamigakiライブラリでは次の2箇所で乱数を生成しています。 vorbis_encoderのOggシーケンス番号 tmp_fileのファイル名の一部 現時点の実装はかなりいい加減なので、この部分を作り直しています。 Boost.Randomにはたくさんの乱数生成器がありますが、(rando…

Boost.Coroutineでスクリプト

yotto-kさんのLuaサンプルをBoost.Coroutineでやってみました。 http://www12.ocn.ne.jp/~dante98/src/non_visual_novel.cpp スクリプト部分はほぼ同じように書けます。 void main() { msg("まってくださいませ。"); int count = 0; while (true) { ++count;…

Boost.Coroutine

Google Summer Of Code 2006(SoC 2006)のプロジェクトの一つとして、C++でコルーチンを使えるようにするBoost.Coroutineというものがあります。 http://lists.boost.org/Archives/boost/2006/08/109369.php これを使えば、ここやここで議論していた列挙コー…

hamigaki::uuid

実装用クラスを別ファイルに切り出す作業を続行中です。 今日は、GUIDのパースとフォーマットを行うクラスを切り出しました。 http://hamigaki.sourceforge.jp/hamigaki/uuid.hpp GUID(グイード)はMS用語なので、より広い意味でUUIDを名前にしています。 cla…

続 signbit

とりあえず思いっきり処理系依存な方法で実装しました。 http://hamigaki.sourceforge.jp/hamigaki/math/sign_bit.hpp <math.h>でsignbit()マクロが提供されているか、i386の環境でだけ動作します。 調べた限り、i386環境ではfloat=4バイト、double=4/8バイト、long </math.h>…

signbit

符号の有無を調べるsignbit()もHamigaki.Mathに入れようかと考え中です。 こちらもMLで議論されていました。 http://thread.gmane.org/gmane.comp.lib.boost.devel/146391 なかなかポータブルな実装はできないようなので、signbit()マクロか、_fpclass()関数…

is_nan

少し前のBoost MLでNaNの判定が話題になっていたので、 http://thread.gmane.org/gmane.comp.lib.boost.devel/146001 これを参考にしつつ、Hamigaki.Audioのdetailにあるis_nanを独立したヘッダに移動してみました。 http://hamigaki.sourceforge.jp/hamigak…

続 close()のwhich

Boost.Iostreamsのソースをざっと見たところ、下記のデバイスでwide_adaptorと同様の問題が見つかりました。 tee_device basic_adapter direct_adapter mode_adapter 試しに次のようなコードを書いてみました。 #include <boost/iostreams/categories.hpp> #include <boost/iostreams/close.hpp> #include <boost/iostreams/tee.hpp> #include <iostream> nam</iostream></boost/iostreams/tee.hpp></boost/iostreams/close.hpp></boost/iostreams/categories.hpp>…

close()のwhich

iff_sourceを組み込んだところ、wave_file_testが軒並みエラーになりました。(最新のソースでは直っています) http://hamigaki.sourceforge.jp/status/原因を追ったところ、wave_file_sinkのclose()が呼ばれていないせいで、チャンクの長さが0になっているよ…

member_access_traitsのテスト

今日も細かい修正とドキュメント書きです。 member_access_traitsのドキュメントとテストも追加しました。 http://hamigaki.sourceforge.jp/doc/html/member_access_traits.html http://hamigaki.sourceforge.jp/libs/type_traits/test/member_access_traits…

続 transform_iteratorは実装の詳細?

istream_line_iteratorとostream_iteratorのドキュメントも追加しました。 http://hamigaki.sourceforge.jp/doc/html/istream_line_iterator.html http://hamigaki.sourceforge.jp/doc/html/ostream_iterator.htmlistream_line_iteratorのドキュメントを書い…