BWAPI
|
00001 #pragma once 00002 #include "../SafeListAdaptor.h" 00003 #include "../Process.h" 00004 #include "../Event.h" 00005 #include <list> 00006 #include <boost/iterator/transform_iterator.hpp> 00007 00008 class IFSMState; 00009 00013 class IFSM : public virtual Process 00014 { 00015 public: 00016 friend class IFSMState; 00017 template <class FSM, class DerivedState> friend class FSMState; 00018 //typedef boost::transform_iterator<extract_fsm, typename SafeListAdaptor<FSMWrapper*>::const_iterator> sub_fsm_const_iterator; 00019 //typedef boost::transform_iterator<extract_fsm, typename SafeListAdaptor<FSMWrapper*>::iterator> sub_fsm_iterator; 00020 00024 IFSM(const Process* parent) 00025 : Process(parent) 00026 , m_currentState(NULL) 00027 { 00028 } 00029 00033 virtual ~IFSM() 00034 { 00035 assert(m_currentState == NULL); 00036 } 00037 00038 // DON'T CALL THESE METHODS IF A SUB-FSM MAY BE ADDED/REMOVED! 00039 //sub_fsm_const_iterator subFSMBegin() const { return sub_fsm_const_iterator(ConstSafeListAdaptor<FSMWrapper*>(m_subFSMs).unsafe_begin()); } 00040 //sub_fsm_const_iterator subFSMEnd() const { return sub_fsm_const_iterator(ConstSafeListAdaptor<FSMWrapper*>(m_subFSMs).unsafe_end()); } 00041 00042 //const IFSMState* getCurrentState() const 00043 //{ 00044 // return m_currentState; 00045 //} 00046 00048 // GUI // 00050 virtual std::vector<const IFSMState*> getAllStates() const = 0; 00051 const IFSMState* getCurrentState() const 00052 { 00053 return m_currentState; 00054 } 00055 00056 protected: 00057 // DON'T CALL THESE METHODS IF A SUB-FSM MAY BE ADDED/REMOVED! 00058 //sub_fsm_iterator subFSMBegin() { return sub_fsm_iterator(SafeListAdaptor<FSMWrapper*>(m_subFSMs).unsafe_begin()); } 00059 //sub_fsm_iterator subFSMEnd() { return sub_fsm_iterator(SafeListAdaptor<FSMWrapper*>(m_subFSMs).unsafe_end()); } 00060 00065 void setCurrentState(IFSMState* currentState) 00066 { 00067 m_currentState = currentState; 00068 } 00069 00075 virtual void terminateImpl(); 00076 00081 void onExitState() 00082 { 00083 m_currentState = NULL; 00084 for_each_child_process(TerminateProcess()); 00085 00086 assert(getNbChildProcesses() == 0); 00087 //m_subFSMs.clear(); 00088 } 00089 00090 // 00091 // Variables 00092 // 00093 00097 IFSMState* m_currentState; 00098 00099 private: 00100 IFSM(const IFSM& other); 00101 }; 00102 00103 template <class DerivedFSM> 00104 class FSM : public virtual IFSM 00105 { 00106 public: 00107 FSM(const Process* parent) 00108 : IFSM(parent) 00109 , Process(parent) 00110 {} 00111 00113 // GUI // 00115 virtual std::vector<const IFSMState*> getAllStates() const 00116 { 00117 std::vector<const IFSMState*> states(boost::tuples::length<DerivedFSM::States>::value); 00118 StatesHelper<boost::tuples::length<typename DerivedFSM::States>::value>::copy(*this, states); 00119 00120 return states; 00121 } 00122 00123 private: 00124 template <size_t i> 00125 struct StatesHelper 00126 { 00127 static void copy(const FSM& fsm, std::vector<const IFSMState*>& states) 00128 { 00129 states[i-1] = &boost::get<i-1>(static_cast<const DerivedFSM&>(fsm).m_states); 00130 StatesHelper<i-1>::copy(fsm, states); 00131 } 00132 }; 00133 template <> 00134 struct StatesHelper<0> 00135 { 00136 static void copy(const FSM&, std::vector<const IFSMState*>&) {} 00137 }; 00138 };