changeset 20388:812cb93f2f44 draft

(svn r25346) -Codechange: Glue between stations and flow stats
author fonsinchen <fonsinchen@openttd.org>
date Sun, 09 Jun 2013 12:49:47 +0000
parents efe55280aefe
children 550023ce3a7b
files src/station.cpp src/station_base.h src/station_cmd.cpp
diffstat 3 files changed, 47 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/station.cpp
+++ b/src/station.cpp
@@ -97,6 +97,11 @@
 				delete lg;
 			}
 		}
+		Station *st;
+		FOR_ALL_STATIONS(st) {
+			GoodsEntry *ge = &st->goods[c];
+			ge->flows.DeleteFlows(this->index);
+		}
 	}
 
 	Vehicle *v;
--- a/src/station_base.h
+++ b/src/station_base.h
@@ -196,6 +196,7 @@
 
 	LinkGraphID link_graph; ///< Link graph this station belongs to.
 	NodeID node;            ///< ID of node in link graph referring to this goods entry.
+	FlowStatMap flows;      ///< Planned flows through this station.
 
 	/**
 	 * Reports whether a vehicle has ever tried to load the cargo at this station.
@@ -212,6 +213,33 @@
 	{
 		return HasBit(this->acceptance_pickup, GES_PICKUP);
 	}
+
+	uint GetSumFlowVia(StationID via) const;
+
+	/**
+	 * Get the best next hop for a cargo packet from station source.
+	 * @param source Source of the packet.
+	 * @return The chosen next hop or INVALID_STATION if none was found.
+	 */
+	inline StationID GetVia(StationID source) const
+	{
+		FlowStatMap::const_iterator flow_it(this->flows.find(source));
+		return flow_it != this->flows.end() ? flow_it->second.GetVia() : INVALID_STATION;
+	}
+
+	/**
+	 * Get the best next hop for a cargo packet from station source, optionally
+	 * excluding one or two stations.
+	 * @param source Source of the packet.
+	 * @param excluded If this station would be chosen choose the second best one instead.
+	 * @param excluded2 Second station to be excluded, if != INVALID_STATION.
+	 * @return The chosen next hop or INVALID_STATION if none was found.
+	 */
+	inline StationID GetVia(StationID source, StationID excluded, StationID excluded2 = INVALID_STATION) const
+	{
+		FlowStatMap::const_iterator flow_it(this->flows.find(source));
+		return flow_it != this->flows.end() ? flow_it->second.GetVia(excluded, excluded2) : INVALID_STATION;
+	}
 };
 
 /** All airport-related information. Only valid if tile != INVALID_TILE. */
--- a/src/station_cmd.cpp
+++ b/src/station_cmd.cpp
@@ -4161,6 +4161,20 @@
 	}
 }
 
+/**
+ * Get the sum of flows via a specific station from this GoodsEntry.
+ * @param via Remote station to look for.
+ * @return a FlowStat with all flows for 'via' added up.
+ */
+uint GoodsEntry::GetSumFlowVia(StationID via) const
+{
+	uint ret = 0;
+	for (FlowStatMap::const_iterator i = this->flows.begin(); i != this->flows.end(); ++i) {
+		ret += i->second.GetShare(via);
+	}
+	return ret;
+}
+
 extern const TileTypeProcs _tile_type_station_procs = {
 	DrawTile_Station,           // draw_tile_proc
 	GetSlopePixelZ_Station,     // get_slope_z_proc