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