4 static void realloc(struct naVec* v)
6 struct VecRec* old = v->rec;
7 int i, oldsz = old ? old->size : 0, newsz = 1 + ((oldsz*3)>>1);
8 struct VecRec* vr = naAlloc(sizeof(struct VecRec) + sizeof(naRef) * newsz);
9 if(oldsz > newsz) oldsz = newsz; // race protection
12 for(i=0; i<oldsz; i++)
13 vr->array[i] = old->array[i];
14 naGC_swapfree((void**)&(v->rec), vr);
17 void naVec_gcclean(struct naVec* v)
23 naRef naVec_get(naRef v, int i)
26 struct VecRec* r = v.ref.ptr.vec->rec;
27 if(r && i < r->size) return r->array[i];
32 void naVec_set(naRef vec, int i, naRef o)
35 struct VecRec* r = vec.ref.ptr.vec->rec;
36 if(r && i >= r->size) return;
41 int naVec_size(naRef v)
44 struct VecRec* r = v.ref.ptr.vec->rec;
45 return r ? r->size : 0;
50 int naVec_append(naRef vec, naRef o)
53 struct VecRec* r = vec.ref.ptr.vec->rec;
54 if(!r || r->size >= r->alloced) {
55 realloc(vec.ref.ptr.vec);
56 r = vec.ref.ptr.vec->rec;
58 r->array[r->size] = o;
64 void naVec_setsize(naRef vec, int sz)
67 struct VecRec* v = vec.ref.ptr.vec->rec;
68 struct VecRec* nv = naAlloc(sizeof(struct VecRec) + sizeof(naRef) * sz);
72 nv->array[i] = (v && i < v->size) ? v->array[i] : naNil();
74 vec.ref.ptr.vec->rec = nv;
77 naRef naVec_removelast(naRef vec)
81 struct VecRec* v = vec.ref.ptr.vec->rec;
82 if(!v || v->size == 0) return naNil();
83 o = v->array[v->size - 1];
85 if(v->size < (v->alloced >> 1))
86 realloc(vec.ref.ptr.vec);