forked from mirror/OpenTTD
(svn r26105) -Codechange: add a lot of assertions to track/road functions that might eventually lead to become indices into tables
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
|
||||
#include "core/bitmath_func.hpp"
|
||||
#include "track_type.h"
|
||||
#include "direction_func.h"
|
||||
#include "slope_func.h"
|
||||
|
||||
/**
|
||||
@@ -27,6 +28,42 @@
|
||||
*/
|
||||
#define FOR_EACH_SET_TRACK(var, track_bits) FOR_EACH_SET_BIT_EX(Track, var, TrackBits, track_bits)
|
||||
|
||||
/**
|
||||
* Checks if a Track is valid.
|
||||
*
|
||||
* @param track The value to check
|
||||
* @return true if the given value is a valid track.
|
||||
* @note Use this in an assert()
|
||||
*/
|
||||
static inline bool IsValidTrack(Track track)
|
||||
{
|
||||
return track < TRACK_END;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a Trackdir is valid for road vehicles.
|
||||
*
|
||||
* @param trackdir The value to check
|
||||
* @return true if the given value is a valid Trackdir
|
||||
* @note Use this in an assert()
|
||||
*/
|
||||
static inline bool IsValidTrackdirForRoadVehicle(Trackdir trackdir)
|
||||
{
|
||||
return trackdir < TRACKDIR_END;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a Trackdir is valid for non-road vehicles.
|
||||
*
|
||||
* @param trackdir The value to check
|
||||
* @return true if the given value is a valid Trackdir
|
||||
* @note Use this in an assert()
|
||||
*/
|
||||
static inline bool IsValidTrackdir(Trackdir trackdir)
|
||||
{
|
||||
return (1 << trackdir & TRACKDIR_BIT_MASK) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert an Axis to the corresponding Track
|
||||
* AXIS_X -> TRACK_X
|
||||
@@ -38,6 +75,7 @@
|
||||
*/
|
||||
static inline Track AxisToTrack(Axis a)
|
||||
{
|
||||
assert(IsValidAxis(a));
|
||||
return (Track)a;
|
||||
}
|
||||
|
||||
@@ -48,6 +86,7 @@ static inline Track AxisToTrack(Axis a)
|
||||
*/
|
||||
static inline TrackBits TrackToTrackBits(Track track)
|
||||
{
|
||||
assert(IsValidTrack(track));
|
||||
return (TrackBits)(1 << track);
|
||||
}
|
||||
|
||||
@@ -74,8 +113,6 @@ static inline TrackBits CornerToTrackBits(Corner corner)
|
||||
return _corner_to_trackbits[corner];
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Maps a Trackdir to the corresponding TrackdirBits value
|
||||
* @param trackdir the track direction to convert
|
||||
@@ -83,6 +120,7 @@ static inline TrackBits CornerToTrackBits(Corner corner)
|
||||
*/
|
||||
static inline TrackdirBits TrackdirToTrackdirBits(Trackdir trackdir)
|
||||
{
|
||||
assert(IsValidTrackdir(trackdir));
|
||||
return (TrackdirBits)(1 << trackdir);
|
||||
}
|
||||
|
||||
@@ -103,6 +141,7 @@ static inline TrackdirBits TrackdirToTrackdirBits(Trackdir trackdir)
|
||||
static inline Track RemoveFirstTrack(TrackBits *tracks)
|
||||
{
|
||||
if (*tracks != TRACK_BIT_NONE && *tracks != INVALID_TRACK_BIT) {
|
||||
assert((*tracks & ~TRACK_BIT_MASK) == TRACK_BIT_NONE);
|
||||
Track first = (Track)FIND_FIRST_BIT(*tracks);
|
||||
ClrBit(*tracks, first);
|
||||
return first;
|
||||
@@ -127,6 +166,7 @@ static inline Track RemoveFirstTrack(TrackBits *tracks)
|
||||
static inline Trackdir RemoveFirstTrackdir(TrackdirBits *trackdirs)
|
||||
{
|
||||
if (*trackdirs != TRACKDIR_BIT_NONE && *trackdirs != INVALID_TRACKDIR_BIT) {
|
||||
assert((*trackdirs & ~TRACKDIR_BIT_MASK) == TRACKDIR_BIT_NONE);
|
||||
Trackdir first = (Trackdir)FindFirstBit2x64(*trackdirs);
|
||||
ClrBit(*trackdirs, first);
|
||||
return first;
|
||||
@@ -184,31 +224,6 @@ static inline Trackdir FindFirstTrackdir(TrackdirBits trackdirs)
|
||||
return (trackdirs != TRACKDIR_BIT_NONE) ? (Trackdir)FindFirstBit2x64(trackdirs) : INVALID_TRACKDIR;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a Track is valid.
|
||||
*
|
||||
* @param track The value to check
|
||||
* @return true if the given value is a valid track.
|
||||
* @note Use this in an assert()
|
||||
*/
|
||||
static inline bool IsValidTrack(Track track)
|
||||
{
|
||||
return track < TRACK_END;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a Trackdir is valid.
|
||||
*
|
||||
* @param trackdir The value to check
|
||||
* @return true if the given value is a valid Trackdir
|
||||
* @note Use this in an assert()
|
||||
*/
|
||||
static inline bool IsValidTrackdir(Trackdir trackdir)
|
||||
{
|
||||
return (TrackdirToTrackdirBits(trackdir) & TRACKDIR_BIT_MASK) != 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Functions describing logical relations between Tracks, TrackBits, Trackdirs
|
||||
* TrackdirBits, Direction and DiagDirections.
|
||||
@@ -225,7 +240,7 @@ static inline bool IsValidTrackdir(Trackdir trackdir)
|
||||
*/
|
||||
static inline Track TrackToOppositeTrack(Track t)
|
||||
{
|
||||
assert(t != INVALID_TRACK);
|
||||
assert(IsValidTrack(t));
|
||||
return (Track)(t ^ 1);
|
||||
}
|
||||
|
||||
@@ -241,7 +256,7 @@ static inline Track TrackToOppositeTrack(Track t)
|
||||
*/
|
||||
static inline Trackdir ReverseTrackdir(Trackdir trackdir)
|
||||
{
|
||||
assert(trackdir != INVALID_TRACKDIR);
|
||||
assert(IsValidTrackdirForRoadVehicle(trackdir));
|
||||
return (Trackdir)(trackdir ^ 8);
|
||||
}
|
||||
|
||||
@@ -256,6 +271,7 @@ static inline Trackdir ReverseTrackdir(Trackdir trackdir)
|
||||
*/
|
||||
static inline Track TrackdirToTrack(Trackdir trackdir)
|
||||
{
|
||||
assert(IsValidTrackdir(trackdir));
|
||||
return (Track)(trackdir & 0x7);
|
||||
}
|
||||
|
||||
@@ -272,6 +288,7 @@ static inline Track TrackdirToTrack(Trackdir trackdir)
|
||||
*/
|
||||
static inline Trackdir TrackToTrackdir(Track track)
|
||||
{
|
||||
assert(IsValidTrack(track));
|
||||
return (Trackdir)track;
|
||||
}
|
||||
|
||||
@@ -373,6 +390,7 @@ static inline TrackStatus CombineTrackStatus(TrackdirBits trackdirbits, Trackdir
|
||||
*/
|
||||
static inline Trackdir NextTrackdir(Trackdir trackdir)
|
||||
{
|
||||
assert(IsValidTrackdir(trackdir));
|
||||
extern const Trackdir _next_trackdir[TRACKDIR_END];
|
||||
return _next_trackdir[trackdir];
|
||||
}
|
||||
@@ -389,6 +407,7 @@ static inline Trackdir NextTrackdir(Trackdir trackdir)
|
||||
*/
|
||||
static inline TrackBits TrackCrossesTracks(Track track)
|
||||
{
|
||||
assert(IsValidTrack(track));
|
||||
extern const TrackBits _track_crosses_tracks[TRACK_END];
|
||||
return _track_crosses_tracks[track];
|
||||
}
|
||||
@@ -407,6 +426,7 @@ static inline TrackBits TrackCrossesTracks(Track track)
|
||||
*/
|
||||
static inline DiagDirection TrackdirToExitdir(Trackdir trackdir)
|
||||
{
|
||||
assert(IsValidTrackdirForRoadVehicle(trackdir));
|
||||
extern const DiagDirection _trackdir_to_exitdir[TRACKDIR_END];
|
||||
return _trackdir_to_exitdir[trackdir];
|
||||
}
|
||||
@@ -428,6 +448,8 @@ static inline DiagDirection TrackdirToExitdir(Trackdir trackdir)
|
||||
*/
|
||||
static inline Trackdir TrackExitdirToTrackdir(Track track, DiagDirection diagdir)
|
||||
{
|
||||
assert(IsValidTrack(track));
|
||||
assert(IsValidDiagDirection(diagdir));
|
||||
extern const Trackdir _track_exitdir_to_trackdir[TRACK_END][DIAGDIR_END];
|
||||
return _track_exitdir_to_trackdir[track][diagdir];
|
||||
}
|
||||
@@ -451,6 +473,8 @@ static inline Trackdir TrackExitdirToTrackdir(Track track, DiagDirection diagdir
|
||||
*/
|
||||
static inline Trackdir TrackEnterdirToTrackdir(Track track, DiagDirection diagdir)
|
||||
{
|
||||
assert(IsValidTrack(track));
|
||||
assert(IsValidDiagDirection(diagdir));
|
||||
extern const Trackdir _track_enterdir_to_trackdir[TRACK_END][DIAGDIR_END];
|
||||
return _track_enterdir_to_trackdir[track][diagdir];
|
||||
}
|
||||
@@ -461,6 +485,8 @@ static inline Trackdir TrackEnterdirToTrackdir(Track track, DiagDirection diagdi
|
||||
*/
|
||||
static inline Trackdir TrackDirectionToTrackdir(Track track, Direction dir)
|
||||
{
|
||||
assert(IsValidTrack(track));
|
||||
assert(IsValidDirection(dir));
|
||||
extern const Trackdir _track_direction_to_trackdir[TRACK_END][DIR_END];
|
||||
return _track_direction_to_trackdir[track][dir];
|
||||
}
|
||||
@@ -473,6 +499,7 @@ static inline Trackdir TrackDirectionToTrackdir(Track track, Direction dir)
|
||||
*/
|
||||
static inline Track DiagDirToDiagTrack(DiagDirection diagdir)
|
||||
{
|
||||
assert(IsValidDiagDirection(diagdir));
|
||||
return (Track)(diagdir & 1);
|
||||
}
|
||||
|
||||
@@ -484,6 +511,7 @@ static inline Track DiagDirToDiagTrack(DiagDirection diagdir)
|
||||
*/
|
||||
static inline TrackBits DiagDirToDiagTrackBits(DiagDirection diagdir)
|
||||
{
|
||||
assert(IsValidDiagDirection(diagdir));
|
||||
return TrackToTrackBits(DiagDirToDiagTrack(diagdir));
|
||||
}
|
||||
|
||||
@@ -496,6 +524,7 @@ static inline TrackBits DiagDirToDiagTrackBits(DiagDirection diagdir)
|
||||
*/
|
||||
static inline Trackdir DiagDirToDiagTrackdir(DiagDirection diagdir)
|
||||
{
|
||||
assert(IsValidDiagDirection(diagdir));
|
||||
extern const Trackdir _dir_to_diag_trackdir[DIAGDIR_END];
|
||||
return _dir_to_diag_trackdir[diagdir];
|
||||
}
|
||||
@@ -513,6 +542,7 @@ static inline Trackdir DiagDirToDiagTrackdir(DiagDirection diagdir)
|
||||
*/
|
||||
static inline TrackdirBits DiagdirReachesTrackdirs(DiagDirection diagdir)
|
||||
{
|
||||
assert(IsValidDiagDirection(diagdir));
|
||||
extern const TrackdirBits _exitdir_reaches_trackdirs[DIAGDIR_END];
|
||||
return _exitdir_reaches_trackdirs[diagdir];
|
||||
}
|
||||
@@ -541,6 +571,7 @@ static inline TrackBits DiagdirReachesTracks(DiagDirection diagdir) { return Tra
|
||||
*/
|
||||
static inline TrackdirBits TrackdirReachesTrackdirs(Trackdir trackdir)
|
||||
{
|
||||
assert(IsValidTrackdir(trackdir));
|
||||
extern const TrackdirBits _exitdir_reaches_trackdirs[DIAGDIR_END];
|
||||
return _exitdir_reaches_trackdirs[TrackdirToExitdir(trackdir)];
|
||||
}
|
||||
@@ -562,6 +593,7 @@ static inline TrackdirBits TrackdirReachesTrackdirs(Trackdir trackdir)
|
||||
*/
|
||||
static inline TrackdirBits TrackdirCrossesTrackdirs(Trackdir trackdir)
|
||||
{
|
||||
assert(IsValidTrackdirForRoadVehicle(trackdir));
|
||||
extern const TrackdirBits _track_crosses_trackdirs[TRACKDIR_END];
|
||||
return _track_crosses_trackdirs[TrackdirToTrack(trackdir)];
|
||||
}
|
||||
@@ -574,6 +606,7 @@ static inline TrackdirBits TrackdirCrossesTrackdirs(Trackdir trackdir)
|
||||
*/
|
||||
static inline bool IsDiagonalTrack(Track track)
|
||||
{
|
||||
assert(IsValidTrack(track));
|
||||
return (track == TRACK_X) || (track == TRACK_Y);
|
||||
}
|
||||
|
||||
@@ -585,6 +618,7 @@ static inline bool IsDiagonalTrack(Track track)
|
||||
*/
|
||||
static inline bool IsDiagonalTrackdir(Trackdir trackdir)
|
||||
{
|
||||
assert(IsValidTrackdir(trackdir));
|
||||
return IsDiagonalTrack(TrackdirToTrack(trackdir));
|
||||
}
|
||||
|
||||
@@ -626,6 +660,7 @@ static inline bool TrackOverlapsTracks(TrackBits tracks, Track track)
|
||||
*/
|
||||
static inline bool IsReversingRoadTrackdir(Trackdir dir)
|
||||
{
|
||||
assert(IsValidTrackdirForRoadVehicle(dir));
|
||||
return (dir & 0x07) >= 6;
|
||||
}
|
||||
|
||||
@@ -636,6 +671,7 @@ static inline bool IsReversingRoadTrackdir(Trackdir dir)
|
||||
*/
|
||||
static inline bool IsStraightRoadTrackdir(Trackdir dir)
|
||||
{
|
||||
assert(IsValidTrackdirForRoadVehicle(dir));
|
||||
return (dir & 0x06) == 0;
|
||||
}
|
||||
|
||||
@@ -651,6 +687,7 @@ static inline bool IsStraightRoadTrackdir(Trackdir dir)
|
||||
*/
|
||||
static inline bool IsUphillTrackdir(Slope slope, Trackdir dir)
|
||||
{
|
||||
assert(IsValidTrackdirForRoadVehicle(dir));
|
||||
extern const TrackdirBits _uphill_trackdirs[];
|
||||
return HasBit(_uphill_trackdirs[RemoveHalftileSlope(slope)], dir);
|
||||
}
|
||||
|
Reference in New Issue
Block a user