4 static struct VecRec* newvecrec(struct VecRec* old)
6 int i, oldsz = old ? old->size : 0, newsz = 1 + ((oldsz*3)>>1);
7 struct VecRec* vr = naAlloc(sizeof(struct VecRec) + sizeof(naRef) * newsz);
8 if(oldsz > newsz) oldsz = newsz; // race protection
11 for(i=0; i<oldsz; i++)
12 vr->array[i] = old->array[i];
16 static void resize(struct naVec* v)
18 struct VecRec* vr = newvecrec(v->rec);
19 naGC_swapfree((void*)&(v->rec), vr);
22 void naVec_gcclean(struct naVec* v)
28 naRef naVec_get(naRef v, int i)
31 struct VecRec* r = PTR(v).vec->rec;
33 if(i < 0) i += r->size;
34 if(i >= 0 && i < r->size) return r->array[i];
40 void naVec_set(naRef vec, int i, naRef o)
43 struct VecRec* r = PTR(vec).vec->rec;
44 if(r && i >= r->size) return;
49 int naVec_size(naRef v)
52 struct VecRec* r = PTR(v).vec->rec;
53 return r ? r->size : 0;
58 int naVec_append(naRef vec, naRef o)
61 struct VecRec* r = PTR(vec).vec->rec;
62 while(!r || r->size >= r->alloced) {
64 r = PTR(vec).vec->rec;
66 r->array[r->size] = o;
72 void naVec_setsize(naContext c, naRef vec, int sz)
75 naRuntimeError(c, "size cannot be negative");
79 struct VecRec* v = PTR(vec).vec->rec;
80 struct VecRec* nv = naAlloc(sizeof(struct VecRec) + sizeof(naRef) * sz);
84 nv->array[i] = (v && i < v->size) ? v->array[i] : naNil();
85 naGC_swapfree((void*)&(PTR(vec).vec->rec), nv);
89 naRef naVec_removelast(naRef vec)
93 struct VecRec* v = PTR(vec).vec->rec;
94 if(!v || v->size == 0) return naNil();
95 o = v->array[v->size - 1];
97 if(v->size < (v->alloced >> 1))