diff --git a/src/track_func.h b/src/track_func.h --- a/src/track_func.h +++ b/src/track_func.h @@ -14,6 +14,7 @@ #include "core/bitmath_func.hpp" #include "track_type.h" +#include "direction_func.h" #include "slope_func.h" /** @@ -28,6 +29,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 * AXIS_Y -> TRACK_Y @@ -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 CornerToTrackBit 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 CornerToTrackBit */ static inline TrackdirBits TrackdirToTrackdirBits(Trackdir trackdir) { + assert(IsValidTrackdir(trackdir)); return (TrackdirBits)(1 << trackdir); } @@ -103,6 +141,7 @@ static inline TrackdirBits TrackdirToTra 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(Tra 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 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(Track */ 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 */ 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(T */ static inline Track TrackdirToTrack(Trackdir trackdir) { + assert(IsValidTrackdir(trackdir)); return (Track)(trackdir & 0x7); } @@ -272,6 +288,7 @@ static inline Track TrackdirToTrack(Trac */ static inline Trackdir TrackToTrackdir(Track track) { + assert(IsValidTrack(track)); return (Trackdir)track; } @@ -373,6 +390,7 @@ static inline TrackStatus CombineTrackSt */ 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(Trac */ 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 TrackCrossesTrac */ 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 TrackdirToEx */ 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 TrackExitdirToTra */ 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 TrackEnterdirToTr */ 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 TrackDirectionToT */ static inline Track DiagDirToDiagTrack(DiagDirection diagdir) { + assert(IsValidDiagDirection(diagdir)); return (Track)(diagdir & 1); } @@ -484,6 +511,7 @@ static inline Track DiagDirToDiagTrack(D */ static inline TrackBits DiagDirToDiagTrackBits(DiagDirection diagdir) { + assert(IsValidDiagDirection(diagdir)); return TrackToTrackBits(DiagDirToDiagTrack(diagdir)); } @@ -496,6 +524,7 @@ static inline TrackBits DiagDirToDiagTra */ 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 DiagDirToDiagTrac */ 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 DiagdirReachesTr */ 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 TrackdirReach */ 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 TrackdirCross */ 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 */ static inline bool IsDiagonalTrackdir(Trackdir trackdir) { + assert(IsValidTrackdir(trackdir)); return IsDiagonalTrack(TrackdirToTrack(trackdir)); } @@ -626,6 +660,7 @@ static inline bool TrackOverlapsTracks(T */ static inline bool IsReversingRoadTrackdir(Trackdir dir) { + assert(IsValidTrackdirForRoadVehicle(dir)); return (dir & 0x07) >= 6; } @@ -636,6 +671,7 @@ static inline bool IsReversingRoadTrackd */ static inline bool IsStraightRoadTrackdir(Trackdir dir) { + assert(IsValidTrackdirForRoadVehicle(dir)); return (dir & 0x06) == 0; } @@ -651,6 +687,7 @@ static inline bool IsStraightRoadTrackdi */ static inline bool IsUphillTrackdir(Slope slope, Trackdir dir) { + assert(IsValidTrackdirForRoadVehicle(dir)); extern const TrackdirBits _uphill_trackdirs[]; return HasBit(_uphill_trackdirs[RemoveHalftileSlope(slope)], dir); }