9 #define INITIAL_CAPACITY 64
14 #define CHECK(x) _check(x)
21 assert(v->capacity > 0);
22 assert(v->length <= v->capacity);
23 assert(v->length < SIZE_MAX);
28 v_new(void (*elt_dtor)(void *))
30 vector *v = malloc(sizeof *v);
31 void **elts = malloc(INITIAL_CAPACITY * sizeof *elts);
39 .capacity = INITIAL_CAPACITY,
57 v_length(const vector *v)
59 return v ? v->length : SIZE_MAX;
63 v_set_length(vector *v, size_t len)
65 if (!v || len == SIZE_MAX)
67 if (v->elt_dtor) /* free any, if necessary */
68 for (size_t i = len; i < v->length; i++)
69 v->elt_dtor(v->elts[i]);
70 if (!v_reserve_capacity(v, len))
72 for (size_t i = v->length; i < len; i++)
81 v_capacity(const vector *v)
83 return v ? v->capacity : 0;
87 v_reserve_capacity(vector *v, size_t desired)
91 if (desired <= v->capacity)
93 size_t n = v->capacity;
94 while (n < desired && n <= SIZE_MAX/2)
97 n = desired; /* > SIZE_MAX/2 */
98 void **enlarged = realloc(v->elts, n);
109 v_is_empty(const vector *v)
111 return v_length(v) == 0;
115 v_at(const vector *v, size_t i)
117 if (!v || i >= v->length)
126 v_first(const vector *v)
132 v_last(const vector *v)
134 /* when length is 0, length-1 is SIZE_MAX */
135 return v_at(v, v_length(v)-1);
139 v_append(vector *v, void *e)
141 return v_insert(v, v_length(v), e);
145 v_prepend(vector *v, void *e)
147 return v_insert(v, 0, e);
151 v_remove_first(vector *v)
153 return v_remove(v, 0, 1);
157 v_remove_last(vector *v)
159 return v_remove(v, v_length(v)-1, 1);
163 v_insert(vector *v, size_t i, void *elt)
165 if (!v || !v_reserve_capacity(v, v->length+1))
167 memmove(v->elts+i+1, v->elts+i, (v->length - i) * sizeof *v->elts);
176 v_swap(vector *v, size_t i, size_t j)
178 if (!v || i >= v->length || j >= v->length)
180 void *t = v->elts[i];
181 v->elts[i] = v->elts[j];
195 v_find_index(const vector *v, const void *needle,
196 int (*cmp)(const void *, const void *))
200 for (size_t i = 0; i < v->length; i++)
201 if (cmp(v->elts[i], needle) == 0)
207 v_find_last_index(const vector *v, const void *needle,
208 int (*cmp)(const void *, const void *))
212 for (size_t i = v->length-1; i < SIZE_MAX; i--)
213 if (cmp(v->elts[i], needle) == 0)
219 v_sort(vector *v, int (*cmp)(const void *, const void *))
223 qsort(v->elts, v->length, sizeof v->elts[0], cmp);