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