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_pop_at(Vector* vector, size_t index)
21{
22 void* tmp = vector_at(vector, index);
23 if(!tmp)
24 {
25 return NULL;
26 } else {
27 vector_remove(vector, index, NULL);
28 return tmp;
29 }
30}
31
32void vector_remove_range(Vector* vector, size_t index, size_t length, void (*rmv)(void*))
33{
34 size_t i;
35 if(rmv)
36 {
37 for(i = index; i < length; i++)
38 {
39 rmv(vector_at(vector, i));
40 }
41 }
42 memmove(vector->items+index, vector->items+index+length, (vector->length-(index+length))*sizeof(*vector->items));
43 vector->length -= length;
44}
45
46size_t* vector_find(const Vector* haystack, const void* needle, int (*cmp)(const void*, const void*))
47{
48 size_t i, *ret;
49
50 for(i = 0; i < haystack->length; i++)
51 {
52 if(cmp(haystack->items[i],needle) == 0)
53 {
54 ret = malloc(sizeof(*ret));
55 *ret = i;
56 return ret;
57 }
58 }
59 return NULL;
60}
61
62bool vector_insert(Vector* vector, size_t index, void* item)
63{
64 if(index > vector->length || vector->length == SIZE_MAX || !vector_adjust_size(vector, vector->length+1))
65 return false;
66
67 memmove(vector->items+index+1, vector->items+index, (vector->length-index)*sizeof(*vector->items));
68 vector->items[index] = item;
69 vector->length++;
70 return true;
71}
72
73bool vector_adjust_size(Vector* vector, size_t size)
74{
75 while(vector->capacity < size)
76 {
77 void** tmp = vector->items;
78 vector->items = cutil_reallocarray_inc(vector->items, vector->capacity, sizeof(*vector->items), vector->capacity);
79 if(!vector->items)
80 {
81 vector->items = tmp;
82 return false;
83 }
84 vector->capacity *= 2;
85 }
86 return true;
87}
88
89bool vector_shrink(Vector* vector)
90{
91 while(vector->capacity > (vector->length*2))
92 {
93 void** tmp = vector->items;
94 vector->items = cutil_reallocarray(vector->items, vector->capacity/2, sizeof(*vector->items));
95 if(!vector->items)
96 {
97 vector->items = tmp;
98 return false;
99 }
100 vector->capacity /= 2;
101 }
102 return true;
103}
104
105void delete_vector(Vector* vector, void (*rmv)(void*))
106{
107 if(rmv)
108 {
109 size_t i;
110 for(i = 0; i < vector->length; i++)
111 {
112 rmv(vector->items[i]);
113 }
114 }
115 free(vector->items);
116 free(vector);
117}
118