diff options
author | rubidium <rubidium@openttd.org> | 2008-04-23 22:16:41 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2008-04-23 22:16:41 +0000 |
commit | 2b85217bfe7197684e22a0257cabe9b4a37cb7d6 (patch) | |
tree | 3c648d4bd6e453e588d664c0eabe3c948a556f7c | |
parent | 7c8fe9791b3fb63a2842f45c85c8c428780a7a4e (diff) | |
download | openttd-2b85217bfe7197684e22a0257cabe9b4a37cb7d6.tar.xz |
(svn r12857) -Fix [FS#1948]: remove the last uses of AutoPtr in the station code.
-rw-r--r-- | projects/openttd_vs80.vcproj | 8 | ||||
-rw-r--r-- | projects/openttd_vs90.vcproj | 8 | ||||
-rw-r--r-- | source.list | 2 | ||||
-rw-r--r-- | src/misc/autocopyptr.hpp | 85 | ||||
-rw-r--r-- | src/misc/autoptr.hpp | 106 | ||||
-rw-r--r-- | src/newgrf_station.cpp | 2 | ||||
-rw-r--r-- | src/oldpool.h | 11 | ||||
-rw-r--r-- | src/oldpool_func.h | 21 | ||||
-rw-r--r-- | src/rail_cmd.cpp | 1 | ||||
-rw-r--r-- | src/road_cmd.cpp | 1 | ||||
-rw-r--r-- | src/station_cmd.cpp | 144 | ||||
-rw-r--r-- | src/water_cmd.cpp | 1 |
12 files changed, 74 insertions, 316 deletions
diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj index b6a6c66b4..087741082 100644 --- a/projects/openttd_vs80.vcproj +++ b/projects/openttd_vs80.vcproj @@ -2276,14 +2276,6 @@ > </File> <File - RelativePath=".\..\src\misc\autocopyptr.hpp" - > - </File> - <File - RelativePath=".\..\src\misc\autoptr.hpp" - > - </File> - <File RelativePath=".\..\src\misc\binaryheap.hpp" > </File> diff --git a/projects/openttd_vs90.vcproj b/projects/openttd_vs90.vcproj index 480c3a969..1031c2a1e 100644 --- a/projects/openttd_vs90.vcproj +++ b/projects/openttd_vs90.vcproj @@ -2273,14 +2273,6 @@ > </File> <File - RelativePath=".\..\src\misc\autocopyptr.hpp" - > - </File> - <File - RelativePath=".\..\src\misc\autoptr.hpp" - > - </File> - <File RelativePath=".\..\src\misc\binaryheap.hpp" > </File> diff --git a/source.list b/source.list index 73828fd04..4170e39f2 100644 --- a/source.list +++ b/source.list @@ -516,8 +516,6 @@ water_map.h # Misc misc/array.hpp -misc/autocopyptr.hpp -misc/autoptr.hpp misc/binaryheap.hpp misc/blob.hpp misc/countedobj.cpp diff --git a/src/misc/autocopyptr.hpp b/src/misc/autocopyptr.hpp deleted file mode 100644 index 0c684aac2..000000000 --- a/src/misc/autocopyptr.hpp +++ /dev/null @@ -1,85 +0,0 @@ -/* $Id$ */ - -/** @file autocopyptr.hpp */ - -#ifndef AUTOCOPYPTR_HPP -#define AUTOCOPYPTR_HPP - -#if 0 // reenable when needed -/** CAutoCopyPtrT - kind of CoW (Copy on Write) pointer. - * It is non-invasive smart pointer (reference counter is held outside - * of Tdata). - * When copied, its new copy shares the same underlaying structure Tdata. - * When dereferenced, its behaviour depends on 2 factors: - * - whether the data is shared (used by more than one pointer) - * - type of access (read/write) - * When shared pointer is dereferenced for write, new clone of Tdata - * is made first. - * Can't be used for polymorphic data types (interfaces). - */ -template <class Tdata_> -class CAutoCopyPtrT { -protected: - typedef Tdata_ Tdata; - - struct CItem { - int m_ref_cnt; ///< reference counter - Tdata m_data; ///< custom data itself - - FORCEINLINE CItem() : m_ref_cnt(1) {}; - FORCEINLINE CItem(const Tdata& data) : m_ref_cnt(1), m_data(data) {}; - FORCEINLINE CItem(const CItem& src) : m_ref_cnt(1), m_data(src.m_data) {}; - }; - - mutable CItem* m_pI; ///< points to the ref-counted data - -public: - FORCEINLINE CAutoCopyPtrT() : m_pI(NULL) {}; - FORCEINLINE CAutoCopyPtrT(const Tdata& data) : m_pI(new CItem(data)) {}; - FORCEINLINE CAutoCopyPtrT(const CAutoCopyPtrT& src) : m_pI(src.m_pI) {if (m_pI != NULL) m_pI->m_ref_cnt++;} - FORCEINLINE ~CAutoCopyPtrT() {if (m_pI == NULL || (--m_pI->m_ref_cnt) > 0) return; delete m_pI; m_pI = NULL;} - - /** data accessor (read only) */ - FORCEINLINE const Tdata& GetDataRO() const {if (m_pI == NULL) m_pI = new CItem(); return m_pI->m_data;} - /** data accessor (read / write) */ - FORCEINLINE Tdata& GetDataRW() {CloneIfShared(); if (m_pI == NULL) m_pI = new CItem(); return m_pI->m_data;} - - /** clone data if it is shared */ - FORCEINLINE void CloneIfShared() - { - if (m_pI != NULL && m_pI->m_ref_cnt > 1) { - // we share data item with somebody, clone it to become an exclusive owner - CItem* pNewI = new CItem(*m_pI); - m_pI->m_ref_cnt--; - m_pI = pNewI; - } - } - - /** assign pointer from the other one (maintaining ref counts) */ - FORCEINLINE void Assign(const CAutoCopyPtrT& src) - { - if (m_pI == src.m_pI) return; - if (m_pI != NULL && (--m_pI->m_ref_cnt) <= 0) delete m_pI; - m_pI = src.m_pI; - if (m_pI != NULL) m_pI->m_ref_cnt++; - } - - /** dereference operator (read only) */ - FORCEINLINE const Tdata* operator -> () const {return &GetDataRO();} - /** dereference operator (read / write) */ - FORCEINLINE Tdata* operator -> () {return &GetDataRW();} - - /** assignment operator */ - FORCEINLINE CAutoCopyPtrT& operator = (const CAutoCopyPtrT& src) {Assign(src); return *this;} - - /** forwarding 'lower then' operator to the underlaying items */ - FORCEINLINE bool operator < (const CAutoCopyPtrT& other) const - { - assert(m_pI != NULL); - assert(other.m_pI != NULL); - return (m_pI->m_data) < (other.m_pI->m_data); - } -}; - -#endif /* 0 */ -#endif /* AUTOCOPYPTR_HPP */ diff --git a/src/misc/autoptr.hpp b/src/misc/autoptr.hpp deleted file mode 100644 index 8b0d920f5..000000000 --- a/src/misc/autoptr.hpp +++ /dev/null @@ -1,106 +0,0 @@ -/* $Id$ */ - -/** @file autoptr.hpp */ - -#ifndef AUTOPTR_HPP -#define AUTOPTR_HPP - -/** AutoPtrT - kind of smart pointer that ensures the owned object gets - * deleted when its pointer goes out of scope. - * It is non-invasive smart pointer (no reference counter). - * When copied, the copy takes ownership of underlying object - * and original becomes NULL! - * Can be used also for polymorphic data types (interfaces). - */ -template <class T> -class AutoPtrT { -public: - typedef T obj_t; - -protected: - mutable T* m_p; ///< points to the data - -public: - FORCEINLINE AutoPtrT() - : m_p(NULL) - {}; - - FORCEINLINE AutoPtrT(const AutoPtrT<T>& src) - : m_p(src.m_p) - { - if (m_p != NULL) src.m_p = NULL; - }; - - FORCEINLINE AutoPtrT(T *p) - : m_p(p) - {} - - FORCEINLINE ~AutoPtrT() - { - if (m_p != NULL) { - T *p = m_p; - m_p = NULL; - delete p; - } - } - - /** give-up ownership and NULLify the raw pointer */ - FORCEINLINE T* Detach() - { - T* p = m_p; - m_p = NULL; - return p; - } - - /** raw-pointer cast operator (read only) */ - FORCEINLINE operator const T* () const - { - return m_p; - } - - /** raw-pointer cast operator */ - FORCEINLINE operator T* () - { - return m_p; - } - - /** dereference operator (read only) */ - FORCEINLINE const T* operator -> () const - { - assert(m_p != NULL); - return m_p; - } - - /** dereference operator (read / write) */ - FORCEINLINE T* operator -> () - { - assert(m_p != NULL); - return m_p; - } - - /** assignment operator */ - FORCEINLINE AutoPtrT& operator = (const AutoPtrT& src) - { - /* Save original pointer and replace it with the given one to avoid recursive calls. */ - T* p = m_p; - m_p = src.m_p; - - if (m_p != NULL) src.m_p = NULL; - - if (p != NULL) { - /* Now we can safely delete the old one. */ - delete p; - } - return *this; - } - - /** forwarding 'lower than' operator to the underlaying items */ - FORCEINLINE bool operator < (const AutoPtrT& other) const - { - assert(m_p != NULL); - assert(other.m_p != NULL); - return (*m_p) < (*other.m_p); - } -}; - -#endif /* AUTOPTR_HPP */ diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index edb49515f..4f57699ab 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -676,7 +676,7 @@ int AllocateSpecToStation(const StationSpec *statspec, Station *st, bool exec) { uint i; - if (statspec == NULL) return 0; + if (statspec == NULL || st == NULL) return 0; /* Check if this spec has already been allocated */ for (i = 1; i < st->num_specs && i < MAX_SPECLIST; i++) { diff --git a/src/oldpool.h b/src/oldpool.h index e8081fa82..1581cfc98 100644 --- a/src/oldpool.h +++ b/src/oldpool.h @@ -294,16 +294,7 @@ protected: } 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; - } + static bool CanAllocateItem(); }; diff --git a/src/oldpool_func.h b/src/oldpool_func.h index e4d1c47d5..2c9801354 100644 --- a/src/oldpool_func.h +++ b/src/oldpool_func.h @@ -31,4 +31,25 @@ template<typename T, typename Tid, OldMemoryPool<T> *Tpool> T *PoolItem<T, Tid, return NULL; } +/** + * 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. + */ +template<typename T, typename Tid, OldMemoryPool<T> *Tpool> bool PoolItem<T, Tid, Tpool>::CanAllocateItem() +{ + uint last_minus_one = Tpool->GetSize() - 1; + + for (T *t = Tpool->Get(Tpool->first_free_index); t != NULL; t = (t->index < last_minus_one) ? Tpool->Get(t->index + 1U) : NULL) { + if (!t->IsValid()) return true; + Tpool->first_free_index = t->index; + } + + /* Check if we can add a block to the pool */ + if (Tpool->AddBlockToPool()) return CanAllocateItem(); + + return false; +} + #endif /* OLDPOOL_FUNC_H */ diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index c08014d12..4bdc8dd09 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -43,6 +43,7 @@ #include "station_map.h" #include "water_map.h" #include "functions.h" +#include "oldpool_func.h" #include "table/sprites.h" #include "table/strings.h" diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index c95506a72..7c610bcd6 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -37,6 +37,7 @@ #include "cheat_func.h" #include "functions.h" #include "effectvehicle_func.h" +#include "oldpool_func.h" #include "table/sprites.h" #include "table/strings.h" diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index f615ac0a9..a57e0a1e5 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -25,7 +25,6 @@ #include "newgrf_callbacks.h" #include "newgrf_station.h" #include "yapf/yapf.h" -#include "misc/autoptr.hpp" #include "road_type.h" #include "road_internal.h" /* For drawing catenary/checking road removal */ #include "cargotype.h" @@ -239,7 +238,7 @@ enum StationNaming { STATIONNAMING_HELIPORT, }; -static bool GenerateStationName(Station *st, TileIndex tile, int flag) +static void GenerateStationName(Station *st, TileIndex tile, int flag) { static const uint32 _gen_station_name_bits[] = { 0, /* 0 */ @@ -344,7 +343,6 @@ static bool GenerateStationName(Station *st, TileIndex tile, int flag) done: st->string_id = found + STR_SV_STNAME; - return true; } #undef M @@ -962,10 +960,6 @@ CommandCost CmdBuildRailroadStation(TileIndex tile_org, uint32 flags, uint32 p1, /* See if there is a deleted station close to us. */ if (st == NULL) st = GetClosestStationFromTile(tile_org); - /* In case of new station if DC_EXEC is NOT set we still need to create the station - * to test if everything is OK. In this case we need to delete it before return. */ - AutoPtrT<Station> st_auto_delete; - if (st != NULL) { /* Reuse an existing station. */ if (st->owner != _current_player) @@ -983,17 +977,17 @@ CommandCost CmdBuildRailroadStation(TileIndex tile_org, uint32 flags, uint32 p1, if (!st->rect.BeforeAddRect(tile_org, w_org, h_org, StationRect::ADD_TEST)) return CMD_ERROR; } else { /* allocate and initialize new station */ - st = new Station(tile_org); - if (st == NULL) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING); + if (!Station::CanAllocateItem()) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING); - /* ensure that in case of error (or no DC_EXEC) the station gets deleted upon return */ - st_auto_delete = st; + if (flags & DC_EXEC) { + st = new Station(); - st->town = ClosestTownFromTile(tile_org, (uint)-1); - if (!GenerateStationName(st, tile_org, STATIONNAMING_RAIL)) return CMD_ERROR; + st->town = ClosestTownFromTile(tile_org, (uint)-1); + GenerateStationName(st, tile_org, STATIONNAMING_RAIL); - if (IsValidPlayer(_current_player) && (flags & DC_EXEC) != 0) { - SetBit(st->town->have_ratings, _current_player); + if (IsValidPlayer(_current_player)) { + SetBit(st->town->have_ratings, _current_player); + } } } @@ -1088,8 +1082,6 @@ CommandCost CmdBuildRailroadStation(TileIndex tile_org, uint32 flags, uint32 p1, RebuildStationLists(); InvalidateWindow(WC_STATION_LIST, st->owner); InvalidateWindowWidget(WC_STATION_VIEW, st->index, SVW_TRAINS); - /* success, so don't delete the new station */ - st_auto_delete.Detach(); } return cost; @@ -1394,23 +1386,13 @@ CommandCost CmdBuildRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) if (st == NULL) st = GetClosestStationFromTile(tile); /* give us a road stop in the list, and check if something went wrong */ - RoadStop *road_stop = new RoadStop(tile); - if (road_stop == NULL) { - return_cmd_error(type ? STR_TOO_MANY_TRUCK_STOPS : STR_TOO_MANY_BUS_STOPS); - } - - /* ensure that in case of error (or no DC_EXEC) the new road stop gets deleted upon return */ - AutoPtrT<RoadStop> rs_auto_delete(road_stop); + if (!RoadStop::CanAllocateItem()) return_cmd_error(type ? STR_TOO_MANY_TRUCK_STOPS : STR_TOO_MANY_BUS_STOPS); if (st != NULL && GetNumRoadStopsInStation(st, ROADSTOP_BUS) + GetNumRoadStopsInStation(st, ROADSTOP_TRUCK) >= RoadStop::LIMIT) { return_cmd_error(type ? STR_TOO_MANY_TRUCK_STOPS : STR_TOO_MANY_BUS_STOPS); } - /* In case of new station if DC_EXEC is NOT set we still need to create the station - * to test if everything is OK. In this case we need to delete it before return. */ - AutoPtrT<Station> st_auto_delete; - if (st != NULL) { if (st->owner != _current_player) { return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION); @@ -1419,26 +1401,25 @@ CommandCost CmdBuildRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) if (!st->rect.BeforeAddTile(tile, StationRect::ADD_TEST)) return CMD_ERROR; } else { /* allocate and initialize new station */ - st = new Station(tile); - if (st == NULL) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING); - - /* ensure that in case of error (or no DC_EXEC) the new station gets deleted upon return */ - st_auto_delete = st; + if (!Station::CanAllocateItem()) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING); + if (flags & DC_EXEC) { + st = new Station(); - Town *t = st->town = ClosestTownFromTile(tile, (uint)-1); - if (!GenerateStationName(st, tile, STATIONNAMING_ROAD)) return CMD_ERROR; + st->town = ClosestTownFromTile(tile, (uint)-1); + GenerateStationName(st, tile, STATIONNAMING_ROAD); - if (IsValidPlayer(_current_player) && (flags & DC_EXEC) != 0) { - SetBit(t->have_ratings, _current_player); + if (IsValidPlayer(_current_player)) { + SetBit(st->town->have_ratings, _current_player); + } + st->sign.width_1 = 0; } - - st->sign.width_1 = 0; } cost.AddCost((type) ? _price.build_truck_station : _price.build_bus_station); if (flags & DC_EXEC) { + RoadStop *road_stop = new RoadStop(tile); /* Insert into linked list of RoadStops */ RoadStop **currstop = FindRoadStopSpot(type, st); *currstop = road_stop; @@ -1460,9 +1441,6 @@ CommandCost CmdBuildRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) RebuildStationLists(); InvalidateWindow(WC_STATION_LIST, st->owner); InvalidateWindowWidget(WC_STATION_VIEW, st->index, SVW_ROADVEHS); - /* success, so don't delete the new station and the new road stop */ - st_auto_delete.Detach(); - rs_auto_delete.Detach(); } return cost; } @@ -1717,10 +1695,6 @@ CommandCost CmdBuildAirport(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) return CMD_ERROR; } - /* In case of new station if DC_EXEC is NOT set we still need to create the station - * to test if everything is OK. In this case we need to delete it before return. */ - AutoPtrT<Station> st_auto_delete; - if (st != NULL) { if (st->owner != _current_player) { return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION); @@ -1735,24 +1709,18 @@ CommandCost CmdBuildAirport(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) airport_upgrade = false; /* allocate and initialize new station */ - st = new Station(tile); - if (st == NULL) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING); + if (!Station::CanAllocateItem()) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING); - /* ensure that in case of error (or no DC_EXEC) the station gets deleted upon return */ - st_auto_delete = st; - - st->town = t; - - if (IsValidPlayer(_current_player) && (flags & DC_EXEC) != 0) { - SetBit(t->have_ratings, _current_player); - } + if (flags & DC_EXEC) { + st = new Station(); - st->sign.width_1 = 0; + st->town = ClosestTownFromTile(tile, (uint)-1); + GenerateStationName(st, tile, !(afc->flags & AirportFTAClass::AIRPLANES) ? STATIONNAMING_HELIPORT : STATIONNAMING_AIRPORT); - /* If only helicopters may use the airport generate a helicopter related (5) - * station name, otherwise generate a normal airport name (1) */ - if (!GenerateStationName(st, tile, !(afc->flags & AirportFTAClass::AIRPLANES) ? STATIONNAMING_HELIPORT : STATIONNAMING_AIRPORT)) { - return CMD_ERROR; + if (IsValidPlayer(_current_player)) { + SetBit(st->town->have_ratings, _current_player); + } + st->sign.width_1 = 0; } } @@ -1789,8 +1757,6 @@ CommandCost CmdBuildAirport(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) RebuildStationLists(); InvalidateWindow(WC_STATION_LIST, st->owner); InvalidateWindowWidget(WC_STATION_VIEW, st->index, SVW_PLANES); - /* success, so don't delete the new station */ - st_auto_delete.Detach(); } return cost; @@ -1860,18 +1826,18 @@ CommandCost CmdBuildBuoy(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) if (GetTileSlope(tile, NULL) != SLOPE_FLAT) return_cmd_error(STR_304B_SITE_UNSUITABLE); /* allocate and initialize new station */ - Station *st = new Station(tile); - if (st == NULL) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING); - - /* ensure that in case of error (or no DC_EXEC) the station gets deleted upon return */ - AutoPtrT<Station> st_auto_delete(st); + if (!Station::CanAllocateItem()) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING); - st->town = ClosestTownFromTile(tile, (uint)-1); - st->sign.width_1 = 0; + if (flags & DC_EXEC) { + Station *st = new Station(); - if (!GenerateStationName(st, tile, STATIONNAMING_BUOY)) return CMD_ERROR; + st->town = ClosestTownFromTile(tile, (uint)-1); + GenerateStationName(st, tile, STATIONNAMING_BUOY); - if (flags & DC_EXEC) { + if (IsValidPlayer(_current_player)) { + SetBit(st->town->have_ratings, _current_player); + } + st->sign.width_1 = 0; st->dock_tile = tile; st->facilities |= FACIL_DOCK; /* Buoys are marked in the Station struct by this flag. Yes, it is this @@ -1888,8 +1854,6 @@ CommandCost CmdBuildBuoy(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) RebuildStationLists(); InvalidateWindow(WC_STATION_LIST, st->owner); InvalidateWindowWidget(WC_STATION_VIEW, st->index, SVW_SHIPS); - /* success, so don't delete the new station */ - st_auto_delete.Detach(); } return CommandCost(EXPENSES_CONSTRUCTION, _price.build_dock); @@ -2011,10 +1975,6 @@ CommandCost CmdBuildDock(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) /* Find a station close to us */ if (st == NULL) st = GetClosestStationFromTile(tile); - /* In case of new station if DC_EXEC is NOT set we still need to create the station - * to test if everything is OK. In this case we need to delete it before return. */ - AutoPtrT<Station> st_auto_delete; - if (st != NULL) { if (st->owner != _current_player) { return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION); @@ -2025,21 +1985,19 @@ CommandCost CmdBuildDock(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) if (st->dock_tile != 0) return_cmd_error(STR_304C_TOO_CLOSE_TO_ANOTHER_DOCK); } else { /* allocate and initialize new station */ - st = new Station(tile); - if (st == NULL) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING); + /* allocate and initialize new station */ + if (!Station::CanAllocateItem()) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING); - /* ensure that in case of error (or no DC_EXEC) the station gets deleted upon return */ - st_auto_delete = st; + if (flags & DC_EXEC) { + st = new Station(); - Town *t = st->town = ClosestTownFromTile(tile, (uint)-1); + st->town = ClosestTownFromTile(tile, (uint)-1); + GenerateStationName(st, tile, STATIONNAMING_DOCK); - if (IsValidPlayer(_current_player) && (flags & DC_EXEC) != 0) { - SetBit(t->have_ratings, _current_player); + if (IsValidPlayer(_current_player)) { + SetBit(st->town->have_ratings, _current_player); + } } - - st->sign.width_1 = 0; - - if (!GenerateStationName(st, tile, STATIONNAMING_DOCK)) return CMD_ERROR; } if (flags & DC_EXEC) { @@ -2055,8 +2013,6 @@ CommandCost CmdBuildDock(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) RebuildStationLists(); InvalidateWindow(WC_STATION_LIST, st->owner); InvalidateWindowWidget(WC_STATION_VIEW, st->index, SVW_SHIPS); - /* success, so don't delete the new station */ - st_auto_delete.Detach(); } return CommandCost(EXPENSES_CONSTRUCTION, _price.build_dock); @@ -2877,11 +2833,7 @@ void BuildOilRig(TileIndex tile) st->town = ClosestTownFromTile(tile, (uint)-1); st->sign.width_1 = 0; - if (!GenerateStationName(st, tile, STATIONNAMING_OILRIG)) { - DEBUG(misc, 0, "Can't allocate station-name for oilrig at 0x%X, reverting to oilrig only", tile); - delete st; - return; - } + GenerateStationName(st, tile, STATIONNAMING_OILRIG); MakeOilrig(tile, st->index); diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 6412a82b2..912b7c99b 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -39,6 +39,7 @@ #include "airport.h" #include "newgrf_cargo.h" #include "effectvehicle_func.h" +#include "oldpool_func.h" #include "table/sprites.h" #include "table/strings.h" |