arraylist

This commit is contained in:
2020-06-06 19:07:55 +02:00
parent 528d0dd06f
commit ebb7c6eeee
6 changed files with 53 additions and 3 deletions

3
.gitignore vendored
View File

@ -64,4 +64,5 @@ install_manifest.txt
compile_commands.json
CTestTestfile.cmake
_deps
# ---> Extra
vgcore.*

View File

@ -1,5 +1,5 @@
project(advanced_C_standard_library C)
set_property(GLOBAL PROPERTY C_STANDARD 99)
set_property(GLOBAL PROPERTY C_STANDARD 11)
cmake_minimum_required(VERSION 3.9)
include_directories(src)
file(GLOB SOURCES "src/*.c")

View File

@ -1,3 +1,4 @@
#!/bin/sh
cmake .
make
./build/test.out

37
src/array.c Normal file
View File

@ -0,0 +1,37 @@
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
union arraylist_meta {
max_align_t dummy_align;
struct {
size_t len;
size_t cap;
size_t sizeof_one_element;
};
};
void* arraylist_create(size_t array_size, size_t sizeof_one_element) {
union arraylist_meta *arraylist_new = malloc(array_size * sizeof_one_element + sizeof*arraylist_new);
arraylist_new->len = array_size;
arraylist_new->cap = array_size;
arraylist_new->sizeof_one_element = sizeof_one_element;
return arraylist_new+1;
}
void* arraylist_append(void *arraylist_void, void *element_void) {
char *element = element_void;
union arraylist_meta *arraylist = arraylist_void;
--arraylist;
if(arraylist->len == arraylist->cap) {
arraylist->cap = arraylist->len + 10;
arraylist = realloc(arraylist, arraylist->cap * arraylist->sizeof_one_element + sizeof *arraylist);
}
char *arraylist_char = (char*)(arraylist+1);
arraylist_char += arraylist->sizeof_one_element * arraylist->len;
for(size_t i = 0; i < arraylist->sizeof_one_element; ++arraylist_char, ++element, ++i) {
*arraylist_char = *element;
}
++arraylist->len;
return arraylist+1;
}

5
src/array.h Normal file
View File

@ -0,0 +1,5 @@
#ifndef array_h
#define array_h
void* arraylist_create(size_t array_size, size_t sizeof_one_element);
void* arraylist_append(void *arraylist_void, void *element_void);
#endif

View File

@ -1,4 +1,10 @@
#include <stdio.h>
#include "array.h"
int main() {
printf("baum\n");
int *int_array = arraylist_create(2, sizeof (int));
int_array[0] = 28;
int_array[1] = 20;
for(int i = 0; i < 100; ++i) int_array = arraylist_append(int_array, &i);
for(int i = 0; i < 102; ++i) printf("Index: %d Value: %d\n", i, int_array[i]);
}