Renamed DynArray to DArray and added first tests
This commit is contained in:
114
include/DArray.h
Normal file
114
include/DArray.h
Normal file
@@ -0,0 +1,114 @@
|
||||
#ifndef SCUFCONT_DARRAY_H_
|
||||
#define SCUFCONT_DARRAY_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h> // IWYU pragma: keep
|
||||
#include <string.h>
|
||||
|
||||
#include "scufcont.h"
|
||||
|
||||
// #define SCUFCONT_BOUNDS_CHECK
|
||||
|
||||
#ifdef SCUFCONT_BOUNDS_CHECK
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#endif // SCUFCONT_BOUNDS_CHECK
|
||||
|
||||
#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_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);
|
||||
|
||||
// SCDARRAY_ALLOC_SIG(type, SCDArray_##type_name, SCDArray_##type_name##_alloc); \
|
||||
// SCDARRAY_PUSH_BACK_SIG(type, SCDArray_##type_name, SCDArray_##type_name##_push_back);
|
||||
|
||||
#define SCDARRAY_STRUCT(type, type_name) \
|
||||
typedef struct { \
|
||||
type* data; \
|
||||
size_t len; \
|
||||
size_t capacity; \
|
||||
} SCDArray_##type_name;
|
||||
|
||||
// SCDARRAY_STRUCT(int);
|
||||
|
||||
#define SCDARRAY_ALLOC_SIG(type, type_name, func_name) ScufContResult func_name(type_name* darr)
|
||||
|
||||
#define SCDARRAY_ALLOC(type, type_name, func_name) \
|
||||
SCDARRAY_ALLOC_SIG(type, type_name, func_name) { \
|
||||
darr->data = (type*) calloc(1, sizeof(type)); \
|
||||
if (darr->data == NULL) { \
|
||||
return SCUFCONT_OUT_OF_MEMORY; \
|
||||
} \
|
||||
darr->len = 0; \
|
||||
darr->capacity = 1; \
|
||||
return SCUFCONT_SUCCESS; \
|
||||
}
|
||||
|
||||
#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) \
|
||||
SCDARRAY_IS_NULL_SIG(type, type_name, func_name) { \
|
||||
return darr->data == NULL; \
|
||||
}
|
||||
|
||||
// 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(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_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);
|
||||
|
||||
#ifdef SCUFCONT_BOUNDS_CHECK
|
||||
|
||||
#define SCDARRAY_AT(type, type_name, func_name) \
|
||||
SCDARRAY_AT_SIG(type, type_name, func_name) { \
|
||||
if (i < 0 || i > darr->len) { \
|
||||
fprintf(stderr, #func_name " out-of-bounds. i: %zu, len: %zu", i, darr->len); \
|
||||
exit(1); \
|
||||
} \
|
||||
\
|
||||
return darr->data + i; \
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#define SCDARRAY_AT(type, type_name, func_name) \
|
||||
SCDARRAY_AT_SIG(type, type_name, func_name) { \
|
||||
return darr->data + i; \
|
||||
}
|
||||
|
||||
#endif // SCUFCONT_BOUNDS_CHECK
|
||||
|
||||
// SCDARRAY_AT(char*, SCDArray_charp, SCDArray_charp_at)
|
||||
|
||||
#endif // SCUFCONT_DARRAY_H_
|
||||
Reference in New Issue
Block a user