OpenTTD Source 20241224-master-gf74b0cf984
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;
37
38 public:
39 friend struct RoadStop;
40
42 Entry() : length(0), occupied(0) {}
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;
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:
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.
Types related to stations.
RoadStopType
Types of RoadStops.
Base class for all PoolItems.
Base class for all pools.
Definition pool_type.hpp:80
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 Enter(const RoadVehicle *rv)
Enter the road stop.
Definition roadstop.cpp:288
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.
void Rebuild(const RoadStop *rs, int side=-1)
Rebuild, from scratch, the vehicles and other metadata on this stop.
Definition roadstop.cpp:365
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.
@ 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.
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
~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.
bool Enter(RoadVehicle *rv)
Enter the road stop.
Definition roadstop.cpp:231
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.