diff --git a/src/station.cpp b/src/station.cpp --- a/src/station.cpp +++ b/src/station.cpp @@ -312,3 +312,100 @@ StationRect& StationRect::operator = (Re return *this; } + +/************************************************************************/ +/* RoadStop implementation */ +/************************************************************************/ + +/** Allocates a new RoadStop onto the pool, or recycles an unsed one + * @return a pointer to the new roadstop + */ +void *RoadStop::operator new(size_t size) +{ + RoadStop *rs = AllocateRaw(); + return rs; +} + +/** Gets a RoadStop with a given index and allocates it when needed + * @return a pointer to the roadstop + */ +void *RoadStop::operator new(size_t size, int index) +{ + if (!AddBlockIfNeeded(&_RoadStop_pool, index)) { + error("RoadStops: failed loading savegame: too many RoadStops"); + } + + RoadStop *rs = GetRoadStop(index); + return rs; +} + +void RoadStop::operator delete(void *p) +{ +} + +void RoadStop::operator delete(void *p, int index) +{ +} + +/** Initializes a RoadStop */ +RoadStop::RoadStop(TileIndex tile, StationID index) +{ + DEBUG(ms, cDebugCtorLevel, "I+%3d at %d[0x%x]", index, tile, tile); + xy = tile; + used = true; + status = 3; //stop is free + next = NULL; + prev = NULL; + station = index; + num_vehicles = 0; +} + +/** De-Initializes a RoadStops. This includes clearing all slots that vehicles might + * have and unlinks it from the linked list of road stops at the given station + */ +RoadStop::~RoadStop() +{ + Vehicle *v; + + /* Clear the slot assignment of all vehicles heading for this road stop */ + if (num_vehicles != 0) { + FOR_ALL_VEHICLES(v) { + if (v->type == VEH_Road && v->u.road.slot == this) ClearSlot(v); + } + } + assert(num_vehicles == 0); + + if (prev != NULL) prev->next = next; + if (next != NULL) next->prev = prev; + + used = false; + DEBUG(ms, cDebugCtorLevel , "I- at %3d%d[0x%x]", station, xy, xy); + + xy = INVALID_TILE; + station = INVALID_STATION; +} + + +/** Low-level function for allocating a RoadStop on the pool */ +RoadStop *RoadStop::AllocateRaw( void ) +{ + RoadStop *rs; + + /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. + * TODO - This is just a temporary stage, this will be removed. */ + for (rs = GetRoadStop(0); rs != NULL; rs = (rs->index + 1U < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1U) : NULL) { + if (!IsValidRoadStop(rs)) { + RoadStopID index = rs->index; + + memset(rs, 0, sizeof(*rs)); + rs->index = index; + + return rs; + } + } + + /* Check if we can add a block to the pool */ + if (AddBlockToPool(&_RoadStop_pool)) return AllocateRaw(); + + return NULL; +}