CVector 4.3.0
A C++ style vector library in strict ANSI C (C89)
Loading...
Searching...
No Matches
cvector_d.c
Go to the documentation of this file.
1#include "cvector_d.h"
2
3
4
5#if defined(CVEC_MALLOC) && defined(CVEC_FREE) && defined(CVEC_REALLOC)
6/* ok */
7#elif !defined(CVEC_MALLOC) && !defined(CVEC_FREE) && !defined(CVEC_REALLOC)
8/* ok */
9#else
10#error "Must define all or none of CVEC_MALLOC, CVEC_FREE, and CVEC_REALLOC."
11#endif
12
13#ifndef CVEC_MALLOC
14#include <stdlib.h>
15#define CVEC_MALLOC(sz) malloc(sz)
16#define CVEC_REALLOC(p, sz) realloc(p, sz)
17#define CVEC_FREE(p) free(p)
18#endif
19
20#ifndef CVEC_MEMMOVE
21#include <string.h>
22#define CVEC_MEMMOVE(dst, src, sz) memmove(dst, src, sz)
23#endif
24
25#ifndef CVEC_ASSERT
26#include <assert.h>
27#define CVEC_ASSERT(x) assert(x)
28#endif
29
31
32#define CVEC_D_ALLOCATOR(x) ((x+1) * 2)
33
41{
42 cvector_d* vec;
43
44 if (!(vec = (cvector_d*)CVEC_MALLOC(sizeof(cvector_d)))) {
45 CVEC_ASSERT(vec != NULL);
46 return NULL;
47 }
48
49 vec->size = size;
50 vec->capacity = (capacity > vec->size || (vec->size && capacity == vec->size)) ? capacity : vec->size + CVEC_D_START_SZ;
51
52 if (!(vec->a = (double*)CVEC_MALLOC(vec->capacity*sizeof(double)))) {
53 CVEC_ASSERT(vec->a != NULL);
54 CVEC_FREE(vec);
55 return NULL;
56 }
57
58 return vec;
59}
60
65{
66 cvector_d* vec;
67
68 if (!(vec = (cvector_d*)CVEC_MALLOC(sizeof(cvector_d)))) {
69 CVEC_ASSERT(vec != NULL);
70 return NULL;
71 }
72
73 vec->capacity = num + CVEC_D_START_SZ;
74 vec->size = num;
75 if (!(vec->a = (double*)CVEC_MALLOC(vec->capacity*sizeof(double)))) {
76 CVEC_ASSERT(vec->a != NULL);
77 CVEC_FREE(vec);
78 return NULL;
79 }
80
81 CVEC_MEMMOVE(vec->a, vals, sizeof(double)*num);
82
83 return vec;
84}
85
90int cvec_d(cvector_d* vec, cvec_sz size, cvec_sz capacity)
91{
92 vec->size = size;
93 vec->capacity = (capacity > vec->size || (vec->size && capacity == vec->size)) ? capacity : vec->size + CVEC_D_START_SZ;
94
95 if (!(vec->a = (double*)CVEC_MALLOC(vec->capacity*sizeof(double)))) {
96 CVEC_ASSERT(vec->a != NULL);
97 vec->size = vec->capacity = 0;
98 return 0;
99 }
100
101 return 1;
102}
103
107int cvec_init_d(cvector_d* vec, double* vals, cvec_sz num)
108{
109 vec->capacity = num + CVEC_D_START_SZ;
110 vec->size = num;
111 if (!(vec->a = (double*)CVEC_MALLOC(vec->capacity*sizeof(double)))) {
112 CVEC_ASSERT(vec->a != NULL);
113 vec->size = vec->capacity = 0;
114 return 0;
115 }
116
117 CVEC_MEMMOVE(vec->a, vals, sizeof(double)*num);
118
119 return 1;
120}
121
132int cvec_copyc_d(void* dest, void* src)
133{
134 cvector_d* vec1 = (cvector_d*)dest;
135 cvector_d* vec2 = (cvector_d*)src;
136
137 vec1->a = NULL;
138 vec1->size = 0;
139 vec1->capacity = 0;
140
141 return cvec_copy_d(vec1, vec2);
142}
143
154{
155 double* tmp = NULL;
156 if (!(tmp = (double*)CVEC_REALLOC(dest->a, src->capacity*sizeof(double)))) {
157 CVEC_ASSERT(tmp != NULL);
158 return 0;
159 }
160 dest->a = tmp;
161
162 CVEC_MEMMOVE(dest->a, src->a, src->size*sizeof(double));
163 dest->size = src->size;
164 dest->capacity = src->capacity;
165 return 1;
166}
167
168
172int cvec_push_d(cvector_d* vec, double a)
173{
174 double* tmp;
175 cvec_sz tmp_sz;
176 if (vec->capacity == vec->size) {
177 tmp_sz = CVEC_D_ALLOCATOR(vec->capacity);
178 if (!(tmp = (double*)CVEC_REALLOC(vec->a, sizeof(double)*tmp_sz))) {
179 CVEC_ASSERT(tmp != NULL);
180 return 0;
181 }
182 vec->a = tmp;
183 vec->capacity = tmp_sz;
184 }
185 vec->a[vec->size++] = a;
186 return 1;
187}
188
191{
192 return vec->a[--vec->size];
193}
194
197{
198 return &vec->a[vec->size-1];
199}
200
204{
205 double* tmp;
206 cvec_sz tmp_sz;
207 if (vec->capacity < vec->size + num) {
208 tmp_sz = vec->capacity + num + CVEC_D_START_SZ;
209 if (!(tmp = (double*)CVEC_REALLOC(vec->a, sizeof(double)*tmp_sz))) {
210 CVEC_ASSERT(tmp != NULL);
211 return 0;
212 }
213 vec->a = tmp;
214 vec->capacity = tmp_sz;
215 }
216
217 vec->size += num;
218 return 1;
219}
220
225int cvec_insert_d(cvector_d* vec, cvec_sz i, double a)
226{
227 double* tmp;
228 cvec_sz tmp_sz;
229 if (vec->capacity == vec->size) {
230 tmp_sz = CVEC_D_ALLOCATOR(vec->capacity);
231 if (!(tmp = (double*)CVEC_REALLOC(vec->a, sizeof(double)*tmp_sz))) {
232 CVEC_ASSERT(tmp != NULL);
233 return 0;
234 }
235 vec->a = tmp;
236 vec->capacity = tmp_sz;
237 }
238
239 CVEC_MEMMOVE(&vec->a[i+1], &vec->a[i], (vec->size-i)*sizeof(double));
240 vec->a[i] = a;
241 vec->size++;
242 return 1;
243}
244
251int cvec_insert_array_d(cvector_d* vec, cvec_sz i, double* a, cvec_sz num)
252{
253 double* tmp;
254 cvec_sz tmp_sz;
255 if (vec->capacity < vec->size + num) {
256 tmp_sz = vec->capacity + num + CVEC_D_START_SZ;
257 if (!(tmp = (double*)CVEC_REALLOC(vec->a, sizeof(double)*tmp_sz))) {
258 CVEC_ASSERT(tmp != NULL);
259 return 0;
260 }
261 vec->a = tmp;
262 vec->capacity = tmp_sz;
263 }
264
265 CVEC_MEMMOVE(&vec->a[i+num], &vec->a[i], (vec->size-i)*sizeof(double));
266 CVEC_MEMMOVE(&vec->a[i], a, num*sizeof(double));
267 vec->size += num;
268 return 1;
269}
270
272double cvec_replace_d(cvector_d* vec, cvec_sz i, double a)
273{
274 double tmp = vec->a[i];
275 vec->a[i] = a;
276 return tmp;
277}
278
284void cvec_erase_d(cvector_d* vec, cvec_sz start, cvec_sz end)
285{
286 cvec_sz d = end - start + 1;
287 CVEC_MEMMOVE(&vec->a[start], &vec->a[end+1], (vec->size-1-end)*sizeof(double));
288 vec->size -= d;
289}
290
293{
294 double* tmp;
295 if (vec->capacity < size) {
296 if (!(tmp = (double*)CVEC_REALLOC(vec->a, sizeof(double)*(size+CVEC_D_START_SZ)))) {
297 CVEC_ASSERT(tmp != NULL);
298 return 0;
299 }
300 vec->a = tmp;
301 vec->capacity = size + CVEC_D_START_SZ;
302 }
303 return 1;
304}
305
311{
312 double* tmp;
313 if (size < vec->size)
314 vec->size = size;
315
316 if (!(tmp = (double*)CVEC_REALLOC(vec->a, sizeof(double)*size))) {
317 CVEC_ASSERT(tmp != NULL);
318 return 0;
319 }
320 vec->a = tmp;
321 vec->capacity = size;
322 return 1;
323}
324
326void cvec_set_val_sz_d(cvector_d* vec, double val)
327{
328 cvec_sz i;
329 for(i=0; i<vec->size; i++) {
330 vec->a[i] = val;
331 }
332}
333
335void cvec_set_val_cap_d(cvector_d* vec, double val)
336{
337 cvec_sz i;
338 for(i=0; i<vec->capacity; i++) {
339 vec->a[i] = val;
340 }
341}
342
344void cvec_clear_d(cvector_d* vec) { vec->size = 0; }
345
348void cvec_free_d_heap(void* vec)
349{
350 cvector_d* tmp = (cvector_d*)vec;
351 if (!tmp) return;
352 CVEC_FREE(tmp->a);
353 CVEC_FREE(tmp);
354}
355
358void cvec_free_d(void* vec)
359{
360 cvector_d* tmp = (cvector_d*)vec;
361 CVEC_FREE(tmp->a);
362 tmp->a = NULL;
363 tmp->size = 0;
364 tmp->capacity = 0;
365}
CVEC_SIZE_T cvec_sz
Definition cvector.h:88
#define CVEC_FREE(p)
Definition cvector_d.c:17
int cvec_insert_array_d(cvector_d *vec, cvec_sz i, double *a, cvec_sz num)
Insert the first num elements of array a at index i.
Definition cvector_d.c:251
int cvec_insert_d(cvector_d *vec, cvec_sz i, double a)
Insert a at index i (0 based).
Definition cvector_d.c:225
void cvec_free_d(void *vec)
Frees the internal array and zeros out the members to maintain a consistent state.
Definition cvector_d.c:358
#define CVEC_REALLOC(p, sz)
Definition cvector_d.c:16
void cvec_erase_d(cvector_d *vec, cvec_sz start, cvec_sz end)
Erases elements from start to end inclusive.
Definition cvector_d.c:284
cvector_d * cvec_d_heap(cvec_sz size, cvec_sz capacity)
Creates a new cvector_d on the heap.
Definition cvector_d.c:40
void cvec_set_val_cap_d(cvector_d *vec, double val)
Fills entire allocated array (capacity) with val.
Definition cvector_d.c:335
int cvec_copy_d(cvector_d *dest, cvector_d *src)
Makes dest a copy of src.
Definition cvector_d.c:153
int cvec_reserve_d(cvector_d *vec, cvec_sz size)
Make sure capacity is at least size(parameter not member).
Definition cvector_d.c:292
#define CVEC_MEMMOVE(dst, src, sz)
Definition cvector_d.c:22
int cvec_extend_d(cvector_d *vec, cvec_sz num)
Increase the size of the array num items.
Definition cvector_d.c:203
int cvec_copyc_d(void *dest, void *src)
Makes dest a copy of src.
Definition cvector_d.c:132
#define CVEC_MALLOC(sz)
Definition cvector_d.c:15
double cvec_replace_d(cvector_d *vec, cvec_sz i, double a)
Replace value at index i with a, return original value.
Definition cvector_d.c:272
#define CVEC_ASSERT(x)
Definition cvector_d.c:27
void cvec_set_val_sz_d(cvector_d *vec, double val)
Set all size elements to val.
Definition cvector_d.c:326
cvector_d * cvec_init_d_heap(double *vals, cvec_sz num)
Create (on the heap) and initialize cvector_d with num elements of vals.
Definition cvector_d.c:64
int cvec_d(cvector_d *vec, cvec_sz size, cvec_sz capacity)
Same as cvec_d_heap() except the vector passed in was declared on the stack so it isn't allocated in ...
Definition cvector_d.c:90
int cvec_set_cap_d(cvector_d *vec, cvec_sz size)
Set capacity to size.
Definition cvector_d.c:310
#define CVEC_D_ALLOCATOR(x)
Definition cvector_d.c:32
int cvec_push_d(cvector_d *vec, double a)
Append a to end of vector (size increased 1).
Definition cvector_d.c:172
double * cvec_back_d(cvector_d *vec)
Return pointer to last element.
Definition cvector_d.c:196
void cvec_clear_d(cvector_d *vec)
Sets size to 0 (does not clear contents).
Definition cvector_d.c:344
void cvec_free_d_heap(void *vec)
Frees everything so don't use vec after calling this.
Definition cvector_d.c:348
int cvec_init_d(cvector_d *vec, double *vals, cvec_sz num)
Same as cvec_init_d_heap() except the vector passed in was declared on the stack so it isn't allocate...
Definition cvector_d.c:107
double cvec_pop_d(cvector_d *vec)
Remove and return the last element (size decreased 1).
Definition cvector_d.c:190
cvec_sz CVEC_D_START_SZ
Definition cvector_d.c:30
Data structure for double vector.
Definition cvector.h:145
cvec_sz size
Current size (amount you use when manipulating array directly).
Definition cvector.h:147
cvec_sz capacity
Allocated size of array; always >= size.
Definition cvector.h:148
double * a
Array.
Definition cvector.h:146