summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cargomonitor.cpp6
-rw-r--r--src/economy.cpp5
-rw-r--r--src/industry_cmd.cpp9
-rw-r--r--src/station.cpp12
-rw-r--r--src/station_base.h11
-rw-r--r--src/subsidy.cpp6
6 files changed, 30 insertions, 19 deletions
diff --git a/src/cargomonitor.cpp b/src/cargomonitor.cpp
index 40a029ac5..82f8d8e4c 100644
--- a/src/cargomonitor.cpp
+++ b/src/cargomonitor.cpp
@@ -151,9 +151,9 @@ void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, Sour
if (iter != _cargo_deliveries.end()) iter->second += amount;
/* Industry delivery. */
- for (const Industry * const *ip = st->industries_near.Begin(); ip != st->industries_near.End(); ip++) {
- if ((*ip)->index != dest) continue;
- CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, (*ip)->index);
+ for (Industry *ind : st->industries_near) {
+ if (ind->index != dest) continue;
+ CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, ind->index);
CargoMonitorMap::iterator iter = _cargo_deliveries.find(num);
if (iter != _cargo_deliveries.end()) iter->second += amount;
}
diff --git a/src/economy.cpp b/src/economy.cpp
index 205064096..b02d4bd76 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -1044,8 +1044,9 @@ static uint DeliverGoodsToIndustry(const Station *st, CargoID cargo_type, uint n
uint accepted = 0;
- for (uint i = 0; i < st->industries_near.Length() && num_pieces != 0; i++) {
- Industry *ind = st->industries_near[i];
+ for (Industry *ind : st->industries_near) {
+ if (num_pieces == 0) break;
+
if (ind->index == source) continue;
if (!_settings_game.station.serve_neutral_industries) {
diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp
index cc05893fb..b1e48f76b 100644
--- a/src/industry_cmd.cpp
+++ b/src/industry_cmd.cpp
@@ -521,7 +521,7 @@ static bool TransportIndustryGoods(TileIndex tile)
if (i->neutral_station != NULL && !_settings_game.station.serve_neutral_industries) {
/* Industry has a neutral station. Use it and ignore any other nearby stations. */
- *neutral.Append() = i->neutral_station;
+ neutral.insert(i->neutral_station);
}
for (uint j = 0; j < lengthof(i->produced_cargo_waiting); j++) {
@@ -534,7 +534,7 @@ static bool TransportIndustryGoods(TileIndex tile)
i->this_month_production[j] += cw;
- uint am = MoveGoodsToStation(i->produced_cargo[j], cw, ST_INDUSTRY, i->index, neutral.Length() != 0 ? &neutral : stations.GetStations());
+ uint am = MoveGoodsToStation(i->produced_cargo[j], cw, ST_INDUSTRY, i->index, neutral.size() != 0 ? &neutral : stations.GetStations());
i->this_month_transported[j] += am;
moved_cargo |= (am != 0);
@@ -2907,3 +2907,8 @@ extern const TileTypeProcs _tile_type_industry_procs = {
GetFoundation_Industry, // get_foundation_proc
TerraformTile_Industry, // terraform_tile_proc
};
+
+bool IndustryCompare::operator() (const Industry *lhs, const Industry *rhs) const
+{
+ return lhs->index < rhs->index;
+}
diff --git a/src/station.cpp b/src/station.cpp
index 04c5a66bd..2fc1bdb45 100644
--- a/src/station.cpp
+++ b/src/station.cpp
@@ -307,8 +307,8 @@ Rect Station::GetCatchmentRect() const
/** Rect and pointer to IndustryVector */
struct RectAndIndustryVector {
- Rect rect; ///< The rectangle to search the industries in.
- IndustryVector *industries_near; ///< The nearby industries.
+ Rect rect; ///< The rectangle to search the industries in.
+ IndustryList *industries_near; ///< The nearby industries.
};
/**
@@ -328,7 +328,7 @@ static bool FindIndustryToDeliver(TileIndex ind_tile, void *user_data)
Industry *ind = Industry::GetByTile(ind_tile);
/* Don't check further if this industry is already in the list */
- if (riv->industries_near->Contains(ind)) return false;
+ if (riv->industries_near->find(ind) != riv->industries_near->end()) return false;
/* Only process tiles in the station acceptance rectangle */
int x = TileX(ind_tile);
@@ -342,7 +342,7 @@ static bool FindIndustryToDeliver(TileIndex ind_tile, void *user_data)
}
if (cargo_index >= lengthof(ind->accepts_cargo)) return false;
- *riv->industries_near->Append() = ind;
+ riv->industries_near->insert(ind);
return false;
}
@@ -353,12 +353,12 @@ static bool FindIndustryToDeliver(TileIndex ind_tile, void *user_data)
*/
void Station::RecomputeIndustriesNear()
{
- this->industries_near.Clear();
+ this->industries_near.clear();
if (this->rect.IsEmpty()) return;
if (!_settings_game.station.serve_neutral_industries && this->industry != NULL) {
/* Station is associated with an industry, so we only need to deliver to that industry. */
- *this->industries_near.Append() = this->industry;
+ this->industries_near.insert(this->industry);
return;
}
diff --git a/src/station_base.h b/src/station_base.h
index 0ea960bb1..d1e62f614 100644
--- a/src/station_base.h
+++ b/src/station_base.h
@@ -20,6 +20,7 @@
#include "linkgraph/linkgraph_type.h"
#include "newgrf_storage.h"
#include <map>
+#include <set>
typedef Pool<BaseStation, StationID, 32, 64000> StationPool;
extern StationPool _station_pool;
@@ -440,7 +441,11 @@ private:
}
};
-typedef SmallVector<Industry *, 2> IndustryVector;
+struct IndustryCompare {
+ bool operator() (const Industry *lhs, const Industry *rhs) const;
+};
+
+typedef std::set<Industry *, IndustryCompare> IndustryList;
/** Station data structure */
struct Station FINAL : SpecializedStation<Station, false> {
@@ -472,8 +477,8 @@ public:
GoodsEntry goods[NUM_CARGO]; ///< Goods at this station
CargoTypes always_accepted; ///< Bitmask of always accepted cargo types (by houses, HQs, industry tiles when industry doesn't accept cargo)
- IndustryVector industries_near; ///< Cached list of industries near the station that can accept cargo, @see DeliverGoodsToIndustry()
- Industry *industry; ///< NOSAVE: Associated industry for neutral stations. (Rebuilt on load from Industry->st)
+ IndustryList industries_near; ///< Cached list of industries near the station that can accept cargo, @see DeliverGoodsToIndustry()
+ Industry *industry; ///< NOSAVE: Associated industry for neutral stations. (Rebuilt on load from Industry->st)
Station(TileIndex tile = INVALID_TILE);
~Station();
diff --git a/src/subsidy.cpp b/src/subsidy.cpp
index d1fda0f0a..1b375d215 100644
--- a/src/subsidy.cpp
+++ b/src/subsidy.cpp
@@ -596,9 +596,9 @@ bool CheckSubsidised(CargoID cargo_type, CompanyID company, SourceType src_type,
if (s->cargo_type == cargo_type && s->src_type == src_type && s->src == src && (!s->IsAwarded() || s->awarded == company)) {
switch (s->dst_type) {
case ST_INDUSTRY:
- for (const Industry * const *ip = st->industries_near.Begin(); ip != st->industries_near.End(); ip++) {
- if (s->dst == (*ip)->index) {
- assert((*ip)->part_of_subsidy & POS_DST);
+ for (Industry *ind : st->industries_near) {
+ if (s->dst == ind->index) {
+ assert(ind->part_of_subsidy & POS_DST);
subsidised = true;
if (!s->IsAwarded()) s->AwardTo(company);
}