Matchaのイベントデータ構造
Matchaアプリケーションはイベントドリブンな動作モデルが基本です。複数のイベントポート(イベントポートという名称は暫定)からのイベントを共通のハンドラで補足します。そのためイベントクラスは抽象クラスで表現されます。
シングルプロセスで完結しているアプリケーションモデルであれば、またデバイス等の拡張の要求が少ないライブラリであれば特殊イベントクラスを実装、dynamic_castでデータの参照でもよかったでしょう。しかしMatchaは分散プロセスを念頭においており、イベントはプロセス間で透過的に受け渡ししたいです。また対応デバイスを増やすごとにライブラリのバージョンを変更するのも面倒です。さらに、ライブラリに依存せずコードの変更だけで増加したイベントの種類に対応したい。
そうなるとイベントのデータ構造はキーバリューで、そしてIPCのためにシリアライズに対応したい。これらをどう実現するかが悩みでした。どっちも自分で実現するのは手間がかかるしバグも持ちそうだなぁってことでいろいろ調べてたんですが、灯台下暗し、Boostで実現できそうです。
キーバリューの問題は異なるデータ型をstd::stringをキーにしたstd::mapに格納することです。これはanyで実現できます。そもそもanyの実装の動機がプロパティの実現でした。シリアライズもそのものずばりserializeがあります。どちらも信号データを乗せるときのパフォーマンスが気になりますが、多分なんとかなるでしょう。最悪大量のデータについては別経路で隠蔽するかもしれません。
anyもserializeもTR1でないということが趣味的には多少気になりますが、これで設計上の大きな山が片付きそうです。
もうひとつの山はIPCのパターンの分析と実装方法の検討ですな。