BWAPI
SPAR/AIModule/SparAIModule/PerceptualState/Locations/Static/CompositeLocation.h
Go to the documentation of this file.
00001 #pragma once
00002 #include "StaticLocation.h"
00003 #include "PrimitiveLocation.h"
00004 #include "CompositeLocationBase.h"
00005 
00006 class PrimitiveLocation;
00007 
00012 class CompositeLocation : public virtual CompositeLocationBase, public virtual StaticLocation
00013 {
00014 public:
00015   typedef CompositeLocationBase::own_unit_const_iterator own_unit_const_iterator;
00016   typedef CompositeLocationBase::own_unit_type_const_iterator own_unit_type_const_iterator;
00017   typedef CompositeLocationBase::own_building_const_iterator own_building_const_iterator;
00018 
00019   typedef CompositeLocationBase::enemy_unit_iterator enemy_unit_iterator;
00020   typedef CompositeLocationBase::enemy_unit_const_iterator enemy_unit_const_iterator;
00021   typedef CompositeLocationBase::enemy_unit_type_iterator enemy_unit_type_iterator;
00022   typedef CompositeLocationBase::enemy_unit_type_const_iterator enemy_unit_type_const_iterator;
00023   typedef CompositeLocationBase::enemy_building_iterator enemy_building_iterator;
00024   typedef CompositeLocationBase::enemy_building_const_iterator enemy_building_const_iterator;
00025 
00026   typedef CompositeLocationBase::neutral_unit_iterator neutral_unit_iterator;
00027   typedef CompositeLocationBase::neutral_unit_const_iterator neutral_unit_const_iterator;
00028   typedef CompositeLocationBase::neutral_unit_type_iterator neutral_unit_type_iterator;
00029   typedef CompositeLocationBase::neutral_unit_type_const_iterator neutral_unit_type_const_iterator;
00030   typedef CompositeLocationBase::neutral_building_iterator neutral_building_iterator;
00031   typedef CompositeLocationBase::neutral_building_const_iterator neutral_building_const_iterator;
00032 
00033   CompositeLocation(CompositeLocation* parent)
00034     : StaticLocation(parent)
00035   {
00036   }
00037 
00038 #pragma region Sub_Locations
00039 
00040   typedef std::list<StaticLocation*>::iterator sub_location_iterator;
00041   std::pair<sub_location_iterator, sub_location_iterator> getSubLocations()
00042   {
00043     return std::make_pair(m_subLocations.begin(),
00044                           m_subLocations.end());
00045   }
00046   typedef std::list<StaticLocation*>::const_iterator sub_location_const_iterator;
00047   std::pair<sub_location_const_iterator, sub_location_const_iterator> getSubLocations() const
00048   {
00049     return std::make_pair(m_subLocations.begin(),
00050                           m_subLocations.end());
00051   }
00052   size_t getNbSubLocations() const { return m_subLocations.size(); }
00053 
00054   typedef std::list<PrimitiveLocation*>::iterator primitive_sub_location_iterator;
00055   std::pair<primitive_sub_location_iterator, primitive_sub_location_iterator> getPrimitiveSubLocations()
00056   {
00057     return std::make_pair(m_primitiveSubLocationsCache.begin(),
00058                           m_primitiveSubLocationsCache.end());
00059   }
00060   typedef std::list<PrimitiveLocation*>::const_iterator primitive_sub_location_const_iterator;
00061   std::pair<primitive_sub_location_const_iterator, primitive_sub_location_const_iterator> getPrimitiveSubLocations() const
00062   {
00063     return std::make_pair(m_primitiveSubLocationsCache.begin(),
00064                           m_primitiveSubLocationsCache.end());
00065   }  
00066   size_t getNbPrimitiveSubLocations() const { return m_primitiveSubLocationsCache.size(); }
00067 
00068   bool contains(const StaticLocation* staticLocation) const
00069   {
00070     return staticLocation->isIn(this);
00071   }
00072 
00073 #pragma endregion Sub_Locations
00074 
00075 #pragma region Own_Units
00076 
00077   std::pair<own_unit_type_const_iterator, own_unit_type_const_iterator> 
00078     getOwnUnits(BWAPI::UnitType unitType) const
00079   {
00080     std::pair<stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<OwnUnit>>::const_iterator, stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<OwnUnit>>::const_iterator> iterators = m_ownUnitsCache.equal_range(unitType);
00081     return std::make_pair(own_unit_type_const_iterator(iterators.first), 
00082                           own_unit_type_const_iterator(iterators.second));
00083   }
00084 
00085   std::pair<own_unit_const_iterator, own_unit_const_iterator> 
00086     getOwnUnits() const
00087   {
00088     return std::make_pair(own_unit_const_iterator(m_ownUnitsCache.begin()),
00089                           own_unit_const_iterator(m_ownUnitsCache.end()));
00090   }
00091 
00092   size_t getNbOwnUnits() const
00093   {
00094     const size_t nbUnitsCache = m_ownUnitsCache.size();
00095 
00096 #ifdef _DEBUG
00097     size_t nbUnits = 0;
00098     for (std::list<StaticLocation*>::const_iterator it = m_subLocations.begin(); it != m_subLocations.end(); ++it)
00099       nbUnits += (*it)->getNbOwnUnits();
00100     assert(nbUnits == nbUnitsCache);
00101 #endif
00102 
00103     return nbUnitsCache;
00104   }
00105 
00106   size_t getNbOwnUnits(BWAPI::UnitType unitType) const
00107   {
00108     const size_t nbUnitsCache = m_ownUnitsCache.count(unitType);
00109 
00110 #ifdef _DEBUG
00111     size_t nbUnits = 0;
00112     for (std::list<StaticLocation*>::const_iterator it = m_subLocations.begin(); it != m_subLocations.end(); ++it)
00113       nbUnits += (*it)->getNbOwnUnits(unitType);
00114     assert(nbUnits == nbUnitsCache);
00115 #endif
00116 
00117     return nbUnitsCache;
00118   }
00119 
00120   std::pair<own_building_const_iterator, own_building_const_iterator>
00121     getOwnBuildings() const
00122   {
00123     std::pair<own_unit_const_iterator, own_unit_const_iterator> ownUnits = getOwnUnits();
00124     return std::make_pair(own_building_const_iterator(IsBuilding<OwnUnit>(), ownUnits.first, ownUnits.second),
00125                           own_building_const_iterator(IsBuilding<OwnUnit>(), ownUnits.second, ownUnits.second));
00126   }
00127 
00128   size_t getNbOwnBuildings() const
00129   {
00130     // Note that this could be implemented in log n (instead of n) by using a std::map with BWAPI::UnitTypes building ID ranges
00131 
00132     std::pair<own_building_const_iterator, own_building_const_iterator> ownBuildings = getOwnBuildings();
00133     return std::distance(ownBuildings.first, ownBuildings.second);
00134   }
00135 
00136   void updateOwnUnits()
00137   {
00138     for (std::list<PrimitiveLocation*>::iterator it = m_primitiveSubLocationsCache.begin(); it != m_primitiveSubLocationsCache.end(); ++it)
00139     {
00140       (*it)->updateOwnUnits();
00141     }
00142   }
00143 
00144 #pragma endregion Own_Units
00145 
00146 #pragma region Enemy_Units
00147 
00148   std::pair<enemy_unit_iterator, enemy_unit_iterator> 
00149     getEnemyUnits()
00150   {
00151     return std::make_pair(enemy_unit_iterator(m_enemyUnitsCache.begin()),
00152                           enemy_unit_iterator(m_enemyUnitsCache.end()));
00153   }
00154 
00155   std::pair<enemy_unit_const_iterator, enemy_unit_const_iterator> 
00156     getEnemyUnits() const
00157   {
00158     return std::make_pair(enemy_unit_const_iterator(m_enemyUnitsCache.begin()),
00159                           enemy_unit_const_iterator(m_enemyUnitsCache.end()));
00160   }
00161 
00162   std::pair<enemy_unit_type_iterator, enemy_unit_type_iterator> 
00163     getEnemyUnits(BWAPI::UnitType unitType)
00164   {
00165     std::pair<stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<EnemyUnit>>::iterator, stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<EnemyUnit>>::iterator> iterators = m_enemyUnitsCache.equal_range(unitType);
00166     return std::make_pair(enemy_unit_type_iterator(iterators.first), enemy_unit_type_iterator(iterators.second));
00167   }
00168 
00169   std::pair<enemy_unit_type_const_iterator, enemy_unit_type_const_iterator> 
00170     getEnemyUnits(BWAPI::UnitType unitType) const
00171   {
00172     std::pair<stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<EnemyUnit>>::const_iterator, stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<EnemyUnit>>::const_iterator> iterators = m_enemyUnitsCache.equal_range(unitType);
00173     return std::make_pair(enemy_unit_type_const_iterator(iterators.first), enemy_unit_type_const_iterator(iterators.second));
00174   }
00175 
00176   std::pair<enemy_building_iterator, enemy_building_iterator>
00177     getEnemyBuildings()
00178   {
00179     std::pair<enemy_unit_iterator, enemy_unit_iterator> enemyUnits = getEnemyUnits();
00180     return std::make_pair(enemy_building_iterator(IsBuilding<EnemyUnit>(), enemyUnits.first, enemyUnits.second),
00181                           enemy_building_iterator(IsBuilding<EnemyUnit>(), enemyUnits.second, enemyUnits.second));
00182   }
00183 
00184   std::pair<enemy_building_const_iterator, enemy_building_const_iterator>
00185     getEnemyBuildings() const
00186   {
00187     std::pair<enemy_unit_const_iterator, enemy_unit_const_iterator> enemyUnits = getEnemyUnits();
00188     return std::make_pair(enemy_building_const_iterator(IsBuilding<EnemyUnit>(), enemyUnits.first, enemyUnits.second),
00189                           enemy_building_const_iterator(IsBuilding<EnemyUnit>(), enemyUnits.second, enemyUnits.second));
00190   }
00191 
00192   size_t getNbEnemyUnits() const
00193   {
00194     const size_t nbUnitsCache = m_enemyUnitsCache.size();
00195 
00196 #ifdef _DEBUG
00197     size_t nbUnits = 0;
00198     for (std::list<StaticLocation*>::const_iterator it = m_subLocations.begin(); it != m_subLocations.end(); ++it)
00199       nbUnits += (*it)->getNbEnemyUnits();
00200     assert(nbUnits == nbUnitsCache);
00201 #endif
00202 
00203     return nbUnitsCache;
00204   }
00205 
00206   size_t getNbEnemyUnits(BWAPI::UnitType unitType) const
00207   {
00208     const size_t nbUnitsCache = m_enemyUnitsCache.count(unitType);
00209 
00210 #ifdef _DEBUG
00211     size_t nbUnits = 0;
00212     for (std::list<StaticLocation*>::const_iterator it = m_subLocations.begin(); it != m_subLocations.end(); ++it)
00213       nbUnits += (*it)->getNbEnemyUnits(unitType);
00214     assert(nbUnits == nbUnitsCache);
00215 #endif
00216 
00217     return nbUnitsCache;
00218   }
00219 
00220   size_t getNbEnemyBuildings() const
00221   {
00222     std::pair<enemy_building_const_iterator, enemy_building_const_iterator> enemyBuildings = getEnemyBuildings();
00223     return std::distance(enemyBuildings.first, enemyBuildings.second);
00224   }
00225 
00226   void updateEnemyBuildings()
00227   {
00228     for (std::list<PrimitiveLocation*>::iterator it = m_primitiveSubLocationsCache.begin(); it != m_primitiveSubLocationsCache.end(); ++it)
00229     {
00230       (*it)->updateEnemyBuildings();
00231     }
00232   }
00233 
00234   void updateEnemyUnits()
00235   {
00236     for (std::list<PrimitiveLocation*>::iterator it = m_primitiveSubLocationsCache.begin(); it != m_primitiveSubLocationsCache.end(); ++it)
00237     {
00238       (*it)->updateEnemyUnits();
00239     }
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     return std::make_pair(neutral_unit_iterator(m_neutralUnitsCache.begin()),
00250                           neutral_unit_iterator(m_neutralUnitsCache.end()));
00251   }
00252 
00253   std::pair<neutral_unit_const_iterator, neutral_unit_const_iterator> 
00254     getNeutralUnits() const
00255   {
00256     return std::make_pair(neutral_unit_const_iterator(m_neutralUnitsCache.begin()),
00257                           neutral_unit_const_iterator(m_neutralUnitsCache.end()));
00258   }
00259 
00260   std::pair<neutral_unit_type_iterator, neutral_unit_type_iterator> 
00261     getNeutralUnits(BWAPI::UnitType unitType)
00262   {
00263     std::pair<stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<NeutralUnit>>::iterator, stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<NeutralUnit>>::iterator> iterators = m_neutralUnitsCache.equal_range(unitType);
00264     return std::make_pair(neutral_unit_type_iterator(iterators.first), neutral_unit_type_iterator(iterators.second));
00265   }
00266 
00267   std::pair<neutral_unit_type_const_iterator, neutral_unit_type_const_iterator> 
00268     getNeutralUnits(BWAPI::UnitType unitType) const
00269   {
00270     std::pair<stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<NeutralUnit>>::const_iterator, stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<NeutralUnit>>::const_iterator> iterators = m_neutralUnitsCache.equal_range(unitType);
00271     return std::make_pair(neutral_unit_type_const_iterator(iterators.first), neutral_unit_type_const_iterator(iterators.second));
00272   }
00273 
00274   std::pair<neutral_building_iterator, neutral_building_iterator>
00275     getNeutralBuildings()
00276   {
00277     std::pair<neutral_unit_iterator, neutral_unit_iterator> neutralUnits = getNeutralUnits();
00278     return std::make_pair(neutral_building_iterator(IsBuilding<NeutralUnit>(), neutralUnits.first, neutralUnits.second),
00279                           neutral_building_iterator(IsBuilding<NeutralUnit>(), neutralUnits.second, neutralUnits.second));
00280   }
00281 
00282   std::pair<neutral_building_const_iterator, neutral_building_const_iterator>
00283     getNeutralBuildings() const
00284   {
00285     std::pair<neutral_unit_const_iterator, neutral_unit_const_iterator> neutralUnits = getNeutralUnits();
00286     return std::make_pair(neutral_building_const_iterator(IsBuilding<NeutralUnit>(), neutralUnits.first, neutralUnits.second),
00287                           neutral_building_const_iterator(IsBuilding<NeutralUnit>(), neutralUnits.second, neutralUnits.second));
00288   }
00289 
00290   size_t getNbNeutralUnits() const
00291   {
00292     const size_t nbUnitsCache = m_neutralUnitsCache.size();
00293 
00294 #ifdef _DEBUG
00295     size_t nbUnits = 0;
00296     for (std::list<StaticLocation*>::const_iterator it = m_subLocations.begin(); it != m_subLocations.end(); ++it)
00297       nbUnits += (*it)->getNbNeutralUnits();
00298     assert(nbUnits == nbUnitsCache);
00299 #endif
00300 
00301     return nbUnitsCache;
00302   }
00303 
00304   size_t getNbNeutralUnits(BWAPI::UnitType unitType) const
00305   {
00306     const size_t nbUnitsCache = m_neutralUnitsCache.count(unitType);
00307 
00308 #ifdef _DEBUG
00309     size_t nbUnits = 0;
00310     for (std::list<StaticLocation*>::const_iterator it = m_subLocations.begin(); it != m_subLocations.end(); ++it)
00311       nbUnits += (*it)->getNbNeutralUnits(unitType);
00312     assert(nbUnits == nbUnitsCache);
00313 #endif
00314 
00315     return nbUnitsCache;
00316   }
00317 
00318   size_t getNbNeutralBuildings() const
00319   {
00320     std::pair<neutral_building_const_iterator, neutral_building_const_iterator> neutralBuildings = getNeutralBuildings();
00321     return std::distance(neutralBuildings.first, neutralBuildings.second);
00322   }
00323 
00324   void updateNeutralBuildings()
00325   {
00326     for (std::list<PrimitiveLocation*>::iterator it = m_primitiveSubLocationsCache.begin(); it != m_primitiveSubLocationsCache.end(); ++it)
00327     {
00328       (*it)->updateNeutralBuildings();
00329     }
00330   }
00331 
00332   void updateNeutralUnits()
00333   {
00334     for (std::list<PrimitiveLocation*>::iterator it = m_primitiveSubLocationsCache.begin(); it != m_primitiveSubLocationsCache.end(); ++it)
00335     {
00336       (*it)->updateNeutralUnits();
00337     }
00338   }
00339 
00340 #pragma endregion Neutral_Units
00341 
00342 protected:
00343   friend class PrimitiveLocation;
00344 
00345   template <class UnitType>
00346   struct UnitManagement : public StaticLocation::UnitManagement<UnitType>
00347   {
00348   };
00349   template <>
00350   struct UnitManagement<OwnUnit> : public StaticLocation::UnitManagement<OwnUnit>
00351   {
00352     static stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<OwnUnit>>& getUnits(CompositeLocation* location)
00353     {
00354       return location->m_ownUnitsCache;
00355     }
00356   };
00357   template <>
00358   struct UnitManagement<EnemyUnit> : public StaticLocation::UnitManagement<EnemyUnit>
00359   {
00360     static stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<EnemyUnit>>& getUnits(CompositeLocation* location)
00361     {
00362       return location->m_enemyUnitsCache;
00363     }
00364   };
00365   template <>
00366   struct UnitManagement<NeutralUnit> : public StaticLocation::UnitManagement<NeutralUnit>
00367   {
00368     static stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<NeutralUnit>>& getUnits(CompositeLocation* location)
00369     {
00370       return location->m_neutralUnitsCache;
00371     }
00372   };
00373   template <class UnitType> friend struct UnitManagement;
00374 
00375   template <class UnitType>
00376   void onUnitAdded(UnitType* unit);
00377 
00378   template <class UnitType>
00379   void onUnitRemoved(UnitType* unit);
00380 
00381   //template <class UnitType>
00382   //void onUnitMorphed(UnitType* ownUnit);
00383 
00384   template <class UnitType>
00385   void onUnitTransferred(UnitType* ownUnit, StaticLocation* fromLocation, StaticLocation* toLocation);
00386 
00387   virtual size_t getNbOwnUnitsV() const { return getNbOwnUnits(); }
00388   virtual size_t getNbOwnUnitsV(BWAPI::UnitType unitType) const { return getNbOwnUnits(unitType); }
00389   virtual size_t getNbOwnBuildingsV() const { return getNbOwnBuildings(); }
00390 
00391   virtual size_t getNbEnemyUnitsV() const { return getNbEnemyUnits(); }
00392   virtual size_t getNbEnemyUnitsV(BWAPI::UnitType unitType) const { return getNbEnemyUnits(unitType); }
00393   virtual size_t getNbEnemyBuildingsV() const { return getNbEnemyBuildings(); }
00394 
00395   virtual size_t getNbNeutralUnitsV() const { return getNbNeutralUnits(); }
00396   virtual size_t getNbNeutralUnitsV(BWAPI::UnitType unitType) const { return getNbNeutralUnits(unitType); }
00397   virtual size_t getNbNeutralBuildingsV() const { return getNbNeutralBuildings(); }
00398 
00399   virtual void updateOwnUnitsV()
00400   {
00401     updateOwnUnits();
00402   }
00403   virtual void updateEnemyBuildingsV()
00404   {
00405     updateEnemyBuildings();
00406   }
00407   virtual void updateEnemyUnitsV()
00408   {
00409     updateEnemyUnits();
00410   }
00411   virtual void updateNeutralBuildingsV()
00412   {
00413     updateNeutralBuildings();
00414   }
00415   virtual void updateNeutralUnitsV()
00416   {
00417     updateNeutralUnits();
00418   }
00419 
00420   void addSubLocation(StaticLocation* location)
00421   {
00422     m_subLocations.insert(m_subLocations.end(), location);
00423 
00424     PrimitiveLocation* primitiveLocation = dynamic_cast<PrimitiveLocation*>(location);
00425     if (primitiveLocation != NULL)
00426     {
00427       onPrimitiveSubLocationAdded(primitiveLocation);
00428     }
00429   }
00430 
00431   void onPrimitiveSubLocationAdded(PrimitiveLocation* location)
00432   {
00433     m_primitiveSubLocationsCache.insert(m_primitiveSubLocationsCache.end(), location);
00434 
00435     if (m_parent != NULL)
00436     {
00437       m_parent->onPrimitiveSubLocationAdded(location);
00438     }
00439   }
00440 
00444   std::list<StaticLocation*> m_subLocations;
00448   std::list<PrimitiveLocation*> m_primitiveSubLocationsCache;
00449 
00450   stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<OwnUnit>> m_ownUnitsCache;
00451   
00452   stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<EnemyUnit>> m_enemyUnitsCache;
00453 
00454   stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<NeutralUnit>> m_neutralUnitsCache;
00455 
00456 private:
00457   template <class UnitType>
00458   void addUnitInternal(UnitType* unit);
00459 
00460   template <class UnitType>
00461   void removeUnitInternal(UnitType* unit);
00462 };
00463 
00464 template <class UnitType>
00465 void CompositeLocation::onUnitAdded(UnitType* unit)
00466 {
00467   addUnitInternal(unit);
00468   UnitManagement<UnitType>::getUnitAddedEvent(this).raise(unit);
00469 
00470   if (m_parent != NULL)
00471     m_parent->onUnitAdded(unit);
00472 }
00473 
00474 template <class UnitType>
00475 void CompositeLocation::onUnitRemoved(UnitType* unit)
00476 {
00477   removeUnitInternal(unit);
00478   UnitManagement<UnitType>::getUnitRemovedEvent(this).raise(unit);
00479 
00480   if (m_parent != NULL)
00481     m_parent->onUnitRemoved(unit);
00482 }
00483 
00484 //template <class UnitType>
00485 //void CompositeLocation::onUnitMorphed(UnitType* unit)
00486 //{
00487 //  removeUnitInternal(unit);
00488 //  addUnitInternal(unit);
00489 //
00490 //  if (m_parent != NULL)
00491 //    m_parent->onUnitMorphed(unit);
00492 //}
00493 
00494 template <class UnitType>
00495 void CompositeLocation::onUnitTransferred(UnitType* unit, StaticLocation* fromLocation, StaticLocation* toLocation)
00496 {
00497   const bool containsFromLocation = fromLocation->isIn(this);
00498   const bool containsToLocation = toLocation->isIn(this);
00499   if (containsFromLocation != containsToLocation)
00500   {
00501     if (containsFromLocation)
00502     {
00503       assert(!containsToLocation);
00504       removeUnitInternal(unit);
00505       UnitManagement<UnitType>::getUnitRemovedEvent(this).raise(unit);
00506     }
00507     else
00508     {
00509       assert(!containsFromLocation);
00510       addUnitInternal(unit);
00511       UnitManagement<UnitType>::getUnitAddedEvent(this).raise(unit);
00512     }
00513   }
00514   if (m_parent != NULL)
00515     m_parent->onUnitTransferred(unit, fromLocation, toLocation);
00516 }
00517 
00518 template <class UnitType>
00519 void CompositeLocation::addUnitInternal(UnitType* unit)
00520 {
00521   stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<UnitType>>::iterator it = 
00522     UnitManagement<UnitType>::getUnits(this).insert(std::make_pair(UnitManagement<UnitType>::getUnitType(unit), UnitWrapper<UnitType>(unit)));
00523   UnitWrapper<UnitType>& unitWrapper = it->second;
00524   unitWrapper.m_posInContainer = it;
00525   if (dynamic_cast<Region*>(this) != NULL)
00526   {
00527     assert(unit->m_regionData == NULL);
00528     unit->m_regionData = &unitWrapper;
00529   }
00530   else if (dynamic_cast<Map*>(this) != NULL)
00531   {
00532     assert(unit->m_mapData == NULL);
00533     unit->m_mapData = &unitWrapper;
00534   }
00535   else
00536   {
00537     throw std::runtime_error("Unsupported composite location class...(oups)");
00538   }
00539   assert(&unitWrapper.m_posInContainer->second == &unitWrapper);
00540 }
00541 
00542 template <class UnitType>
00543 void CompositeLocation::removeUnitInternal(UnitType* unit)
00544 {
00545   UnitWrapper<UnitType>* unitWrapper = NULL;
00546   if (dynamic_cast<Region*>(this) != NULL)
00547   {
00548     assert(unit->m_regionData != NULL);
00549     unitWrapper = reinterpret_cast<UnitWrapper<UnitType>*>(unit->m_regionData);
00550     unit->m_regionData = NULL;
00551   }
00552   else if (dynamic_cast<Map*>(this) != NULL)
00553   {
00554     assert(unit->m_mapData != NULL);
00555     unitWrapper = reinterpret_cast<UnitWrapper<UnitType>*>(unit->m_mapData);
00556     unit->m_mapData = NULL;
00557   }
00558   else
00559   {
00560     throw std::runtime_error("Unsupported composite location class...(oups)");
00561   }
00562 
00563   assert(&unitWrapper->m_posInContainer->second == unitWrapper);
00564 
00565   UnitManagement<UnitType>::getUnits(this).erase(unitWrapper->m_posInContainer);
00566 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines