]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
ArrayList: pass by reference
authorTimePath <andrew.hardaker1995@gmail.com>
Sat, 5 Dec 2015 10:23:13 +0000 (21:23 +1100)
committerTimePath <andrew.hardaker1995@gmail.com>
Sat, 5 Dec 2015 10:23:13 +0000 (21:23 +1100)
qcsrc/common/ent_cs.qh
qcsrc/lib/arraylist.qh
qcsrc/lib/i18n.qh
qcsrc/lib/registry.qh

index 363103b379240df971717a17b8cc5daa8f191e78..8122ccdc0ee543ad913594b6384c697efe665971 100644 (file)
@@ -41,14 +41,14 @@ REGISTER_NET_TEMP(CLIENT_ENTCS)
 
 #ifdef CSQC
 
-       AL_declare(_entcs);
+       ArrayList _entcs;
        STATIC_INIT(_entcs)
        {
-               AL_init(_entcs, 255, NULL, e);  // 255 is the engine limit on maxclients
+               AL_NEW(_entcs, 255, NULL, e);  // 255 is the engine limit on maxclients
        }
        SHUTDOWN(_entcs)
        {
-               AL_delete(_entcs);
+               AL_DELETE(_entcs);
        }
        #define entcs_receiver(...) EVAL(OVERLOAD(entcs_receiver, __VA_ARGS__))
        #define entcs_receiver_1(i) AL_gete(_entcs, i)
index c2aae2b7b5476f529eaa977840852bdb5fa55045..b071805ef4136e0b06d2c4b4452f139c0e9e8968 100644 (file)
@@ -1,26 +1,36 @@
 #ifndef ARRAYLIST_H
 #define ARRAYLIST_H
 
-typedef int ArrayList;
+typedef entity ArrayList;
+.int al_buf;
+.int al_len;
 
-#define AL_declare(this) ArrayList this; int this##_len = (0)
-#define AL_init(this, n, default, T) \
+#define AL_NEW(this, n, default, T) \
        do \
        { \
-               this = buf_create(); \
-               this##_len = n; \
-               for (int i = 0; i < this##_len; ++i) \
+               ArrayList _al = this = new(ArrayList); \
+               make_pure(_al); \
+               _al.al_buf = buf_create(); \
+               for (int i = 0, _n = _al.al_len = n; i < _n; ++i) \
                { \
                        const _AL_type__##T() it = default; \
                        AL_set##T(this, i, it); \
                } \
        } \
        while (0)
-#define AL_delete(this) buf_del(this)
+
+#define AL_DELETE(this) \
+       do \
+       { \
+               buf_del(this.al_buf); \
+               remove(this); \
+               this = NULL; \
+       } \
+       while (0)
 
 #define _AL_type__s() string
-#define AL_gets(this, idx) bufstr_get(this, idx)
-#define AL_sets(this, idx, val) bufstr_set(this, idx, val)
+#define AL_gets(this, idx) bufstr_get(this.al_buf, idx)
+#define AL_sets(this, idx, val) bufstr_set(this.al_buf, idx, val)
 
 #define _AL_type__f() float
 #define AL_getf(this, idx) stof(AL_gets(this, idx))
@@ -34,7 +44,7 @@ typedef int ArrayList;
        do \
        { \
                const noref ArrayList _al = this; \
-               for (int i = 0, n = this##_len; i < n; ++i) \
+               for (int i = 0, n = _al.al_len; i < n; ++i) \
                { \
                        const noref _AL_type__##T() it = AL_get##T(_al, i); \
                        if (cond) { body } \
index 137e78204ac60416629468180861c51ea72e1ba2..afb38ff95686509917343c9af5af6b43efb8faca 100644 (file)
@@ -26,14 +26,14 @@ string language_filename(string s)
 #endif
 
 #if CTX_CACHE
-       AL_declare(CTX_cache);
+       ArrayList CTX_cache;
        STATIC_INIT(CTX_cache)
        {
-               AL_init(CTX_cache, 0, string_null, s);
+               AL_NEW(CTX_cache, 0, string_null, s);
        }
        SHUTDOWN(CTX_cache)
        {
-               AL_delete(CTX_cache);
+               AL_DELETE(CTX_cache);
        }
 #endif
 
index 3fc5e48983e673668a22db755cd0d8bb2a1bbd1a..a2284b19448a10428963439464da0b91940a5b73 100644 (file)
@@ -4,10 +4,10 @@
 #include "oo.qh"
 
 #if 1
-       #define _R_MAP(r, max) AL_declare(r); STATIC_INIT(r) { AL_init(r, max, NULL, e); }
+       #define _R_MAP(r, max) ArrayList r; STATIC_INIT(r) { AL_NEW(r, max, NULL, e); }
        #define _R_GET(r, i) AL_gete(r, i)
        #define _R_SET(r, i, e) AL_sete(r, i, e)
-       #define _R_DEL(r) AL_delete(r)
+       #define _R_DEL(r) AL_DELETE(r)
 #else
        #define _R_MAP(r, max) entity r[max]
        #define _R_GET(r, i) r[i]