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 = 4;
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)
42{
43 if(index < vector->length)
44 {
45 free(vector->items[index]);
46 memmove(vector->items+index, vector->items+index+1, (vector->length-index-1)*sizeof(*vector->items));
47 vector->length--;
48 }
49}
50
51bool vector_push(Vector* vector, void* item)
52{
53 if(!vector_adjust_size(vector, ++vector->length))
54 return false;
55 vector->items[vector->length-1] = item;
56 return true;
57}
58
59FindReturn vector_find(const Vector* haystack, const void* needle, bool (*cmp)(const void*, const void*))
60{
61 FindReturn ret;
62 for(size_t i = 0; i < haystack->length; i++)
63 {
64 if(cmp)
65 {
66 if(cmp(haystack->items[i],needle))
67 {
68 ret.found = true;
69 ret.index = i;
70 return ret;
71 }
72 } else {
73 if(haystack->items[i] == needle)
74 {
75 ret.found = true;
76 ret.index = i;
77 return ret;
78 }
79 }
80 }
81 ret.found = false;
82 return ret;
83}
84
85bool vector_insert(Vector* vector, size_t index, void* item)
86{
87 if(!vector_adjust_size(vector, ++vector->length))
88 return false;
89
90 memmove(vector->items+index+1, vector->items+index, (vector->length-index)*sizeof(*vector->items));
91 vector->items[index] = item;
92 vector->length++;
93 return true;
94}
95
96bool vector_adjust_size(Vector* vector, size_t size)
97{
98 while(vector->capacity < size)
99 {
100 void** tmp = vector->items;
101 vector->items = realloc(vector->items, vector->capacity*2*(sizeof(*vector->items)));
102 if(!vector->items)
103 {
104 vector->items = tmp;
105 return false;
106 }
107 vector->capacity *= 2;
108 }
109 while(vector->capacity > (size*2))
110 {
111 void** tmp = vector->items;
112 vector->items = realloc(vector->items, vector->capacity/2*(sizeof(*vector->items)));
113 if(!vector->items)
114 {
115 vector->items = tmp;
116 return false;
117 }
118 vector->capacity /= 2;
119 }
120 return true;
121}
122