Fix: O(N^2) cost of Station::RecomputeCatchmentForAll

Station::RemoveFromAllNearbyLists does not need to be called when
all station nearby lists have been cleared and are being regenerated.
pull/491/head
Jonathan G Rennison 5 years ago committed by rubidium42
parent 5d0ad5625b
commit 0e4b716815

@ -455,11 +455,12 @@ bool Station::CatchmentCoversTown(TownID t) const
/**
* Recompute tiles covered in our catchment area.
* This will additionally recompute nearby towns and industries.
* @param no_clear_nearby_lists If Station::RemoveFromAllNearbyLists does not need to be called.
*/
void Station::RecomputeCatchment()
void Station::RecomputeCatchment(bool no_clear_nearby_lists)
{
this->industries_near.clear();
this->RemoveFromAllNearbyLists();
if (!no_clear_nearby_lists) this->RemoveFromAllNearbyLists();
if (this->rect.IsEmpty()) {
this->catchment_tiles.Reset();
@ -526,7 +527,9 @@ void Station::RecomputeCatchment()
*/
/* static */ void Station::RecomputeCatchmentForAll()
{
for (Station *st : Station::Iterate()) { st->RecomputeCatchment(); }
for (Town *t : Town::Iterate()) { t->stations_near.clear(); }
for (Industry *i : Industry::Iterate()) { i->stations_near.clear(); }
for (Station *st : Station::Iterate()) { st->RecomputeCatchment(true); }
}
/************************************************************************/

@ -501,7 +501,7 @@ public:
uint GetPlatformLength(TileIndex tile, DiagDirection dir) const override;
uint GetPlatformLength(TileIndex tile) const override;
void RecomputeCatchment();
void RecomputeCatchment(bool no_clear_nearby_lists = false);
static void RecomputeCatchmentForAll();
uint GetCatchmentRadius() const;

Loading…
Cancel
Save