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