vector.c
Raw
1#include "vector.h"
2
3Vector* new_vector(void)
4{
5 Vector* vector = malloc(sizeof(*vector));
6 if(!vector)
7 return NULL;
8 vector->items = malloc(sizeof(*vector->items)*VECTOR_DEFAULT_SIZE);
9 if(!vector->items)
10 {
11 free(vector);
12 return NULL;
13 }
14 vector->length = 0;
15 vector->capacity = VECTOR_DEFAULT_SIZE;
16
17 return vector;
18}
19
20void* vector_at(const Vector* vector, size_t index)
21{
22 if(index >= vector->length)
23 return NULL;
24 else
25 return vector->items[index];
26}
27
28void* vector_pop(Vector* vector, size_t index)
29{
30 if(index >= vector->length)
31 return NULL;
32 else
33 {
34 void* tmp = vector->items[index];
35 memmove(vector->items+index, vector->items+index+1, (vector->length-index-1)*sizeof(*vector->items));
36 vector->length--;
37 return tmp;
38 }
39}
40
41void vector_remove(Vector* vector, size_t index, void (*rmv)(void*))
42{
43 if(index < vector->length)
44 {
45 if(rmv)
46 rmv(vector->items[index]);
47 else
48 free(vector->items[index]);
49 memmove(vector->items+index, vector->items+index+1, (vector->length-index-1)*sizeof(*vector->items));
50 vector->length--;
51 }
52}
53
54bool vector_push(Vector* vector, void* item)
55{
56 if(!vector_adjust_size(vector, ++vector->length))
57 return false;
58 vector->items[vector->length-1] = item;
59 return true;
60}
61
62size_t* vector_find(const Vector* haystack, const void* needle, bool (*cmp)(const void*, const void*))
63{
64 size_t* ret;
65 for(size_t i = 0; i < haystack->length; i++)
66 {
67 if(cmp ? cmp(haystack->items[i],needle) : haystack->items[i] == needle)
68 {
69 ret = malloc(sizeof(*ret));
70 *ret = i;
71 return ret;
72 }
73 }
74 return NULL;
75}
76
77bool vector_insert(Vector* vector, size_t index, void* item)
78{
79 if(!vector_adjust_size(vector, vector->length))
80 return false;
81
82 memmove(vector->items+index+1, vector->items+index, (vector->length-index)*sizeof(*vector->items));
83 vector->items[index] = item;
84 vector->length++;
85 return true;
86}
87
88bool vector_adjust_size(Vector* vector, size_t size)
89{
90 while(vector->capacity < size)
91 {
92 void** tmp = vector->items;
93 vector->items = realloc(vector->items, vector->capacity*2*(sizeof(*vector->items)));
94 if(!vector->items)
95 {
96 vector->items = tmp;
97 return false;
98 }
99 vector->capacity *= 2;
100 }
101 while(vector->capacity > (size*2))
102 {
103 void** tmp = vector->items;
104 vector->items = realloc(vector->items, vector->capacity/2*(sizeof(*vector->items)));
105 if(!vector->items)
106 {
107 vector->items = tmp;
108 return false;
109 }
110 vector->capacity /= 2;
111 }
112 return true;
113}
114
115void delete_vector(Vector* vector, void (*rmv)(void*))
116{
117 for(size_t i = 0; i < vector->length; i++)
118 {
119 if(rmv)
120 rmv(vector->items[i]);
121 else
122 free(vector->items[i]);
123 }
124 free(vector);
125}
126