diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index d8a7ed61a8..76ddb07800 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -436,8 +436,8 @@ uint32_t Station::GetNewGRFVariable(const ResolverObject &object, uint8_t variab case 0x8A: return this->had_vehicle_of_type; case 0xF1: return (this->airport.tile != INVALID_TILE) ? this->airport.GetSpec()->ttd_airport_type : ATP_TTDP_LARGE; - case 0xF2: return (this->truck_stops != nullptr) ? this->truck_stops->status : 0; - case 0xF3: return (this->bus_stops != nullptr) ? this->bus_stops->status : 0; + case 0xF2: return (this->truck_stops != nullptr) ? this->truck_stops->status.base() : 0; + case 0xF3: return (this->bus_stops != nullptr) ? this->bus_stops->status.base() : 0; case 0xF6: return this->airport.blocks.base(); case 0xF7: return GB(this->airport.blocks.base(), 8, 8); } diff --git a/src/roadstop.cpp b/src/roadstop.cpp index 4c68e2688f..4dcc2c5c53 100644 --- a/src/roadstop.cpp +++ b/src/roadstop.cpp @@ -26,7 +26,7 @@ INSTANTIATE_POOL_METHODS(RoadStop) RoadStop::~RoadStop() { /* When we are the head we need to free the entries */ - if (HasBit(this->status, RSSFB_BASE_ENTRY)) { + if (this->status.Test(RoadStopStatusFlag::BaseEntry)) { delete this->east; delete this->west; } @@ -86,7 +86,7 @@ void RoadStop::MakeDriveThrough() if (south && rs_south->east != nullptr) { // (east != nullptr) == (west != nullptr) /* There more southern tiles too, they must 'join' us too */ - ClrBit(rs_south->status, RSSFB_BASE_ENTRY); + rs_south->status.Reset(RoadStopStatusFlag::BaseEntry); this->east->occupied += rs_south->east->occupied; this->west->occupied += rs_south->west->occupied; @@ -107,13 +107,13 @@ void RoadStop::MakeDriveThrough() /* There is one to the south, but not to the north... so we become 'parent' */ this->east = rs_south->east; this->west = rs_south->west; - SetBit(this->status, RSSFB_BASE_ENTRY); - ClrBit(rs_south->status, RSSFB_BASE_ENTRY); + this->status.Set(RoadStopStatusFlag::BaseEntry); + rs_south->status.Reset(RoadStopStatusFlag::BaseEntry); } else { /* We are the only... so we are automatically the master */ this->east = new Entry(); this->west = new Entry(); - SetBit(this->status, RSSFB_BASE_ENTRY); + this->status.Set(RoadStopStatusFlag::BaseEntry); } /* Now update the lengths */ @@ -153,7 +153,7 @@ void RoadStop::ClearDriveThrough() if (south) { /* There are more southern tiles too, they must be split; * first make the new southern 'base' */ - SetBit(rs_south->status, RSSFB_BASE_ENTRY); + rs_south->status.Set(RoadStopStatusFlag::BaseEntry); rs_south->east = new Entry(); rs_south->west = new Entry(); @@ -182,7 +182,7 @@ void RoadStop::ClearDriveThrough() rs_south_base->east->Rebuild(rs_south_base); rs_south_base->west->Rebuild(rs_south_base); - assert(HasBit(rs_north->status, RSSFB_BASE_ENTRY)); + assert(rs_north->status.Test(RoadStopStatusFlag::BaseEntry)); rs_north->east->Rebuild(rs_north); rs_north->west->Rebuild(rs_north); } else { @@ -192,7 +192,7 @@ void RoadStop::ClearDriveThrough() } } else if (south) { /* There is only something to the south. Hand over the base entry */ - SetBit(rs_south->status, RSSFB_BASE_ENTRY); + rs_south->status.Set(RoadStopStatusFlag::BaseEntry); rs_south->east->length -= TILE_SIZE; rs_south->west->length -= TILE_SIZE; } else { @@ -202,7 +202,7 @@ void RoadStop::ClearDriveThrough() } /* Make sure we don't get used for something 'incorrect' */ - ClrBit(this->status, RSSFB_BASE_ENTRY); + this->status.Reset(RoadStopStatusFlag::BaseEntry); this->east = nullptr; this->west = nullptr; } @@ -364,7 +364,7 @@ static DiagDirection GetEntryDirection(bool east, Axis axis) */ void RoadStop::Entry::Rebuild(const RoadStop *rs, int side) { - assert(HasBit(rs->status, RSSFB_BASE_ENTRY)); + assert(rs->status.Test(RoadStopStatusFlag::BaseEntry)); Axis axis = GetDriveThroughStopAxis(rs->xy); if (side == -1) side = (rs->east == this); @@ -392,7 +392,7 @@ void RoadStop::Entry::Rebuild(const RoadStop *rs, int side) */ void RoadStop::Entry::CheckIntegrity(const RoadStop *rs) const { - if (!HasBit(rs->status, RSSFB_BASE_ENTRY)) return; + if (!rs->status.Test(RoadStopStatusFlag::BaseEntry)) return; /* The tile 'before' the road stop must not be part of this 'line' */ assert(IsDriveThroughStopTile(rs->xy)); diff --git a/src/roadstop_base.h b/src/roadstop_base.h index 6dc957286d..1ae6d75729 100644 --- a/src/roadstop_base.h +++ b/src/roadstop_base.h @@ -20,14 +20,13 @@ extern RoadStopPool _roadstop_pool; /** A Stop for a Road Vehicle */ struct RoadStop : RoadStopPool::PoolItem<&_roadstop_pool> { - enum RoadStopStatusFlags : uint8_t { - RSSFB_BAY0_FREE = 0, ///< Non-zero when bay 0 is free - RSSFB_BAY1_FREE = 1, ///< Non-zero when bay 1 is free - RSSFB_BASE_ENTRY = 6, ///< Non-zero when the entries on this road stop are the primary, i.e. the ones to delete - RSSFB_ENTRY_BUSY = 7, ///< Non-zero when roadstop entry is busy + enum class RoadStopStatusFlag : uint8_t { + Bay0Free = 0, ///< Non-zero when bay 0 is free + Bay1Free = 1, ///< Non-zero when bay 1 is free + BaseEntry = 6, ///< Non-zero when the entries on this road stop are the primary, i.e. the ones to delete + EntryBusy = 7, ///< Non-zero when roadstop entry is busy }; - - static constexpr uint8_t BAY_COUNT = 2; ///< Max. number of bays + using RoadStopStatusFlags = EnumBitSet; /** Container for each entry point of a drive through road stop */ struct Entry { @@ -65,15 +64,12 @@ struct RoadStop : RoadStopPool::PoolItem<&_roadstop_pool> { void Rebuild(const RoadStop *rs, int side = -1); }; - uint8_t status = 0; ///< Current status of the Stop, @see RoadStopSatusFlag. Access using *Bay and *Busy functions. + RoadStopStatusFlags status{RoadStopStatusFlag::Bay0Free, RoadStopStatusFlag::Bay1Free}; ///< Current status of the Stop. Access using *Bay and *Busy functions. TileIndex xy = INVALID_TILE; ///< Position on the map RoadStop *next = nullptr; ///< Next stop of the given type at this station /** Initializes a RoadStop */ - inline RoadStop(TileIndex tile = INVALID_TILE) : - status((1 << BAY_COUNT) - 1), - xy(tile) - { } + inline RoadStop(TileIndex tile = INVALID_TILE) : xy(tile) { } ~RoadStop(); @@ -83,7 +79,7 @@ struct RoadStop : RoadStopPool::PoolItem<&_roadstop_pool> { */ inline bool HasFreeBay() const { - return GB(this->status, 0, BAY_COUNT) != 0; + return this->status.Any({RoadStopStatusFlag::Bay0Free, RoadStopStatusFlag::Bay1Free}); } /** @@ -93,8 +89,11 @@ struct RoadStop : RoadStopPool::PoolItem<&_roadstop_pool> { */ inline bool IsFreeBay(uint nr) const { - assert(nr < BAY_COUNT); - return HasBit(this->status, nr); + switch (nr) { + case 0: return this->status.Test(RoadStopStatusFlag::Bay0Free); + case 1: return this->status.Test(RoadStopStatusFlag::Bay1Free); + default: NOT_REACHED(); + } } /** @@ -103,7 +102,7 @@ struct RoadStop : RoadStopPool::PoolItem<&_roadstop_pool> { */ inline bool IsEntranceBusy() const { - return HasBit(this->status, RSSFB_ENTRY_BUSY); + return this->status.Test(RoadStopStatusFlag::EntryBusy); } /** @@ -112,7 +111,7 @@ struct RoadStop : RoadStopPool::PoolItem<&_roadstop_pool> { */ inline void SetEntranceBusy(bool busy) { - SB(this->status, RSSFB_ENTRY_BUSY, 1, busy); + this->status.Set(RoadStopStatusFlag::EntryBusy, busy); } /** @@ -160,11 +159,11 @@ private: { assert(this->HasFreeBay()); - /* Find the first free bay. If the bit is set, the bay is free. */ + /* Find the first free bay. */ uint bay_nr = 0; - while (!HasBit(this->status, bay_nr)) bay_nr++; + while (!this->IsFreeBay(bay_nr)) ++bay_nr; - ClrBit(this->status, bay_nr); + this->AllocateDriveThroughBay(bay_nr); return bay_nr; } @@ -174,8 +173,11 @@ private: */ inline void AllocateDriveThroughBay(uint nr) { - assert(nr < BAY_COUNT); - ClrBit(this->status, nr); + switch (nr) { + case 0: this->status.Reset(RoadStopStatusFlag::Bay0Free); break; + case 1: this->status.Reset(RoadStopStatusFlag::Bay1Free); break; + default: NOT_REACHED(); + } } /** @@ -184,8 +186,11 @@ private: */ inline void FreeBay(uint nr) { - assert(nr < BAY_COUNT); - SetBit(this->status, nr); + switch (nr) { + case 0: this->status.Set(RoadStopStatusFlag::Bay0Free); break; + case 1: this->status.Set(RoadStopStatusFlag::Bay1Free); break; + default: NOT_REACHED(); + } } }; diff --git a/src/saveload/station_sl.cpp b/src/saveload/station_sl.cpp index 45a37b7b23..87091cb6fc 100644 --- a/src/saveload/station_sl.cpp +++ b/src/saveload/station_sl.cpp @@ -149,7 +149,7 @@ void AfterLoadRoadStops() } /* And then rebuild the data in those entries */ for (RoadStop *rs : RoadStop::Iterate()) { - if (!HasBit(rs->status, RoadStop::RSSFB_BASE_ENTRY)) continue; + if (!rs->status.Test(RoadStop::RoadStopStatusFlag::BaseEntry)) continue; rs->GetEntry(DIAGDIR_NE)->Rebuild(rs); rs->GetEntry(DIAGDIR_NW)->Rebuild(rs);