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 //------------------------------------------------------------------------------
73 void naVec_setsize(naContext c, naRef vec, int sz)
76 naRuntimeError(c, "size cannot be negative");
80 struct VecRec* v = PTR(vec).vec->rec;
81 struct VecRec* nv = naAlloc(sizeof(struct VecRec) + sizeof(naRef) * sz);
85 nv->array[i] = (v && i < v->size) ? v->array[i] : naNil();
86 naGC_swapfree((void*)&(PTR(vec).vec->rec), nv);
90 //------------------------------------------------------------------------------
91 naRef naVec_removefirst(naRef vec)
96 struct VecRec* v = PTR(vec).vec->rec;
97 if(!v || v->size == 0) return naNil();
99 for (i=1; i<v->size; i++)
100 v->array[i-1] = v->array[i];
102 if(v->size < (v->alloced >> 1))
103 resize(PTR(vec).vec);
109 //------------------------------------------------------------------------------
110 naRef naVec_removelast(naRef vec)
114 struct VecRec* v = PTR(vec).vec->rec;
115 if(!v || v->size == 0) return naNil();
116 o = v->array[v->size - 1];
118 if(v->size < (v->alloced >> 1))
119 resize(PTR(vec).vec);