7 #define INITIAL_CAPACITY 64
12 #define CHECK(x) _check(x)
19 assert(v->capacity > 0);
20 assert(v->length <= v->capacity);
21 assert(v->length < SIZE_MAX);
26 v_new(void (*elt_dtor)(void *))
28 vector *v = malloc(sizeof *v);
29 void **elts = malloc(INITIAL_CAPACITY * sizeof *elts);
37 .capacity = INITIAL_CAPACITY,
55 v_length(const vector *v)
57 return v ? v->length : SIZE_MAX;
61 v_set_length(vector *v, size_t len)
63 if (!v || len == SIZE_MAX)
65 if (v->elt_dtor) /* free any, if necessary */
66 for (size_t i = len; i < v->length; i++)
67 v->elt_dtor(v->elts[i]);
68 if (!v_reserve_capacity(v, len))
70 for (size_t i = v->length; i < len; i++)
79 v_capacity(const vector *v)
81 return v ? v->capacity : 0;
84 size_t v_reserve_capacity(vector *v, size_t desired)
88 if (desired <= v->capacity)
91 for (n = v->capacity; n < desired && n < SIZE_MAX/2; n *= 2)
94 n = desired; /* desired >= SIZE_MAX/2 */
95 void **enlarged = realloc(v->elts, n);
108 assert(v_set_length(v, 0));