1 /* $Id$ */ |
1 /* $Id$ */ |
2 |
2 |
3 #ifndef TRACK_DIR_HPP |
3 #ifndef TRACK_DIR_HPP |
4 #define TRACK_DIR_HPP |
4 #define TRACK_DIR_HPP |
5 |
5 |
6 EXTERN_C_BEGIN |
|
7 #include "../tile.h" |
6 #include "../tile.h" |
8 #include "../openttd.h" |
7 #include "../openttd.h" |
9 #include "../map.h" |
8 #include "../map.h" |
10 #include "../rail.h" |
9 #include "../rail.h" |
11 EXTERN_C_END |
|
12 |
|
13 /** Helpers to allow to work with enum as with type safe bit set in C++ */ |
|
14 #define DECLARE_ENUM_AS_BIT_MASK(mask_t) \ |
|
15 FORCEINLINE mask_t operator | (mask_t m1, mask_t m2) {return (mask_t)((int)m1 | m2);} \ |
|
16 FORCEINLINE mask_t operator & (mask_t m1, mask_t m2) {return (mask_t)((int)m1 & m2);} \ |
|
17 FORCEINLINE mask_t operator ^ (mask_t m1, mask_t m2) {return (mask_t)((int)m1 ^ m2);} \ |
|
18 FORCEINLINE mask_t& operator |= (mask_t& m1, mask_t m2) {m1 = m1 | m2; return m1;} \ |
|
19 FORCEINLINE mask_t& operator &= (mask_t& m1, mask_t m2) {m1 = m1 & m2; return m1;} \ |
|
20 FORCEINLINE mask_t& operator ^= (mask_t& m1, mask_t m2) {m1 = m1 ^ m2; return m1;} \ |
|
21 FORCEINLINE mask_t operator ~(mask_t m) {return (mask_t)(~(int)m);} |
|
22 |
|
23 /** probably redundant enum combining operators (as we have conversion functions) */ |
|
24 #define DECLARE_ENUM_AS_BIT_INDEX(idx_t, mask_t) \ |
|
25 FORCEINLINE mask_t operator << (int m, idx_t i) {return (mask_t)(m << (int)i);} \ |
|
26 FORCEINLINE mask_t operator << (mask_t m, int i) {return (mask_t)(((int)m) << i);} \ |
|
27 FORCEINLINE mask_t operator >> (mask_t m, int i) {return (mask_t)(((int)m) >> i);} |
|
28 |
|
29 DECLARE_ENUM_AS_BIT_MASK(TrackBits) |
|
30 DECLARE_ENUM_AS_BIT_INDEX(Track, TrackBits) |
|
31 |
|
32 DECLARE_ENUM_AS_BIT_MASK(TrackdirBits) |
|
33 DECLARE_ENUM_AS_BIT_INDEX(Trackdir, TrackdirBits) |
|
34 |
10 |
35 #endif /* TRACK_DIR_HPP */ |
11 #endif /* TRACK_DIR_HPP */ |