]> git.mxchange.org Git - simgear.git/blob - simgear/nasal/vector.c
db98b3e45793c51e38c542a1cd9fa0482d4f2019
[simgear.git] / simgear / nasal / vector.c
1 #include "nasal.h"
2 #include "data.h"
3
4 static void realloc(struct naVec* v)
5 {
6     int i, newsz = 1 + ((v->size*3)>>1);
7     naRef* na = naAlloc(sizeof(naRef) * newsz);
8     v->alloced = newsz;
9     for(i=0; i<v->size; i++)
10         na[i] = v->array[i];
11     naFree(v->array);
12     v->array = na;
13 }
14
15 void naVec_init(naRef vec)
16 {
17     struct naVec* v = vec.ref.ptr.vec;
18     v->array = 0;
19     v->size = 0;
20     v->alloced = 0;
21 }
22
23 void naVec_gcclean(struct naVec* v)
24 {
25     naFree(v->array);
26     v->size = 0;
27     v->alloced = 0;
28     v->array = 0;
29 }
30
31 naRef naVec_get(naRef v, int i)
32 {
33     if(!IS_VEC(v)) return naNil();
34     if(i >= v.ref.ptr.vec->size) return naNil();
35     return v.ref.ptr.vec->array[i];
36 }
37
38 void naVec_set(naRef vec, int i, naRef o)
39 {
40     struct naVec* v = vec.ref.ptr.vec;
41     if(!IS_VEC(vec) || i >= v->size) return;
42     v->array[i] = o;
43 }
44
45 int naVec_size(naRef v)
46 {
47     if(!IS_VEC(v)) return 0;
48     return v.ref.ptr.vec->size;
49 }
50
51 int naVec_append(naRef vec, naRef o)
52 {
53     struct naVec* v = vec.ref.ptr.vec;
54     if(!IS_VEC(vec)) return 0;
55     if(v->size >= v->alloced)
56         realloc(v);
57     v->array[v->size] = o;
58     return v->size++;
59 }
60
61 naRef naVec_removelast(naRef vec)
62 {
63     naRef o;
64     struct naVec* v = vec.ref.ptr.vec;
65     if(!IS_VEC(vec) || v->size == 0) return naNil();
66     o = v->array[v->size - 1];
67     v->size--;
68     if(v->size < (v->alloced >> 1))
69         realloc(v);
70     return o;
71 }