Add basic list implementation

This commit is contained in:
Abdelrahman Said 2024-06-23 01:43:18 +01:00
parent 65dcd66f76
commit 058dba9276
2 changed files with 86 additions and 0 deletions

60
include/list/typed_list.h Normal file
View File

@ -0,0 +1,60 @@
#ifndef TYPED_LIST_H
#define TYPED_LIST_H
#include "c_cpp_aliases/aliases.h"
#include <assert.h>
#include <string.h>
#define BASE_LIST_CAPACITY 1024
#define CONCAT(A, B, C) A##B##C
#define LIST_TYPE_NAME(T) CONCAT(list_, T, _t)
#define MAKE_LIST_TYPE(T) \
typedef struct { \
T *items; \
u64 capacity; \
u64 count; \
} LIST_TYPE_NAME(T)
#define create_list(T) \
(LIST_TYPE_NAME(T) *)_create_list(sizeof(T), BASE_LIST_CAPACITY)
#define create_list_with_capacity(T, CAPACITY) \
(LIST_TYPE_NAME(T) *)_create_list(sizeof(T), CAPACITY)
#define destroy_list(T, LP) \
do { \
munmap(LP->items, sizeof(T) * LP->capacity); \
LP->items = NULL; \
LP->count = 0; \
LP->capacity = 0; \
munmap(LP, sizeof(LIST_TYPE_NAME(T))); \
} while (0)
#define append(T, LP, ITEM) \
do { \
if (LP->count + 1 >= LP->capacity) { \
u64 new_capacity = LP->capacity * 2; \
T *tmp = _alloc_for_list(sizeof(T) * new_capacity); \
assert(tmp != NULL && "Failed to increase capacity"); \
\
memcpy(tmp, LP->items, sizeof(T) * LP->count); \
\
i32 deallocated = munmap(LP->items, sizeof(T) * LP->capacity); \
assert(deallocated == 0 && "Failed to deallocate old memory"); \
\
LP->capacity = new_capacity; \
LP->items = tmp; \
} \
\
LP->items[(LP->count)++] = ITEM; \
} while (0)
#define get(LP, IDX) LP->items[IDX]
MAKE_LIST_TYPE(void);
list_void_t *_create_list(u64 size, u64 count);
void *_alloc_for_list(u64 size);
#endif // !TYPED_LIST_H

26
src/list/typed_list.c Normal file
View File

@ -0,0 +1,26 @@
#include "list/typed_list.h"
#include <stdlib.h>
#include <sys/mman.h>
list_void_t *_create_list(u64 size, u64 count) {
list_void_t *list = (list_void_t *)_alloc_for_list(sizeof(list_void_t));
if (!list) {
return NULL;
}
list->items = (void *)_alloc_for_list(size * count);
if (!list->items) {
munmap(list, sizeof(list_void_t));
return NULL;
}
list->capacity = count;
list->count = 0;
return list;
}
void *_alloc_for_list(u64 size) {
return mmap(NULL, size, PROT_READ | PROT_WRITE,
MAP_ANON | MAP_NORESERVE | MAP_SHARED, -1, 0);
}