#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *data;
size_t capacity;
size_t size;
const size_t element_size;
} vector;
vector vector_init(size_t initial_capacity, size_t element_size) {
if(!initial_capacity) {
initial_capacity = 1;
}
vector result = {
malloc(initial_capacity
*element_size
), initial_capacity,
0,
element_size
};
return result;
}
char *vector_get(vector *vec, size_t idx) {
return vec->size > idx
? vec->data + idx*vec->element_size
: NULL;
}
void vector_reserve(vector *vec, size_t size) {
if(vec->capacity >= size) {
return;
}
vec->capacity = size;
vec
->data
= realloc(vec
->data
, vec
->capacity
*size
);}
void vector_push(vector *vec, void *data) {
if(vec->size >= vec->capacity) {
vector_reserve(vec, vec->capacity*2);
}
memcpy(vec
->data
+ vec
->size
*vec
->element_size
, data
, vec
->element_size
); vec->size += 1;
}
size_t vector_size(vector const *vec) {
return vec->size;
}
size_t vector_capacity(vector const *vec) {
return vec->capacity;
}
void vector_free(vector *vec) {
}
int main(void) {
int initial_capacity = 0;
vector vec = vector_init(initial_capacity, sizeof(int));
int i = 10;
while(i --> 0) {
vector_push(&vec, &i);
}
printf("vector size: %d\n", vector_size
(&vec
)); printf("vector capacity: %d\n", vector_capacity
(&vec
)); for(i = 0; i < vector_size(&vec); ++i) {
printf(" vec[%d]: %d\n", i
, *(int*)vector_get
(&vec
, i
)); }
vector_free(&vec);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdHlwZWRlZiBzdHJ1Y3QgewoJY2hhciAqZGF0YTsKCXNpemVfdCBjYXBhY2l0eTsKCXNpemVfdCBzaXplOwoJY29uc3Qgc2l6ZV90IGVsZW1lbnRfc2l6ZTsKfSB2ZWN0b3I7Cgp2ZWN0b3IgdmVjdG9yX2luaXQoc2l6ZV90IGluaXRpYWxfY2FwYWNpdHksIHNpemVfdCBlbGVtZW50X3NpemUpIHsKCWlmKCFpbml0aWFsX2NhcGFjaXR5KSB7CgkJaW5pdGlhbF9jYXBhY2l0eSA9IDE7Cgl9Cgl2ZWN0b3IgcmVzdWx0ID0gewoJCW1hbGxvYyhpbml0aWFsX2NhcGFjaXR5KmVsZW1lbnRfc2l6ZSksCgkJaW5pdGlhbF9jYXBhY2l0eSwKCQkwLAoJCWVsZW1lbnRfc2l6ZQoJfTsKCXJldHVybiByZXN1bHQ7Cn0KCmNoYXIgKnZlY3Rvcl9nZXQodmVjdG9yICp2ZWMsIHNpemVfdCBpZHgpIHsKCXJldHVybiB2ZWMtPnNpemUgPiBpZHgKCQk/IHZlYy0+ZGF0YSArIGlkeCp2ZWMtPmVsZW1lbnRfc2l6ZQoJCTogTlVMTDsKfQoKdm9pZCB2ZWN0b3JfcmVzZXJ2ZSh2ZWN0b3IgKnZlYywgc2l6ZV90IHNpemUpIHsKCWlmKHZlYy0+Y2FwYWNpdHkgPj0gc2l6ZSkgewoJCXJldHVybjsKCX0KCQoJdmVjLT5jYXBhY2l0eSA9IHNpemU7Cgl2ZWMtPmRhdGEgPSByZWFsbG9jKHZlYy0+ZGF0YSwgdmVjLT5jYXBhY2l0eSpzaXplKTsKfQoKdm9pZCB2ZWN0b3JfcHVzaCh2ZWN0b3IgKnZlYywgdm9pZCAqZGF0YSkgewoJaWYodmVjLT5zaXplID49IHZlYy0+Y2FwYWNpdHkpIHsKCQl2ZWN0b3JfcmVzZXJ2ZSh2ZWMsIHZlYy0+Y2FwYWNpdHkqMik7Cgl9CgkKCW1lbWNweSh2ZWMtPmRhdGEgKyB2ZWMtPnNpemUqdmVjLT5lbGVtZW50X3NpemUsIGRhdGEsIHZlYy0+ZWxlbWVudF9zaXplKTsKCXZlYy0+c2l6ZSArPSAxOwp9CgpzaXplX3QgdmVjdG9yX3NpemUodmVjdG9yIGNvbnN0ICp2ZWMpIHsKCXJldHVybiB2ZWMtPnNpemU7Cn0KCnNpemVfdCB2ZWN0b3JfY2FwYWNpdHkodmVjdG9yIGNvbnN0ICp2ZWMpIHsKCXJldHVybiB2ZWMtPmNhcGFjaXR5Owp9Cgp2b2lkIHZlY3Rvcl9mcmVlKHZlY3RvciAqdmVjKSB7CglmcmVlKHZlYy0+ZGF0YSk7Cn0KCmludCBtYWluKHZvaWQpIHsKCWludCBpbml0aWFsX2NhcGFjaXR5ID0gMDsKCXZlY3RvciB2ZWMgPSB2ZWN0b3JfaW5pdChpbml0aWFsX2NhcGFjaXR5LCBzaXplb2YoaW50KSk7CglpbnQgaSA9IDEwOwoJCgl3aGlsZShpIC0tPiAwKSB7CgkJdmVjdG9yX3B1c2goJnZlYywgJmkpOwoJfQoJCglwcmludGYoInZlY3RvciBzaXplOiAgICAgJWRcbiIsIHZlY3Rvcl9zaXplKCZ2ZWMpKTsKCXByaW50ZigidmVjdG9yIGNhcGFjaXR5OiAlZFxuIiwgdmVjdG9yX2NhcGFjaXR5KCZ2ZWMpKTsKCXByaW50ZigidmVjdG9yIHZhbHVlczpcbiIpOwoJZm9yKGkgPSAwOyBpIDwgdmVjdG9yX3NpemUoJnZlYyk7ICsraSkgewoJCXByaW50ZigiICB2ZWNbJWRdOiAlZFxuIiwgaSwgKihpbnQqKXZlY3Rvcl9nZXQoJnZlYywgaSkpOwoJfQoJdmVjdG9yX2ZyZWUoJnZlYyk7CglyZXR1cm4gMDsKfQo=