From f667a831a5a1045e041e5b03328ef3b2b6803ddf Mon Sep 17 00:00:00 2001 From: Rubidium Date: Fri, 13 Jan 2023 17:19:25 +0100 Subject: [PATCH] Codechange: unify creation of diagonal/orthogonal iterator using smart pointers --- src/landscape.cpp | 4 +--- src/object_cmd.cpp | 3 +-- src/rail_cmd.cpp | 3 +-- src/terraform_cmd.cpp | 4 +--- src/tilearea.cpp | 15 +++++++++++++++ src/tilearea_type.h | 2 ++ src/water_cmd.cpp | 8 +------- 7 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/landscape.cpp b/src/landscape.cpp index a0707108a4..90737de745 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -758,7 +758,7 @@ std::tuple 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 iter = TileIterator::Create(tile, start_tile, diagonal); for (; *iter != INVALID_TILE; ++(*iter)) { TileIndex t = *iter; CommandCost ret = Command::Do(flags & ~DC_EXEC, t); @@ -774,7 +774,6 @@ std::tuple 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::Do(flags, t); @@ -794,7 +793,6 @@ std::tuple CmdClearArea(DoCommandFlag flags, TileIndex tile, cost.AddCost(ret); } - delete iter; return { had_success ? cost : last_error, 0 }; } diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index 3eced27ef6..4c9b95809f 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -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 iter = TileIterator::Create(tile, start_tile, diagonal); for (; *iter != INVALID_TILE; ++(*iter)) { TileIndex t = *iter; CommandCost ret = Command::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; } diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 7ee5813606..eda42d1620 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -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 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; } diff --git a/src/terraform_cmd.cpp b/src/terraform_cmd.cpp index 21df5ccbe3..8ec602a4f0 100644 --- a/src/terraform_cmd.cpp +++ b/src/terraform_cmd.cpp @@ -361,7 +361,7 @@ std::tuple 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 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 CmdLevelLand(DoCommandFlag flags, Tile if (flags & DC_EXEC) { money -= ret.GetCost(); if (money < 0) { - delete iter; return { cost, ret.GetCost(), error_tile }; } Command::Do(flags, t, SLOPE_N, curh <= h); @@ -403,7 +402,6 @@ std::tuple 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 }; } diff --git a/src/tilearea.cpp b/src/tilearea.cpp index 21271f94f1..6c943e8c87 100644 --- a/src/tilearea.cpp +++ b/src/tilearea.cpp @@ -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::Create(TileIndex corner1, TileIndex corner2, bool diagonal) +{ + if (diagonal) { + return std::make_unique(corner1, corner2); + } + return std::make_unique(corner1, corner2); +} diff --git a/src/tilearea_type.h b/src/tilearea_type.h index b6af998a76..2484aac2c6 100644 --- a/src/tilearea_type.h +++ b/src/tilearea_type.h @@ -177,6 +177,8 @@ public: { return this->tile != rhs; } + + static std::unique_ptr Create(TileIndex corner1, TileIndex corner2, bool diagonal); }; /** Iterator to iterate over a tile area (rectangle) of the map. */ diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 44be4dc367..68b2cef3e7 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -445,13 +445,7 @@ CommandCost CmdBuildCanal(DoCommandFlag flags, TileIndex tile, TileIndex start_t CommandCost cost(EXPENSES_CONSTRUCTION); - std::unique_ptr iter; - if (diagonal) { - iter = std::make_unique(tile, start_tile); - } else { - iter = std::make_unique(tile, start_tile); - } - + std::unique_ptr iter = TileIterator::Create(tile, start_tile, diagonal); for (; *iter != INVALID_TILE; ++(*iter)) { TileIndex current_tile = *iter; CommandCost ret;