OpenTTD Source 20250312-master-gcdcc6b491d
roadstop_base.h
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6 */
7
10#ifndef ROADSTOP_BASE_H
11#define ROADSTOP_BASE_H
12
13#include "station_type.h"
14#include "core/pool_type.hpp"
15#include "core/bitmath_func.hpp"
16#include "vehicle_type.h"
17
20
22struct RoadStop : RoadStopPool::PoolItem<&_roadstop_pool> {
29
30 static constexpr uint8_t BAY_COUNT = 2;
31
33 struct Entry {
34 private:
35 int length = 0;
36 int occupied = 0;
37
38 public:
39 friend struct RoadStop;
40
42 Entry() {}
43
48 inline int GetLength() const
49 {
50 return this->length;
51 }
52
57 inline int GetOccupied() const
58 {
59 return this->occupied;
60 }
61
62 void Leave(const RoadVehicle *rv);
63 void Enter(const RoadVehicle *rv);
64 void CheckIntegrity(const RoadStop *rs) const;
65 void Rebuild(const RoadStop *rs, int side = -1);
66 };
67
68 uint8_t status = 0;
70 RoadStop *next = nullptr;
71
74 status((1 << BAY_COUNT) - 1),
75 xy(tile)
76 { }
77
78 ~RoadStop();
79
84 inline bool HasFreeBay() const
85 {
86 return GB(this->status, 0, BAY_COUNT) != 0;
87 }
88
94 inline bool IsFreeBay(uint nr) const
95 {
96 assert(nr < BAY_COUNT);
97 return HasBit(this->status, nr);
98 }
99
104 inline bool IsEntranceBusy() const
105 {
106 return HasBit(this->status, RSSFB_ENTRY_BUSY);
107 }
108
113 inline void SetEntranceBusy(bool busy)
114 {
115 SB(this->status, RSSFB_ENTRY_BUSY, 1, busy);
116 }
117
123 inline const Entry *GetEntry(DiagDirection dir) const
124 {
125 return HasBit((int)dir, 1) ? this->west : this->east;
126 }
127
134 {
135 return HasBit((int)dir, 1) ? this->west : this->east;
136 }
137
138 void MakeDriveThrough();
139 void ClearDriveThrough();
140
141 void Leave(RoadVehicle *rv);
142 bool Enter(RoadVehicle *rv);
143
144 RoadStop *GetNextRoadStop(const struct RoadVehicle *v) const;
145
146 static RoadStop *GetByTile(TileIndex tile, RoadStopType type);
147
149
150private:
151 Entry *east = nullptr;
152 Entry *west = nullptr;
153
159 inline uint AllocateBay()
160 {
161 assert(this->HasFreeBay());
162
163 /* Find the first free bay. If the bit is set, the bay is free. */
164 uint bay_nr = 0;
165 while (!HasBit(this->status, bay_nr)) bay_nr++;
166
167 ClrBit(this->status, bay_nr);
168 return bay_nr;
169 }
170
175 inline void AllocateDriveThroughBay(uint nr)
176 {
177 assert(nr < BAY_COUNT);
178 ClrBit(this->status, nr);
179 }
180
185 inline void FreeBay(uint nr)
186 {
187 assert(nr < BAY_COUNT);
188 SetBit(this->status, nr);
189 }
190};
191
192#endif /* ROADSTOP_BASE_H */
Functions related to bit mathematics.
debug_inline constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
constexpr T SB(T &x, const uint8_t s, const uint8_t n, const U d)
Set n bits in x starting at bit s to d.
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
debug_inline static constexpr uint GB(const T x, const uint8_t s, const uint8_t n)
Fetch n bits from x, started at bit s.
constexpr T ClrBit(T &x, const uint8_t y)
Clears a bit in a variable.
DiagDirection
Enumeration for diagonal directions.
Definition of Pool, structure used to access PoolItems, and PoolItem, base structure for Vehicle,...
RoadStopPool _roadstop_pool("RoadStop")
The pool of roadstops.
@ Enter
signal entering the block found
@ Rebuild
rebuild the sort list
Types related to stations.
RoadStopType
Types of RoadStops.
Base class for all PoolItems.
Base class for all pools.
Container for each entry point of a drive through road stop.
Entry()
Create an entry.
int length
The length of the stop in tile 'units'.
void Leave(const RoadVehicle *rv)
Leave the road stop.
Definition roadstop.cpp:278
void CheckIntegrity(const RoadStop *rs) const
Check the integrity of the data in this struct.
Definition roadstop.cpp:393
int GetOccupied() const
Get the amount of occupied space in this drive through stop.
int GetLength() const
Get the length of this drive through stop.
int occupied
The amount of occupied stop in tile 'units'.
A Stop for a Road Vehicle.
void SetEntranceBusy(bool busy)
Makes an entrance occupied or free.
Entry * east
The vehicles that entered from the east.
RoadStop(TileIndex tile=INVALID_TILE)
Initializes a RoadStop.
bool IsFreeBay(uint nr) const
Checks whether the given bay is free in this road stop.
void Leave(RoadVehicle *rv)
Leave the road stop.
Definition roadstop.cpp:214
RoadStop * next
Next stop of the given type at this station.
uint AllocateBay()
Allocates a bay.
RoadStop * GetNextRoadStop(const struct RoadVehicle *v) const
Get the next road stop accessible by this vehicle.
Definition roadstop.cpp:42
@ RSSFB_ENTRY_BUSY
Non-zero when roadstop entry is busy.
@ RSSFB_BASE_ENTRY
Non-zero when the entries on this road stop are the primary, i.e. the ones to delete.
@ RSSFB_BAY1_FREE
Non-zero when bay 1 is free.
@ RSSFB_BAY0_FREE
Non-zero when bay 0 is free.
~RoadStop()
De-Initializes RoadStops.
Definition roadstop.cpp:26
bool HasFreeBay() const
Checks whether there is a free bay in this road stop.
void AllocateDriveThroughBay(uint nr)
Allocates a bay in a drive-through road stop.
Entry * GetEntry(DiagDirection dir)
Get the drive through road stop entry struct for the given direction.
void FreeBay(uint nr)
Frees the given bay.
TileIndex xy
Position on the map.
bool IsEntranceBusy() const
Checks whether the entrance of the road stop is occupied by a vehicle.
static bool IsDriveThroughRoadStopContinuation(TileIndex rs, TileIndex next)
Checks whether the 'next' tile is still part of the road same drive through stop 'rs' in the same dir...
Definition roadstop.cpp:303
uint8_t status
Current status of the Stop,.
static RoadStop * GetByTile(TileIndex tile, RoadStopType type)
Find a roadstop at given tile.
Definition roadstop.cpp:264
void MakeDriveThrough()
Join this road stop to another 'base' road stop if possible; fill all necessary data to become an act...
Definition roadstop.cpp:62
Entry * west
The vehicles that entered from the west.
static constexpr uint8_t BAY_COUNT
Max. number of bays.
const Entry * GetEntry(DiagDirection dir) const
Get the drive through road stop entry struct for the given direction.
void ClearDriveThrough()
Prepare for removal of this stop; update other neighbouring stops if needed.
Definition roadstop.cpp:129
Buses, trucks and trams belong to this class.
Definition roadveh.h:98
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
Definition tile_type.h:95
Types related to vehicles.