From e9e7e4af5132e4b70804a9fe1a2780846bf4f792 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 3 Jan 2026 16:40:12 +0100 Subject: [PATCH] Codechange: remove need for new (address) PoolItem(...) --- src/core/pool_type.hpp | 22 ++-------------------- src/engine.cpp | 4 ++++ src/engine_base.h | 1 - src/saveload/engine_sl.cpp | 4 ++-- src/saveload/oldloader_sl.cpp | 8 ++++---- src/saveload/saveload_internal.h | 2 +- 6 files changed, 13 insertions(+), 28 deletions(-) diff --git a/src/core/pool_type.hpp b/src/core/pool_type.hpp index cfd9a713c1..697af8bce8 100644 --- a/src/core/pool_type.hpp +++ b/src/core/pool_type.hpp @@ -318,26 +318,8 @@ public: /** Do not use new (index) PoolItem(...), but rather PoolItem::CreateAtIndex(index, ...). */ inline void *operator new(size_t size, Tindex index) = delete; - /** - * Allocates space for new Titem at given memory address - * @param ptr where are we allocating the item? - * @return pointer to allocated memory (== ptr) - * @note use of this is strongly discouraged - * @pre the memory must not be allocated in the Pool! - */ - inline void *operator new(size_t, void *ptr) - { - for (size_t i = 0; i < Tpool->first_unused; i++) { - /* Don't allow creating new objects over existing. - * Even if we called the destructor and reused this memory, - * we don't know whether 'size' and size of currently allocated - * memory are the same (because of possible inheritance). - * Use { size_t index = item->index; delete item; new (index) item; } - * instead to make sure destructor is called and no memory leaks. */ - assert(ptr != Tpool->data[i]); - } - return ptr; - } + /** Do not use new (address) PoolItem(...). */ + inline void *operator new(size_t, void *ptr) = delete; /** diff --git a/src/engine.cpp b/src/engine.cpp index 81b7c16d23..c137882cd9 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -71,6 +71,10 @@ static_assert(lengthof(_orig_rail_vehicle_info) + lengthof(_orig_road_vehicle_in Engine::Engine(EngineID index, VehicleType type, uint16_t local_id) : EnginePool::PoolItem<&_engine_pool>(index) { this->type = type; + + /* Called in the context of loading a savegame. The rest comes from the loader. */ + if (type == VEH_INVALID) return; + this->grf_prop.local_id = local_id; this->list_position = local_id; this->preview_company = CompanyID::Invalid(); diff --git a/src/engine_base.h b/src/engine_base.h index 4a1999e0b1..a7fd846d75 100644 --- a/src/engine_base.h +++ b/src/engine_base.h @@ -77,7 +77,6 @@ private: std::variant vehicle_info{}; public: - Engine(EngineID index) : EnginePool::PoolItem<&_engine_pool>(index) {} Engine(EngineID index, VehicleType type, uint16_t local_id); bool IsEnabled() const; diff --git a/src/saveload/engine_sl.cpp b/src/saveload/engine_sl.cpp index ecb89953b6..311eae05f7 100644 --- a/src/saveload/engine_sl.cpp +++ b/src/saveload/engine_sl.cpp @@ -43,12 +43,12 @@ static const SaveLoad _engine_desc[] = { static TypedIndexContainer, EngineID> _temp_engine; -Engine *GetTempDataEngine(EngineID index) +Engine *GetTempDataEngine(EngineID index, VehicleType type, uint16_t local_id) { if (index < _temp_engine.size()) { return &_temp_engine[index]; } else if (index == _temp_engine.size()) { - return &_temp_engine.emplace_back(index); + return &_temp_engine.emplace_back(index, type, local_id); } else { NOT_REACHED(); } diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp index 94fe4c51ea..0794d1c1fb 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -379,10 +379,10 @@ static bool FixTTOEngines() /* Load the default engine set. Many of them will be overridden later */ { EngineID j = EngineID::Begin(); - for (uint16_t i = 0; i < lengthof(_orig_rail_vehicle_info); ++i, ++j) new (GetTempDataEngine(j)) Engine(j, VEH_TRAIN, i); - for (uint16_t i = 0; i < lengthof(_orig_road_vehicle_info); ++i, ++j) new (GetTempDataEngine(j)) Engine(j, VEH_ROAD, i); - for (uint16_t i = 0; i < lengthof(_orig_ship_vehicle_info); ++i, ++j) new (GetTempDataEngine(j)) Engine(j, VEH_SHIP, i); - for (uint16_t i = 0; i < lengthof(_orig_aircraft_vehicle_info); ++i, ++j) new (GetTempDataEngine(j)) Engine(j, VEH_AIRCRAFT, i); + for (uint16_t i = 0; i < lengthof(_orig_rail_vehicle_info); ++i, ++j) GetTempDataEngine(j, VEH_TRAIN, i); + for (uint16_t i = 0; i < lengthof(_orig_road_vehicle_info); ++i, ++j) GetTempDataEngine(j, VEH_ROAD, i); + for (uint16_t i = 0; i < lengthof(_orig_ship_vehicle_info); ++i, ++j) GetTempDataEngine(j, VEH_SHIP, i); + for (uint16_t i = 0; i < lengthof(_orig_aircraft_vehicle_info); ++i, ++j) GetTempDataEngine(j, VEH_AIRCRAFT, i); } TimerGameCalendar::Date aging_date = std::min(TimerGameCalendar::date + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR, TimerGameCalendar::ConvertYMDToDate(TimerGameCalendar::Year{2050}, 0, 1)); diff --git a/src/saveload/saveload_internal.h b/src/saveload/saveload_internal.h index 6b439e1be4..bcbafdeff5 100644 --- a/src/saveload/saveload_internal.h +++ b/src/saveload/saveload_internal.h @@ -44,7 +44,7 @@ void ConvertOldMultiheadToNew(); void ConnectMultiheadedTrains(); void ResetTempEngineData(); -Engine *GetTempDataEngine(EngineID index); +Engine *GetTempDataEngine(EngineID index, VehicleType type = VEH_INVALID, uint16_t local_id = 0); void CopyTempEngineData(); extern int32_t _saved_scrollpos_x;