src/macros.h
author KUDr
Fri, 12 Jan 2007 15:43:00 +0000
changeset 5620 eab6f02899a0
parent 5605 f9ea8ede273f
child 5668 36b39f4a9032
permissions -rw-r--r--
(svn r8079) -Fix [YAPF]: float division by zero when calculating stats (YAPF cache hit ratio). Caused BSOD on Win9x. (thanks 3iff for report, Darkvater for help)
2186
db48cf29b983 (svn r2701) Insert Id tags into all source files
tron
parents: 2159
diff changeset
     1
/* $Id$ */
db48cf29b983 (svn r2701) Insert Id tags into all source files
tron
parents: 2159
diff changeset
     2
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     3
#ifndef MACROS_H
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     4
#define MACROS_H
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     5
926
a6d140a6a4de (svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents: 900
diff changeset
     6
#include "map.h"
a6d140a6a4de (svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents: 900
diff changeset
     7
2663
e5a3df7f225a (svn r3205) Some more uses for GB/SB
tron
parents: 2493
diff changeset
     8
/// Fetch n bits starting at bit s from x
e5a3df7f225a (svn r3205) Some more uses for GB/SB
tron
parents: 2493
diff changeset
     9
#define GB(x, s, n) (((x) >> (s)) & ((1U << (n)) - 1))
e5a3df7f225a (svn r3205) Some more uses for GB/SB
tron
parents: 2493
diff changeset
    10
/// Set n bits starting at bit s in x to d
e5a3df7f225a (svn r3205) Some more uses for GB/SB
tron
parents: 2493
diff changeset
    11
#define SB(x, s, n, d) ((x) = ((x) & ~(((1U << (n)) - 1) << (s))) | ((d) << (s)))
e5a3df7f225a (svn r3205) Some more uses for GB/SB
tron
parents: 2493
diff changeset
    12
/// Add i to the n bits starting at bit s in x
e5a3df7f225a (svn r3205) Some more uses for GB/SB
tron
parents: 2493
diff changeset
    13
#define AB(x, s, n, i) ((x) = ((x) & ~(((1U << (n)) - 1) << (s))) | (((x) + ((i) << (s))) & (((1U << (n)) - 1) << (s))))
e5a3df7f225a (svn r3205) Some more uses for GB/SB
tron
parents: 2493
diff changeset
    14
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 22
diff changeset
    15
#ifdef min
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    16
#undef min
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    17
#endif
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    18
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    19
#ifdef max
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    20
#undef max
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    21
#endif
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    22
5605
f9ea8ede273f (svn r8061) -Fix r8055: obj-c can't handle templates
bjarni
parents: 5603
diff changeset
    23
/* Objective C don't like templates */
f9ea8ede273f (svn r8061) -Fix r8055: obj-c can't handle templates
bjarni
parents: 5603
diff changeset
    24
#ifdef __cplusplus
5603
adebdc9b413c (svn r8057) -Codechange: Declare the "new" max template as static line.
celestar
parents: 5602
diff changeset
    25
template <typename T>
adebdc9b413c (svn r8057) -Codechange: Declare the "new" max template as static line.
celestar
parents: 5602
diff changeset
    26
static inline T max(T a, T b)
adebdc9b413c (svn r8057) -Codechange: Declare the "new" max template as static line.
celestar
parents: 5602
diff changeset
    27
{
adebdc9b413c (svn r8057) -Codechange: Declare the "new" max template as static line.
celestar
parents: 5602
diff changeset
    28
	return a >= b ? a : b;
adebdc9b413c (svn r8057) -Codechange: Declare the "new" max template as static line.
celestar
parents: 5602
diff changeset
    29
}
5605
f9ea8ede273f (svn r8061) -Fix r8055: obj-c can't handle templates
bjarni
parents: 5603
diff changeset
    30
#endif
5601
d58f82901b2f (svn r8055) -Codechange: Replace the different max, dmax, maxu whatever macros by a simple template function max(), that requires two arguments of the same type. While I'm at it change a variable called "max" to "maxval" in a function that calls max().
celestar
parents: 5587
diff changeset
    31
500
8e52f7797b48 (svn r793) Merge INLINE -> inline replacement (revision 376)
tron
parents: 239
diff changeset
    32
static inline int min(int a, int b) { if (a <= b) return a; return b; }
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    33
500
8e52f7797b48 (svn r793) Merge INLINE -> inline replacement (revision 376)
tron
parents: 239
diff changeset
    34
static inline uint minu(uint a, uint b) { if (a <= b) return a; return b; }
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    35
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    36
1400
09a471f04d17 (svn r1904) Remove some more unused stuff
tron
parents: 1394
diff changeset
    37
static inline int clamp(int a, int min, int max)
09a471f04d17 (svn r1904) Remove some more unused stuff
tron
parents: 1394
diff changeset
    38
{
09a471f04d17 (svn r1904) Remove some more unused stuff
tron
parents: 1394
diff changeset
    39
	if (a <= min) return min;
09a471f04d17 (svn r1904) Remove some more unused stuff
tron
parents: 1394
diff changeset
    40
	if (a >= max) return max;
09a471f04d17 (svn r1904) Remove some more unused stuff
tron
parents: 1394
diff changeset
    41
	return a;
09a471f04d17 (svn r1904) Remove some more unused stuff
tron
parents: 1394
diff changeset
    42
}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    43
3352
99e5e3634e9d (svn r4142) - Fix [FS#74]: Incorrectly loaded settings from the config file when the signed uint32 variable would be negative.
Darkvater
parents: 3326
diff changeset
    44
static inline uint clampu(uint a, uint min, uint max)
99e5e3634e9d (svn r4142) - Fix [FS#74]: Incorrectly loaded settings from the config file when the signed uint32 variable would be negative.
Darkvater
parents: 3326
diff changeset
    45
{
99e5e3634e9d (svn r4142) - Fix [FS#74]: Incorrectly loaded settings from the config file when the signed uint32 variable would be negative.
Darkvater
parents: 3326
diff changeset
    46
	if (a <= min) return min;
99e5e3634e9d (svn r4142) - Fix [FS#74]: Incorrectly loaded settings from the config file when the signed uint32 variable would be negative.
Darkvater
parents: 3326
diff changeset
    47
	if (a >= max) return max;
99e5e3634e9d (svn r4142) - Fix [FS#74]: Incorrectly loaded settings from the config file when the signed uint32 variable would be negative.
Darkvater
parents: 3326
diff changeset
    48
	return a;
99e5e3634e9d (svn r4142) - Fix [FS#74]: Incorrectly loaded settings from the config file when the signed uint32 variable would be negative.
Darkvater
parents: 3326
diff changeset
    49
}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    50
500
8e52f7797b48 (svn r793) Merge INLINE -> inline replacement (revision 376)
tron
parents: 239
diff changeset
    51
static inline int32 BIGMULSS(int32 a, int32 b, int shift) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    52
	return (int32)(((int64)(a) * (int64)(b)) >> (shift));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    53
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    54
500
8e52f7797b48 (svn r793) Merge INLINE -> inline replacement (revision 376)
tron
parents: 239
diff changeset
    55
static inline int64 BIGMULSS64(int64 a, int64 b, int shift) {
236
da0ae9d977e0 (svn r237) -Fix: [1025836] Company value problem (again). Now company value rightly shows the value, including ALL your money.
darkvater
parents: 222
diff changeset
    56
	return ((a) * (b)) >> (shift);
da0ae9d977e0 (svn r237) -Fix: [1025836] Company value problem (again). Now company value rightly shows the value, including ALL your money.
darkvater
parents: 222
diff changeset
    57
}
da0ae9d977e0 (svn r237) -Fix: [1025836] Company value problem (again). Now company value rightly shows the value, including ALL your money.
darkvater
parents: 222
diff changeset
    58
500
8e52f7797b48 (svn r793) Merge INLINE -> inline replacement (revision 376)
tron
parents: 239
diff changeset
    59
static inline uint32 BIGMULUS(uint32 a, uint32 b, int shift) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    60
	return (uint32)(((uint64)(a) * (uint64)(b)) >> (shift));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    61
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    62
500
8e52f7797b48 (svn r793) Merge INLINE -> inline replacement (revision 376)
tron
parents: 239
diff changeset
    63
static inline int64 BIGMULS(int32 a, int32 b) {
4274
af2ccbc3f643 (svn r5902) -Fix [FS#26]: BIGMULS return-type fix (Graphite)
Darkvater
parents: 3943
diff changeset
    64
	return (int64)(a) * (int64)(b);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    65
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    66
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    67
/* OPT: optimized into an unsigned comparison */
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    68
//#define IS_INSIDE_1D(x, base, size) ((x) >= (base) && (x) < (base) + (size))
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    69
#define IS_INSIDE_1D(x, base, size) ( (uint)((x) - (base)) < ((uint)(size)) )
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    70
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    71
3132
4ecd7f40fc76 (svn r3747) Change HASBIT() to return 0/1 instead of 0/value of tested bit, because the name suggests it does the former and current behavior broke in some places in very subtle ways (for example HASBIT(x, 0) != HASBIT(y, 1) doesn't work, returning a bool after HASBIT(x, 9) neither)
tron
parents: 2966
diff changeset
    72
#define HASBIT(x,y)    (((x) & (1 << (y))) != 0)
954
66c89362a778 (svn r1445) -Fix: reversing a train also reverses the UP and DOWN status for the
truelight
parents: 947
diff changeset
    73
#define SETBIT(x,y)    ((x) |=  (1 << (y)))
66c89362a778 (svn r1445) -Fix: reversing a train also reverses the UP and DOWN status for the
truelight
parents: 947
diff changeset
    74
#define CLRBIT(x,y)    ((x) &= ~(1 << (y)))
66c89362a778 (svn r1445) -Fix: reversing a train also reverses the UP and DOWN status for the
truelight
parents: 947
diff changeset
    75
#define TOGGLEBIT(x,y) ((x) ^=  (1 << (y)))
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    76
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    77
// checking more bits. Maybe unneccessary, but easy to use
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    78
#define HASBITS(x,y) ((x) & (y))
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    79
#define SETBITS(x,y) ((x) |= (y))
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    80
#define CLRBITS(x,y) ((x) &= ~(y))
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    81
3941
55fa782a443c (svn r5085) - Fix (FS#198): add parentheses to CHANCE16*() (and GENERAL_SPRITE_COLOR) macro parameters (thanks to ASM)
peter1138
parents: 3812
diff changeset
    82
#define GENERAL_SPRITE_COLOR(color) ( ((color) + PALETTE_RECOLOR_START) << PALETTE_SPRITE_START)
3326
00cf690a7fe1 (svn r4092) CodeChange : Named sprites instead of magic numbers plus create/use helper macro/enum for recoloring scheme
belugas
parents: 3132
diff changeset
    83
#define PLAYER_SPRITE_COLOR(owner) ( GENERAL_SPRITE_COLOR(_player_colors[owner]))
2187
a0e206ce9fbf (svn r2702) -Codechange: Cleaned up the sprite code and replaced many magic numbers
celestar
parents: 2186
diff changeset
    84
#define SPRITE_PALETTE(x) ((x) | PALETTE_MODIFIER_COLOR)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    85
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    86
extern const byte _ffb_64[128];
22
fe6f35cc987b (svn r23) -Some omments on the code (blathijs)
darkvater
parents: 0
diff changeset
    87
/* Returns the position of the first bit that is not zero, counted from the
fe6f35cc987b (svn r23) -Some omments on the code (blathijs)
darkvater
parents: 0
diff changeset
    88
 * left. Ie, 10110100 returns 2, 00000001 returns 0, etc. When x == 0 returns
fe6f35cc987b (svn r23) -Some omments on the code (blathijs)
darkvater
parents: 0
diff changeset
    89
 * 0.
fe6f35cc987b (svn r23) -Some omments on the code (blathijs)
darkvater
parents: 0
diff changeset
    90
 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    91
#define FIND_FIRST_BIT(x) _ffb_64[(x)]
22
fe6f35cc987b (svn r23) -Some omments on the code (blathijs)
darkvater
parents: 0
diff changeset
    92
/* Returns x with the first bit that is not zero, counted from the left, set
fe6f35cc987b (svn r23) -Some omments on the code (blathijs)
darkvater
parents: 0
diff changeset
    93
 * to zero. So, 10110100 returns 10110000, 00000001 returns 00000000, etc.
fe6f35cc987b (svn r23) -Some omments on the code (blathijs)
darkvater
parents: 0
diff changeset
    94
 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    95
#define KILL_FIRST_BIT(x) _ffb_64[(x)+64]
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    96
500
8e52f7797b48 (svn r793) Merge INLINE -> inline replacement (revision 376)
tron
parents: 239
diff changeset
    97
static inline int FindFirstBit2x64(int value)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    98
{
1247
3851739bfd09 (svn r1751) - Feature: New PathFinder (NPF).
matthijs
parents: 1202
diff changeset
    99
/*
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   100
	int i = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   101
	if ( (byte) value == 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   102
		i += 8;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   103
		value >>= 8;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   104
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   105
	return i + FIND_FIRST_BIT(value & 0x3F);
1247
3851739bfd09 (svn r1751) - Feature: New PathFinder (NPF).
matthijs
parents: 1202
diff changeset
   106
3851739bfd09 (svn r1751) - Feature: New PathFinder (NPF).
matthijs
parents: 1202
diff changeset
   107
Faster ( or at least cleaner ) implementation below?
3851739bfd09 (svn r1751) - Feature: New PathFinder (NPF).
matthijs
parents: 1202
diff changeset
   108
*/
2663
e5a3df7f225a (svn r3205) Some more uses for GB/SB
tron
parents: 2493
diff changeset
   109
	if (GB(value, 0, 8) == 0) {
e5a3df7f225a (svn r3205) Some more uses for GB/SB
tron
parents: 2493
diff changeset
   110
		return FIND_FIRST_BIT(GB(value, 8, 6)) + 8;
1247
3851739bfd09 (svn r1751) - Feature: New PathFinder (NPF).
matthijs
parents: 1202
diff changeset
   111
	} else {
2663
e5a3df7f225a (svn r3205) Some more uses for GB/SB
tron
parents: 2493
diff changeset
   112
		return FIND_FIRST_BIT(GB(value, 0, 6));
1247
3851739bfd09 (svn r1751) - Feature: New PathFinder (NPF).
matthijs
parents: 1202
diff changeset
   113
	}
3851739bfd09 (svn r1751) - Feature: New PathFinder (NPF).
matthijs
parents: 1202
diff changeset
   114
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   115
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   116
1247
3851739bfd09 (svn r1751) - Feature: New PathFinder (NPF).
matthijs
parents: 1202
diff changeset
   117
static inline int KillFirstBit2x64(int value)
3851739bfd09 (svn r1751) - Feature: New PathFinder (NPF).
matthijs
parents: 1202
diff changeset
   118
{
2663
e5a3df7f225a (svn r3205) Some more uses for GB/SB
tron
parents: 2493
diff changeset
   119
	if (GB(value, 0, 8) == 0) {
e5a3df7f225a (svn r3205) Some more uses for GB/SB
tron
parents: 2493
diff changeset
   120
		return KILL_FIRST_BIT(GB(value, 8, 6)) << 8;
1247
3851739bfd09 (svn r1751) - Feature: New PathFinder (NPF).
matthijs
parents: 1202
diff changeset
   121
	} else {
2663
e5a3df7f225a (svn r3205) Some more uses for GB/SB
tron
parents: 2493
diff changeset
   122
		return value & (KILL_FIRST_BIT(GB(value, 0, 6)) | 0x3F00);
1247
3851739bfd09 (svn r1751) - Feature: New PathFinder (NPF).
matthijs
parents: 1202
diff changeset
   123
	}
3851739bfd09 (svn r1751) - Feature: New PathFinder (NPF).
matthijs
parents: 1202
diff changeset
   124
}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   125
3812
e6fc916c17ab (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3352
diff changeset
   126
/** returns true if value a has only one bit set to 1 */
e6fc916c17ab (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3352
diff changeset
   127
#define HAS_SINGLE_BIT(a) ( ((a) & ((a) - 1)) == 0)
e6fc916c17ab (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3352
diff changeset
   128
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   129
/* [min,max), strictly less than */
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   130
#define IS_BYTE_INSIDE(a,min,max) ((byte)((a)-(min)) < (byte)((max)-(min)))
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   131
#define IS_INT_INSIDE(a,min,max) ((uint)((a)-(min)) < (uint)((max)-(min)))
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   132
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   133
3941
55fa782a443c (svn r5085) - Fix (FS#198): add parentheses to CHANCE16*() (and GENERAL_SPRITE_COLOR) macro parameters (thanks to ASM)
peter1138
parents: 3812
diff changeset
   134
#define CHANCE16(a,b) ((uint16)Random() <= (uint16)((65536 * (a)) / (b)))
3943
d3d5f7b3d3d0 (svn r5088) - Add another set of parentheses, missed in r5085, somehow... (thanks ASM)
peter1138
parents: 3941
diff changeset
   135
#define CHANCE16R(a,b,r) ((uint16)(r=Random()) <= (uint16)((65536 * (a)) / (b)))
3941
55fa782a443c (svn r5085) - Fix (FS#198): add parentheses to CHANCE16*() (and GENERAL_SPRITE_COLOR) macro parameters (thanks to ASM)
peter1138
parents: 3812
diff changeset
   136
#define CHANCE16I(a,b,v) ((uint16)(v) <= (uint16)((65536 * (a)) / (b)))
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   137
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   138
2952
58522ed8f0f1 (svn r3511) More whitespace ([FS#46] by Rubidium)
tron
parents: 2775
diff changeset
   139
#define for_each_bit(_i, _b)            \
58522ed8f0f1 (svn r3511) More whitespace ([FS#46] by Rubidium)
tron
parents: 2775
diff changeset
   140
	for (_i = 0; _b != 0; _i++, _b >>= 1) \
58522ed8f0f1 (svn r3511) More whitespace ([FS#46] by Rubidium)
tron
parents: 2775
diff changeset
   141
		if (_b & 1)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   142
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   143
#define abs myabs
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   144
500
8e52f7797b48 (svn r793) Merge INLINE -> inline replacement (revision 376)
tron
parents: 239
diff changeset
   145
static inline int intxchg_(int *a, int b) { int t = *a; *a = b; return t; }
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   146
#define intswap(a,b) ((b) = intxchg_(&(a), (b)))
1884
804ff5f94ed0 (svn r2390) - Codechange: Fix some warnings on GCC 4.0.0
hackykid
parents: 1852
diff changeset
   147
static inline int uintxchg_(uint *a, uint b) { uint t = *a; *a = b; return t; }
804ff5f94ed0 (svn r2390) - Codechange: Fix some warnings on GCC 4.0.0
hackykid
parents: 1852
diff changeset
   148
#define uintswap(a,b) ((b) = uintxchg_(&(a), (b)))
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   149
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   150
2966
661554d683cd (svn r3529) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help)
Darkvater
parents: 2952
diff changeset
   151
static inline uint16 ReadLE16Aligned(const void* x)
661554d683cd (svn r3529) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help)
Darkvater
parents: 2952
diff changeset
   152
{
661554d683cd (svn r3529) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help)
Darkvater
parents: 2952
diff changeset
   153
	return FROM_LE16(*(const uint16*)x);
661554d683cd (svn r3529) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help)
Darkvater
parents: 2952
diff changeset
   154
}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   155
2966
661554d683cd (svn r3529) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help)
Darkvater
parents: 2952
diff changeset
   156
static inline uint16 ReadLE16Unaligned(const void* x)
661554d683cd (svn r3529) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help)
Darkvater
parents: 2952
diff changeset
   157
{
661554d683cd (svn r3529) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help)
Darkvater
parents: 2952
diff changeset
   158
#ifdef OTTD_ALIGNMENT
661554d683cd (svn r3529) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help)
Darkvater
parents: 2952
diff changeset
   159
	return ((const byte*)x)[0] | ((const byte*)x)[1] << 8;
661554d683cd (svn r3529) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help)
Darkvater
parents: 2952
diff changeset
   160
#else
661554d683cd (svn r3529) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help)
Darkvater
parents: 2952
diff changeset
   161
	return FROM_LE16(*(const uint16*)x);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   162
#endif
2966
661554d683cd (svn r3529) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help)
Darkvater
parents: 2952
diff changeset
   163
}
661554d683cd (svn r3529) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help)
Darkvater
parents: 2952
diff changeset
   164
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   165
2086
5c32d85b589a (svn r2596) Add macros ROL and ROR to ROtate values Left/Right. Also shorten the parameter names for GB and SB to increase readability
tron
parents: 1981
diff changeset
   166
/**
5c32d85b589a (svn r2596) Add macros ROL and ROR to ROtate values Left/Right. Also shorten the parameter names for GB and SB to increase readability
tron
parents: 1981
diff changeset
   167
 * ROtate x Left/Right by n (must be >= 0)
5c32d85b589a (svn r2596) Add macros ROL and ROR to ROtate values Left/Right. Also shorten the parameter names for GB and SB to increase readability
tron
parents: 1981
diff changeset
   168
 * @note Assumes a byte has 8 bits
5c32d85b589a (svn r2596) Add macros ROL and ROR to ROtate values Left/Right. Also shorten the parameter names for GB and SB to increase readability
tron
parents: 1981
diff changeset
   169
 */
5c32d85b589a (svn r2596) Add macros ROL and ROR to ROtate values Left/Right. Also shorten the parameter names for GB and SB to increase readability
tron
parents: 1981
diff changeset
   170
#define ROL(x, n) ((x) << (n) | (x) >> (sizeof(x) * 8 - (n)))
5c32d85b589a (svn r2596) Add macros ROL and ROR to ROtate values Left/Right. Also shorten the parameter names for GB and SB to increase readability
tron
parents: 1981
diff changeset
   171
#define ROR(x, n) ((x) >> (n) | (x) << (sizeof(x) * 8 - (n)))
1852
a7f9f961c5e1 (svn r2358) Add macros for getting (GB) and setting (SB) a range of bits
tron
parents: 1556
diff changeset
   172
2398
912f16512ce2 (svn r2924) Introduce the ALIGN() macro which aligns values to multiples of a power of 2, for exact semantics see the commment in macros.h
tron
parents: 2238
diff changeset
   173
/**
912f16512ce2 (svn r2924) Introduce the ALIGN() macro which aligns values to multiples of a power of 2, for exact semantics see the commment in macros.h
tron
parents: 2238
diff changeset
   174
 * Return the smallest multiple of n equal or greater than x
912f16512ce2 (svn r2924) Introduce the ALIGN() macro which aligns values to multiples of a power of 2, for exact semantics see the commment in macros.h
tron
parents: 2238
diff changeset
   175
 * @note n must be a power of 2
912f16512ce2 (svn r2924) Introduce the ALIGN() macro which aligns values to multiples of a power of 2, for exact semantics see the commment in macros.h
tron
parents: 2238
diff changeset
   176
 */
912f16512ce2 (svn r2924) Introduce the ALIGN() macro which aligns values to multiples of a power of 2, for exact semantics see the commment in macros.h
tron
parents: 2238
diff changeset
   177
#define ALIGN(x, n) (((x) + (n) - 1) & ~((n) - 1))
912f16512ce2 (svn r2924) Introduce the ALIGN() macro which aligns values to multiples of a power of 2, for exact semantics see the commment in macros.h
tron
parents: 2238
diff changeset
   178
4300
c7e43c47a2b9 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4274
diff changeset
   179
/** return the largest value that can be entered in a variable.
c7e43c47a2b9 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4274
diff changeset
   180
 *  known to work for uint32.
c7e43c47a2b9 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4274
diff changeset
   181
 *  used by TGP to set the max value of the _patches.generation_seed in its definition
c7e43c47a2b9 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4274
diff changeset
   182
 */
c7e43c47a2b9 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4274
diff changeset
   183
#define MAX_UVALUE(type) ((type)~(type)0)
c7e43c47a2b9 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4274
diff changeset
   184
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   185
#endif /* MACROS_H */