summaryrefslogtreecommitdiff
path: root/src/std/containers/darray.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/std/containers/darray.h')
-rw-r--r--src/std/containers/darray.h151
1 files changed, 0 insertions, 151 deletions
diff --git a/src/std/containers/darray.h b/src/std/containers/darray.h
deleted file mode 100644
index 080afb4..0000000
--- a/src/std/containers/darray.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/**
- * @file darray.h
- * @brief Typed dynamic array
- * @copyright Copyright (c) 2023
- */
-// COPIED FROM KITC WITH SOME MINOR ADJUSTMENTS
-
-/* TODO:
- - a 'find' function that takes a predicate (maybe wrap with a macro so we dont have to define a
- new function?)
-*/
-
-#ifndef KITC_TYPED_ARRAY_H
-#define KITC_TYPED_ARRAY_H
-
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define DARRAY_DEFAULT_CAPACITY 64
-#define DARRAY_RESIZE_FACTOR 3
-
-/** @brief create a new darray type and functions with type `N` */
-#define typed_array(T) \
- struct { \
- /* @brief current number of items in the array */ \
- size_t len; \
- size_t capacity; \
- T* data; \
- }
-
-#define typed_array_iterator(T) \
- struct { \
- T##_darray* array; \
- size_t current_idx; \
- }
-
-#define PREFIX static
-
-#define KITC_DECL_TYPED_ARRAY(T) DECL_TYPED_ARRAY(T, T)
-
-#define DECL_TYPED_ARRAY(T, Type) \
- typedef typed_array(T) Type##_darray; \
- typedef typed_array_iterator(Type) Type##_darray_iter; \
- \
- /* Create a new one growable array */ \
- PREFIX Type##_darray* Type##_darray_new(size_t starting_capacity) { \
- Type##_darray* d; \
- T* data; \
- d = malloc(sizeof(Type##_darray)); \
- data = malloc(starting_capacity * sizeof(T)); \
- \
- d->len = 0; \
- d->capacity = starting_capacity; \
- d->data = data; \
- \
- return d; \
- } \
- \
- PREFIX void Type##_darray_free(Type##_darray* d) { \
- if (d != NULL) { \
- free(d->data); \
- free(d); \
- } \
- } \
- \
- PREFIX T* Type##_darray_resize(Type##_darray* d, size_t capacity) { \
- /* resize the internal data block */ \
- T* new_data = realloc(d->data, sizeof(T) * capacity); \
- /* TODO: handle OOM error */ \
- \
- d->capacity = capacity; \
- d->data = new_data; \
- return new_data; \
- } \
- \
- PREFIX void Type##_darray_push(Type##_darray* d, T value) { \
- if (d->len >= d->capacity) { \
- size_t new_capacity = \
- d->capacity > 0 ? d->capacity * DARRAY_RESIZE_FACTOR : DARRAY_DEFAULT_CAPACITY; \
- T* resized = Type##_darray_resize(d, new_capacity); \
- (void)resized; \
- } \
- \
- d->data[d->len] = value; \
- d->len += 1; \
- } \
- \
- PREFIX void Type##_darray_push_copy(Type##_darray* d, const T* value) { \
- if (d->len >= d->capacity) { \
- size_t new_capacity = \
- d->capacity > 0 ? d->capacity * DARRAY_RESIZE_FACTOR : DARRAY_DEFAULT_CAPACITY; \
- T* resized = Type##_darray_resize(d, new_capacity); \
- (void)resized; \
- } \
- \
- T* place = d->data + d->len; \
- d->len += 1; \
- memcpy(place, value, sizeof(T)); \
- } \
- \
- PREFIX void Type##_darray_pop(Type##_darray* d, T* dest) { \
- T* item = d->data + (d->len - 1); \
- d->len -= 1; \
- memcpy(dest, item, sizeof(T)); \
- } \
- \
- PREFIX void Type##_darray_ins(Type##_darray* d, const T* value, size_t index) { \
- /* check if requires resize */ \
- if (d->len + 1 > d->capacity) { \
- size_t new_capacity = \
- d->capacity > 0 ? d->capacity * DARRAY_RESIZE_FACTOR : DARRAY_DEFAULT_CAPACITY; \
- T* resized = Type##_darray_resize(d, new_capacity); \
- (void)resized; \
- } \
- \
- /* shift existing data after index */ \
- T* insert_dest = d->data + index; \
- T* shift_dest = insert_dest + 1; \
- \
- int num_items = d->len - index; \
- \
- d->len += 1; \
- memcpy(shift_dest, insert_dest, num_items * sizeof(T)); \
- memcpy(insert_dest, value, sizeof(T)); \
- } \
- \
- PREFIX void Type##_darray_clear(Type##_darray* d) { \
- d->len = 0; \
- memset(d->data, 0, d->capacity * sizeof(T)); \
- } \
- \
- PREFIX size_t Type##_darray_len(Type##_darray* d) { return d->len; } \
- \
- PREFIX Type##_darray_iter Type##_darray_iter_new(Type##_darray* d) { \
- Type##_darray_iter iterator; \
- iterator.array = d; \
- iterator.current_idx = 0; \
- return iterator; \
- } \
- \
- PREFIX void* Type##_darray_iter_next(Type##_darray_iter* iterator) { \
- if (iterator->current_idx < iterator->array->len) { \
- return &iterator->array->data[iterator->current_idx++]; \
- } else { \
- return NULL; \
- } \
- }
-
-#endif // KITC_TYPED_ARRAY_H