CVector  4.1.0
A C++ style vector library in strict ANSI C (C89)
cvector_i.c
Go to the documentation of this file.
1 #include "cvector_i.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 #define CVEC_MALLOC(sz) malloc(sz)
15 #define CVEC_REALLOC(p, sz) realloc(p, sz)
16 #define CVEC_FREE(p) free(p)
17 #endif
18 
19 #ifndef CVEC_MEMMOVE
20 #include <string.h>
21 #define CVEC_MEMMOVE(dst, src, sz) memmove(dst, src, sz)
22 #endif
23 
24 #ifndef CVEC_ASSERT
25 #include <assert.h>
26 #define CVEC_ASSERT(x) assert(x)
27 #endif
28 
30 
31 #define CVEC_I_ALLOCATOR(x) ((x+1) * 2)
32 
40 {
41  cvector_i* vec;
42  if (!(vec = (cvector_i*)CVEC_MALLOC(sizeof(cvector_i)))) {
43  CVEC_ASSERT(vec != NULL);
44  return NULL;
45  }
46 
47  vec->size = size;
48  vec->capacity = (capacity > vec->size || (vec->size && capacity == vec->size)) ? capacity : vec->size + CVEC_I_START_SZ;
49 
50  if (!(vec->a = (int*)CVEC_MALLOC(vec->capacity*sizeof(int)))) {
51  CVEC_ASSERT(vec->a != NULL);
52  CVEC_FREE(vec);
53  return NULL;
54  }
55 
56  return vec;
57 }
58 
63 {
64  cvector_i* vec;
65 
66  if (!(vec = (cvector_i*)CVEC_MALLOC(sizeof(cvector_i)))) {
67  CVEC_ASSERT(vec != NULL);
68  return NULL;
69  }
70 
71  vec->capacity = num + CVEC_I_START_SZ;
72  vec->size = num;
73  if (!(vec->a = (int*)CVEC_MALLOC(vec->capacity*sizeof(int)))) {
74  CVEC_ASSERT(vec->a != NULL);
75  CVEC_FREE(vec);
76  return NULL;
77  }
78 
79  CVEC_MEMMOVE(vec->a, vals, sizeof(int)*num);
80 
81  return vec;
82 }
83 
88 int cvec_i(cvector_i* vec, cvec_sz size, cvec_sz capacity)
89 {
90  vec->size = size;
91  vec->capacity = (capacity > vec->size || (vec->size && capacity == vec->size)) ? capacity : vec->size + CVEC_I_START_SZ;
92 
93  if (!(vec->a = (int*)CVEC_MALLOC(vec->capacity*sizeof(int)))) {
94  CVEC_ASSERT(vec->a != NULL);
95  vec->size = vec->capacity = 0;
96  return 0;
97  }
98 
99  return 1;
100 }
101 
105 int cvec_init_i(cvector_i* vec, int* vals, cvec_sz num)
106 {
107  vec->capacity = num + CVEC_I_START_SZ;
108  vec->size = num;
109  if (!(vec->a = (int*)CVEC_MALLOC(vec->capacity*sizeof(int)))) {
110  CVEC_ASSERT(vec->a != NULL);
111  vec->size = vec->capacity = 0;
112  return 0;
113  }
114 
115  CVEC_MEMMOVE(vec->a, vals, sizeof(int)*num);
116 
117  return 1;
118 }
119 
130 int cvec_copyc_i(void* dest, void* src)
131 {
132  cvector_i* vec1 = (cvector_i*)dest;
133  cvector_i* vec2 = (cvector_i*)src;
134 
135  vec1->a = NULL;
136  vec1->size = 0;
137  vec1->capacity = 0;
138 
139  return cvec_copy_i(vec1, vec2);
140 }
141 
152 {
153  int* tmp = NULL;
154  if (!(tmp = (int*)CVEC_REALLOC(dest->a, src->capacity*sizeof(int)))) {
155  CVEC_ASSERT(tmp != NULL);
156  return 0;
157  }
158  dest->a = tmp;
159 
160  CVEC_MEMMOVE(dest->a, src->a, src->size*sizeof(int));
161  dest->size = src->size;
162  dest->capacity = src->capacity;
163  return 1;
164 }
165 
170 int cvec_push_i(cvector_i* vec, int a)
171 {
172  int* tmp;
173  cvec_sz tmp_sz;
174  if (vec->capacity == vec->size) {
175  tmp_sz = CVEC_I_ALLOCATOR(vec->capacity);
176  if (!(tmp = (int*)CVEC_REALLOC(vec->a, sizeof(int)*tmp_sz))) {
177  CVEC_ASSERT(tmp != NULL);
178  return 0;
179  }
180  vec->a = tmp;
181  vec->capacity = tmp_sz;
182  }
183 
184  vec->a[vec->size++] = a;
185  return 1;
186 }
187 
190 {
191  return vec->a[--vec->size];
192 }
193 
196 {
197  return &vec->a[vec->size-1];
198 }
199 
203 {
204  int* tmp;
205  cvec_sz tmp_sz;
206  if (vec->capacity < vec->size + num) {
207  tmp_sz = vec->capacity + num + CVEC_I_START_SZ;
208  if (!(tmp = (int*)CVEC_REALLOC(vec->a, sizeof(int)*tmp_sz))) {
209  CVEC_ASSERT(tmp != NULL);
210  return 0;
211  }
212  vec->a = tmp;
213  vec->capacity = tmp_sz;
214  }
215 
216  vec->size += num;
217  return 1;
218 }
219 
224 int cvec_insert_i(cvector_i* vec, cvec_sz i, int a)
225 {
226  int* tmp;
227  cvec_sz tmp_sz;
228  if (vec->capacity == vec->size) {
229  tmp_sz = CVEC_I_ALLOCATOR(vec->capacity);
230  if (!(tmp = (int*)CVEC_REALLOC(vec->a, sizeof(int)*tmp_sz))) {
231  CVEC_ASSERT(tmp != NULL);
232  return 0;
233  }
234  vec->a = tmp;
235  vec->capacity = tmp_sz;
236  }
237 
238  CVEC_MEMMOVE(&vec->a[i+1], &vec->a[i], (vec->size-i)*sizeof(int));
239  vec->a[i] = a;
240  vec->size++;
241  return 1;
242 }
243 
250 int cvec_insert_array_i(cvector_i* vec, cvec_sz i, int* a, cvec_sz num)
251 {
252  int* tmp;
253  cvec_sz tmp_sz;
254  if (vec->capacity < vec->size + num) {
255  tmp_sz = vec->capacity + num + CVEC_I_START_SZ;
256  if (!(tmp = (int*)CVEC_REALLOC(vec->a, sizeof(int)*tmp_sz))) {
257  CVEC_ASSERT(tmp != NULL);
258  return 0;
259  }
260  vec->a = tmp;
261  vec->capacity = tmp_sz;
262  }
263 
264  CVEC_MEMMOVE(&vec->a[i+num], &vec->a[i], (vec->size-i)*sizeof(int));
265  CVEC_MEMMOVE(&vec->a[i], a, num*sizeof(int));
266  vec->size += num;
267  return 1;
268 }
269 
271 int cvec_replace_i(cvector_i* vec, cvec_sz i, int a)
272 {
273  int tmp = vec->a[i];
274  vec->a[i] = a;
275  return tmp;
276 }
277 
283 void cvec_erase_i(cvector_i* vec, cvec_sz start, cvec_sz end)
284 {
285  cvec_sz d = end - start + 1;
286  CVEC_MEMMOVE(&vec->a[start], &vec->a[end+1], (vec->size-1-end)*sizeof(int));
287  vec->size -= d;
288 }
289 
292 {
293  int* tmp;
294  if (vec->capacity < size) {
295  if (!(tmp = (int*)CVEC_REALLOC(vec->a, sizeof(int)*(size+CVEC_I_START_SZ)))) {
296  CVEC_ASSERT(tmp != NULL);
297  return 0;
298  }
299  vec->a = tmp;
300  vec->capacity = size + CVEC_I_START_SZ;
301  }
302  return 1;
303 }
304 
310 {
311  int* tmp;
312  if (size < vec->size) {
313  vec->size = size;
314  }
315 
316  if (!(tmp = (int*)CVEC_REALLOC(vec->a, sizeof(int)*size))) {
317  CVEC_ASSERT(tmp != NULL);
318  return 0;
319  }
320  vec->a = tmp;
321  vec->capacity = size;
322  return 1;
323 }
324 
326 void cvec_set_val_sz_i(cvector_i* vec, int val)
327 {
328  cvec_sz i;
329  for (i=0; i<vec->size; i++) {
330  vec->a[i] = val;
331  }
332 }
333 
335 void cvec_set_val_cap_i(cvector_i* vec, int val)
336 {
337  cvec_sz i;
338  for (i=0; i<vec->capacity; i++) {
339  vec->a[i] = val;
340  }
341 }
342 
344 void cvec_clear_i(cvector_i* vec) { vec->size = 0; }
345 
348 void cvec_free_i_heap(void* vec)
349 {
350  cvector_i* tmp = (cvector_i*)vec;
351  if (!tmp) return;
352  CVEC_FREE(tmp->a);
353  CVEC_FREE(tmp);
354 }
355 
357 void cvec_free_i(void* vec)
358 {
359  cvector_i* tmp = (cvector_i*)vec;
360  CVEC_FREE(tmp->a);
361  tmp->size = 0;
362  tmp->capacity = 0;
363 }
364 
CVEC_SIZE_T cvec_sz
Definition: cvector.h:88
#define CVEC_FREE(p)
Definition: cvector_i.c:16
#define CVEC_I_ALLOCATOR(x)
Definition: cvector_i.c:31
int cvec_insert_i(cvector_i *vec, cvec_sz i, int a)
Insert a at index i (0 based).
Definition: cvector_i.c:224
void cvec_free_i_heap(void *vec)
Frees everything so don't use vec after calling this.
Definition: cvector_i.c:348
void cvec_free_i(void *vec)
Frees the internal array and sets size and capacity to 0.
Definition: cvector_i.c:357
#define CVEC_REALLOC(p, sz)
Definition: cvector_i.c:15
int cvec_pop_i(cvector_i *vec)
Remove and return the last element (size decreased 1).
Definition: cvector_i.c:189
int cvec_copyc_i(void *dest, void *src)
Makes dest a copy of src.
Definition: cvector_i.c:130
int cvec_replace_i(cvector_i *vec, cvec_sz i, int a)
Replace value at index i with a, return original value.
Definition: cvector_i.c:271
int cvec_insert_array_i(cvector_i *vec, cvec_sz i, int *a, cvec_sz num)
Insert the first num elements of array a at index i.
Definition: cvector_i.c:250
cvec_sz CVEC_I_START_SZ
Definition: cvector_i.c:29
cvector_i * cvec_init_i_heap(int *vals, cvec_sz num)
Create (on the heap) and initialize cvector_i with num elements of vals.
Definition: cvector_i.c:62
int cvec_copy_i(cvector_i *dest, cvector_i *src)
Makes dest a copy of src.
Definition: cvector_i.c:151
int cvec_set_cap_i(cvector_i *vec, cvec_sz size)
Set capacity to size.
Definition: cvector_i.c:309
#define CVEC_MEMMOVE(dst, src, sz)
Definition: cvector_i.c:21
int cvec_reserve_i(cvector_i *vec, cvec_sz size)
Make sure capacity is at least size(parameter not member).
Definition: cvector_i.c:291
#define CVEC_MALLOC(sz)
Definition: cvector_i.c:14
#define CVEC_ASSERT(x)
Definition: cvector_i.c:26
int cvec_push_i(cvector_i *vec, int a)
Append a to end of vector (size increased 1).
Definition: cvector_i.c:170
void cvec_erase_i(cvector_i *vec, cvec_sz start, cvec_sz end)
Erases elements from start to end inclusive.
Definition: cvector_i.c:283
int cvec_init_i(cvector_i *vec, int *vals, cvec_sz num)
Same as cvec_init_i_heap() except the vector passed in was declared on the stack so it isn't allocate...
Definition: cvector_i.c:105
int cvec_i(cvector_i *vec, cvec_sz size, cvec_sz capacity)
Same as cvec_i_heap() except the vector passed in was declared on the stack so it isn't allocated in ...
Definition: cvector_i.c:88
cvector_i * cvec_i_heap(cvec_sz size, cvec_sz capacity)
Creates a new cvector_i on the heap.
Definition: cvector_i.c:39
int * cvec_back_i(cvector_i *vec)
Return pointer to last element.
Definition: cvector_i.c:195
void cvec_clear_i(cvector_i *vec)
Sets size to 0 (does not clear contents).
Definition: cvector_i.c:344
int cvec_extend_i(cvector_i *vec, cvec_sz num)
Increase the size of the array num items.
Definition: cvector_i.c:202
void cvec_set_val_cap_i(cvector_i *vec, int val)
Fills entire allocated array (capacity) with val.
Definition: cvector_i.c:335
void cvec_set_val_sz_i(cvector_i *vec, int val)
Set all size elements to val.
Definition: cvector_i.c:326
Data structure for int vector.
Definition: cvector.h:100
cvec_sz size
Current size (amount you use when manipulating array directly).
Definition: cvector.h:102
int * a
Array.
Definition: cvector.h:101
cvec_sz capacity
Allocated size of array; always >= size.
Definition: cvector.h:103