]> git.mxchange.org Git - simgear.git/blob - simgear/nasal/vector.c
Melchior FRANZ:
[simgear.git] / simgear / nasal / vector.c
1 #include "nasal.h"
2 #include "data.h"
3
4 static void realloc(struct naVec* v)
5 {
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
10     vr->alloced = newsz;
11     vr->size = oldsz;
12     for(i=0; i<oldsz; i++)
13         vr->array[i] = old->array[i];
14     naGC_swapfree((void**)&(v->rec), vr);
15 }
16
17 void naVec_gcclean(struct naVec* v)
18 {
19     naFree(v->rec);
20     v->rec = 0;
21 }
22
23 naRef naVec_get(naRef v, int i)
24 {
25     if(IS_VEC(v)) {
26         struct VecRec* r = v.ref.ptr.vec->rec;
27         if(r && i < r->size) return r->array[i];
28     }
29     return naNil();
30 }
31
32 void naVec_set(naRef vec, int i, naRef o)
33 {
34     if(IS_VEC(vec)) {
35         struct VecRec* r = vec.ref.ptr.vec->rec;
36         if(r && i >= r->size) return;
37         r->array[i] = o;
38     }
39 }
40
41 int naVec_size(naRef v)
42 {
43     if(IS_VEC(v)) {
44         struct VecRec* r = v.ref.ptr.vec->rec;
45         return r ? r->size : 0;
46     }
47     return 0;
48 }
49
50 int naVec_append(naRef vec, naRef o)
51 {
52     if(IS_VEC(vec)) {
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;
57         }
58         r->array[r->size] = o;
59         return r->size++;
60     }
61     return 0;
62 }
63
64 void naVec_setsize(naRef vec, int sz)
65 {
66     int i;
67     struct VecRec* v = vec.ref.ptr.vec->rec;
68     struct VecRec* nv = naAlloc(sizeof(struct VecRec) + sizeof(naRef) * sz);
69     nv->size = sz;
70     nv->alloced = sz;
71     for(i=0; i<sz; i++)
72         nv->array[i] = (v && i < v->size) ? v->array[i] : naNil();
73     naFree(v);
74     vec.ref.ptr.vec->rec = nv;
75 }
76
77 naRef naVec_removelast(naRef vec)
78 {
79     naRef o;
80     if(IS_VEC(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];
84         v->size--;
85         if(v->size < (v->alloced >> 1))
86             realloc(vec.ref.ptr.vec);
87         return o;
88     }
89     return naNil();
90 }