-#ifndef MISC_H
-#define MISC_H
-
-#ifdef GMQCC
- #define EVAL(...) __VA_ARGS__
-
- #define OVERLOAD_(F, ...) F##_##__VA_COUNT__(__VA_ARGS__)
- #define OVERLOAD(F, ...) F##_##__VA_COUNT__(__VA_ARGS__)
+#pragma once
+
+#ifdef __STDC__
+ #define EVAL(...) EVAL1(EVAL1(EVAL1(__VA_ARGS__)))
+ #define EVAL1(...) EVAL2(EVAL2(EVAL2(__VA_ARGS__)))
+ #define EVAL2(...) EVAL3(EVAL3(EVAL3(__VA_ARGS__)))
+ #define EVAL3(...) EVAL4(EVAL4(EVAL4(__VA_ARGS__)))
+ #define EVAL4(...) EVAL5(EVAL5(EVAL5(__VA_ARGS__)))
+ #define EVAL5(...) __VA_ARGS__
+
+ #include "p99.qh"
+ #define OVERLOAD(F, ...) P99_IF_EMPTY(__VA_ARGS__)(P99_PASTE2(F, _00)())(P99_PASTE3(F, _, P00_NARG(__VA_ARGS__))(__VA_ARGS__))
+ #define OVERLOAD_(F, ...) P99_IF_EMPTY(__VA_ARGS__)(P99_PASTE2(F, _00)())(P99_PASTE3(F, _, P00_NARG(__VA_ARGS__))(__VA_ARGS__))
#else
- #define EMPTY()
- #define DEFER(id) id EMPTY()
+ #define EVAL(...) __VA_ARGS__
- #define EVAL(...) EVAL1(EVAL1(EVAL1(__VA_ARGS__)))
- #define EVAL1(...) EVAL2(EVAL2(EVAL2(__VA_ARGS__)))
- #define EVAL2(...) EVAL3(EVAL3(EVAL3(__VA_ARGS__)))
- #define EVAL3(...) EVAL4(EVAL4(EVAL4(__VA_ARGS__)))
- #define EVAL4(...) EVAL5(EVAL5(EVAL5(__VA_ARGS__)))
- #define EVAL5(...) __VA_ARGS__
+ #define OVERLOAD_(F, ...) F##_##__VA_COUNT__(__VA_ARGS__)
+ #define OVERLOAD(F, ...) F##_##__VA_COUNT__(__VA_ARGS__)
+#endif
- #define OVERLOAD___(F,_16,_15,_14,_13,_12,_11,_10,_9,_8,_7,_6,_5,_4,_3,_2,_1,n,...) F##_##n
- #define OVERLOAD__(F, ...) OVERLOAD___(F,##__VA_ARGS__,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)
- #define OVERLOAD_(...) DEFER(OVERLOAD__(__VA_ARGS__))
- #define OVERLOAD(F, ...) OVERLOAD_(F,##__VA_ARGS__)(__VA_ARGS__)
+#if defined(CSQC)
+ #define etof(e) num_for_edict(e)
+ #define ftoe(i) entitybyindex(i)
+#elif defined(SVQC)
+ #define etof(e) num_for_edict(e)
+ #define ftoe(i) edict_num(i)
+#elif defined(MENUQC)
+ // already defined
#endif
#define GET(name) name##get
#define GETTER(type, name) type GET(name)() { return name; }
-
-#define LAMBDA(...) { __VA_ARGS__ ; }
-
-// Can't wrap with do-while as block may contain continue or break
-#define WITH(type, name, value, block) { \
- type __with_save = (name); \
- name = (value); \
- LAMBDA(block) \
- name = __with_save; \
-} do { } while (0)
-
-#endif
+#define PROPERTY(type, name) type name; GETTER(type, name)
+#define LAMBDA(...) { __VA_ARGS__; }
+
+// With block may not contain continue or break
+#define WITH(type, name, value, block) \
+ MACRO_BEGIN \
+ { \
+ type __with_save = (name); \
+ name = (value); \
+ LAMBDA(block) \
+ name = __with_save; \
+ } MACRO_END