Added push_back_multiple, free, and remove to DArray. Added tests.

This commit is contained in:
2026-08-13 19:01:13 +03:00
parent 331529a05d
commit 6ce34dfe91
4 changed files with 197 additions and 25 deletions
+65 -24
View File
@@ -6,7 +6,7 @@
#include <stdlib.h> // IWYU pragma: keep
#include <string.h>
#include "scufcont.h"
#include "scufcont.h" // IWYU pragma: keep
// #define SCUFCONT_BOUNDS_CHECK
@@ -18,21 +18,27 @@
#define SCDARRAY_EXPANDER(macro, type, type_name, func_name) macro(type, SCDArray_##type_name, SCDArray_##type_name##_##func_name)
#define SCDARRAY_IMPL(type, type_name) \
SCDARRAY_EXPANDER(SCDARRAY_ALLOC, type, type_name, alloc) \
SCDARRAY_EXPANDER(SCDARRAY_IS_NULL, type, type_name, is_null) \
SCDARRAY_EXPANDER(SCDARRAY_PUSH_BACK, type, type_name, push_back) \
SCDARRAY_EXPANDER(SCDARRAY_AT, type, type_name, at)
#define SCDARRAY_IMPL(type, type_name) \
SCDARRAY_EXPANDER(SCDARRAY_ALLOC, type, type_name, alloc) \
SCDARRAY_EXPANDER(SCDARRAY_FREE, type, type_name, free) \
SCDARRAY_EXPANDER(SCDARRAY_IS_NULL, type, type_name, is_null) \
SCDARRAY_EXPANDER(SCDARRAY_PUSH_BACK, type, type_name, push_back) \
SCDARRAY_EXPANDER(SCDARRAY_PUSH_BACK_MULTIPLE, type, type_name, push_back_multiple) \
SCDARRAY_EXPANDER(SCDARRAY_AT, type, type_name, at) \
SCDARRAY_EXPANDER(SCDARRAY_REMOVE, type, type_name, remove)
#define SCDARRAY_HEADER(type, type_name) \
SCDARRAY_STRUCT(type, type_name) \
SCDARRAY_SIGS(type, type_name)
#define SCDARRAY_SIGS(type, type_name) \
SCDARRAY_EXPANDER(SCDARRAY_ALLOC_SIG, type, type_name, alloc); \
SCDARRAY_EXPANDER(SCDARRAY_IS_NULL_SIG, type, type_name, is_null); \
SCDARRAY_EXPANDER(SCDARRAY_PUSH_BACK_SIG, type, type_name, push_back); \
SCDARRAY_EXPANDER(SCDARRAY_AT_SIG, type, type_name, at);
#define SCDARRAY_SIGS(type, type_name) \
SCDARRAY_EXPANDER(SCDARRAY_ALLOC_SIG, type, type_name, alloc); \
SCDARRAY_EXPANDER(SCDARRAY_FREE_SIG, type, type_name, free); \
SCDARRAY_EXPANDER(SCDARRAY_IS_NULL_SIG, type, type_name, is_null); \
SCDARRAY_EXPANDER(SCDARRAY_PUSH_BACK_SIG, type, type_name, push_back); \
SCDARRAY_EXPANDER(SCDARRAY_PUSH_BACK_MULTIPLE_SIG, type, type_name, push_back_multiple); \
SCDARRAY_EXPANDER(SCDARRAY_AT_SIG, type, type_name, at); \
SCDARRAY_EXPANDER(SCDARRAY_REMOVE_SIG, type, type_name, remove);
// SCDARRAY_ALLOC_SIG(type, SCDArray_##type_name, SCDArray_##type_name##_alloc); \
// SCDARRAY_PUSH_BACK_SIG(type, SCDArray_##type_name, SCDArray_##type_name##_push_back);
@@ -59,6 +65,13 @@
return SCUFCONT_SUCCESS; \
}
#define SCDARRAY_FREE_SIG(type, type_name, func_name) void func_name(type_name* darr)
#define SCDARRAY_FREE(type, type_name, func_name) \
SCDARRAY_FREE_SIG(type, type_name, func_name) { \
free(darr->data); \
}
#define SCDARRAY_IS_NULL_SIG(type, type_name, func_name) bool func_name(const type_name* darr)
#define SCDARRAY_IS_NULL(type, type_name, func_name) \
@@ -68,22 +81,40 @@
// SCDARRAY_ALLOC(int, SCDArray_int, SCDArray_int_alloc);
#define SCDARRAY_PUSH_BACK_SIG(type, type_name, func_name) int func_name(type_name* darr, const type* new_elem)
#define SCDARRAY_PUSH_BACK_SIG(type, type_name, func_name) ScufContResult func_name(type_name* darr, const type* new_elem)
#define SCDARRAY_PUSH_BACK(type, type_name, func_name) \
SCDARRAY_PUSH_BACK_SIG(type, type_name, func_name) { \
if (darr->len + 1 > darr->capacity) { \
darr->capacity *= 2; \
darr->data = (type*) realloc(darr->data, darr->capacity * sizeof(type)); \
if (darr->data == NULL) { \
return -1; \
} \
} \
memcpy(darr->data + darr->len, new_elem, sizeof(type)); \
darr->len++; \
return 1; \
#define SCDARRAY_PUSH_BACK(type, type_name, func_name) \
SCDARRAY_PUSH_BACK_SIG(type, type_name, func_name) { \
if (darr->len + 1 > darr->capacity) { \
darr->capacity *= 2; \
darr->data = (type*) realloc(darr->data, darr->capacity * sizeof(*new_elem)); \
if (darr->data == NULL) { \
return SCUFCONT_OUT_OF_MEMORY; \
} \
} \
memcpy(darr->data + darr->len, new_elem, sizeof(*new_elem)); \
darr->len++; \
return SCUFCONT_SUCCESS; \
}
#define SCDARRAY_PUSH_BACK_MULTIPLE_SIG(type, type_name, func_name) ScufContResult func_name(type_name* darr, const type* new_elems, const size_t new_elems_n)
#define SCDARRAY_PUSH_BACK_MULTIPLE(type, type_name, func_name) \
SCDARRAY_PUSH_BACK_MULTIPLE_SIG(type, type_name, func_name) { \
if (darr->len + new_elems_n > darr->capacity) { \
darr->data = (type*) realloc(darr->data, (darr->capacity + new_elems_n) * sizeof(type)); \
if (darr->data == NULL) { \
return SCUFCONT_OUT_OF_MEMORY; \
} \
darr->capacity += new_elems_n; \
} \
memcpy(darr->data + darr->len, new_elems, sizeof(type) * new_elems_n); \
darr->len += new_elems_n; \
return SCUFCONT_SUCCESS; \
}
// SCDARRAY_PUSH_BACK_MULTIPLE(int, SCDArray_int, SCDArray_int_push_back_multiple)
#define SCDARRAY_AT_SIG(type, type_name, func_name) type* func_name(type_name* darr, const size_t i)
// SCDARRAY_PUSH_BACK(int, SCDArray_int, SCDArray_int_push_back);
@@ -111,4 +142,14 @@
// SCDARRAY_AT(char*, SCDArray_charp, SCDArray_charp_at)
#define SCDARRAY_REMOVE_SIG(type, type_name, func_name) void func_name(type_name* darr, const size_t i)
#define SCDARRAY_REMOVE(type, type_name, func_name) \
SCDARRAY_REMOVE_SIG(type, type_name, func_name) { \
memmove(darr->data + i, darr->data + i + 1, (darr->len - i) * sizeof(type)); \
darr->len--; \
}
// SCDARRAY_REMOVE(char*, SCDArray_charp, SCDArray_charp_remove)
#endif // SCUFCONT_DARRAY_H_