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 realloc(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 = v.ref.ptr.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 = vec.ref.ptr.vec->rec;
44 if(r && i >= r->size) return;
49 int naVec_size(naRef v)
52 struct VecRec* r = v.ref.ptr.vec->rec;
53 return r ? r->size : 0;
58 int naVec_append(naRef vec, naRef o)
61 struct VecRec* r = vec.ref.ptr.vec->rec;
62 while(!r || r->size >= r->alloced) {
63 realloc(vec.ref.ptr.vec);
64 r = vec.ref.ptr.vec->rec;
66 r->array[r->size] = o;
72 void naVec_setsize(naRef vec, int sz)
75 struct VecRec* v = vec.ref.ptr.vec->rec;
76 struct VecRec* nv = naAlloc(sizeof(struct VecRec) + sizeof(naRef) * sz);
80 nv->array[i] = (v && i < v->size) ? v->array[i] : naNil();
82 vec.ref.ptr.vec->rec = nv;
85 naRef naVec_removelast(naRef vec)
89 struct VecRec* v = vec.ref.ptr.vec->rec;
90 if(!v || v->size == 0) return naNil();
91 o = v->array[v->size - 1];
93 if(v->size < (v->alloced >> 1))
94 realloc(vec.ref.ptr.vec);