2 * dcvector.c -- a dynamic array
3 * (C) 2011 - Georg Martius
4 * georg dot martius at web dot de
6 * This file is part of vid.stab video stabilization library
8 * vid.stab is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License,
10 * as published by the Free Software Foundation; either version 2, or
11 * (at your option) any later version.
13 * vid.stab is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with GNU Make; see the file COPYING. If not, write to
20 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "vidstabdefines.h"
29 /*************************************************************************/
30 int vs_vector_resize(VSVector
*V
, int newsize
);
32 /*************************************************************************/
34 int vs_vector_init(VSVector
*V
, int buffersize
){
37 V
->data
=(void**)vs_zalloc(sizeof(void*)*buffersize
);
38 if(!V
->data
) return VS_ERROR
;
43 V
->buffersize
=buffersize
;
48 int vs_vector_fini(VSVector
*V
){
50 if(V
->data
) vs_free(V
->data
);
57 int vs_vector_del(VSVector
*V
){
59 return vs_vector_fini(V
);
62 int vs_vector_zero(VSVector
*V
){
64 assert(V
->nelems
< 1 || V
->data
);
66 for(i
=0; i
< V
->nelems
; i
++){
75 int vs_vector_size(const VSVector
*V
){
81 int vs_vector_append(VSVector
*V
, void *data
){
83 if(!V
->data
|| V
->buffersize
< 1) vs_vector_init(V
,4);
84 if(V
->nelems
>= V
->buffersize
){
85 if(vs_vector_resize(V
, V
->buffersize
*2)!=VS_OK
) return VS_ERROR
;
87 V
->data
[V
->nelems
]=data
;
92 int vs_vector_append_dup(VSVector
*V
, void *data
, int data_size
){
94 if(!V
->data
|| V
->buffersize
< 1) vs_vector_init(V
,4);
95 void* d
= vs_malloc(data_size
);
96 if(!d
) return VS_ERROR
;
97 memcpy(d
, data
, data_size
);
98 return vs_vector_append(V
, d
);
102 void *vs_vector_get(const VSVector
*V
, int pos
){
103 assert(V
&& V
->data
);
104 if(pos
<0 || pos
>= V
->nelems
)
110 void* vs_vector_set(VSVector
*V
, int pos
, void *data
){
111 assert(V
&& data
&& pos
>=0);
112 if(!V
->data
|| V
->buffersize
< 1) vs_vector_init(V
,4);
113 if(V
->buffersize
<= pos
) {
114 int nsize
= V
->buffersize
;
115 while(nsize
<= pos
) nsize
*=2;
116 if(vs_vector_resize(V
, nsize
)!=VS_OK
) return 0; // insuficient error handling here! VS_ERROR
118 if(pos
>= V
->nelems
){ // insert after end of vector
120 for(i
=V
->nelems
; i
< pos
+1; i
++){
125 void* old
= V
->data
[pos
];
130 void* vs_vector_set_dup(VSVector
*V
, int pos
, void *data
, int data_size
){
131 void* d
= vs_malloc(data_size
);
132 if(!d
) return 0; // insuficient error handling here! VS_ERROR
133 memcpy(d
, data
, data_size
);
134 return vs_vector_set(V
, pos
, d
);
138 int vs_vector_resize(VSVector
*V
, int newsize
){
139 assert(V
&& V
->data
);
140 if(newsize
<1) newsize
=1;
141 V
->data
= (void**)vs_realloc(V
->data
, newsize
* sizeof(void*));
142 V
->buffersize
=newsize
;
143 if(V
->nelems
>V
->buffersize
){
144 V
->nelems
=V
->buffersize
;
147 vs_log_error("VS_Vector","out of memory!");
153 VSVector
vs_vector_filter(const VSVector
*V
, short (*pred
)(void*, void*), void* param
){
156 vs_vector_init(&result
, V
->nelems
);
157 for(int i
=0; i
< V
->nelems
; i
++){
158 if(pred(param
, V
->data
[i
]))
159 vs_vector_append(&result
, V
->data
[i
]);
164 VSVector
vs_vector_concat(const VSVector
*V1
, const VSVector
*V2
){
167 vs_vector_init(&result
, V1
->nelems
+ V2
->nelems
);
168 memcpy(result
.data
, V1
->data
, sizeof(void*)* V1
->nelems
);
169 memcpy(result
.data
+V1
->nelems
, V2
->data
, sizeof(void*)* V2
->nelems
);
170 result
.nelems
=V1
->nelems
+V2
->nelems
;
177 VSArray
vs_array_new(int len
){
179 a
.dat
= (double*)vs_zalloc(sizeof(double)*len
);
184 VSArray
vs_array(double vals
[],int len
){
185 VSArray a
= vs_array_new(len
);
186 memcpy(a
.dat
,vals
, sizeof(double)*len
);
190 VSArray
* vs_array_plus(VSArray
* c
, VSArray a
, VSArray b
){
192 assert(a
.len
== b
.len
);
193 if(c
->len
== 0 ) *c
= vs_array_new(a
.len
);
194 for(i
=0; i
< a
.len
; i
++) c
->dat
[i
]=a
.dat
[i
]+b
.dat
[i
];
198 VSArray
* vs_array_scale(VSArray
* c
, VSArray a
, double f
){
199 if(c
->len
== 0 ) *c
= vs_array_new(a
.len
);
200 for(int i
=0; i
< a
.len
; i
++) c
->dat
[i
]=a
.dat
[i
]*f
;
204 VSArray
vs_array_copy(VSArray a
){
205 VSArray c
= vs_array_new(a
.len
);
206 memcpy(c
.dat
, a
.dat
, a
.len
*sizeof(double));
210 void vs_array_zero(VSArray
* a
){
211 memset(a
->dat
,0,sizeof(double)*a
->len
);
214 void vs_array_swap(VSArray
* a
, VSArray
* b
){
221 void vs_array_free(VSArray a
){
227 void vs_array_print(VSArray a
, FILE* f
){
228 for(int i
=0; i
<a
.len
; i
++){
229 fprintf(f
, "%g ", a
.dat
[i
]);
236 * c-file-style: "stroustrup"
237 * c-file-offsets: ((case-label . *) (statement-case-intro . *))
238 * indent-tabs-mode: nil
239 * c-basic-offset: 2 t
242 * vim: expandtab shiftwidth=4: