Listing 1
class Aggregator;
class NO_VTABLE State:public IState_base<Aggregator,State>
{
public:
virtual State* event1(Aggregator*,const boost::any&){return this;}
virtual State* event2(Aggregator*,const boost::any&){return this;}
};
/*****************************************************************************/
IState_base<Aggregator>
|
State <<-app-specific, prototypes every event handled by the system
/ | \
/ | \
/ | \
state3 state4 state1 <<each state implements events that it cares about
|
state2
******************************************************************************/
class Aggregator:public Fsm<Aggregator,State>{
class state1:public State{
virtual State* event1 (Aggregator* p,const boost::any&)
{return &p->m_state2;}
virtual State* event2 (Aggregator* p,const boost::any&){return this;}
} m_state1;
class state2:public state1{
virtual State* event1(Aggregator* p,const boost::any&)
{return &p->m_state1;}
} m_state2;
};
Aggregator::Event get_event(boost::any& arg){
return (random)? State::event1 : State::event2;
}
main(){
for(;;){
boost::any arg;
Aggregator::Event e=get_event(arg);
State* next_state=a.dispatch(e,arg);
if(0==next_state) break;
}
}