BWAPI
|
00001 #pragma once 00002 #include "../PersistentUnitGroup.h" 00003 #include <BWAPI.h> 00004 00008 class GroupProcess : public virtual Process 00009 { 00010 public: 00011 GroupProcess(const Process* parent, const PersistentUnitGroup* group) 00012 : Process(parent) 00013 , m_group(group, *this) 00014 , m_unitAddedEventHandler(*this) 00015 , m_unitRemovedEventHandler(*this) 00016 { 00017 } 00018 00019 ~GroupProcess() 00020 { 00021 m_group->getUnitAddedEvent().unsubscribe(m_unitAddedID); 00022 m_group->getUnitRemovedEvent().unsubscribe(m_unitRemovedID); 00023 } 00024 00025 const PersistentUnitGroup* getGroup() const 00026 { 00027 return m_group; 00028 } 00029 00030 protected: 00031 virtual void onUnitAddedToGroup(void*, BWAPI::Unit* unit) = 0; 00032 virtual void onUnitRemovedFromGroup(void*, BWAPI::Unit* unit)= 0; 00033 00034 virtual void executeImpl() 00035 { 00036 // WARNING: Process::executeImpl() is intended to be called by the derived class! 00037 00038 m_unitAddedID = m_group->getUnitAddedEvent().subscribe(&m_unitAddedEventHandler, NULL); 00039 m_unitRemovedID = m_group->getUnitRemovedEvent().subscribe(&m_unitRemovedEventHandler, NULL); 00040 } 00041 00042 virtual void terminateImpl() 00043 { 00044 // WARNING: Process::terminateImpl() is intended to be called by the derived class! 00045 00046 m_group->getUnitAddedEvent().unsubscribe(m_unitAddedID); 00047 m_group->getUnitRemovedEvent().unsubscribe(m_unitRemovedID); 00048 } 00049 00050 private: 00051 EVENT_HANDLER1(GroupProcess, onUnitAddedToGroup, BWAPI::Unit*) m_unitAddedEventHandler; 00052 PersistentUnitGroup::OnUnitAdded::SubscriberID m_unitAddedID; 00053 EVENT_HANDLER1(GroupProcess, onUnitRemovedFromGroup, BWAPI::Unit*) m_unitRemovedEventHandler; 00054 PersistentUnitGroup::OnUnitRemoved::SubscriberID m_unitRemovedID; 00055 00056 // Derived classes can access the (const) group via getGroup() 00060 AutoPtr<const PersistentUnitGroup> m_group; 00061 };