BWAPI
|
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 };