// 表驱动的自动状态机(FSM)// VC2008
#include "stdafx.h"#include <map>
// 状态enum enState{ enState_Open, enState_Close,
// 数量 enState_Num};
// 输入事件enum enEvent{ enEvent_Open, enEvent_Close,
// 数量 enEvent_Num};
// 状态转换表struct FSM_Transition{ enState m_curState; enEvent m_Event; enState m_NextState;};
// 状态机class FSM{public: // 初始状态 FSM(enState s0) : m_curState(s0) {};
// 设置状态转换表 void ClearTrans() { m_TransTable.clear(); }; void AddTrans(const FSM_Transition& trans) { TransTableKey key = std::make_pair(trans.m_curState, trans.m_Event); TransTable::iterator it_find = m_TransTable.find(key); if(it_find != m_TransTable.end()) { if(trans.m_curState != trans.m_NextState) { it_find->second = trans.m_NextState; } else { m_TransTable.erase(it_find); } } else if(trans.m_curState != trans.m_NextState) { m_TransTable.insert( std::make_pair(key, trans.m_NextState) ); } }
// 状态转换函数 bool HandleEvent(enEvent enE) { enState prevState = m_curState; TransTableKey key = std::make_pair(prevState, enE); TransTable::iterator it_find = m_TransTable.find(key); if(it_find != m_TransTable.end()) { m_curState = it_find->second; } OnStateChange(prevState, enE, m_curState); return (prevState != m_curState); }
// 终止状态 bool IsFinal() const { return (m_curState == enState_Close); }
protected: // 状态转换事件 void OnStateChange(enState prevState, enEvent enE, enState curState) {};
private: enState m_curState; typedef std::pair<enState, enEvent> TransTableKey; typedef std::map<TransTableKey, enState> TransTable; TransTable m_TransTable;};
int _tmain(int argc, _TCHAR* argv[]){
FSM_Transition trans[] = { {enState_Open, enEvent_Close, enState_Close}, {enState_Close, enEvent_Open, enState_Open}, };
FSM fsm(enState_Open); fsm.ClearTrans(); for(int i=0; i<sizeof(trans)/sizeof(trans[0]); ++i) { fsm.AddTrans(trans[i]); }
fsm.HandleEvent(enEvent_Open); fsm.HandleEvent(enEvent_Close); fsm.HandleEvent(enEvent_Open); fsm.HandleEvent(enEvent_Open); fsm.HandleEvent(enEvent_Close);
bool bClose = fsm.IsFinal(); return 0;}
