# HG changeset patch # User Jonathan G Rennison # Date 2019-09-23 17:45:37 # Node ID b4e367b734d91937ddb340c5ba134e649c0d3e53 # Parent d685f421058549a634f6d6983e443ec5971309c1 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. diff --git a/src/station.cpp b/src/station.cpp --- a/src/station.cpp +++ b/src/station.cpp @@ -455,11 +455,12 @@ bool Station::CatchmentCoversTown(TownID /** * 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); } } /************************************************************************/ diff --git a/src/station_base.h b/src/station_base.h --- a/src/station_base.h +++ b/src/station_base.h @@ -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;