Codechange: unify creation of diagonal/orthogonal iterator using smart pointers

This commit is contained in:
Rubidium 2023-01-13 17:19:25 +01:00 committed by rubidium42
parent 6a0d1c7c19
commit f667a831a5
7 changed files with 22 additions and 17 deletions

View File

@ -758,7 +758,7 @@ std::tuple<CommandCost, Money> CmdClearArea(DoCommandFlag flags, TileIndex tile,
const Company *c = (flags & (DC_AUTO | DC_BANKRUPT)) ? nullptr : Company::GetIfValid(_current_company);
int limit = (c == nullptr ? INT32_MAX : GB(c->clear_limit, 16, 16));
TileIterator *iter = diagonal ? (TileIterator *)new DiagonalTileIterator(tile, start_tile) : new OrthogonalTileIterator(tile, start_tile);
std::unique_ptr<TileIterator> iter = TileIterator::Create(tile, start_tile, diagonal);
for (; *iter != INVALID_TILE; ++(*iter)) {
TileIndex t = *iter;
CommandCost ret = Command<CMD_LANDSCAPE_CLEAR>::Do(flags & ~DC_EXEC, t);
@ -774,7 +774,6 @@ std::tuple<CommandCost, Money> CmdClearArea(DoCommandFlag flags, TileIndex tile,
if (flags & DC_EXEC) {
money -= ret.GetCost();
if (ret.GetCost() > 0 && money < 0) {
delete iter;
return { cost, ret.GetCost() };
}
Command<CMD_LANDSCAPE_CLEAR>::Do(flags, t);
@ -794,7 +793,6 @@ std::tuple<CommandCost, Money> CmdClearArea(DoCommandFlag flags, TileIndex tile,
cost.AddCost(ret);
}
delete iter;
return { had_success ? cost : last_error, 0 };
}

View File

@ -402,7 +402,7 @@ CommandCost CmdBuildObjectArea(DoCommandFlag flags, TileIndex tile, TileIndex st
const Company *c = Company::GetIfValid(_current_company);
int limit = (c == nullptr ? INT32_MAX : GB(c->build_object_limit, 16, 16));
TileIterator *iter = diagonal ? (TileIterator *)new DiagonalTileIterator(tile, start_tile) : new OrthogonalTileIterator(tile, start_tile);
std::unique_ptr<TileIterator> iter = TileIterator::Create(tile, start_tile, diagonal);
for (; *iter != INVALID_TILE; ++(*iter)) {
TileIndex t = *iter;
CommandCost ret = Command<CMD_BUILD_OBJECT>::Do(flags & ~DC_EXEC, t, type, view);
@ -426,7 +426,6 @@ CommandCost CmdBuildObjectArea(DoCommandFlag flags, TileIndex tile, TileIndex st
cost.AddCost(ret);
}
delete iter;
return had_success ? cost : last_error;
}

View File

@ -1548,7 +1548,7 @@ CommandCost CmdConvertRail(DoCommandFlag flags, TileIndex tile, TileIndex area_s
CommandCost error = CommandCost(STR_ERROR_NO_SUITABLE_RAILROAD_TRACK); // by default, there is no track to convert.
bool found_convertible_track = false; // whether we actually did convert some track (see bug #7633)
TileIterator *iter = diagonal ? (TileIterator *)new DiagonalTileIterator(area_start, area_end) : new OrthogonalTileIterator(area_start, area_end);
std::unique_ptr<TileIterator> iter = TileIterator::Create(area_start, area_end, diagonal);
for (; (tile = *iter) != INVALID_TILE; ++(*iter)) {
TileType tt = GetTileType(tile);
@ -1745,7 +1745,6 @@ CommandCost CmdConvertRail(DoCommandFlag flags, TileIndex tile, TileIndex area_s
}
}
delete iter;
return found_convertible_track ? cost : error;
}

View File

@ -361,7 +361,7 @@ std::tuple<CommandCost, Money, TileIndex> CmdLevelLand(DoCommandFlag flags, Tile
if (limit == 0) return { CommandCost(STR_ERROR_TERRAFORM_LIMIT_REACHED), 0, INVALID_TILE };
TileIndex error_tile = INVALID_TILE;
TileIterator *iter = diagonal ? (TileIterator *)new DiagonalTileIterator(tile, start_tile) : new OrthogonalTileIterator(tile, start_tile);
std::unique_ptr<TileIterator> iter = TileIterator::Create(tile, start_tile, diagonal);
for (; *iter != INVALID_TILE; ++(*iter)) {
TileIndex t = *iter;
uint curh = TileHeight(t);
@ -379,7 +379,6 @@ std::tuple<CommandCost, Money, TileIndex> CmdLevelLand(DoCommandFlag flags, Tile
if (flags & DC_EXEC) {
money -= ret.GetCost();
if (money < 0) {
delete iter;
return { cost, ret.GetCost(), error_tile };
}
Command<CMD_TERRAFORM_LAND>::Do(flags, t, SLOPE_N, curh <= h);
@ -403,7 +402,6 @@ std::tuple<CommandCost, Money, TileIndex> CmdLevelLand(DoCommandFlag flags, Tile
if (limit <= 0) break;
}
delete iter;
CommandCost cc_ret = had_success ? cost : last_error;
return { cc_ret, 0, cc_ret.Succeeded() ? tile : error_tile };
}

View File

@ -280,3 +280,18 @@ TileIterator &DiagonalTileIterator::operator++()
if (this->b_max == this->b_cur) this->tile = INVALID_TILE;
return *this;
}
/**
* Create either an OrthogonalTileIterator or DiagonalTileIterator given the diagonal parameter.
* @param corner1 Tile from where to begin iterating.
* @param corner2 Tile where to end the iterating.
* @param diagonal Whether to create a DiagonalTileIterator or OrthogonalTileIterator.
* @return unique_ptr to the allocated TileIterator.
*/
/* static */ std::unique_ptr<TileIterator> TileIterator::Create(TileIndex corner1, TileIndex corner2, bool diagonal)
{
if (diagonal) {
return std::make_unique<DiagonalTileIterator>(corner1, corner2);
}
return std::make_unique<OrthogonalTileIterator>(corner1, corner2);
}

View File

@ -177,6 +177,8 @@ public:
{
return this->tile != rhs;
}
static std::unique_ptr<TileIterator> Create(TileIndex corner1, TileIndex corner2, bool diagonal);
};
/** Iterator to iterate over a tile area (rectangle) of the map. */

View File

@ -445,13 +445,7 @@ CommandCost CmdBuildCanal(DoCommandFlag flags, TileIndex tile, TileIndex start_t
CommandCost cost(EXPENSES_CONSTRUCTION);
std::unique_ptr<TileIterator> iter;
if (diagonal) {
iter = std::make_unique<DiagonalTileIterator>(tile, start_tile);
} else {
iter = std::make_unique<OrthogonalTileIterator>(tile, start_tile);
}
std::unique_ptr<TileIterator> iter = TileIterator::Create(tile, start_tile, diagonal);
for (; *iter != INVALID_TILE; ++(*iter)) {
TileIndex current_tile = *iter;
CommandCost ret;