Initial append

This commit is contained in:
Warwick 2024-04-26 12:18:50 +01:00
commit f78fc942c2
4 changed files with 94 additions and 0 deletions

17
CMakeLists.txt Normal file
View file

@ -0,0 +1,17 @@
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
project(dynarr
VERSION 0
DESCRIPTION "Simple Dynamic Arrays"
HOMEPAGE_URL "https://git.warwick-new.co.uk/"
LANGUAGES C
)
set(CMAKE_C_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Executables
file(GLOB_RECURSE SOURCE_FILES
${CMAKE_SOURCE_DIR}/src/*.c)
file(GLOB_RECURSE HEADER_FILES
${CMAKE_SOURCE_DIR}/src/*.h)
add_executable(${PROJECT_NAME} ${HEADER_FILES} ${SOURCE_FILES})

39
src/dyn_arr.c Normal file
View file

@ -0,0 +1,39 @@
// Special thanks to https://bytesbeneath.com/p/dynamic-arrays-in-c
#include "dyn_arr.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ARRAY_GROWTH_MULTIPLIER 1.3
void *dyn_arr_init(size_t item_size, size_t capacity) {
void *dyna_ptr = NULL;
size_t size = item_size * capacity + sizeof(dyna_header);
dyna_header *header = malloc(size);
if (header) {
header->capacity = capacity;
header->length = 0;
dyna_ptr = header + 1;
}
return dyna_ptr;
}
void *dyna_ensure_capacity(void *array, size_t item_count, size_t item_size) {
dyna_header *header = dyna_get_header(array);
size_t minimum_capacity = header->length + item_count;
if (header->capacity > minimum_capacity) {
return header + 1;
}
size_t new_capacity = header->capacity * ARRAY_GROWTH_MULTIPLIER;
while (new_capacity < minimum_capacity) {
new_capacity *= ARRAY_GROWTH_MULTIPLIER;
}
size_t new_size = sizeof(dyna_header) + new_capacity * item_size;
header = realloc(header, new_size);
header->capacity = new_capacity;
return header + 1;
}

24
src/dyn_arr.h Normal file
View file

@ -0,0 +1,24 @@
#pragma once
#include <stdlib.h>
#define ARRAY_INITIAL_CAPACITY 4
typedef struct dyna_header {
size_t capacity;
size_t length;
} dyna_header;
#define dyna_init(T) (T *)dyn_arr_init(sizeof(T), ARRAY_INITIAL_CAPACITY)
void *dyn_arr_init(size_t item_size, size_t capacity);
#define dyna_append(array, value) \
((array) = dyna_ensure_capacity(array, 1, sizeof(value)), \
(array)[dyna_get_header(array)->length] = (value), \
&(array)[dyna_get_header(array)->length++])
#define dyna_get_header(array) ((dyna_header *)(array) - 1)
#define dyna_length(array) (array_header(array)->length)
#define dyna_capacity(array) (array_header(array)->capacity)
void *dyna_ensure_capacity(void *array, size_t item_count, size_t item_size);

14
src/main.c Normal file
View file

@ -0,0 +1,14 @@
#include "dyn_arr.h"
#include <stdio.h>
#include <stdlib.h>
int main() {
int *dyna_array = dyna_init(int);
for (int i = 0; i < 999999999; i++) {
dyna_append(dyna_array, i);
}
printf("capacity %zu\n", dyna_get_header(dyna_array)->capacity);
return EXIT_SUCCESS;
}