# HG changeset patch # User peter1138 # Date 2019-02-24 19:16:24 # Node ID dad55774ae34d451887261d83ea7fc9e10c22201 # Parent 4a18cf6bbfe5a19aa84bbe6f00db05ef1b6faec3 Codechange: Convert IndustryVector to a std::set. diff --git a/src/cargomonitor.cpp b/src/cargomonitor.cpp --- a/src/cargomonitor.cpp +++ b/src/cargomonitor.cpp @@ -151,9 +151,9 @@ void AddCargoDelivery(CargoID cargo_type 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 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1044,8 +1044,9 @@ static uint DeliverGoodsToIndustry(const 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 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -521,7 +521,7 @@ static bool TransportIndustryGoods(TileI 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(TileI 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_in 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 --- 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(TileIn 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(TileIn } 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(TileIn */ 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 --- a/src/station_base.h +++ b/src/station_base.h @@ -20,6 +20,7 @@ #include "linkgraph/linkgraph_type.h" #include "newgrf_storage.h" #include +#include typedef Pool StationPool; extern StationPool _station_pool; @@ -440,7 +441,11 @@ private: } }; -typedef SmallVector IndustryVector; +struct IndustryCompare { + bool operator() (const Industry *lhs, const Industry *rhs) const; +}; + +typedef std::set IndustryList; /** Station data structure */ struct Station FINAL : SpecializedStation { @@ -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 --- a/src/subsidy.cpp +++ b/src/subsidy.cpp @@ -596,9 +596,9 @@ bool CheckSubsidised(CargoID cargo_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); }