diff --git a/src/ai/api/ai_subsidylist.cpp b/src/ai/api/ai_subsidylist.cpp index cfda16e9a3..d372b4b2f5 100644 --- a/src/ai/api/ai_subsidylist.cpp +++ b/src/ai/api/ai_subsidylist.cpp @@ -8,7 +8,8 @@ AISubsidyList::AISubsidyList() { - for (uint i = 0; i < lengthof(_subsidies); i++) { - if (AISubsidy::IsValidSubsidy(i)) this->AddItem(i); + const Subsidy *s; + FOR_ALL_SUBSIDIES(s) { + this->AddItem(s - _subsidies); } } diff --git a/src/economy.cpp b/src/economy.cpp index 0891e1bd94..2883f65c15 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -327,10 +327,9 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner) if (new_owner == INVALID_OWNER) { Subsidy *s; - - for (s = _subsidies; s != endof(_subsidies); s++) { - if (s->cargo_type != CT_INVALID && s->age >= 12) { - if (Station::Get(s->to)->owner == old_owner) s->cargo_type = CT_INVALID; + FOR_ALL_SUBSIDIES(s) { + if (s->age >= 12 && Station::Get(s->to)->owner == old_owner) { + s->cargo_type = CT_INVALID; } } } diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 809248faf2..28c5cd5255 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1916,8 +1916,8 @@ bool AfterLoadGame() } /* Delete invalid subsidies possibly present in old versions (but converted to new savegame) */ - for (Subsidy *s = _subsidies; s < endof(_subsidies); s++) { - if (s->cargo_type == CT_INVALID) continue; + Subsidy *s; + FOR_ALL_SUBSIDIES(s) { if (s->age >= 12) { /* Station -> Station */ const Station *from = Station::GetIfValid(s->from); diff --git a/src/saveload/subsidy_sl.cpp b/src/saveload/subsidy_sl.cpp index 7ff23e6f8e..7e59a80e31 100644 --- a/src/saveload/subsidy_sl.cpp +++ b/src/saveload/subsidy_sl.cpp @@ -19,15 +19,10 @@ static const SaveLoad _subsidies_desc[] = { void Save_SUBS() { - int i; Subsidy *s; - - for (i = 0; i != lengthof(_subsidies); i++) { - s = &_subsidies[i]; - if (s->cargo_type != CT_INVALID) { - SlSetArrayIndex(i); - SlObject(s, _subsidies_desc); - } + FOR_ALL_SUBSIDIES(s) { + SlSetArrayIndex(s - _subsidies); + SlObject(s, _subsidies_desc); } } diff --git a/src/subsidy.cpp b/src/subsidy.cpp index d444c4d436..9a60dfa2df 100644 --- a/src/subsidy.cpp +++ b/src/subsidy.cpp @@ -69,9 +69,8 @@ Pair SetupSubsidyDecodeParam(const Subsidy *s, bool mode) void DeleteSubsidyWithTown(TownID index) { Subsidy *s; - - for (s = _subsidies; s != endof(_subsidies); s++) { - if (s->cargo_type != CT_INVALID && s->age < 12) { + FOR_ALL_SUBSIDIES(s) { + if (s->age < 12) { const CargoSpec *cs = GetCargo(s->cargo_type); if (((cs->town_effect == TE_PASSENGERS || cs->town_effect == TE_MAIL) && (index == s->from || index == s->to)) || ((cs->town_effect == TE_GOODS || cs->town_effect == TE_FOOD) && index == s->to)) { @@ -84,9 +83,8 @@ void DeleteSubsidyWithTown(TownID index) void DeleteSubsidyWithIndustry(IndustryID index) { Subsidy *s; - - for (s = _subsidies; s != endof(_subsidies); s++) { - if (s->cargo_type != CT_INVALID && s->age < 12) { + FOR_ALL_SUBSIDIES(s) { + if (s->age < 12) { const CargoSpec *cs = GetCargo(s->cargo_type); if (cs->town_effect != TE_PASSENGERS && cs->town_effect != TE_MAIL && (index == s->from || (cs->town_effect != TE_GOODS && cs->town_effect != TE_FOOD && index == s->to))) { @@ -98,12 +96,11 @@ void DeleteSubsidyWithIndustry(IndustryID index) void DeleteSubsidyWithStation(StationID index) { - Subsidy *s; bool dirty = false; - for (s = _subsidies; s != endof(_subsidies); s++) { - if (s->cargo_type != CT_INVALID && s->age >= 12 && - (s->from == index || s->to == index)) { + Subsidy *s; + FOR_ALL_SUBSIDIES(s) { + if (s->age >= 12 && (s->from == index || s->to == index)) { s->cargo_type = CT_INVALID; dirty = true; } @@ -196,8 +193,7 @@ static void FindSubsidyCargoRoute(FoundRoute *fr) static bool CheckSubsidyDuplicate(Subsidy *s) { const Subsidy *ss; - - for (ss = _subsidies; ss != endof(_subsidies); ss++) { + FOR_ALL_SUBSIDIES(ss) { if (s != ss && ss->from == s->from && ss->to == s->to && @@ -212,15 +208,13 @@ static bool CheckSubsidyDuplicate(Subsidy *s) void SubsidyMonthlyLoop() { - Subsidy *s; Station *st; uint n; FoundRoute fr; bool modified = false; - for (s = _subsidies; s != endof(_subsidies); s++) { - if (s->cargo_type == CT_INVALID) continue; - + Subsidy *s; + FOR_ALL_SUBSIDIES(s) { if (s->age == 12 - 1) { Pair reftype = SetupSubsidyDecodeParam(s, 1); AddNewsItem(STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED, NS_SUBSIDIES, (NewsReferenceType)reftype.a, s->from, (NewsReferenceType)reftype.b, s->to); @@ -290,7 +284,7 @@ bool CheckSubsidised(const Station *from, const Station *to, CargoID cargo_type, TileIndex xy; /* check if there is an already existing subsidy that applies to us */ - for (s = _subsidies; s != endof(_subsidies); s++) { + FOR_ALL_SUBSIDIES(s) { if (s->cargo_type == cargo_type && s->age >= 12 && s->from == from->index && @@ -300,7 +294,7 @@ bool CheckSubsidised(const Station *from, const Station *to, CargoID cargo_type, } /* check if there's a new subsidy that applies.. */ - for (s = _subsidies; s != endof(_subsidies); s++) { + FOR_ALL_SUBSIDIES(s) { if (s->cargo_type == cargo_type && s->age < 12) { /* Check distance from source */ const CargoSpec *cs = GetCargo(cargo_type); diff --git a/src/subsidy_gui.cpp b/src/subsidy_gui.cpp index 14ae1348ad..071fb327dc 100644 --- a/src/subsidy_gui.cpp +++ b/src/subsidy_gui.cpp @@ -43,8 +43,10 @@ struct SubsidyListWindow : Window { if (y < 0) return; uint num = 0; - for (const Subsidy *s = _subsidies; s != endof(_subsidies); s++) { - if (s->cargo_type != CT_INVALID && s->age < 12) { + + const Subsidy *s; + FOR_ALL_SUBSIDIES(s) { + if (s->age < 12) { y -= FONT_HEIGHT_NORMAL; if (y < 0) { this->HandleClick(s); @@ -62,8 +64,8 @@ struct SubsidyListWindow : Window { y -= 11; // "Services already subsidised:" if (y < 0) return; - for (const Subsidy *s = _subsidies; s != endof(_subsidies); s++) { - if (s->cargo_type != CT_INVALID && s->age >= 12) { + FOR_ALL_SUBSIDIES(s) { + if (s->age >= 12) { y -= FONT_HEIGHT_NORMAL; if (y < 0) { this->HandleClick(s); @@ -127,8 +129,8 @@ struct SubsidyListWindow : Window { y += FONT_HEIGHT_NORMAL; uint num = 0; - for (s = _subsidies; s != endof(_subsidies); s++) { - if (s->cargo_type != CT_INVALID && s->age < 12) { + FOR_ALL_SUBSIDIES(s) { + if (s->age < 12) { /* Displays the two offered towns */ SetupSubsidyDecodeParam(s, 1); SetDParam(7, _date - ymd.day + 384 - s->age * 32); @@ -149,8 +151,8 @@ struct SubsidyListWindow : Window { y += FONT_HEIGHT_NORMAL; num = 0; - for (s = _subsidies; s != endof(_subsidies); s++) { - if (s->cargo_type != CT_INVALID && s->age >= 12) { + FOR_ALL_SUBSIDIES(s) { + if (s->age >= 12) { SetupSubsidyDecodeParam(s, 1); SetDParam(3, Station::Get(s->to)->owner); SetDParam(4, _date - ymd.day + 768 - s->age * 32); diff --git a/src/subsidy_type.h b/src/subsidy_type.h index bec1a2cd48..8aa6738a42 100644 --- a/src/subsidy_type.h +++ b/src/subsidy_type.h @@ -18,4 +18,8 @@ struct Subsidy { extern Subsidy _subsidies[MAX_COMPANIES]; +#define FOR_ALL_SUBSIDIES_FROM(var, start) for (var = &_subsidies[start]; var < endof(_subsidies); var++) \ + if (var->cargo_type != CT_INVALID) +#define FOR_ALL_SUBSIDIES(var) FOR_ALL_SUBSIDIES_FROM(var, 0) + #endif /* SUBSIDY_TYPE_H */