]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/lib/enumclass.qh
Merge branch 'master' into matthiaskrgr/domicons
[xonotic/xonotic-data.pk3dir.git] / qcsrc / lib / enumclass.qh
diff --git a/qcsrc/lib/enumclass.qh b/qcsrc/lib/enumclass.qh
new file mode 100644 (file)
index 0000000..532db1d
--- /dev/null
@@ -0,0 +1,28 @@
+#pragma once
+
+#include "oo.qh"
+
+// purpose: prevent transposed parameter passing
+
+#if NDEBUG
+
+// zero overhead mode, use this for releases
+
+#define ENUMCLASS(id) USING(id, int); enum { CASE(id, Null)
+#define CASE(class, id) class##_##id,
+#define ENUMCLASS_END(id) };
+#define ORDINAL(it) (it)
+#define ENUMCAST(T, it) (it)
+
+#else
+
+// edict overhead mode, use this for type checking
+
+.int enum_ordinal;
+#define ENUMCLASS(id) CLASS(id, Object) int id##_count; const noref entity id##_Null = nil; CASE(id, Null__)
+#define CASE(class, id) class class##_##id; STATIC_INIT(class##_##id) { entity e = class##_##id = NEW(class); e.enum_ordinal = class##_count++; }
+#define ENUMCLASS_END(id) ENDCLASS(id)
+#define ORDINAL(it) ((it).enum_ordinal)
+#define ENUMCAST(T, it) ftoe(etof(T##_Null__) + (it))
+
+#endif