72 lines
1.8 KiB
C
72 lines
1.8 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#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;
|
|
}
|