BWAPI
SPAR/AIModule/SparAIModule/PerceptualState/Locations/Static/StaticLocation.h
Go to the documentation of this file.
00001 #pragma once
00002 #include "../../../../Utils/Utils.h"
00003 #include "../../../Utils/Utils.h"
00004 #include "../../../Utils/Component.h"
00005 #include "../Location.h"
00006 #include "StaticLocationBase.h"
00007 // Necessary to hack iterator
00008 #include "PrimitiveLocationBase.h"
00009 #include "CompositeLocationBase.h"
00010 
00011 class CompositeLocation;
00012 
00016 class StaticLocation : public Location, public Component, public virtual StaticLocationBase
00017 {
00018 public:
00019   typedef general_iterator<PrimitiveLocationBase::own_unit_const_iterator,
00020                            CompositeLocationBase::own_unit_const_iterator> own_unit_const_iterator;
00021   typedef general_iterator<PrimitiveLocationBase::own_unit_type_const_iterator,
00022                            CompositeLocationBase::own_unit_type_const_iterator> own_unit_type_const_iterator;
00023   typedef general_iterator<PrimitiveLocationBase::own_building_const_iterator,
00024                            CompositeLocationBase::own_building_const_iterator> own_building_const_iterator;
00025 
00026   typedef general_iterator<PrimitiveLocationBase::enemy_unit_iterator,
00027                            CompositeLocationBase::enemy_unit_iterator> enemy_unit_iterator;
00028   typedef general_iterator<PrimitiveLocationBase::enemy_unit_const_iterator,
00029                            CompositeLocationBase::enemy_unit_const_iterator> enemy_unit_const_iterator;
00030   typedef general_iterator<PrimitiveLocationBase::enemy_unit_type_iterator,
00031                            CompositeLocationBase::enemy_unit_type_iterator> enemy_unit_type_iterator;
00032   typedef general_iterator<PrimitiveLocationBase::enemy_unit_type_const_iterator,
00033                            CompositeLocationBase::enemy_unit_type_const_iterator> enemy_unit_type_const_iterator;
00034   typedef general_iterator<PrimitiveLocationBase::enemy_building_iterator,
00035                            CompositeLocationBase::enemy_building_iterator> enemy_building_iterator;
00036   typedef general_iterator<PrimitiveLocationBase::enemy_building_const_iterator,
00037                            CompositeLocationBase::enemy_building_const_iterator> enemy_building_const_iterator;
00038 
00039   typedef general_iterator<PrimitiveLocationBase::neutral_unit_iterator,
00040                            CompositeLocationBase::neutral_unit_iterator> neutral_unit_iterator;
00041   typedef general_iterator<PrimitiveLocationBase::neutral_unit_const_iterator,
00042                            CompositeLocationBase::neutral_unit_const_iterator> neutral_unit_const_iterator;
00043   typedef general_iterator<PrimitiveLocationBase::neutral_unit_type_iterator,
00044                            CompositeLocationBase::neutral_unit_type_iterator> neutral_unit_type_iterator;
00045   typedef general_iterator<PrimitiveLocationBase::neutral_unit_type_const_iterator,
00046                            CompositeLocationBase::neutral_unit_type_const_iterator> neutral_unit_type_const_iterator;
00047   typedef general_iterator<PrimitiveLocationBase::neutral_building_iterator,
00048                            CompositeLocationBase::neutral_building_iterator> neutral_building_iterator;
00049   typedef general_iterator<PrimitiveLocationBase::neutral_building_const_iterator,
00050                            CompositeLocationBase::neutral_building_const_iterator> neutral_building_const_iterator;
00051 
00056   StaticLocation(CompositeLocation* parent)
00057     : m_id(s_id++)
00058     , m_parent(parent)
00059   {
00060   }
00061 
00065   size_t getId() const
00066   { 
00067     return m_id;
00068   }
00069 
00073   CompositeLocation* getParent()
00074   { 
00075     return m_parent;
00076   }
00077 
00082   bool isIn(const CompositeLocation* compositeLocation) const;
00083 
00084 #pragma region Own_Units
00085 
00086   std::pair<own_unit_const_iterator, own_unit_const_iterator> 
00087     getOwnUnits() const;
00088 
00093   std::pair<own_unit_type_const_iterator, own_unit_type_const_iterator> 
00094     getOwnUnits(BWAPI::UnitType unitType) const;
00095 
00096   std::pair<own_building_const_iterator, own_building_const_iterator>
00097     getOwnBuildings() const;
00098 
00099   size_t getNbOwnUnits() const
00100   {
00101     return getNbOwnUnitsV();
00102   }
00103 
00108   size_t getNbOwnUnits(BWAPI::UnitType unitType) const
00109   {
00110     return getNbOwnUnitsV(unitType);
00111   }
00116   size_t getNbOwnBuildings() const
00117   {
00118     return getNbOwnBuildingsV();
00119   }
00120 
00121   void updateOwnUnits()
00122   {
00123     updateOwnUnitsV();
00124   }
00125 
00126   // #################### ADD-ON ####################
00127   // Copy-paste this stuff in PrimitiveLocation.h and CompositeLocation.h for better performance ;-)
00128 
00129   //template <class Predicate>
00130   //std::pair<boost::filter_iterator<Predicate, own_unit_const_iterator>, boost::filter_iterator<Predicate, own_unit_const_iterator>> 
00131   //  getOwnUnits(Predicate predicate) const
00132   //{
00133   //  std::pair<own_unit_const_iterator, own_unit_const_iterator> ownUnits = getOwnUnits();
00134   //  return std::make_pair(boost::filter_iterator<Predicate, own_unit_const_iterator>(predicate, ownUnits.first, ownUnits.second),
00135   //                        boost::filter_iterator<Predicate, own_unit_const_iterator>(predicate, ownUnits.second, ownUnits.second));
00136   //}
00137 
00138   //template <class Predicate>
00139   //std::pair<boost::filter_iterator<Predicate, own_unit_const_iterator>, boost::filter_iterator<Predicate, own_unit_const_iterator>> 
00140   //  getOwnUnits(BWAPI::UnitType unitType, Predicate predicate) const
00141   //{
00142   //  std::pair<own_unit_const_iterator, own_unit_const_iterator> ownUnits = getOwnUnits(unitType);
00143   //  return std::make_pair(boost::filter_iterator<Predicate, own_unit_const_iterator>(predicate, ownUnits.first, ownUnits.second),
00144   //                        boost::filter_iterator<Predicate, own_unit_const_iterator>(predicate, ownUnits.second, ownUnits.second));
00145   //}
00146 
00147   //typedef boost::filter_iterator<IsCompleted, own_unit_const_iterator> own_completed_unit_const_iterator;
00148   //std::pair<own_completed_unit_const_iterator, own_completed_unit_const_iterator>
00149   //  getCompletedOwnUnits() const
00150   //{
00151   //  std::pair<own_unit_const_iterator, own_unit_const_iterator> ownUnits = getOwnUnits();
00152   //  return std::make_pair(own_completed_unit_const_iterator(IsCompleted(), ownUnits.first, ownUnits.second),
00153   //                        own_completed_unit_const_iterator(IsCompleted(), ownUnits.second, ownUnits.second));
00154   //}
00155 
00156   typedef boost::filter_iterator<IsCompleted<OwnUnit>, own_unit_const_iterator> own_completed_unit_const_iterator;
00157   std::pair<own_completed_unit_const_iterator, own_completed_unit_const_iterator>
00158     getCompletedOwnUnits(BWAPI::UnitType unitType) const
00159   {
00160     std::pair<own_unit_const_iterator, own_unit_const_iterator> ownUnits = getOwnUnits(unitType);
00161     return std::make_pair(own_completed_unit_const_iterator(IsCompleted<OwnUnit>(), ownUnits.first, ownUnits.second),
00162                           own_completed_unit_const_iterator(IsCompleted<OwnUnit>(), ownUnits.second, ownUnits.second));
00163   }
00164 
00165   //typedef boost::filter_iterator<IsCompletedBuilding, own_unit_const_iterator> own_completed_building_const_iterator;
00166   //std::pair<own_completed_building_const_iterator, own_completed_building_const_iterator>
00167   //  getCompletedOwnBuildings() const
00168   //{
00169   //  std::pair<own_unit_const_iterator, own_unit_const_iterator> ownUnits = getOwnUnits();
00170   //  return std::make_pair(own_completed_building_const_iterator(IsCompletedBuilding(), ownUnits.first, ownUnits.second),
00171   //                        own_completed_building_const_iterator(IsCompletedBuilding(), ownUnits.second, ownUnits.second));
00172   //}
00173 
00174   //size_t getNbCompletedOwnUnits() const
00175   //{
00176   //  std::pair<own_completed_unit_const_iterator, own_completed_unit_const_iterator> ownUnits =
00177   //    getCompletedOwnUnits();
00178   //  return std::distance(ownUnits.first, ownUnits.second);
00179   //}
00180 
00181   size_t getNbCompletedOwnUnits(BWAPI::UnitType unitType) const
00182   {
00183     std::pair<own_completed_unit_const_iterator, own_completed_unit_const_iterator> ownUnits =
00184       getCompletedOwnUnits(unitType);
00185     return std::distance(ownUnits.first, ownUnits.second);
00186   }
00187 
00188   //size_t getNbCompletedOwnBuildings() const
00189   //{
00190   //  std::pair<own_completed_building_const_iterator, own_completed_building_const_iterator> ownBuildings = 
00191   //    getCompletedOwnBuildings();
00192   //  return std::distance(ownBuildings.first, ownBuildings.second);
00193   //}
00194 
00195 #pragma endregion Own_Units
00196 
00197 #pragma region Enemy_Units
00198 
00199   std::pair<enemy_unit_iterator, enemy_unit_iterator> 
00200     getEnemyUnits();
00201 
00202   std::pair<enemy_unit_const_iterator, enemy_unit_const_iterator> 
00203     getEnemyUnits() const;
00204 
00205   std::pair<enemy_unit_type_iterator, enemy_unit_type_iterator> 
00206     getEnemyUnits(BWAPI::UnitType unitType);
00207 
00208   std::pair<enemy_unit_type_const_iterator, enemy_unit_type_const_iterator> 
00209     getEnemyUnits(BWAPI::UnitType unitType) const;
00210 
00211   std::pair<enemy_building_iterator, enemy_building_iterator> 
00212     getEnemyBuildings();
00213 
00214   std::pair<enemy_building_const_iterator, enemy_building_const_iterator> 
00215     getEnemyBuildings() const;
00216 
00217   size_t getNbEnemyUnits() const
00218   {
00219     return getNbEnemyUnitsV();
00220   }
00221 
00222   size_t getNbEnemyUnits(BWAPI::UnitType unitType) const
00223   {
00224     return getNbEnemyUnitsV(unitType);
00225   }
00226 
00227   size_t getNbEnemyBuildings() const
00228   {
00229     return getNbEnemyBuildingsV();
00230   }
00231 
00232   void updateEnemyBuildings()
00233   {
00234     updateEnemyBuildingsV();
00235   }
00236 
00237   void updateEnemyUnits()
00238   {
00239     updateEnemyUnitsV();
00240   }
00241 
00242 #pragma endregion Enemy_Units
00243 
00244 #pragma region Neutral_Units
00245 
00246   std::pair<neutral_unit_iterator, neutral_unit_iterator> 
00247     getNeutralUnits();
00248 
00249   std::pair<neutral_unit_const_iterator, neutral_unit_const_iterator> 
00250     getNeutralUnits() const;
00251 
00252   std::pair<neutral_unit_type_iterator, neutral_unit_type_iterator> 
00253     getNeutralUnits(BWAPI::UnitType unitType);
00254 
00255   std::pair<neutral_unit_type_const_iterator, neutral_unit_type_const_iterator> 
00256     getNeutralUnits(BWAPI::UnitType unitType) const;
00257 
00258   std::pair<neutral_building_iterator, neutral_building_iterator> 
00259     getNeutralBuildings();
00260 
00261   std::pair<neutral_building_const_iterator, neutral_building_const_iterator> 
00262     getNeutralBuildings() const;
00263 
00264   size_t getNbNeutralUnits() const
00265   {
00266     return getNbNeutralUnitsV();
00267   }
00268 
00269   size_t getNbNeutralUnits(BWAPI::UnitType unitType) const
00270   {
00271     return getNbNeutralUnitsV(unitType);
00272   }
00273 
00274   size_t getNbNeutralBuildings() const
00275   {
00276     return getNbNeutralBuildingsV();
00277   }
00278 
00279   void updateNeutralBuildings()
00280   {
00281     updateNeutralBuildingsV();
00282   }
00283 
00284   void updateNeutralUnits()
00285   {
00286     updateNeutralUnitsV(); 
00287   }
00288 
00289 #pragma endregion Neutral_Units
00290 
00295   DECLARE_EVENT1(OnOwnUnitAdded, OwnUnit*);
00296   OnOwnUnitAdded& getOwnUnitAddedEvent() const { return m_ownUnitAddedEvent; }
00301   DECLARE_EVENT1(OnOwnUnitRemoved, OwnUnit*);
00302   OnOwnUnitRemoved& getOwnUnitRemovedEvent() const { return m_ownUnitRemovedEvent; }
00303 
00309   DECLARE_EVENT1(OnEnemyUnitAdded, EnemyUnit*);
00310   OnEnemyUnitAdded& getEnemyUnitAddedEvent() const { return m_enemyUnitAddedEvent; }
00314   DECLARE_EVENT1(OnEnemyUnitRemoved, EnemyUnit*);
00315   OnEnemyUnitRemoved& getEnemyUnitRemovedEvent() const { return m_enemyUnitRemovedEvent; }
00316 
00317   DECLARE_EVENT1(OnNeutralUnitAdded, NeutralUnit*);
00318   OnNeutralUnitAdded& getNeutralUnitAddedEvent() const { return m_neutralUnitAddedEvent; }
00319 
00320   DECLARE_EVENT1(OnNeutralUnitRemoved, NeutralUnit*);
00321   OnNeutralUnitRemoved& getNeutralUnitRemovedEvent() const { return m_neutralUnitRemovedEvent; }
00322 
00323 protected:
00324   template <class UnitType>
00325   struct UnitManagement
00326   {
00327   };
00328   template <>
00329   struct UnitManagement<OwnUnit>
00330   {
00331     static BWAPI::UnitType getUnitType(const OwnUnit* ownUnit)
00332     {
00333       return ownUnit->getUnit()->getType();
00334     }
00335     static Event1<OwnUnit*>& getUnitAddedEvent(StaticLocation* location)
00336     {
00337       return location->m_ownUnitAddedEvent;
00338     }
00339     static Event1<OwnUnit*>& getUnitRemovedEvent(StaticLocation* location)
00340     {
00341       return location->m_ownUnitRemovedEvent;
00342     }
00343   };
00344   template <>
00345   struct UnitManagement<EnemyUnit>
00346   {
00347     static BWAPI::UnitType getUnitType(const EnemyUnit* enemyUnit)
00348     {
00349       if (enemyUnit->isAccessible())
00350         return enemyUnit->getUnit()->getType();
00351       else
00352         return enemyUnit->getLastKnownState().getType();
00353     }
00354     static Event1<EnemyUnit*>& getUnitAddedEvent(StaticLocation* location)
00355     {
00356       return location->m_enemyUnitAddedEvent;
00357     }
00358     static Event1<EnemyUnit*>& getUnitRemovedEvent(StaticLocation* location)
00359     {
00360       return location->m_enemyUnitRemovedEvent;
00361     }
00362   };
00363   template <>
00364   struct UnitManagement<NeutralUnit>
00365   {
00366     static BWAPI::UnitType getUnitType(const NeutralUnit* neutralUnit)
00367     {
00368       if (neutralUnit->isAccessible())
00369         return neutralUnit->getUnit()->getType();
00370       else
00371         return neutralUnit->getLastKnownState().getType();
00372     }
00373     static Event1<NeutralUnit*>& getUnitAddedEvent(StaticLocation* location)
00374     {
00375       return location->m_neutralUnitAddedEvent;
00376     }
00377     static Event1<NeutralUnit*>& getUnitRemovedEvent(StaticLocation* location)
00378     {
00379       return location->m_neutralUnitRemovedEvent;
00380     }
00381   };
00382   template <class UnitType> friend struct UnitManagement;
00383 
00384   virtual size_t getNbOwnUnitsV() const = 0;
00385   virtual size_t getNbOwnUnitsV(BWAPI::UnitType unitType) const = 0;
00386   virtual size_t getNbOwnBuildingsV() const = 0;
00387 
00388   virtual size_t getNbEnemyUnitsV() const = 0;
00389   virtual size_t getNbEnemyUnitsV(BWAPI::UnitType unitType) const = 0;
00390   virtual size_t getNbEnemyBuildingsV() const = 0;
00391 
00392   virtual size_t getNbNeutralUnitsV() const = 0;
00393   virtual size_t getNbNeutralUnitsV(BWAPI::UnitType unitType) const = 0;
00394   virtual size_t getNbNeutralBuildingsV() const = 0;
00395 
00396   virtual void updateOwnUnitsV() = 0;
00397   virtual void updateEnemyBuildingsV() = 0;
00398   virtual void updateEnemyUnitsV() = 0;
00399   virtual void updateNeutralBuildingsV() = 0;
00400   virtual void updateNeutralUnitsV() = 0;
00401 
00405   const size_t m_id;
00409   CompositeLocation* const m_parent;
00410 
00411   EVENT(OnOwnUnitAdded) m_ownUnitAddedEvent;
00412   EVENT(OnOwnUnitRemoved) m_ownUnitRemovedEvent;
00413 
00414   EVENT(OnEnemyUnitAdded) m_enemyUnitAddedEvent;
00415   EVENT(OnEnemyUnitRemoved) m_enemyUnitRemovedEvent;
00416 
00417   EVENT(OnNeutralUnitAdded) m_neutralUnitAddedEvent;
00418   EVENT(OnNeutralUnitRemoved) m_neutralUnitRemovedEvent;
00419 private:
00420   static size_t s_id;
00421 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines