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