mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-12 18:40:29 +00:00
(svn r25424) -Fix: keep old flows around in an invalidated state to continue routing cargo if necessary
This commit is contained in:
parent
b923eb31a8
commit
f0119308f6
@ -72,7 +72,19 @@ LinkGraphJob::~LinkGraphJob()
|
||||
}
|
||||
}
|
||||
|
||||
ge.flows.swap(flows);
|
||||
/* Swap shares and invalidate ones that are completely deleted. Don't
|
||||
* really delete them as we could then end up with unroutable cargo
|
||||
* somewhere. */
|
||||
for (FlowStatMap::iterator it(ge.flows.begin()); it != ge.flows.end(); ++it) {
|
||||
FlowStatMap::iterator new_it = flows.find(it->first);
|
||||
if (new_it == flows.end()) {
|
||||
it->second.Invalidate();
|
||||
} else {
|
||||
it->second.SwapShares(new_it->second);
|
||||
flows.erase(new_it);
|
||||
}
|
||||
}
|
||||
ge.flows.insert(flows.begin(), flows.end());
|
||||
InvalidateWindowData(WC_STATION_VIEW, st->index, this->Cargo());
|
||||
}
|
||||
}
|
||||
|
@ -79,6 +79,13 @@ public:
|
||||
*/
|
||||
inline const SharesMap *GetShares() const { return &this->shares; }
|
||||
|
||||
/**
|
||||
* Swap the shares maps, and thus the content of this FlowStat with the
|
||||
* other one.
|
||||
* @param other FlowStat to swap with.
|
||||
*/
|
||||
inline void SwapShares(FlowStat &other) { this->shares.swap(other.shares); }
|
||||
|
||||
/**
|
||||
* Get a station a package can be routed to. This done by drawing a
|
||||
* random number between 0 and sum_shares and then looking that up in
|
||||
@ -94,6 +101,8 @@ public:
|
||||
|
||||
StationID GetVia(StationID excluded, StationID excluded2 = INVALID_STATION) const;
|
||||
|
||||
void Invalidate();
|
||||
|
||||
private:
|
||||
SharesMap shares; ///< Shares of flow to be sent via specified station (or consumed locally).
|
||||
};
|
||||
|
@ -4086,7 +4086,23 @@ StationID FlowStat::GetVia(StationID excluded, StationID excluded2) const
|
||||
}
|
||||
assert(it3 != this->shares.end());
|
||||
return it3->second;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reduce all flows to minimum capacity so that they don't get in the way of
|
||||
* link usage statistics too much. Keep them around, though, to continue
|
||||
* routing any remaining cargo.
|
||||
*/
|
||||
void FlowStat::Invalidate()
|
||||
{
|
||||
assert(!this->shares.empty());
|
||||
SharesMap new_shares;
|
||||
uint i = 0;
|
||||
for (SharesMap::iterator it(this->shares.begin()); it != this->shares.end(); ++it) {
|
||||
new_shares[++i] = it->second;
|
||||
}
|
||||
this->shares.swap(new_shares);
|
||||
assert(!this->shares.empty());
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user