]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/oo/interface.qc
Tidy up OO helpers
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / oo / interface.qc
1 #ifndef INTERFACE
2 #define INTERFACE
3 #endif
4
5 #ifdef IMPLEMENTATION
6 #undef IMPLEMENTATION
7 #endif
8
9 #ifdef CLASS
10 #undef CLASS
11 #undef METHOD
12 #undef ATTRIB
13 #undef ATTRIBARRAY
14 #undef ENDCLASS
15 #undef SUPER
16 #endif
17
18 #define CLASS(cname, base)                                          \
19 [[accumulate]] entity spawn##cname(entity this, entity basevtbl) {  \
20     this = NEW(base); basevtbl = base##_vtbl;                       \
21 }
22
23 #define METHOD(cname, name, prototype)                              \
24 prototype cname##_##name;                                           \
25 .prototype name;                                                    \
26 [[accumulate]] entity spawn##cname(entity this, entity basevtbl) {  \
27     this.name = cname##_##name;                                     \
28 }
29
30 #define ATTRIB(cname, name, type, val)                              \
31 .type name;                                                         \
32 [[accumulate]] entity spawn##cname(entity this, entity basevtbl) {  \
33     this.name = val;                                                \
34 }
35
36 #define ATTRIBARRAY(cname, name, type, cnt)                         \
37 .type name[cnt];
38
39 #define ENDCLASS(cname)                                             \
40 .bool instanceOf##cname;                                            \
41 entity cname##_vtbl;                                                \
42 [[accumulate]] entity spawn##cname(entity this, entity basevtbl) {  \
43     this.instanceOf##cname = true;                                  \
44     this.classname = #cname;                                        \
45     if (!cname##_vtbl) cname##_vtbl = spawnVtbl(this, basevtbl);    \
46     return this;                                                    \
47 }
48
49 #define SUPER(cname)
50
51 #include "../classes.inc"