読者です 読者をやめる 読者になる 読者になる

Boostのレビュー状況 2009/06

C++

BoostML - Review Wizard Status Report for June 2009


【Future】
Boost.Range Extension : 採択
Polynomial Library : リジェクト
Constrained Value : 未決


【以前からの問題点】
・2007/08に採択された時系列(Time Series)ライブラリはまだ提出されていません。
浮動小数点ユーティリティライブラリはまだ提出されていません。
 Boost.Mathライブラリに統合される予定です。
・2008/01に仮採択されたSwitchライブラリは、完全な採択のための提出はまだされていません。
・2008/09に仮採択されたPhoenixライブラリは、完全な採択のための提出はまだされていません。
 Protoメタプログラミングライブラリに基づいたPhoenixの書き直しがたった今始まりました。


【一般的な発表】
私たちは常に、経験を積んだレビューマネージャーを必要としています。


〜中略〜(レビュアーが全然足りないそうです)


レビューキュー
・Lexer
・Shifted Pointer
・Logging
・Log
・Join
・PImpl
・Thread Pool
・Endian
・Meta State Machine
・Conversion
・Sorting
・GIL.IO
・AutoBuffer
・String Convert


【Lexer】
作者 : Ben Hanson
レビューマネージャー : Eric Neibler
ダウンロード : http://boost-consulting.com/vault/index.php?action=downloadfile&filename=boost.lexer.zip&directory=Strings%20-%20Text%20Processing
説明 :
flexによってインスパイアされたプログラマブルな字句解析器(lexical analyser)ジェネレータです。
flexのように、正規表現によってプログラムされ、圧縮のための同値類(equivalence class)を利用する
多くのDFAとしてステートマシンを出力します。


【Shifted Pointer】
作者 : Phil Bouchard
レビューマネージャー : 必要としている
ダウンロード : http://www.boost-consulting.com/vault/index.php?&direction=0&order=&directory=Memory
説明 :
スマートポインタは、ユーザーが最大限に活用する特定のリソース(メモリ使用量、CPUサイクル、扱いやすい…)のために
最適化されます。このスマートポインタの目的は、参照カウント(あるいは所有権)およびオブジェクトそれ自身を
同時に割り当てることで、動的メモリ管理が加速され、メモリマップよりも安い状態に単純化することです。


【Logging】
作者 : John Torjo
レビューマネージャー : Gennadiy Rozental
ダウンロード : http://torjo.com/log2/
説明 :
適切に使用されるLoggingは非常に強力なツールです。デバッグ/テストの支援に加え、
それはさらにあなたのアプリケーションがどのように使用されるかあなたに示すことができます。
Boost Logging Libraryは多くのシナリオをサポートし、非常に単純なものから(ひとつの
目的地にすべてダンプする)、非常に複雑なもの(複数のログ、一部を有効/一部を無効、
レベル、etc...)まで可能にします。それは非常にシンプルで柔軟なインタフェース、
メッセージの効率的なフィルタリング、スレッド安全性、フォーマッタおよび目的地、
ログの容易な操作を特徴とし、あなたのアプリケーションのニーズに基づいた
最良のLogger/フィルタクラスを見つけて、あなた自身のマクロと、より多くのものを定義できます!


【Log】
作者 : Andrey Semashev
レビューマネージャー : 必要としている
ダウンロード : http://tinyurl.com/cm9lum
説明 :
このライブラリは、アプリケーションにロギング機能を加えるための支援を目的としています。
syslogサーバーあるいはWindowsイベントログへログを送る、フォーマットと属性に基づいて
フィルタリングする、あるいは単にファイルにログを格納するといった、多くの広く用いられる
性能を常識破りにサポートします。さらにそれは、設定ファイルからのライブラリ初期化を行う
基礎的なサポートも行います。このライブラリはアプリケーションイベントに関して広範囲の
タスクと手段を集め、処理の統計情報やユーザーへの通知に使用することができます。


【Join】
作者 : Yigong Liu
レビューマネージャー : 必要としている
ダウンロード : http://channel.sourceforge.net/
説明 :
Joinは非同期の、join算法(join calculus)に基づいたメッセージベースのC++並列性ライブラリです。
それはマルチスレッドのアプリケーション、非同期の組織化、イベントベースアプリケーションに
適用可能です。Comegaの設計とBoost facilitiesによる実装と構造に従います。
それは非同期メソッド、同期メソッド、そして同期・非同期性と並列性を定義する「joinパターン」を
一致させることにより、高水準の並列性APIを提供します。


【PImpl】
作者 : Vladimir Batov
レビューマネージャー : 必要としている
ダウンロード : http://www.boost-consulting.com/vault/index.php?action=downloadfile&filename=Pimpl.zip&directory=&

http://www.ddj.com/cpp/205918714 (ドキュメント)

説明 :
Pimplイディオムは、インターフェースと実装の分離、
および実装を隠すことにより結合を最小化する、シンプルであるが強健な技術です。
このライブラリは、PImplイディオムに便利で柔軟な、ジェネリック配置テクニックを提供します。
その外見は完全で広く適用可能で、にも関わらず小さく単純で、使用することが楽しい。


【Thread Pool】
作者 : Oliver Kowalke
レビューマネージャ : 必要としている
ダウンロード : http://www.boostpro.com/vault/index.php?action=downloadfile&filename=boost-threadpool.2.tar.gz&directory=Concurrent%20Programming
説明 :このライブラリは以下を提供します:

    • スレッド生成ポリシー:ワーカースレッドの管理を決定する
      • プール中のスレッドの固定セット
      • 要求に応じて(コンテキストに依存して)ワーカースレッドを作成する
      • 一定のアイドル時間のあとにワーカースレッドをタイムアウトさせる
    • チャンネルポリシー:キューに置かれたタスクへのアクセスを管理する:
      • 待ち状態タスクのための高/低水準による制限のあるチャンネル
      • キューに置かれたタスクの無制限の数による無制限のチャンネル
      • rendezvousは、producerとconsumerのスレッド間で同期を渡す(怪しい訳。このへん参照)
    • キューポリシー:タスクがチャンネルからどのように取り除かれるかを決定する
      • FIFO
      • LIFO
      • 優先順位キュー(タスクに属性を割り当てる)
      • スマートな挿入と抽出(たとえば、最も新しい属性を持った最も古いタスクを取り除く)
    • タスクはチェーンにすることができ、また、Lazyなタスクの提出(submit)もサポートされます(Braddocksの将来のライブラリのおかげ)
    • submit関数からタスクオブジェクトが返されます。タスクはそれ自身がcooperative(協力的?)であれば中断することができる。(このコード"this_thread::interruption_point()"が、それがいくつかの中段ポイントを持っていることを意味する)


【Endian】
作者 : Beman Dawes
レビューマネージャー : 必要としている
ダウンロード : http://mysite.verizon.net/beman/endian-0.10.zip
説明 :
ヘッダは、バイトオーダー、値型、サイズおよびアライメント上の
明示的な制御で整数ライクなbyte-holder binary型を提供します。
typedefは、共通設定で使いやすい名前を提供します。


これらの型は特定のコンピュータアーキテクチャとは無関係に、整数データにポータブルな
バイトホルダーを提供します。ユースケースは、ほぼ常にファイルかネットワーク接続の
いずれかによるI/Oを含んでいます。データのポータビリティは主要な動機ですが、
これらの整数バイトホルダーもそれらがそうでなければ利用可能でない2進整数サイズを
提供するので、メモリ使用、ファイルサイズあるいはネットワーク活動を
縮小するために使用されるかもしれません。


【Meta State Machine】
作者 : Christophe Henry
レビューマネージャー : 必要としている
ダウンロード : http://www.boostpro.com/vault/index.php?direction=0&order=&directory=Msm
説明 :
Msmは、あなたが素直に、記述的で、使いやすい方法で有限ステートマシンを構築することを
可能にするフレームワークです。それは、UMLステートマシンダイアグラムから
working programを生成する最低限の労力を必要とします。この作業は、
David AbrahamsのAleksey Gurtovoy著書『C++ Template Metaprogramming』で述べられた
ステートマシンによってインスパイアされ、UMLデザイナーが
UMLステートマシンフレームワークから要求しているものをほぼ全て加えます:

    • メソッドの入り口と出口
    • ガード条件
    • サブステートマシン(UMLでいうところのcomposite state)
    • 履歴
    • 擬似状態(Pseudo-State)を終了させる
    • 延期されたイベント(Deferred Events)
    • 直交ゾーン(Orthogonal zones)
    • サブステートマシンへの明示的な入り口
    • フォーク(Fork)
    • 疑似状態の入口/出口
    • 衝突する遷移(Conflicting transitions)


【Conversion】
作者 : Vicente Botet
レビューマネージャー : 必要としている
ダウンロード : http://www.boostpro.com/vault/index.php?action=downloadfile&filename=conversion.zip&directory=Utilities&
説明 :
無関係な型の間のGenericな明示的型変換。
Boost.Conversionは以下を提供します:

    • 無関係な型の間の明示的型変換を作るためにユーザーによって特殊化できるGenericな"convert_to"関数
    • 無関係な型の間の明示的な代入をするためにユーザーによって特殊化することができるGenericな"assign_to"関数
    • 明示的に変換可能な型の"std::complex"との変換
    • 明示的に変換可能な型の"boost::optional"との変換
    • 明示的に変換可能な型の"boost::rational"との変換
    • 明示的に変換可能な型の"boost::interval"との変換
    • "boost::chrono::time_point"と"boost::ptime"との変換
    • "boost::chrono::duration"と"boost::time_duration"との変換


【Sorting】
作者 : Steven Ross
レビューマネージャー : 必要としている
ダウンロード : http://www.boostpro.com/vault/index.php?action=downloadfile&filename=algorithm_sorting.zip
説明 :
std::sortに優秀な(?)最悪なケースと平均なケースの性能を提供する、
3つのテンプレート化された高水準なradix/comparison-basedソートアルゴリズムのグループです:
右シフト(デフォルトは>>)と比較演算子(デフォルトは<)をサポートする固定サイズデータ型をソートするinteger_sort。
整数に安全にそれらをキャストすることにより標準の浮動小数点数をソートするfloat_sort。
可変長データ型をソートし、8ビット文字列のために最適化されるstring_sort。


3つのアルゴリズムは全て、kがデータ型のビット数でsがconstantな場合に
O(n(k/s + s))ランタイムと、制限メモリオーバーヘッド(現実的な入力用のkB)を持ちます。
テストでは、integer_sortはプロセッサ、コンパイラの最適化、
データ配分によってstd::sortより35%から8倍速くなります。
float_sortはx86プロセッサ上のstd::sortよりおよそ7倍ほど速いです。
string_sortはstd::sortよりおよそ2倍ほど速いです。


【GIL.IO】
作者 : Christian Henning
レビューマネージャー : 必要としている
ダウンロード : http://gil-contributions.googlecode.com/files/rc2.zip
説明 :
boost::gilのための、様々な画像形式(tiff, jpeg, png, etc)を読み書きすることを
可能にするI/O拡張です。このレビューは、さらに新しいカラースペース、
アルゴリズムなどのような、gilにある一般的な機能性を追加する
ツールボックス拡張を含んでいるでしょう。


【AutoBuffer】
作者 : Thorsten Ottosen
レビューマネージャー : 必要としている
ダウンロード : http://www.cs.aau.dk/~nesotto/boost/auto_buffer.zip
説明 :
Boost.AutoBufferは、効率的な動的ローカルバッファのためのコンテナを提供します。
さらに、コンテナはより大きな柔軟性とよりよい性能を提供し、
std::vectorの代わりとして使用されてもいいでしょう。


【String Convert】
作者 : Vladimir Batov
レビューマネージャー : 必要としている
ダウンロード : http://www.boostpro.com/vault/index.php?action=downloadfile&filename=boost-string-convert.zip
説明 :
このライブラリは、string-to-typeとtype-to-string変換の領域で、
boost::lexical_castのアプローチをとり、過去のboost::lexical_castの
経験と進歩に基礎を置く、さらなる変換機能性を提供します:

    • 変換失敗をthrowする/しないの振る舞い
    • 変換失敗時にデフォルト値の返却をサポート
    • 2つの型の変換失敗チェック -- basic and better/safe
    • 標準IOストリームおよび標準(あるいはユーザー定義)のストリームマニピュレータ(std::hex、std::scientificなど)に基づいたフォーマットサポート
    • boost::range準拠のchar/wchar_tベース文字列コンテナのサポート
    • ターゲット型にDefaultConstructibilityを要求しない


これは例えば、設定ファイルを広範囲に利用したり、相当なデータ量をXML等で
処理/準備しなければならないアプリケーションでは必須のツールです。


=========================


現在あなたが開発している、レビューに提出予定のライブラリを知らせてください。



【Mirror】
作者 : Matus Chochlik
ダウンロード : http://svn.boost.org/svn/boost/sandbox/mirror/doc/index.html
http://www.boostpro.com/vault/index.php?action=downloadfile&filename=mirror.zip
説明 :
Mirrorライブラリの目標は、namespace、型、typedefされた型、クラスとそれらの
基本クラスのような一般的なC++の構成物について、コンパイルタイムと
ランタイムの両方で有用な共通のメタデータを提供することです。


Mirrorは層化の原則(the principle of stratification)が念頭にある状態で
設計されていて、可能なかぎり侵入的でないようにします。いくつかの一般的な
ガイドラインに従うかぎり、新しいもしくは既存のクラスは直接Mirrorを
サポートするように計画されている必要はありません。
また、Mirrorの関連コードはクラスの定義において必要ではありません。


現在実装されるMirrorライブラリの最も重要な機能は以下を含んでいます:

    • typedefされた型名、ポインタ、参照、cv修飾型、配列、関数およびテンプレート名のような派生型(?)の型名のサポートによる型名のクエリ。nested-name-specifiersを持つ/持たない名前もクエリできます。
    • 型が定義されたスコープの検査
    • 基本クラスの一様でジェネリックな検査。それらが仮想継承されていてもいなくても、基本クラスの特性とアクセス指定子(private, protected, public)を検査できます。
    • クラスのメンバ属性の一様でジェネリックな検査。コンパイルタイムでは、クラスの属性とそれらの型の計算、ストレージクラス指定子(static, mutable)とその他いくつかの特性をクエリすることができます。ランタイムでは、(リフレクトされたクラスのインスタンスを与えられた場合に)一様にメンバ属性の名前および/または値をクエリでき、クラスの全ての属性上のカスタムファンクタをシーケンシャルに実行することができます。
    • 任意に提供された型のインスタンス、もしくはランタイムデータのない構造に対する、ユーザー定義Visitorによるクラス(一般型)構造の横断。これらのVisitorは、クラス構造のMirrorによってガイドされ、横断中の現在位置に関する文脈の情報が任意に提供されます。


私は、これを以降の数ヶ月でレビューの準備ができることを望んでいます。


【Interval Template Library】
作者 : Joachim Faulhaber
説明 :
Interval Template Library(Itl)は、intervalと、2種類の区間コンテナを
提供します:interval_setとinterval_map。
interval_setとmapは、ちょうど要素のsetあるいはmapとして
使用することができます。しかし、要素が隣接したチャンクで現れるとき、
それらのスペースと時間ははるかに効率的です:interval。
これは明らかに、日付と時間に関連した問題を扱う分野では
多くの問題領域(problem domain)のケースです。


区間コンテナは、セグメンテーションで働くことをinterval_setの
交わる点(intersect)のために可能にします。例えば、数ヶ月のグリッドを
もつ区間コンテナと交差し、次にそれらの数ヶ月にわたって繰り返したいと思うかもしれません。


最後に、追加のintervalがinterval_mapに格納される間隔で
オーバーラップする場合、interval_mapは関連する値上の集合を提供します。
この機能はオーバーラップ上の集成体(aggregate on overlap)と呼ばれます。
以下に例を示します:

typedef set<string> guests; 
interval_map<time, guests> party; 
guests mary; mary.insert("Mary"); 
guests harry; harry.insert("Harry"); 
party += make_pair(interval<time>::rightopen(20:00, 22:00),mary); 
party += make_pair(interval<time>::rightopen_(21:00, 23:00),harry); 

// party now contains 
[20:00, 21:00)->{"Mary"} 
[21:00, 22:00)->{"Harry","Mary"} //guest sets aggregated on overlap 
[22:00, 23:00)->{"Harry"}

例からわかるように、interval_mapは(関連する値上の)累積的(accumulative)な
ものだけでなく、(時間次元上の)decompositionalな振る舞いの両方を持ちます。


【StlConstantTimeSize】
作者 : Vicente J. Botet Escriba
ダウンロード : http://www.boostpro.com/vault/index.php?action=downloadfile&filename=constant_time_size.zip&directory=Containers&
説明 :
Boost.StlConstantTimeSizeは、size関数の複雑さ(complexity)を
ユーザーに選択権を与えるために、STLコンテナlistへの
ラッパーを定義します:線形時間、定数時間あるいは疑似定数。
このライブラリの将来のバージョンでは、slistへの同様のラッパーを含むかもしれません。


【InterThreads】
作者 : Vicente J. Botet Escriba
ダウンロード : http://www.boostpro.com/vault/index.php?action=downloadfile&filename=interthreads.zip&directory=Concurrent%20Programming&
説明 :
Boost.InterThreadsは、Boost.Threadsにいくつかの機能を拡張します:

    • スレッドデコレーター : thread_decoratorは、スレッドによって一度だけ呼ばれるsetup/cleanup関数を定義することを可能にします:setupはスレッド関数の前、cleanupはスレッド関数を抜けるときに呼ばれます。
    • shared_ptr特有のスレッド:これは、他のスレッドからそのスレッド特有のコンテキストへのアクセスを提供するthread_specific_ptrの拡張です。それが共有されるように、格納されるポインタは生のポインタの代わりにshared_ptrです。
    • thread keep alive mechanism:このメカニズムは、それらがkeep_alive_pointを定期的に呼ぶことにより生きていることを示さないスレッドを検知することを可能にします。スレッドが死んでいるように宣言される場合、ユーザーが提供された関数を呼ぶと、デフォルトでプログラムを終了(abort)するでしょう。
    • スレッドタプル:スレッド数を静的に知っているスレッドが構築時に作成されるスレッドグループを定義します。
    • set_once:待機しているあらゆる変数を、一度だけ設定する変数値に通知するシンクロナイザー。
    • thread_tuple_onece:set_onceシンクロナイザーを使用して、最初に終了するスレッドを連結(join)することを可能にするboost::thread_tupleの拡張。
    • thread_group_once:set_onceシンクロナイザーを使用して、最初に終了するスレッドを連結(join)することを可能にするboost::thread_groupの拡張。


thread_decoratorとthread_specific_shared_ptrは、
Roland Schwarzによって書かれたthreadalertのオリジナルの実装に基づきます。


Boost.InterThreadsは、スレッドsetup/cleanupデコレーター、スレッド特有の共有ポインター、
keep alive mechanismおよびthread tuplesを加えてBoost.Threadsを拡張します。