BWAPI
SPAR/AIModule/SparAIModule/DecisionMaking/Layer1Reactive/FSM/Layer1FSMUnitData.h
Go to the documentation of this file.
00001 #pragma once
00002 #include "../../../Utils/Component.h"
00003 #include "ArbitratorUnitData.h"
00004 #include "UnitBehavior.h"
00005 #include <boost/iterator/transform_iterator.hpp>
00006 
00010 class Layer1FSMUnitData : public ArbitratorUnitData, public Component
00011 {
00012 public:
00013   Layer1FSMUnitData(BWAPI::Unit* unit)
00014     : ArbitratorUnitData(unit)
00015     , UnitData(unit)
00016 #ifdef USE_SPAR_GUI
00017     , m_behaviorTerminateEventHandler(*this)
00018 #endif
00019   {
00020   }
00021 
00022 #ifndef USE_SPAR_GUI
00023 
00024   void addBehavior(IUnitBehavior* behavior)
00025   {
00026     unused(behavior);
00027   }
00028 
00029 #else
00030 
00031 protected:
00032   struct BehaviorWrapper
00033   {
00034     BehaviorWrapper() {}
00035     BehaviorWrapper(IUnitBehavior* behavior)
00036       : m_behavior(behavior) {}
00037 
00038     IUnitBehavior* m_behavior;
00039     std::list<BehaviorWrapper>::iterator m_behaviorID;
00040     IUnitBehavior::OnTerminate::SubscriberID m_subscriberID;
00041   };
00042   struct extract_behavior : std::unary_function<BehaviorWrapper,const IUnitBehavior*>
00043   {
00044     const IUnitBehavior* operator()(const BehaviorWrapper& behaviorWrapper) const
00045     {
00046       return behaviorWrapper.m_behavior;
00047     }
00048   };
00049 
00050 public:
00055   void addBehavior(IUnitBehavior* behavior)
00056   {
00057     std::list<BehaviorWrapper>::iterator behaviorID = m_behaviors.insert(m_behaviors.end(), BehaviorWrapper(behavior));
00058     BehaviorWrapper& behaviorWrapper = *behaviorID;
00059     behaviorWrapper.m_behaviorID = behaviorID;
00060     behaviorWrapper.m_subscriberID = behavior->getTerminateEvent().subscribe(&m_behaviorTerminateEventHandler, &behaviorWrapper);
00061   }
00062 
00067   void onBehaviorTerminate(void* data)
00068   {
00069     BehaviorWrapper* behaviorWrapper = reinterpret_cast<BehaviorWrapper*>(data);
00070 #ifdef _DEBUG_COMPONENT
00071     behaviorWrapper->m_behavior->getTerminateEvent().unsubscribe(behaviorWrapper->m_subscriberID);
00072 #endif
00073     m_behaviors.erase(behaviorWrapper->m_behaviorID);
00074   }
00075 
00076   typedef boost::transform_iterator<extract_behavior, std::list<BehaviorWrapper>::const_iterator> behavior_iterator;
00077   behavior_iterator behaviorsBegin()
00078   {
00079     return behavior_iterator(m_behaviors.begin());
00080   }
00081   behavior_iterator behaviorsEnd()
00082   {
00083     return behavior_iterator(m_behaviors.end());
00084   }
00085 
00086 protected:
00087   EVENT_HANDLER(Layer1FSMUnitData, onBehaviorTerminate) m_behaviorTerminateEventHandler;
00088 
00089   std::list<BehaviorWrapper> m_behaviors;
00090 #endif
00091 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines