(svn r12855) -Codechange: do not use autoptr's for testing whether certain objects can be build, but check it directly in the pool so we do not have to call destructors in the testing phase. Stations still use the autoptr though.
authorrubidium
Wed, 23 Apr 2008 20:56:08 +0000
changeset 9036 6368fe55fd6d
parent 9035 7e8b8f37259a
child 9037 28b55f76daa5
(svn r12855) -Codechange: do not use autoptr's for testing whether certain objects can be build, but check it directly in the pool so we do not have to call destructors in the testing phase. Stations still use the autoptr though.
src/engine.cpp
src/group_cmd.cpp
src/industry_cmd.cpp
src/oldpool.h
src/rail_cmd.cpp
src/road_cmd.cpp
src/ship_cmd.cpp
src/signs.cpp
src/town_cmd.cpp
src/water_cmd.cpp
src/waypoint.cpp
--- a/src/engine.cpp	Wed Apr 23 20:22:31 2008 +0000
+++ b/src/engine.cpp	Wed Apr 23 20:56:08 2008 +0000
@@ -15,7 +15,6 @@
 #include "aircraft.h"
 #include "newgrf_cargo.h"
 #include "group.h"
-#include "misc/autoptr.hpp"
 #include "strings_func.h"
 #include "gfx_func.h"
 #include "functions.h"
@@ -516,19 +515,15 @@
 		return CommandCost();
 	}
 
-	er = new EngineRenew(old_engine, new_engine);
-	if (er == NULL) return CMD_ERROR;
-	AutoPtrT<EngineRenew> er_auto_delete = er;
-
+	if (!EngineRenew::CanAllocateItem()) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
+		er = new EngineRenew(old_engine, new_engine);
 		er->group_id = group;
 
 		/* Insert before the first element */
 		er->next = (EngineRenew *)(*erl);
 		*erl = (EngineRenewList)er;
-
-		er_auto_delete.Detach();
 	}
 
 	return CommandCost();
--- a/src/group_cmd.cpp	Wed Apr 23 20:22:31 2008 +0000
+++ b/src/group_cmd.cpp	Wed Apr 23 20:56:08 2008 +0000
@@ -12,7 +12,6 @@
 #include "train.h"
 #include "aircraft.h"
 #include "vehicle_gui.h"
-#include "misc/autoptr.hpp"
 #include "strings_func.h"
 #include "functions.h"
 #include "window_func.h"
@@ -94,20 +93,14 @@
 	VehicleType vt = (VehicleType)p1;
 	if (!IsPlayerBuildableVehicleType(vt)) return CMD_ERROR;
 
-	AutoPtrT<Group> g_auto_delete;
-
-	Group *g = new Group(_current_player);
-	if (g == NULL) return CMD_ERROR;
-
-	g_auto_delete = g;
+	if (!Group::CanAllocateItem()) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
+		Group *g = new Group(_current_player);
 		g->replace_protection = false;
 		g->vehicle_type = vt;
 
 		InvalidateWindowData(GetWCForVT(vt), (vt << 11) | VLW_GROUP_LIST | _current_player);
-
-		g_auto_delete.Detach();
 	}
 
 	return CommandCost();
--- a/src/industry_cmd.cpp	Wed Apr 23 20:22:31 2008 +0000
+++ b/src/industry_cmd.cpp	Wed Apr 23 20:56:08 2008 +0000
@@ -26,7 +26,6 @@
 #include "newgrf_industries.h"
 #include "newgrf_industrytiles.h"
 #include "newgrf_callbacks.h"
-#include "misc/autoptr.hpp"
 #include "autoslope.h"
 #include "transparency.h"
 #include "water.h"
@@ -1592,17 +1591,19 @@
 	if (!CheckIfIndustryIsAllowed(tile, type, t)) return NULL;
 	if (!CheckSuitableIndustryPos(tile)) return NULL;
 
-	Industry *i = new Industry(tile);
-	if (i == NULL) return NULL;
-	AutoPtrT<Industry> i_auto_delete = i;
+	if (!Industry::CanAllocateItem()) return NULL;
 
 	if (flags & DC_EXEC) {
+		Industry *i = new Industry(tile);
 		if (!custom_shape_check) CheckIfCanLevelIndustryPlatform(tile, DC_EXEC, it, type);
 		DoCreateNewIndustry(i, tile, type, it, itspec_index, t, OWNER_NONE);
-		i_auto_delete.Detach();
+
+		return i;
 	}
 
-	return i;
+	/* We need to return a non-NULL pointer to tell we have created an industry.
+	 * However, we haven't created a real one (no DC_EXEC), so return a fake one. */
+	return GetIndustry(0);
 }
 
 /** Build/Fund an industry
--- a/src/oldpool.h	Wed Apr 23 20:22:31 2008 +0000
+++ b/src/oldpool.h	Wed Apr 23 20:56:08 2008 +0000
@@ -292,6 +292,18 @@
 	{
 		return Tpool->CleaningPool();
 	}
+
+public:
+	/**
+	 * Check whether we can allocate an item in this pool. This to prevent the
+	 * need to actually construct the object and then destructing it again,
+	 * which could be *very* costly.
+	 * @return true if and only if at least ONE item can be allocated.
+	 */
+	static inline bool CanAllocateItem()
+	{
+		return AllocateRaw() != NULL;
+	}
 };
 
 
--- a/src/rail_cmd.cpp	Wed Apr 23 20:22:31 2008 +0000
+++ b/src/rail_cmd.cpp	Wed Apr 23 20:56:08 2008 +0000
@@ -30,7 +30,6 @@
 #include "newgrf_callbacks.h"
 #include "newgrf_station.h"
 #include "train.h"
-#include "misc/autoptr.hpp"
 #include "variables.h"
 #include "autoslope.h"
 #include "transparency.h"
@@ -766,12 +765,10 @@
 
 	if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
 
-	Depot *d = new Depot(tile);
-
-	if (d == NULL) return CMD_ERROR;
-	AutoPtrT<Depot> d_auto_delete = d;
+	if (!Depot::CanAllocateItem()) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
+		Depot *d = new Depot(tile);
 		MakeRailDepot(tile, _current_player, dir, (RailType)p1);
 		MarkTileDirtyByTile(tile);
 
@@ -779,7 +776,6 @@
 
 		AddSideToSignalBuffer(tile, INVALID_DIAGDIR, _current_player);
 		YapfNotifyTrackLayoutChange(tile, TrackdirToTrack(DiagdirToDiagTrackdir(dir)));
-		d_auto_delete.Detach();
 	}
 
 	return cost.AddCost(_price.build_train_depot);
--- a/src/road_cmd.cpp	Wed Apr 23 20:22:31 2008 +0000
+++ b/src/road_cmd.cpp	Wed Apr 23 20:56:08 2008 +0000
@@ -23,7 +23,6 @@
 #include "newgrf.h"
 #include "station_map.h"
 #include "tunnel_map.h"
-#include "misc/autoptr.hpp"
 #include "variables.h"
 #include "autoslope.h"
 #include "transparency.h"
@@ -817,16 +816,14 @@
 
 	if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
 
-	Depot *dep = new Depot(tile);
-	if (dep == NULL) return CMD_ERROR;
-	AutoPtrT<Depot> d_auto_delete = dep;
+	if (!Depot::CanAllocateItem()) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
+		Depot *dep = new Depot(tile);
 		dep->town_index = ClosestTownFromTile(tile, (uint)-1)->index;
 
 		MakeRoadDepot(tile, _current_player, dir, rt);
 		MarkTileDirtyByTile(tile);
-		d_auto_delete.Detach();
 	}
 	return cost.AddCost(_price.build_road_depot);
 }
--- a/src/ship_cmd.cpp	Wed Apr 23 20:22:31 2008 +0000
+++ b/src/ship_cmd.cpp	Wed Apr 23 20:56:08 2008 +0000
@@ -28,7 +28,6 @@
 #include "newgrf_text.h"
 #include "newgrf_sound.h"
 #include "spritecache.h"
-#include "misc/autoptr.hpp"
 #include "strings_func.h"
 #include "functions.h"
 #include "window_func.h"
--- a/src/signs.cpp	Wed Apr 23 20:22:31 2008 +0000
+++ b/src/signs.cpp	Wed Apr 23 20:56:08 2008 +0000
@@ -11,7 +11,6 @@
 #include "saveload.h"
 #include "command_func.h"
 #include "variables.h"
-#include "misc/autoptr.hpp"
 #include "strings_func.h"
 #include "viewport_func.h"
 #include "zoom_func.h"
@@ -99,12 +98,11 @@
 CommandCost CmdPlaceSign(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	/* Try to locate a new sign */
-	Sign *si = new Sign(_current_player);
-	if (si == NULL) return_cmd_error(STR_2808_TOO_MANY_SIGNS);
-	AutoPtrT<Sign> s_auto_delete = si;
+	if (!Sign::CanAllocateItem()) return_cmd_error(STR_2808_TOO_MANY_SIGNS);
 
 	/* When we execute, really make the sign */
 	if (flags & DC_EXEC) {
+		Sign *si = new Sign(_current_player);
 		int x = TileX(tile) * TILE_SIZE;
 		int y = TileY(tile) * TILE_SIZE;
 
@@ -117,7 +115,6 @@
 		_sign_sort_dirty = true;
 		_new_sign_id = si->index;
 		_total_signs++;
-		s_auto_delete.Detach();
 	}
 
 	return CommandCost();
--- a/src/town_cmd.cpp	Wed Apr 23 20:22:31 2008 +0000
+++ b/src/town_cmd.cpp	Wed Apr 23 20:56:08 2008 +0000
@@ -31,7 +31,6 @@
 #include "newgrf_house.h"
 #include "newgrf_commons.h"
 #include "newgrf_townname.h"
-#include "misc/autoptr.hpp"
 #include "autoslope.h"
 #include "waypoint.h"
 #include "transparency.h"
@@ -1538,16 +1537,14 @@
 		return_cmd_error(STR_023A_TOO_MANY_TOWNS);
 
 	/* Allocate town struct */
-	Town *t = new Town(tile);
-	if (t == NULL) return_cmd_error(STR_023A_TOO_MANY_TOWNS);
-	AutoPtrT<Town> t_auto_delete = t;
+	if (!Town::CanAllocateItem()) return_cmd_error(STR_023A_TOO_MANY_TOWNS);
 
 	/* Create the town */
 	if (flags & DC_EXEC) {
+		Town *t = new Town(tile);
 		_generating_world = true;
 		DoCreateTown(t, tile, townnameparts, (TownSizeMode)p2, p1);
 		_generating_world = false;
-		t_auto_delete.Detach();
 	}
 	return CommandCost();
 }
--- a/src/water_cmd.cpp	Wed Apr 23 20:22:31 2008 +0000
+++ b/src/water_cmd.cpp	Wed Apr 23 20:56:08 2008 +0000
@@ -24,7 +24,6 @@
 #include "industry_map.h"
 #include "newgrf.h"
 #include "newgrf_canal.h"
-#include "misc/autoptr.hpp"
 #include "transparency.h"
 #include "strings_func.h"
 #include "functions.h"
@@ -201,18 +200,16 @@
 	ret = DoCommand(tile2, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 	if (CmdFailed(ret)) return CMD_ERROR;
 
-	Depot *depot = new Depot(tile);
-	if (depot == NULL) return CMD_ERROR;
-	AutoPtrT<Depot> d_auto_delete = depot;
+	if (!Depot::CanAllocateItem()) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
+		Depot *depot = new Depot(tile);
 		depot->town_index = ClosestTownFromTile(tile, (uint)-1)->index;
 
 		MakeShipDepot(tile,  _current_player, DEPOT_NORTH, axis, wc1);
 		MakeShipDepot(tile2, _current_player, DEPOT_SOUTH, axis, wc2);
 		MarkTileDirtyByTile(tile);
 		MarkTileDirtyByTile(tile2);
-		d_auto_delete.Detach();
 	}
 
 	return CommandCost(EXPENSES_CONSTRUCTION, _price.build_ship_depot);
--- a/src/waypoint.cpp	Wed Apr 23 20:22:31 2008 +0000
+++ b/src/waypoint.cpp	Wed Apr 23 20:56:08 2008 +0000
@@ -18,7 +18,6 @@
 #include "variables.h"
 #include "yapf/yapf.h"
 #include "newgrf.h"
-#include "misc/autoptr.hpp"
 #include "strings_func.h"
 #include "gfx_func.h"
 #include "functions.h"
@@ -191,7 +190,6 @@
 CommandCost CmdBuildTrainWaypoint(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	Waypoint *wp;
-	AutoPtrT<Waypoint> wp_auto_delete;
 	Slope tileh;
 	Axis axis;
 
@@ -219,35 +217,35 @@
 
 	/* Check if there is an already existing, deleted, waypoint close to us that we can reuse. */
 	wp = FindDeletedWaypointCloseTo(tile);
-	if (wp == NULL) {
-		wp = new Waypoint(tile);
-		if (wp == NULL) return CMD_ERROR;
-
-		wp_auto_delete = wp;
+	if (wp == NULL && !Waypoint::CanAllocateItem()) return CMD_ERROR;
 
-		wp->town_index = INVALID_TOWN;
-		wp->name = NULL;
-		wp->town_cn = 0;
-	} else if (flags & DC_EXEC) {
-		/* Move existing (recently deleted) waypoint to the new location */
+	if (flags & DC_EXEC) {
+		if (wp == NULL) {
+			wp = new Waypoint(tile);
+			if (wp == NULL) return CMD_ERROR;
 
-		/* First we update the destination for all vehicles that
-		 * have the old waypoint in their orders. */
-		Vehicle *v;
-		FOR_ALL_VEHICLES(v) {
-			if (v->type == VEH_TRAIN &&
-					v->First() == v &&
-					v->current_order.IsType(OT_GOTO_WAYPOINT) &&
-					v->dest_tile == wp->xy) {
-				v->dest_tile = tile;
+			wp->town_index = INVALID_TOWN;
+			wp->name = NULL;
+			wp->town_cn = 0;
+		} else {
+			/* Move existing (recently deleted) waypoint to the new location */
+
+			/* First we update the destination for all vehicles that
+			* have the old waypoint in their orders. */
+			Vehicle *v;
+			FOR_ALL_VEHICLES(v) {
+				if (v->type == VEH_TRAIN &&
+						v->First() == v &&
+						v->current_order.IsType(OT_GOTO_WAYPOINT) &&
+						v->dest_tile == wp->xy) {
+					v->dest_tile = tile;
+				}
 			}
+
+			RedrawWaypointSign(wp);
+			wp->xy = tile;
 		}
 
-		RedrawWaypointSign(wp);
-		wp->xy = tile;
-	}
-
-	if (flags & DC_EXEC) {
 		const StationSpec* statspec;
 
 		MakeRailWaypoint(tile, GetTileOwner(tile), axis, GetRailType(tile), wp->index);
@@ -274,7 +272,6 @@
 		UpdateWaypointSign(wp);
 		RedrawWaypointSign(wp);
 		YapfNotifyTrackLayoutChange(tile, AxisToTrack(axis));
-		wp_auto_delete.Detach();
 	}
 
 	return CommandCost(EXPENSES_CONSTRUCTION, _price.build_train_depot);