Imported Debian version 1.0~trusty
[deb_vid.stab.git] / src / vsvector.h
CommitLineData
80f575fc
DM
1/*
2 * vsvector.h -- a dynamic array
3 * (C) 2011 - Georg Martius
4 * georg dot martius at web dot de
5 *
6 * This file is part of vid.stab video stabilization library
7 *
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.
12 *
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.
17 *
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.
21 */
22#ifndef VSVECTOR_H
23#define VSVECTOR_H
24
25#include <stddef.h>
26#include <stdio.h>
27
28/**
29 A vector for arbitrary elements that resizes
30*/
31typedef struct vsvector_ VSVector;
32struct vsvector_ {
33 void** data;
34 int buffersize;
35 int nelems;
36};
37
38/**
39 * vs_vector_init:
40 * intializes a vector data structure.
41 * A vector will grow but not shrink if elements are added.
42 *
43 * Parameters:
44 * V: pointer to list to be initialized.
45 * buffersize: size of buffer (if known, then # of resizes are reduced)
46 * Return Value:
47 * VS_OK on success,
48 * VS_ERROR on error.
49 */
50int vs_vector_init(VSVector *V, int buffersize);
51
52/**
53 * vs_vector_fini:
54 * finalizes a vector data structure. Frees all resources aquired,
55 * but *NOT* the data pointed by vector elements.
56 *
57 * Parameters:
58 * V: pointer to list to be finalized
59 * Return Value:
60 * VS_OK on success,
61 * VS_ERROR on error.
62 */
63int vs_vector_fini(VSVector *V);
64
65/**
66 * vs_vector_del:
67 * like vs_vector_fini, but also deletes the data pointed by vector elements.
68 *
69 * Parameters:
70 * V: pointer to list to be finalized
71 * Return Value:
72 * VS_OK on success,
73 * VS_ERROR on error.
74 */
75int vs_vector_del(VSVector *V);
76
77/**
78 * vs_vector_zero:
79 * deletes all data pointed to by the vector elements.
80 * sets the number of elements to 0 but does not delete buffer
81*/
82int vs_vector_zero(VSVector *V);
83
84/**
85 * vs_vector_size:
86 * gives the number of elements present in the vector
87 * (not the internal buffer size).
88 *
89 * Parameters:
90 * V: vector to be used.
91 * Return Value:
92 * -1 on error,
93 * the number of elements otherwise
94 */
95int vs_vector_size(const VSVector *V);
96
97
98/**
99 * vs_vector_append:
100 * append an element to the vector.
101 * The element is added to the end of the vector.
102 *
103 * Parameters:
104 * V: pointer to vector to be used
105 * data: pointer to data to be appended or prepend.
106 * *PLEASE NOTE* that JUST THE POINTER is copied on the newly-added
107 * element. NO deep copy is performed.
108 * The caller has to allocate memory by itself if it want to
109 * add a copy of the data.
110 * Return Value:
111 * VS_OK on success,
112 * VS_ERROR on error.
113 */
114int vs_vector_append(VSVector *V, void *data);
115
116/**
117 * vs_vector_append_dup:
118 * like vs_vector_append but copies data
119 */
120int vs_vector_append_dup(VSVector *V, void *data, int data_size);
121
122
123/* vs_vector_set:
124 * the newly inserted element BECOMES the position `pos' in the vector.
125 * and the old item is returned
126 */
127void* vs_vector_set(VSVector *V, int pos, void *data);
128
129/* vs_vector_set_dup:
130 * the newly inserted element is copied and BECOMES the position `pos' in the vector
131 * and the old item is returned
132 */
133void* vs_vector_set_dup(VSVector *V, int pos, void *data, int data_size);
134
135/*
136 * vs_vector_get:
137 * gives access to the data pointed by the element in the given position.
138 *
139 * Parameters:
140 * V: vector to be accessed.
141 * pos: position of the element on which the data will be returned.
142 * Return Value:
143 * NULL on error (requested element doesn't exist)
144 * a pointer to the data belonging to the requested vector item.
145 */
146void *vs_vector_get(const VSVector *V, int pos);
147
148/*
149 * vs_vector_filter:
150 * returns a new vector with elements that fulfill predicate
151 * pred(param, elem)
152 */
153VSVector vs_vector_filter(const VSVector *V, short (*pred)(void*, void*), void* param);
154
155/*
156 * vs_vector_concat:
157 * returns a new vector with elements of vector V1 and V2 after another
158 */
159VSVector vs_vector_concat(const VSVector *V1, const VSVector *V2);
160
161
162/**
163 A simple fixed-size double vector
164*/
165typedef struct vsarray_ VSArray;
166struct vsarray_ {
167 double* dat;
168 int len;
169};
170
171/** creates an VSArray from a double array */
172VSArray vs_array(double vals[], int len);
173
174/** allocates a new (zero initialized) double array */
175VSArray vs_array_new(int len);
176
177/** adds two vectors ands stores results into c (if zero length then allocated) */
178VSArray* vs_array_plus(VSArray* c, VSArray a, VSArray b);
179
180/** scales a vector by a factor and stores results into c (if zero length then allocated) */
181VSArray* vs_array_scale(VSArray* c, VSArray a, double f);
182
183/** create a new deep copy of the vector */
184VSArray vs_array_copy(VSArray a);
185
186/** sets all elements of the vector to 0.0 */
187void vs_array_zero(VSArray* a);
188
189/** swaps the content of the two arrays */
190void vs_array_swap(VSArray* a, VSArray* b);
191
192/** free data */
193void vs_array_free(VSArray a);
194
195/** print array to file */
196void vs_array_print(VSArray a, FILE* f);
197
198#endif /* VSVECTOR_H */
199
200/*
201 * Local variables:
202 * c-file-style: "stroustrup"
203 * c-file-offsets: ((case-label . *) (statement-case-intro . *))
204 * indent-tabs-mode: nil
205 * End:
206 *
207 * vim: expandtab shiftwidth=4:
208 */