]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/lib/misc.qh
etof: avoid tempstring
[xonotic/xonotic-data.pk3dir.git] / qcsrc / lib / misc.qh
1 #ifndef MISC_H
2 #define MISC_H
3
4 #ifdef GMQCC
5         #define EVAL(...) __VA_ARGS__
6
7         #define OVERLOAD_(F, ...) F##_##__VA_COUNT__(__VA_ARGS__)
8         #define OVERLOAD(F, ...) F##_##__VA_COUNT__(__VA_ARGS__)
9 #else
10         #define EMPTY()
11         #define DEFER(id) id EMPTY()
12
13         #define EVAL(...) EVAL1(EVAL1(EVAL1(__VA_ARGS__)))
14         #define EVAL1(...) EVAL2(EVAL2(EVAL2(__VA_ARGS__)))
15         #define EVAL2(...) EVAL3(EVAL3(EVAL3(__VA_ARGS__)))
16         #define EVAL3(...) EVAL4(EVAL4(EVAL4(__VA_ARGS__)))
17         #define EVAL4(...) EVAL5(EVAL5(EVAL5(__VA_ARGS__)))
18         #define EVAL5(...) __VA_ARGS__
19
20         #define OVERLOAD___(F, _16, _15, _14, _13, _12, _11, _10, _9, _8, _7, _6, _5, _4, _3, _2, _1, n, ...) F##_##n
21         #define OVERLOAD__(F, ...) OVERLOAD___(F,##__VA_ARGS__, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
22         #define OVERLOAD_(...) DEFER(OVERLOAD__(__VA_ARGS__))
23         #define OVERLOAD(F, ...) OVERLOAD_(F,##__VA_ARGS__)(__VA_ARGS__)
24 #endif
25
26 #if defined(CSQC)
27         #define etof(e) num_for_edict(e)
28         #define ftoe(i) entitybyindex(i)
29 #elif defined(SVQC)
30         #define etof(e) num_for_edict(e)
31         #define ftoe(i) edict_num(i)
32 #elif defined(MENUQC)
33         // already defined
34 #endif
35
36 // avoid bounds checks
37 #undef etof
38 #if 1
39         #define etof(e) ITOF(reinterpret_cast(int, e))
40 #else
41         #define etof(e) stof(sprintf("%i", e))
42 #endif
43
44 #define GET(name) name##get
45 #define GETTER(type, name) type GET(name)() { return name; }
46 #define PROPERTY(type, name) type name; GETTER(type, name)
47 #define LAMBDA(...) { __VA_ARGS__; }
48
49 // With block may not contain continue or break
50 #define WITH(type, name, value, block) \
51         MACRO_BEGIN \
52         { \
53                 type __with_save = (name); \
54                 name = (value); \
55                 LAMBDA(block) \
56                 name = __with_save; \
57         } MACRO_END
58
59 #endif