boost msm ライブラリを使用して有限状態マシンを作成しました。イベントとその遷移は、コンパイル時に宣言的に定義されます。ただし、実行時には、入力データに基づいて適切なイベントを選択するコードが必要です。現在、コードは次のようになっています。
enum : unsigned {
fin = (1 << 0),
syn = (1 << 1),
ack = (1 << 4)
// etc...
};
// events
struct receive_syn {};
struct receive_syn_ack {};
struct receive_fin {};
struct receive_fin_ack {};
struct receive_ack {};
// etc..
void receive(const Segment& segment)
{
switch (segment.getFlags())
{
case syn|ack: state_machine.process_event(receive_syn_ack{}); break;
case syn: state_machine.process_event(receive_syn{}); break;
case fin|ack: state_machine.process_event(receive_fin_ack{}); break;
case fin: state_machine.process_event(receive_fin{}); break;
case ack: state_machine.process_event(receive_ack{}); break;
// etc..
}
}
それは動作し、おそらく高速です。しかし、これはもっと宣言的なスタイルで書かれるべきだと思います。
追加のランタイム オーバーヘッドを導入することなく、より高いレベルのプログラミング スタイルでこれを実装するにはどうすればよいでしょうか?
参考までに、boost::msm の例を次に示します。