… | |
… | |
21 | */ |
21 | */ |
22 | |
22 | |
23 | #ifndef UTIL_H__ |
23 | #ifndef UTIL_H__ |
24 | #define UTIL_H__ |
24 | #define UTIL_H__ |
25 | |
25 | |
|
|
26 | #include <compiler.h> |
|
|
27 | |
26 | #define DEBUG_POISON 0x00 // poison memory before freeing it if != 0 |
28 | #define DEBUG_POISON 0x00 // poison memory before freeing it if != 0 |
27 | #define DEBUG_SALLOC 0 // add a debug wrapper around all sallocs |
29 | #define DEBUG_SALLOC 0 // add a debug wrapper around all sallocs |
28 | #define PREFER_MALLOC 0 // use malloc and not the slice allocator |
30 | #define PREFER_MALLOC 0 // use malloc and not the slice allocator |
29 | |
|
|
30 | #if __GNUC__ >= 3 |
|
|
31 | # define is_constant(c) __builtin_constant_p (c) |
|
|
32 | # define expect(expr,value) __builtin_expect ((expr),(value)) |
|
|
33 | # define prefetch(addr,rw,locality) __builtin_prefetch (addr, rw, locality) |
|
|
34 | # define noinline __attribute__((__noinline__)) |
|
|
35 | #else |
|
|
36 | # define is_constant(c) 0 |
|
|
37 | # define expect(expr,value) (expr) |
|
|
38 | # define prefetch(addr,rw,locality) |
|
|
39 | # define noinline |
|
|
40 | #endif |
|
|
41 | |
|
|
42 | #if __GNUC__ < 4 || (__GNUC__ == 4 || __GNUC_MINOR__ < 4) |
|
|
43 | # define decltype(x) typeof(x) |
|
|
44 | #endif |
|
|
45 | |
|
|
46 | // put into ifs if you are very sure that the expression |
|
|
47 | // is mostly true or mosty false. note that these return |
|
|
48 | // booleans, not the expression. |
|
|
49 | #define expect_false(expr) expect ((expr) ? 1 : 0, 0) |
|
|
50 | #define expect_true(expr) expect ((expr) ? 1 : 0, 1) |
|
|
51 | |
31 | |
52 | #include <pthread.h> |
32 | #include <pthread.h> |
53 | |
33 | |
54 | #include <cstddef> |
34 | #include <cstddef> |
55 | #include <cmath> |
35 | #include <cmath> |
… | |
… | |
212 | // on modern cpus |
192 | // on modern cpus |
213 | inline int |
193 | inline int |
214 | isqrt (int n) |
194 | isqrt (int n) |
215 | { |
195 | { |
216 | return (int)sqrtf ((float)n); |
196 | return (int)sqrtf ((float)n); |
|
|
197 | } |
|
|
198 | |
|
|
199 | // this is kind of like the ^^ operator, if it would exist, without sequence point. |
|
|
200 | // more handy than it looks like, due to the implicit !! done on its arguments |
|
|
201 | inline bool |
|
|
202 | logical_xor (bool a, bool b) |
|
|
203 | { |
|
|
204 | return a != b; |
|
|
205 | } |
|
|
206 | |
|
|
207 | inline bool |
|
|
208 | logical_implies (bool a, bool b) |
|
|
209 | { |
|
|
210 | return a <= b; |
217 | } |
211 | } |
218 | |
212 | |
219 | // this is only twice as fast as naive sqrtf (dx*dy+dy*dy) |
213 | // this is only twice as fast as naive sqrtf (dx*dy+dy*dy) |
220 | #if 0 |
214 | #if 0 |
221 | // and has a max. error of 6 in the range -100..+100. |
215 | // and has a max. error of 6 in the range -100..+100. |
… | |
… | |
708 | |
702 | |
709 | int similar_direction (int a, int b); |
703 | int similar_direction (int a, int b); |
710 | |
704 | |
711 | // like v?sprintf, but returns a "static" buffer |
705 | // like v?sprintf, but returns a "static" buffer |
712 | char *vformat (const char *format, va_list ap); |
706 | char *vformat (const char *format, va_list ap); |
713 | char *format (const char *format, ...); |
707 | char *format (const char *format, ...) attribute ((format (printf, 1, 2))); |
714 | |
708 | |
715 | // safety-check player input which will become object->msg |
709 | // safety-check player input which will become object->msg |
716 | bool msg_is_safe (const char *msg); |
710 | bool msg_is_safe (const char *msg); |
717 | |
711 | |
718 | ///////////////////////////////////////////////////////////////////////////// |
712 | ///////////////////////////////////////////////////////////////////////////// |