(svn r8732) -Codechange/Fix(r8705): Turned the bit-handling macros into template functions. Fixes a problem with MSVC and 64-bit shifts.

This commit is contained in:
celestar 2007-02-14 11:53:39 +00:00
parent 447b16930e
commit 59a814c6d3
3 changed files with 27 additions and 8 deletions

View File

@ -372,9 +372,9 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
extern uint GetRailFoundation(Slope tileh, TrackBits bits); // XXX function declaration in .c extern uint GetRailFoundation(Slope tileh, TrackBits bits); // XXX function declaration in .c
extern uint GetRoadFoundation(Slope tileh, RoadBits bits); // XXX function declaration in .c extern uint GetRoadFoundation(Slope tileh, RoadBits bits); // XXX function declaration in .c
extern uint GetBridgeFoundation(Slope tileh, Axis); // XXX function declaration in .c extern uint GetBridgeFoundation(Slope tileh, Axis); // XXX function declaration in .c
enum { typedef enum BridgeFoundations{
BRIDGE_NO_FOUNDATION = 1 << 0 | 1 << 3 | 1 << 6 | 1 << 9 | 1 << 12, BRIDGE_NO_FOUNDATION = 1 << 0 | 1 << 3 | 1 << 6 | 1 << 9 | 1 << 12,
}; } BridgeFoundation;
// The most important function: it calculates the g-value // The most important function: it calculates the g-value
static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current, OpenListNode *parent) static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current, OpenListNode *parent)

View File

@ -62,11 +62,30 @@ static inline int64 BIGMULS(int32 a, int32 b) {
//#define IS_INSIDE_1D(x, base, size) ((x) >= (base) && (x) < (base) + (size)) //#define IS_INSIDE_1D(x, base, size) ((x) >= (base) && (x) < (base) + (size))
#define IS_INSIDE_1D(x, base, size) ( (uint)((x) - (base)) < ((uint)(size)) ) #define IS_INSIDE_1D(x, base, size) ( (uint)((x) - (base)) < ((uint)(size)) )
template <typename T>
static inline bool HASBIT(T x, int y)
{
return (x & (((T)1) << y)) != 0;
}
template <typename T>
static inline T SETBIT(T& x, int y)
{
return x |= (((T)1) << y);
}
template <typename T>
static inline T CLRBIT(T& x, int y)
{
return x &= ~(((T)1) << y);
}
template <typename T>
static inline T TOGGLEBIT(T& x, int y)
{
return x ^= (((T)1) << y);
}
#define HASBIT(x,y) (((x) & (1 << (y))) != 0)
#define SETBIT(x,y) ((x) |= (1 << (y)))
#define CLRBIT(x,y) ((x) &= ~(1 << (y)))
#define TOGGLEBIT(x,y) ((x) ^= (1 << (y)))
// checking more bits. Maybe unneccessary, but easy to use // checking more bits. Maybe unneccessary, but easy to use
#define HASBITS(x,y) ((x) & (y)) #define HASBITS(x,y) ((x) & (y))

View File

@ -77,7 +77,7 @@ int CalcBridgeLenCostFactor(int x)
} }
#define M(x) (1 << (x)) #define M(x) (1 << (x))
enum { typedef enum BridgeFoundations{
// foundation, whole tile is leveled up --> 3 corners raised // foundation, whole tile is leveled up --> 3 corners raised
BRIDGE_FULL_LEVELED_FOUNDATION = M(SLOPE_WSE) | M(SLOPE_NWS) | M(SLOPE_ENW) | M(SLOPE_SEN), BRIDGE_FULL_LEVELED_FOUNDATION = M(SLOPE_WSE) | M(SLOPE_NWS) | M(SLOPE_ENW) | M(SLOPE_SEN),
// foundation, tile is partly leveled up --> 1 corner raised // foundation, tile is partly leveled up --> 1 corner raised
@ -85,7 +85,7 @@ enum {
// no foundations (X,Y direction) // no foundations (X,Y direction)
BRIDGE_NO_FOUNDATION = M(SLOPE_FLAT) | M(SLOPE_SW) | M(SLOPE_SE) | M(SLOPE_NW) | M(SLOPE_NE), BRIDGE_NO_FOUNDATION = M(SLOPE_FLAT) | M(SLOPE_SW) | M(SLOPE_SE) | M(SLOPE_NW) | M(SLOPE_NE),
BRIDGE_HORZ_RAMP = (BRIDGE_PARTLY_LEVELED_FOUNDATION | BRIDGE_NO_FOUNDATION) & ~M(SLOPE_FLAT) BRIDGE_HORZ_RAMP = (BRIDGE_PARTLY_LEVELED_FOUNDATION | BRIDGE_NO_FOUNDATION) & ~M(SLOPE_FLAT)
}; } BridgeFoundataion;
#undef M #undef M
static inline const PalSpriteID *GetBridgeSpriteTable(int index, byte table) static inline const PalSpriteID *GetBridgeSpriteTable(int index, byte table)