#pragma once #define DEFAULT_ARRAY_SIZE 10 typedef struct { void *value; size_t element_size; size_t size; size_t capacity; } Array; typedef struct { int initial_size; size_t element_size; } ArrayCreateOptions; #define DEFAULT_ARRAY_CREATE_OPTIONS \ (ArrayCreateOptions){ DEFAULT_ARRAY_SIZE, sizeof(int) } Array *array_create(const ArrayCreateOptions *options); void array_deconstructor(Array **pp_array); void array_resize(Array *p_array, size_t new_size); void *array_get_value(const Array *p_array, size_t index); void array_set_value(Array *p_array, size_t index, const void *value); size_t array_get_size(const Array *p_array); size_t array_get_capacity(const Array *p_array); #define array_get_value_as(type, arr, idx) \ (sizeof(type) == (arr)->element_size) ? \ (type*)array_get_value(arr, idx) : \ NULL #define array_set_value_as(type, arr, idx, value) \ ((sizeof(type) == (arr)->element_size) ? \ (array_set_value((arr), (idx), (value)), 0) : \ -1)