Changeset - r26942:b4e367b734d9
[Not reviewed]
master
0 2 0
Jonathan G Rennison - 5 years ago 2019-09-23 17:45:37
j.g.rennison@gmail.com
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.
2 files changed with 7 insertions and 4 deletions:
0 comments (0 inline, 0 general)
src/station.cpp
Show inline comments
 
@@ -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); }
 
}
 

	
 
/************************************************************************/
src/station_base.h
Show inline comments
 
@@ -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;
0 comments (0 inline, 0 general)