diff --git a/clib/cdynarr.c b/clib/cdynarr.c index 36b54e5..de28b9d 100644 --- a/clib/cdynarr.c +++ b/clib/cdynarr.c @@ -64,6 +64,16 @@ void cintarr_free(cintarr_t* array) { /* Float array */ +cfltarr_t* new_cfltarr(void) { + cfltarr_t* arr = malloc(sizeof(cfltarr_t)); + if (arr == NULL) return NULL; + if (cfltarr_init(arr) == NULL) { + cfltarr_free(arr); + return NULL; + } + return arr; +} + void* cfltarr_init(cfltarr_t* array) { array->data = malloc(INIT_CAPA * sizeof(double)); if (array->data == NULL) return NULL; @@ -75,8 +85,9 @@ void* cfltarr_init(cfltarr_t* array) { void* cfltarr_append(cfltarr_t* array, double add) { if (array->size + 1 > array->capa) { - size_t newcapa = (array->capa * 10) / 6 ; - double* newarray = realloc(array->data, newcapa); + size_t newcapa = (array->capa * 10) / 6; + size_t memsize = newcapa * sizeof(double); + double* newarray = realloc(array->data, memsize); if (newarray == NULL) return NULL; array->capa = newcapa; array->data = newarray; @@ -94,6 +105,11 @@ void cfltarr_destroy(cfltarr_t* array) { free(array->data); } +void cfltarr_free(cfltarr_t* array) { + if (array == NULL) return; + cfltarr_destroy(array); + free(array); +} /* Bool array */ cboolarr_t* new_cboolarr(void) { @@ -117,8 +133,9 @@ void* cboolarr_init(cboolarr_t* array) { void* cboolarr_append(cboolarr_t* array, bool add) { if (array->size + 1 > array->capa) { - size_t newcapa = (array->capa * 10) / 6 ; - bool* newarray = realloc(array->data, newcapa); + size_t newcapa = (array->capa * 10) / 6; + size_t memsize = newcapa * sizeof(bool); + bool* newarray = realloc(array->data, memsize); if (newarray == NULL) return NULL; array->capa = newcapa; array->data = newarray; @@ -127,12 +144,18 @@ void* cboolarr_append(cboolarr_t* array, bool add) { return array->data; } +bool* cboolarr_getref(cboolarr_t* array) { + return array->data; +} + void cboolarr_destroy(cboolarr_t* array) { if (array == NULL) return; free(array->data); } void cboolarr_free(cboolarr_t* array) { + if (array == NULL) return; cboolarr_destroy(array); - free(array->data); + free(array); } + diff --git a/clib/cdynarr_test.c b/clib/cdynarr_test.c index cc7e8cd..abacf74 100644 --- a/clib/cdynarr_test.c +++ b/clib/cdynarr_test.c @@ -13,8 +13,14 @@ void test01(void) { cintarr_t* arr = new_cintarr(); - cintarr_append(arr, 12); - cintarr_append(arr, 12); + const size_t size = 1024 * 1024 * 32; + for (size_t i = 0; i < size; i++) { + cintarr_append(arr, (int64_t)i); + } + for (size_t i = 0; i < size; i++) { + MASSERT(arr->data[i] == i); + } + MASSERT(arr->size == size); cintarr_free(arr); }