Initial append
This commit is contained in:
commit
f78fc942c2
4 changed files with 94 additions and 0 deletions
17
CMakeLists.txt
Normal file
17
CMakeLists.txt
Normal 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
39
src/dyn_arr.c
Normal 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
24
src/dyn_arr.h
Normal 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
14
src/main.c
Normal 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;
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue