#include #include #include #include "dynamic_array.h" Array *array_create(const ArrayCreateOptions *options) { const ArrayCreateOptions opt = options != NULL ? *options : DEFAULT_ARRAY_CREATE_OPTIONS; Array *array = malloc(sizeof(Array)); array->capacity = opt.initial_size; array->value = calloc(array->capacity, opt.element_size); array->size = 0; array->element_size = opt.element_size; return array; } void array_deconstructor(Array **pp_array) { if (*pp_array == NULL) return; free((*pp_array)->value); free(*pp_array); *pp_array = NULL; } void array_resize(Array *p_array, const size_t new_size) { int *new_ptr = realloc(p_array->value, new_size*p_array->element_size); if (new_ptr == NULL) { exit(1); } if (new_size > p_array->capacity) { memset(new_ptr + p_array->capacity, 0, (new_size - p_array->capacity) * p_array->element_size); } p_array->value = new_ptr; p_array->capacity = new_size; } void *array_get_value(const Array *p_array, const size_t index) { if (index > p_array->capacity) { return NULL; } return p_array->value + index * p_array->element_size; } void array_set_value(Array *p_array, const size_t index, const void *value) { if (index > p_array->capacity) { size_t new_size = p_array->capacity; while (index >= new_size) { new_size *= 2; } array_resize(p_array, new_size); } memcpy( array_get_value(p_array, index), value, p_array->element_size ); if (index >= p_array->size) { p_array->size = index + 1; } } size_t array_get_size(const Array *p_array) { return p_array->size; } size_t array_get_capacity(const Array *p_array) { return p_array->capacity; }