BWAPI
SPAR/AIModule/SparAIModule/Utils/FSM/FSM.h
Go to the documentation of this file.
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 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines