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