Renamed DynArray to DArray and added first tests

This commit is contained in:
2026-08-09 23:36:48 +03:00
parent faa660125e
commit 331529a05d
10 changed files with 384 additions and 352 deletions

114
include/DArray.h Normal file
View 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_

51
include/DString.h Normal file
View File

@@ -0,0 +1,51 @@
#ifndef SCUFCONT_DSTRING_H_
#define SCUFCONT_DSTRING_H_
#include <stdbool.h>
#include <stddef.h>
#include "scufcont.h"
#define SCDSTRING_FMT(dstr) (int) (dstr).len, (dstr).data
#define SCDString_is_null(dstr) ((dstr)->data == NULL)
#define SCDString_c_str(dstr) ((dstr)->data)
typedef struct {
char* data;
size_t len;
size_t capacity;
} SCDString;
ScufContResult SCDString_alloc(SCDString* dstr, const char* str, const size_t len);
ScufContResult SCDString_reserve(SCDString* dstr, const size_t new_capacity);
void SCDString_free(SCDString* dstr);
bool SCDString_equal(const SCDString* s1, const SCDString* s2);
bool SCDString_equal_c_str(const SCDString* s1, const char* s2);
bool SCDString_equal_next_chars_c_str(
const SCDString* dstr,
const char* str,
const size_t str_len,
const size_t s
);
ScufContResult SCDString_concat_c_str(
SCDString* dstr,
const char* str,
const size_t str_len
);
ScufContResult SCDString_alloc_concat_c_strs(
SCDString* dstr,
const char* s1,
const size_t s1_len,
const char* s2,
const size_t s2_len
);
ScufContResult SCDString_split(
const SCDString* dstr,
const char* delim,
SCDString** split_arr,
size_t* arr_len
);
void SCDString_split_arr_free(SCDString** arr, const size_t arr_len);
#endif // SCUFCONT_DSTRING_H_

View File

@@ -1,111 +0,0 @@
#ifndef DYN_ARRAY_H_
#define DYN_ARRAY_H_
#include <stddef.h>
#include <string.h>
// #define SCUFCONT_BOUNDS_CHECK
#ifdef SCUFCONT_BOUNDS_CHECK
#include <stdio.h>
#include <stdlib.h>
#endif // SCUFCONT_BOUNDS_CHECK
#define DYN_ARRAY_EXPANDER(macro, type, type_name, func_name) macro(type, DynArray_##type_name, DynArray_##type_name##_##func_name);
#define DYN_ARRAY_IMPL(type, type_name) \
DYN_ARRAY_EXPANDER(DYN_ARRAY_ALLOC, type, type_name, alloc) \
DYN_ARRAY_EXPANDER(DYN_ARRAY_IS_NULL, type, type_name, is_null) \
DYN_ARRAY_EXPANDER(DYN_ARRAY_PUSH_BACK, type, type_name, push_back) \
DYN_ARRAY_EXPANDER(DYN_ARRAY_AT, type, type_name, at)
#define DYN_ARRAY_HEADER(type, type_name) \
DYN_ARRAY_STRUCT(type, type_name) \
DYN_ARRAY_SIGS(type, type_name)
#define DYN_ARRAY_SIGS(type, type_name) \
DYN_ARRAY_EXPANDER(DYN_ARRAY_ALLOC_SIG, type, type_name, alloc) \
DYN_ARRAY_EXPANDER(DYN_ARRAY_IS_NULL_SIG, type, type_name, is_null) \
DYN_ARRAY_EXPANDER(DYN_ARRAY_PUSH_BACK_SIG, type, type_name, push_back) \
DYN_ARRAY_EXPANDER(DYN_ARRAY_AT_SIG, type, type_name, at)
// DYN_ARRAY_ALLOC_SIG(type, DynArray_##type_name, DynArray_##type_name##_alloc); \
// DYN_ARRAY_PUSH_BACK_SIG(type, DynArray_##type_name, DynArray_##type_name##_push_back);
#define DYN_ARRAY_STRUCT(type, type_name) \
typedef struct { \
type* data; \
size_t len; \
size_t capacity; \
} DynArray_##type_name;
// DYN_ARRAY_STRUCT(int);
#define DYN_ARRAY_ALLOC_SIG(type, type_name, func_name) bool func_name(type_name* darr)
#define DYN_ARRAY_ALLOC(type, type_name, func_name) \
DYN_ARRAY_ALLOC_SIG(type, type_name, func_name) { \
darr->data = (type*) calloc(1, sizeof(type)); \
if (darr->data == NULL) { \
return false; \
} \
darr->len = 0; \
darr->capacity = 1; \
return true; \
}
#define DYN_ARRAY_IS_NULL_SIG(type, type_name, func_name) bool func_name(const type_name* darr)
#define DYN_ARRAY_IS_NULL(type, type_name, func_name) \
DYN_ARRAY_IS_NULL_SIG(type, type_name, func_name) { \
return darr->data == NULL; \
}
// DYN_ARRAY_ALLOC(int, DynArray_int, DynArray_int_alloc);
#define DYN_ARRAY_PUSH_BACK_SIG(type, type_name, func_name) int func_name(type_name* darr, const type* new_elem)
#define DYN_ARRAY_PUSH_BACK(type, type_name, func_name) \
DYN_ARRAY_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 DYN_ARRAY_AT_SIG(type, type_name, func_name) type* func_name(type_name* darr, const size_t i)
// DYN_ARRAY_PUSH_BACK(int, DynArray_int, DynArray_int_push_back);
#ifdef SCUFCONT_BOUNDS_CHECK
#define DYN_ARRAY_AT(type, type_name, func_name) \
DYN_ARRAY_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 DYN_ARRAY_AT(type, type_name, func_name) \
DYN_ARRAY_AT_SIG(type, type_name, func_name) { \
return darr->data + i; \
}
#endif // SCUFCONT_BOUNDS_CHECK
// DYN_ARRAY_AT(char*, DynArray_charp, DynArray_charp_at)
#endif // DYN_ARRAY_H_

View File

@@ -1,51 +0,0 @@
#ifndef DYN_STRING_H_
#define DYN_STRING_H_
#include <stdbool.h>
#include <stddef.h>
#include "scufcont.h"
#define DYN_STRING_FMT(dstr) (int) (dstr).len, (dstr).data
#define DynString_is_null(dstr) ((dstr)->data == NULL)
#define DynString_c_str(dstr) ((dstr)->data)
typedef struct {
char* data;
size_t len;
size_t capacity;
} DynString;
ScufContResult DynString_alloc(DynString* dstr, const char* str, const size_t len);
ScufContResult DynString_reserve(DynString* dstr, const size_t new_capacity);
void DynString_free(DynString* dstr);
bool DynString_equal(const DynString* s1, const DynString* s2);
bool DynString_equal_c_str(const DynString* s1, const char* s2);
bool DynString_equal_next_chars_c_str(
const DynString* dstr,
const char* str,
const size_t str_len,
const size_t s
);
ScufContResult DynString_concat_c_str(
DynString* dstr,
const char* str,
const size_t str_len
);
ScufContResult DynString_alloc_concat_c_strs(
DynString* dstr,
const char* s1,
const size_t s1_len,
const char* s2,
const size_t s2_len
);
ScufContResult DynString_split(
const DynString* dstr,
const char* delim,
DynString** split_arr,
size_t* arr_len
);
void DynString_split_arr_free(DynString** arr, const size_t arr_len);
#endif // DYN_STRING_H_