Listing 3: The state.
template <class T, class EV, class CMP>
class Transition
{
friend State<T,EV,CMP>;
public:
State<T,EV,CMP>* operator()( const T& _T, const EV& ev ) throw() {
(*m_evAction)(_T,ev);
return m_stNext;
}
protected:
Transition( const State<T,EV,CMP>& stNext, Action<T,EV>* evAction ) :
m_stNext(const_cast<State<T,EV,CMP>*>(&stNext)), m_evAction(evAction) {
}
... // Other member information
};
template <class T, class EV, class CMP = std::less<EV> >
class State
{
// State Transition Table Type
typedef std::map<const EV,const Transition<T,EV,CMP>*,CMP>
TransitionTable;
public:
typedef State<T,EV,CMP> state_type;
typedef EventAction<T,EV>::HANDLE HANDLE;
public:
State( HANDLE hEnter = 0, HANDLE hExit = 0 ); {
if ( hEnter == 0 ) {
m_evEnter = new NoAction<T,EV>;
}
else { m_evEnter = new EventAction<T,EV>(hEnter); }
if ( hExit == 0 ) {
m_evExit = new NoAction<T,EV>;
}
else { m_evExit = new EventAction<T,EV>(hExit); }
}
~State() {
TransitionTable::iterator iter;
for ( iter = m_stTable.begin(); iter != m_stTable.end(); iter++ ) {
delete const_cast<Transition<T,EV,CMP>*>( iter->second );
}
delete m_evEnter; delete m_evExit;
}
... // other API functions not shown
private:
TransitionTable m_stTable;
Action<T,EV>* m_evEnter;
Action<T,EV>* m_evExit;
};