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