diff --git a/src/base/dbl_list/dbl_list.c b/src/base/dbl_list/dbl_list.c index 5249ee9..776822d 100644 --- a/src/base/dbl_list/dbl_list.c +++ b/src/base/dbl_list/dbl_list.c @@ -1,39 +1,49 @@ -/** - * THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN. - */ - #include "./dbl_list.h" +#include "../mem/allocator/mem_allocator.h" #include "../../common/assert/assert.h" #include "../../common/aliases/aliases.h" #include "../../common/platform/platform.h" #include -wapp_intern VoidPList void_ptr_node_to_list(VoidPNode *node); -wapp_intern Str8List str8_node_to_list(Str8Node *node); -wapp_intern B8List b8_node_to_list(B8Node *node); -wapp_intern CharList char_node_to_list(CharNode *node); -wapp_intern C8List c8_node_to_list(C8Node *node); -wapp_intern C16List c16_node_to_list(C16Node *node); -wapp_intern C32List c32_node_to_list(C32Node *node); -wapp_intern I8List i8_node_to_list(I8Node *node); -wapp_intern I16List i16_node_to_list(I16Node *node); -wapp_intern I32List i32_node_to_list(I32Node *node); -wapp_intern I64List i64_node_to_list(I64Node *node); -wapp_intern U8List u8_node_to_list(U8Node *node); -wapp_intern U16List u16_node_to_list(U16Node *node); -wapp_intern U32List u32_node_to_list(U32Node *node); -wapp_intern U64List u64_node_to_list(U64Node *node); -wapp_intern F32List f32_node_to_list(F32Node *node); -wapp_intern F64List f64_node_to_list(F64Node *node); -wapp_intern F128List f128_node_to_list(F128Node *node); -wapp_intern IptrList iptr_node_to_list(IptrNode *node); -wapp_intern UptrList uptr_node_to_list(UptrNode *node); +wapp_intern GenericList _node_to_list(GenericNode *node, u64 item_size); +wapp_intern void _dbl_list_validate(const GenericList *list, u64 item_size); +wapp_intern void _dbl_list_node_validate(const GenericNode *node, u64 item_size); -VoidPNode *wapp_void_ptr_list_get(const VoidPList *list, u64 index) { +GenericList *_dbl_list_alloc(const Allocator *allocator, u64 item_size) { + wapp_debug_assert(allocator != NULL, "`allocator` should not be NULL"); + + GenericList *list = wapp_mem_allocator_alloc(allocator, sizeof(GenericList)); + if (!list) { goto DBL_LIST_ALLOC_RETURN; } + + memset((void *)list, 0, sizeof(GenericList)); + list->magic = WAPP_DBL_LIST_MAGIC; + list->item_size = item_size; + +DBL_LIST_ALLOC_RETURN: + return list; +} + +GenericNode *_dbl_list_node_alloc(const Allocator *allocator, u64 item_size) { + wapp_debug_assert(allocator != NULL, "`allocator` should not be NULL"); + + GenericNode *node = wapp_mem_allocator_alloc(allocator, sizeof(GenericNode)); + if (!node) { goto DBL_LIST_NODE_ALLOC_RETURN; } + + memset((void *)node, 0, sizeof(GenericNode)); + node->magic = WAPP_DBL_NODE_MAGIC; + node->item_size = item_size; + +DBL_LIST_NODE_ALLOC_RETURN: + return node; +} + +GenericNode *_dbl_list_get(const GenericList *list, u64 index, u64 item_size) { + wapp_debug_assert(list != NULL, "`list` should not be NULL"); + _dbl_list_validate(list, item_size); wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - VoidPNode *output = NULL; - VoidPNode *current = list->first; + GenericNode *output = NULL; + GenericNode *current = list->first; for (u64 i = 1; i <= index; ++i) { current = current->next; } @@ -43,10 +53,12 @@ VoidPNode *wapp_void_ptr_list_get(const VoidPList *list, u64 index) { return output; } -void wapp_void_ptr_list_push_front(VoidPList *list, VoidPNode *node) { +void _dbl_list_push_front(GenericList *list, GenericNode *node, u64 item_size) { wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); + _dbl_list_validate(list, item_size); + _dbl_list_node_validate(node, item_size); - VoidPList node_list = void_ptr_node_to_list(node); + GenericList node_list = _node_to_list(node, item_size); if (list->node_count == 0) { *list = node_list; @@ -55,7 +67,7 @@ void wapp_void_ptr_list_push_front(VoidPList *list, VoidPNode *node) { list->node_count += node_list.node_count; - VoidPNode *first = list->first; + GenericNode *first = list->first; if (first) { first->prev = node_list.last; } @@ -64,10 +76,12 @@ void wapp_void_ptr_list_push_front(VoidPList *list, VoidPNode *node) { node_list.last->next = first; } -void wapp_void_ptr_list_push_back(VoidPList *list, VoidPNode *node) { +void _dbl_list_push_back(GenericList *list, GenericNode *node, u64 item_size) { wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); + _dbl_list_validate(list, item_size); + _dbl_list_node_validate(node, item_size); - VoidPList node_list = void_ptr_node_to_list(node); + GenericList node_list = _node_to_list(node, item_size); if (list->node_count == 0) { *list = node_list; @@ -76,7 +90,7 @@ void wapp_void_ptr_list_push_back(VoidPList *list, VoidPNode *node) { list->node_count += node_list.node_count; - VoidPNode *last = list->last; + GenericNode *last = list->last; if (last) { last->next = node_list.first; } @@ -85,27 +99,29 @@ void wapp_void_ptr_list_push_back(VoidPList *list, VoidPNode *node) { node_list.first->prev = last; } -void wapp_void_ptr_list_insert(VoidPList *list, VoidPNode *node, u64 index) { +void _dbl_list_insert(GenericList *list, GenericNode *node, u64 index, u64 item_size) { wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); + _dbl_list_validate(list, item_size); + _dbl_list_node_validate(node, item_size); if (index == 0) { - wapp_void_ptr_list_push_front(list, node); + _dbl_list_push_front(list, node, item_size); return; } else if (index == list->node_count) { - wapp_void_ptr_list_push_back(list, node); + _dbl_list_push_back(list, node, item_size); return; } - VoidPNode *dst_node = wapp_void_ptr_list_get(list, index); + GenericNode *dst_node = _dbl_list_get(list, index, item_size); if (!dst_node) { return; } - VoidPList node_list = void_ptr_node_to_list(node); + GenericList node_list = _node_to_list(node, item_size); list->node_count += node_list.node_count; - VoidPNode *prev = dst_node->prev; + GenericNode *prev = dst_node->prev; dst_node->prev = node_list.last; prev->next = node_list.first; @@ -114,1567 +130,11 @@ void wapp_void_ptr_list_insert(VoidPList *list, VoidPNode *node, u64 index) { node_list.last->next = dst_node; } -VoidPNode *wapp_void_ptr_list_pop_front(VoidPList *list) { +GenericNode *_dbl_list_pop_front(GenericList *list, u64 item_size) { wapp_debug_assert(list != NULL, "`list` should not be NULL"); + _dbl_list_validate(list, item_size); - VoidPNode *output = NULL; - - if (list->node_count == 0) { - goto RETURN_VOID_PTR_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (VoidPList){0}; - goto RETURN_VOID_PTR_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_VOID_PTR_LIST_POP_FRONT: - return output; -} - -VoidPNode *wapp_void_ptr_list_pop_back(VoidPList *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - VoidPNode *output = NULL; - - if (list->node_count == 0) { - goto RETURN_VOID_PTR_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (VoidPList){0}; - goto RETURN_VOID_PTR_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_VOID_PTR_LIST_POP_BACK: - return output; -} - -VoidPNode *wapp_void_ptr_list_remove(VoidPList *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - VoidPNode *output = NULL; - - if (index == 0) { - output = wapp_void_ptr_list_pop_front(list); - goto RETURN_VOID_PTR_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_void_ptr_list_pop_back(list); - goto RETURN_VOID_PTR_LIST_REMOVE; - } - - output = wapp_void_ptr_list_get(list, index); - if (!output) { - goto RETURN_VOID_PTR_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_VOID_PTR_LIST_REMOVE: - return output; -} - -void wapp_void_ptr_list_empty(VoidPList *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_void_ptr_list_pop_back(list); - } -} - -Str8Node *wapp_str8_list_get(const Str8List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - Str8Node *output = NULL; - Str8Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_str8_list_push_front(Str8List *list, Str8Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - Str8List node_list = str8_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - Str8Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_str8_list_push_back(Str8List *list, Str8Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - Str8List node_list = str8_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - Str8Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_str8_list_insert(Str8List *list, Str8Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_str8_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_str8_list_push_back(list, node); - return; - } - - Str8Node *dst_node = wapp_str8_list_get(list, index); - if (!dst_node) { - return; - } - - Str8List node_list = str8_node_to_list(node); - - list->node_count += node_list.node_count; - - Str8Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -Str8Node *wapp_str8_list_pop_front(Str8List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - Str8Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_STR8_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (Str8List){0}; - goto RETURN_STR8_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_STR8_LIST_POP_FRONT: - return output; -} - -Str8Node *wapp_str8_list_pop_back(Str8List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - Str8Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_STR8_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (Str8List){0}; - goto RETURN_STR8_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_STR8_LIST_POP_BACK: - return output; -} - -Str8Node *wapp_str8_list_remove(Str8List *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - Str8Node *output = NULL; - - if (index == 0) { - output = wapp_str8_list_pop_front(list); - goto RETURN_STR8_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_str8_list_pop_back(list); - goto RETURN_STR8_LIST_REMOVE; - } - - output = wapp_str8_list_get(list, index); - if (!output) { - goto RETURN_STR8_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_STR8_LIST_REMOVE: - return output; -} - -void wapp_str8_list_empty(Str8List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_str8_list_pop_back(list); - } -} - -B8Node *wapp_b8_list_get(const B8List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - B8Node *output = NULL; - B8Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_b8_list_push_front(B8List *list, B8Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - B8List node_list = b8_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - B8Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_b8_list_push_back(B8List *list, B8Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - B8List node_list = b8_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - B8Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_b8_list_insert(B8List *list, B8Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_b8_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_b8_list_push_back(list, node); - return; - } - - B8Node *dst_node = wapp_b8_list_get(list, index); - if (!dst_node) { - return; - } - - B8List node_list = b8_node_to_list(node); - - list->node_count += node_list.node_count; - - B8Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -B8Node *wapp_b8_list_pop_front(B8List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - B8Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_B8_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (B8List){0}; - goto RETURN_B8_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_B8_LIST_POP_FRONT: - return output; -} - -B8Node *wapp_b8_list_pop_back(B8List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - B8Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_B8_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (B8List){0}; - goto RETURN_B8_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_B8_LIST_POP_BACK: - return output; -} - -B8Node *wapp_b8_list_remove(B8List *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - B8Node *output = NULL; - - if (index == 0) { - output = wapp_b8_list_pop_front(list); - goto RETURN_B8_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_b8_list_pop_back(list); - goto RETURN_B8_LIST_REMOVE; - } - - output = wapp_b8_list_get(list, index); - if (!output) { - goto RETURN_B8_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_B8_LIST_REMOVE: - return output; -} - -void wapp_b8_list_empty(B8List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_b8_list_pop_back(list); - } -} - -CharNode *wapp_char_list_get(const CharList *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - CharNode *output = NULL; - CharNode *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_char_list_push_front(CharList *list, CharNode *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - CharList node_list = char_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - CharNode *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_char_list_push_back(CharList *list, CharNode *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - CharList node_list = char_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - CharNode *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_char_list_insert(CharList *list, CharNode *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_char_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_char_list_push_back(list, node); - return; - } - - CharNode *dst_node = wapp_char_list_get(list, index); - if (!dst_node) { - return; - } - - CharList node_list = char_node_to_list(node); - - list->node_count += node_list.node_count; - - CharNode *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -CharNode *wapp_char_list_pop_front(CharList *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - CharNode *output = NULL; - - if (list->node_count == 0) { - goto RETURN_CHAR_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (CharList){0}; - goto RETURN_CHAR_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_CHAR_LIST_POP_FRONT: - return output; -} - -CharNode *wapp_char_list_pop_back(CharList *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - CharNode *output = NULL; - - if (list->node_count == 0) { - goto RETURN_CHAR_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (CharList){0}; - goto RETURN_CHAR_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_CHAR_LIST_POP_BACK: - return output; -} - -CharNode *wapp_char_list_remove(CharList *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - CharNode *output = NULL; - - if (index == 0) { - output = wapp_char_list_pop_front(list); - goto RETURN_CHAR_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_char_list_pop_back(list); - goto RETURN_CHAR_LIST_REMOVE; - } - - output = wapp_char_list_get(list, index); - if (!output) { - goto RETURN_CHAR_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_CHAR_LIST_REMOVE: - return output; -} - -void wapp_char_list_empty(CharList *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_char_list_pop_back(list); - } -} - -C8Node *wapp_c8_list_get(const C8List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - C8Node *output = NULL; - C8Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_c8_list_push_front(C8List *list, C8Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - C8List node_list = c8_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - C8Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_c8_list_push_back(C8List *list, C8Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - C8List node_list = c8_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - C8Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_c8_list_insert(C8List *list, C8Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_c8_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_c8_list_push_back(list, node); - return; - } - - C8Node *dst_node = wapp_c8_list_get(list, index); - if (!dst_node) { - return; - } - - C8List node_list = c8_node_to_list(node); - - list->node_count += node_list.node_count; - - C8Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -C8Node *wapp_c8_list_pop_front(C8List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - C8Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_C8_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (C8List){0}; - goto RETURN_C8_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_C8_LIST_POP_FRONT: - return output; -} - -C8Node *wapp_c8_list_pop_back(C8List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - C8Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_C8_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (C8List){0}; - goto RETURN_C8_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_C8_LIST_POP_BACK: - return output; -} - -C8Node *wapp_c8_list_remove(C8List *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - C8Node *output = NULL; - - if (index == 0) { - output = wapp_c8_list_pop_front(list); - goto RETURN_C8_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_c8_list_pop_back(list); - goto RETURN_C8_LIST_REMOVE; - } - - output = wapp_c8_list_get(list, index); - if (!output) { - goto RETURN_C8_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_C8_LIST_REMOVE: - return output; -} - -void wapp_c8_list_empty(C8List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_c8_list_pop_back(list); - } -} - -C16Node *wapp_c16_list_get(const C16List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - C16Node *output = NULL; - C16Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_c16_list_push_front(C16List *list, C16Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - C16List node_list = c16_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - C16Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_c16_list_push_back(C16List *list, C16Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - C16List node_list = c16_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - C16Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_c16_list_insert(C16List *list, C16Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_c16_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_c16_list_push_back(list, node); - return; - } - - C16Node *dst_node = wapp_c16_list_get(list, index); - if (!dst_node) { - return; - } - - C16List node_list = c16_node_to_list(node); - - list->node_count += node_list.node_count; - - C16Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -C16Node *wapp_c16_list_pop_front(C16List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - C16Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_C16_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (C16List){0}; - goto RETURN_C16_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_C16_LIST_POP_FRONT: - return output; -} - -C16Node *wapp_c16_list_pop_back(C16List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - C16Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_C16_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (C16List){0}; - goto RETURN_C16_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_C16_LIST_POP_BACK: - return output; -} - -C16Node *wapp_c16_list_remove(C16List *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - C16Node *output = NULL; - - if (index == 0) { - output = wapp_c16_list_pop_front(list); - goto RETURN_C16_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_c16_list_pop_back(list); - goto RETURN_C16_LIST_REMOVE; - } - - output = wapp_c16_list_get(list, index); - if (!output) { - goto RETURN_C16_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_C16_LIST_REMOVE: - return output; -} - -void wapp_c16_list_empty(C16List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_c16_list_pop_back(list); - } -} - -C32Node *wapp_c32_list_get(const C32List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - C32Node *output = NULL; - C32Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_c32_list_push_front(C32List *list, C32Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - C32List node_list = c32_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - C32Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_c32_list_push_back(C32List *list, C32Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - C32List node_list = c32_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - C32Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_c32_list_insert(C32List *list, C32Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_c32_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_c32_list_push_back(list, node); - return; - } - - C32Node *dst_node = wapp_c32_list_get(list, index); - if (!dst_node) { - return; - } - - C32List node_list = c32_node_to_list(node); - - list->node_count += node_list.node_count; - - C32Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -C32Node *wapp_c32_list_pop_front(C32List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - C32Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_C32_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (C32List){0}; - goto RETURN_C32_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_C32_LIST_POP_FRONT: - return output; -} - -C32Node *wapp_c32_list_pop_back(C32List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - C32Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_C32_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (C32List){0}; - goto RETURN_C32_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_C32_LIST_POP_BACK: - return output; -} - -C32Node *wapp_c32_list_remove(C32List *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - C32Node *output = NULL; - - if (index == 0) { - output = wapp_c32_list_pop_front(list); - goto RETURN_C32_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_c32_list_pop_back(list); - goto RETURN_C32_LIST_REMOVE; - } - - output = wapp_c32_list_get(list, index); - if (!output) { - goto RETURN_C32_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_C32_LIST_REMOVE: - return output; -} - -void wapp_c32_list_empty(C32List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_c32_list_pop_back(list); - } -} - -I8Node *wapp_i8_list_get(const I8List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - I8Node *output = NULL; - I8Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_i8_list_push_front(I8List *list, I8Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - I8List node_list = i8_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - I8Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_i8_list_push_back(I8List *list, I8Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - I8List node_list = i8_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - I8Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_i8_list_insert(I8List *list, I8Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_i8_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_i8_list_push_back(list, node); - return; - } - - I8Node *dst_node = wapp_i8_list_get(list, index); - if (!dst_node) { - return; - } - - I8List node_list = i8_node_to_list(node); - - list->node_count += node_list.node_count; - - I8Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -I8Node *wapp_i8_list_pop_front(I8List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - I8Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_I8_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (I8List){0}; - goto RETURN_I8_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_I8_LIST_POP_FRONT: - return output; -} - -I8Node *wapp_i8_list_pop_back(I8List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - I8Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_I8_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (I8List){0}; - goto RETURN_I8_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_I8_LIST_POP_BACK: - return output; -} - -I8Node *wapp_i8_list_remove(I8List *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - I8Node *output = NULL; - - if (index == 0) { - output = wapp_i8_list_pop_front(list); - goto RETURN_I8_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_i8_list_pop_back(list); - goto RETURN_I8_LIST_REMOVE; - } - - output = wapp_i8_list_get(list, index); - if (!output) { - goto RETURN_I8_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_I8_LIST_REMOVE: - return output; -} - -void wapp_i8_list_empty(I8List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_i8_list_pop_back(list); - } -} - -I16Node *wapp_i16_list_get(const I16List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - I16Node *output = NULL; - I16Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_i16_list_push_front(I16List *list, I16Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - I16List node_list = i16_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - I16Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_i16_list_push_back(I16List *list, I16Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - I16List node_list = i16_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - I16Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_i16_list_insert(I16List *list, I16Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_i16_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_i16_list_push_back(list, node); - return; - } - - I16Node *dst_node = wapp_i16_list_get(list, index); - if (!dst_node) { - return; - } - - I16List node_list = i16_node_to_list(node); - - list->node_count += node_list.node_count; - - I16Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -I16Node *wapp_i16_list_pop_front(I16List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - I16Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_I16_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (I16List){0}; - goto RETURN_I16_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_I16_LIST_POP_FRONT: - return output; -} - -I16Node *wapp_i16_list_pop_back(I16List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - I16Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_I16_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (I16List){0}; - goto RETURN_I16_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_I16_LIST_POP_BACK: - return output; -} - -I16Node *wapp_i16_list_remove(I16List *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - I16Node *output = NULL; - - if (index == 0) { - output = wapp_i16_list_pop_front(list); - goto RETURN_I16_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_i16_list_pop_back(list); - goto RETURN_I16_LIST_REMOVE; - } - - output = wapp_i16_list_get(list, index); - if (!output) { - goto RETURN_I16_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_I16_LIST_REMOVE: - return output; -} - -void wapp_i16_list_empty(I16List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_i16_list_pop_back(list); - } -} - -I32Node *wapp_i32_list_get(const I32List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - I32Node *output = NULL; - I32Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_i32_list_push_front(I32List *list, I32Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - I32List node_list = i32_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - I32Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_i32_list_push_back(I32List *list, I32Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - I32List node_list = i32_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - I32Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_i32_list_insert(I32List *list, I32Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_i32_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_i32_list_push_back(list, node); - return; - } - - I32Node *dst_node = wapp_i32_list_get(list, index); - if (!dst_node) { - return; - } - - I32List node_list = i32_node_to_list(node); - - list->node_count += node_list.node_count; - - I32Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -I32Node *wapp_i32_list_pop_front(I32List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - I32Node *output = NULL; + GenericNode *output = NULL; if (list->node_count == 0) { goto RETURN_I32_LIST_POP_FRONT; @@ -1683,7 +143,7 @@ I32Node *wapp_i32_list_pop_front(I32List *list) { output = list->first; if (list->node_count == 1) { - *list = (I32List){0}; + *list = (GenericList){0}; goto RETURN_I32_LIST_POP_FRONT; } @@ -1696,10 +156,11 @@ RETURN_I32_LIST_POP_FRONT: return output; } -I32Node *wapp_i32_list_pop_back(I32List *list) { +GenericNode *_dbl_list_pop_back(GenericList *list, u64 item_size) { wapp_debug_assert(list != NULL, "`list` should not be NULL"); + _dbl_list_validate(list, item_size); - I32Node *output = NULL; + GenericNode *output = NULL; if (list->node_count == 0) { goto RETURN_I32_LIST_POP_BACK; @@ -1708,7 +169,7 @@ I32Node *wapp_i32_list_pop_back(I32List *list) { output = list->last; if (list->node_count == 1) { - *list = (I32List){0}; + *list = (GenericList){.magic = WAPP_DBL_LIST_MAGIC, .item_size = item_size}; goto RETURN_I32_LIST_POP_BACK; } @@ -1721,20 +182,21 @@ RETURN_I32_LIST_POP_BACK: return output; } -I32Node *wapp_i32_list_remove(I32List *list, u64 index) { +GenericNode *_dbl_list_remove(GenericList *list, u64 index, u64 item_size) { wapp_debug_assert(list != NULL, "`list` should not be NULL"); + _dbl_list_validate(list, item_size); - I32Node *output = NULL; + GenericNode *output = NULL; if (index == 0) { - output = wapp_i32_list_pop_front(list); + output = _dbl_list_pop_front(list, item_size); goto RETURN_I32_LIST_REMOVE; } else if (index == list->node_count) { - output = wapp_i32_list_pop_back(list); + output = _dbl_list_pop_back(list, item_size); goto RETURN_I32_LIST_REMOVE; } - output = wapp_i32_list_get(list, index); + output = _dbl_list_get(list, index, item_size); if (!output) { goto RETURN_I32_LIST_REMOVE; } @@ -1750,1747 +212,24 @@ RETURN_I32_LIST_REMOVE: return output; } -void wapp_i32_list_empty(I32List *list) { +void _dbl_list_empty(GenericList *list, u64 item_size) { wapp_debug_assert(list != NULL, "`list` should not be NULL"); + _dbl_list_validate(list, item_size); u64 count = list->node_count; for (u64 i = 0; i < count; ++i) { - wapp_i32_list_pop_back(list); + _dbl_list_pop_back(list, item_size); } } -I64Node *wapp_i64_list_get(const I64List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - I64Node *output = NULL; - I64Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_i64_list_push_front(I64List *list, I64Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - I64List node_list = i64_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - I64Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_i64_list_push_back(I64List *list, I64Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - I64List node_list = i64_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - I64Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_i64_list_insert(I64List *list, I64Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_i64_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_i64_list_push_back(list, node); - return; - } - - I64Node *dst_node = wapp_i64_list_get(list, index); - if (!dst_node) { - return; - } - - I64List node_list = i64_node_to_list(node); - - list->node_count += node_list.node_count; - - I64Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -I64Node *wapp_i64_list_pop_front(I64List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - I64Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_I64_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (I64List){0}; - goto RETURN_I64_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_I64_LIST_POP_FRONT: - return output; -} - -I64Node *wapp_i64_list_pop_back(I64List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - I64Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_I64_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (I64List){0}; - goto RETURN_I64_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_I64_LIST_POP_BACK: - return output; -} - -I64Node *wapp_i64_list_remove(I64List *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - I64Node *output = NULL; - - if (index == 0) { - output = wapp_i64_list_pop_front(list); - goto RETURN_I64_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_i64_list_pop_back(list); - goto RETURN_I64_LIST_REMOVE; - } - - output = wapp_i64_list_get(list, index); - if (!output) { - goto RETURN_I64_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_I64_LIST_REMOVE: - return output; -} - -void wapp_i64_list_empty(I64List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_i64_list_pop_back(list); - } -} - -U8Node *wapp_u8_list_get(const U8List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - U8Node *output = NULL; - U8Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_u8_list_push_front(U8List *list, U8Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - U8List node_list = u8_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - U8Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_u8_list_push_back(U8List *list, U8Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - U8List node_list = u8_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - U8Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_u8_list_insert(U8List *list, U8Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_u8_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_u8_list_push_back(list, node); - return; - } - - U8Node *dst_node = wapp_u8_list_get(list, index); - if (!dst_node) { - return; - } - - U8List node_list = u8_node_to_list(node); - - list->node_count += node_list.node_count; - - U8Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -U8Node *wapp_u8_list_pop_front(U8List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - U8Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_U8_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (U8List){0}; - goto RETURN_U8_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_U8_LIST_POP_FRONT: - return output; -} - -U8Node *wapp_u8_list_pop_back(U8List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - U8Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_U8_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (U8List){0}; - goto RETURN_U8_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_U8_LIST_POP_BACK: - return output; -} - -U8Node *wapp_u8_list_remove(U8List *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - U8Node *output = NULL; - - if (index == 0) { - output = wapp_u8_list_pop_front(list); - goto RETURN_U8_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_u8_list_pop_back(list); - goto RETURN_U8_LIST_REMOVE; - } - - output = wapp_u8_list_get(list, index); - if (!output) { - goto RETURN_U8_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_U8_LIST_REMOVE: - return output; -} - -void wapp_u8_list_empty(U8List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_u8_list_pop_back(list); - } -} - -U16Node *wapp_u16_list_get(const U16List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - U16Node *output = NULL; - U16Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_u16_list_push_front(U16List *list, U16Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - U16List node_list = u16_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - U16Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_u16_list_push_back(U16List *list, U16Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - U16List node_list = u16_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - U16Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_u16_list_insert(U16List *list, U16Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_u16_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_u16_list_push_back(list, node); - return; - } - - U16Node *dst_node = wapp_u16_list_get(list, index); - if (!dst_node) { - return; - } - - U16List node_list = u16_node_to_list(node); - - list->node_count += node_list.node_count; - - U16Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -U16Node *wapp_u16_list_pop_front(U16List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - U16Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_U16_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (U16List){0}; - goto RETURN_U16_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_U16_LIST_POP_FRONT: - return output; -} - -U16Node *wapp_u16_list_pop_back(U16List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - U16Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_U16_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (U16List){0}; - goto RETURN_U16_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_U16_LIST_POP_BACK: - return output; -} - -U16Node *wapp_u16_list_remove(U16List *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - U16Node *output = NULL; - - if (index == 0) { - output = wapp_u16_list_pop_front(list); - goto RETURN_U16_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_u16_list_pop_back(list); - goto RETURN_U16_LIST_REMOVE; - } - - output = wapp_u16_list_get(list, index); - if (!output) { - goto RETURN_U16_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_U16_LIST_REMOVE: - return output; -} - -void wapp_u16_list_empty(U16List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_u16_list_pop_back(list); - } -} - -U32Node *wapp_u32_list_get(const U32List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - U32Node *output = NULL; - U32Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_u32_list_push_front(U32List *list, U32Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - U32List node_list = u32_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - U32Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_u32_list_push_back(U32List *list, U32Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - U32List node_list = u32_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - U32Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_u32_list_insert(U32List *list, U32Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_u32_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_u32_list_push_back(list, node); - return; - } - - U32Node *dst_node = wapp_u32_list_get(list, index); - if (!dst_node) { - return; - } - - U32List node_list = u32_node_to_list(node); - - list->node_count += node_list.node_count; - - U32Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -U32Node *wapp_u32_list_pop_front(U32List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - U32Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_U32_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (U32List){0}; - goto RETURN_U32_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_U32_LIST_POP_FRONT: - return output; -} - -U32Node *wapp_u32_list_pop_back(U32List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - U32Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_U32_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (U32List){0}; - goto RETURN_U32_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_U32_LIST_POP_BACK: - return output; -} - -U32Node *wapp_u32_list_remove(U32List *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - U32Node *output = NULL; - - if (index == 0) { - output = wapp_u32_list_pop_front(list); - goto RETURN_U32_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_u32_list_pop_back(list); - goto RETURN_U32_LIST_REMOVE; - } - - output = wapp_u32_list_get(list, index); - if (!output) { - goto RETURN_U32_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_U32_LIST_REMOVE: - return output; -} - -void wapp_u32_list_empty(U32List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_u32_list_pop_back(list); - } -} - -U64Node *wapp_u64_list_get(const U64List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - U64Node *output = NULL; - U64Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_u64_list_push_front(U64List *list, U64Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - U64List node_list = u64_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - U64Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_u64_list_push_back(U64List *list, U64Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - U64List node_list = u64_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - U64Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_u64_list_insert(U64List *list, U64Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_u64_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_u64_list_push_back(list, node); - return; - } - - U64Node *dst_node = wapp_u64_list_get(list, index); - if (!dst_node) { - return; - } - - U64List node_list = u64_node_to_list(node); - - list->node_count += node_list.node_count; - - U64Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -U64Node *wapp_u64_list_pop_front(U64List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - U64Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_U64_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (U64List){0}; - goto RETURN_U64_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_U64_LIST_POP_FRONT: - return output; -} - -U64Node *wapp_u64_list_pop_back(U64List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - U64Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_U64_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (U64List){0}; - goto RETURN_U64_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_U64_LIST_POP_BACK: - return output; -} - -U64Node *wapp_u64_list_remove(U64List *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - U64Node *output = NULL; - - if (index == 0) { - output = wapp_u64_list_pop_front(list); - goto RETURN_U64_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_u64_list_pop_back(list); - goto RETURN_U64_LIST_REMOVE; - } - - output = wapp_u64_list_get(list, index); - if (!output) { - goto RETURN_U64_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_U64_LIST_REMOVE: - return output; -} - -void wapp_u64_list_empty(U64List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_u64_list_pop_back(list); - } -} - -F32Node *wapp_f32_list_get(const F32List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - F32Node *output = NULL; - F32Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_f32_list_push_front(F32List *list, F32Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - F32List node_list = f32_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - F32Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_f32_list_push_back(F32List *list, F32Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - F32List node_list = f32_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - F32Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_f32_list_insert(F32List *list, F32Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_f32_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_f32_list_push_back(list, node); - return; - } - - F32Node *dst_node = wapp_f32_list_get(list, index); - if (!dst_node) { - return; - } - - F32List node_list = f32_node_to_list(node); - - list->node_count += node_list.node_count; - - F32Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -F32Node *wapp_f32_list_pop_front(F32List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - F32Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_F32_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (F32List){0}; - goto RETURN_F32_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_F32_LIST_POP_FRONT: - return output; -} - -F32Node *wapp_f32_list_pop_back(F32List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - F32Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_F32_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (F32List){0}; - goto RETURN_F32_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_F32_LIST_POP_BACK: - return output; -} - -F32Node *wapp_f32_list_remove(F32List *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - F32Node *output = NULL; - - if (index == 0) { - output = wapp_f32_list_pop_front(list); - goto RETURN_F32_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_f32_list_pop_back(list); - goto RETURN_F32_LIST_REMOVE; - } - - output = wapp_f32_list_get(list, index); - if (!output) { - goto RETURN_F32_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_F32_LIST_REMOVE: - return output; -} - -void wapp_f32_list_empty(F32List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_f32_list_pop_back(list); - } -} - -F64Node *wapp_f64_list_get(const F64List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - F64Node *output = NULL; - F64Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_f64_list_push_front(F64List *list, F64Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - F64List node_list = f64_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - F64Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_f64_list_push_back(F64List *list, F64Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - F64List node_list = f64_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - F64Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_f64_list_insert(F64List *list, F64Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_f64_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_f64_list_push_back(list, node); - return; - } - - F64Node *dst_node = wapp_f64_list_get(list, index); - if (!dst_node) { - return; - } - - F64List node_list = f64_node_to_list(node); - - list->node_count += node_list.node_count; - - F64Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -F64Node *wapp_f64_list_pop_front(F64List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - F64Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_F64_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (F64List){0}; - goto RETURN_F64_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_F64_LIST_POP_FRONT: - return output; -} - -F64Node *wapp_f64_list_pop_back(F64List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - F64Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_F64_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (F64List){0}; - goto RETURN_F64_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_F64_LIST_POP_BACK: - return output; -} - -F64Node *wapp_f64_list_remove(F64List *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - F64Node *output = NULL; - - if (index == 0) { - output = wapp_f64_list_pop_front(list); - goto RETURN_F64_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_f64_list_pop_back(list); - goto RETURN_F64_LIST_REMOVE; - } - - output = wapp_f64_list_get(list, index); - if (!output) { - goto RETURN_F64_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_F64_LIST_REMOVE: - return output; -} - -void wapp_f64_list_empty(F64List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_f64_list_pop_back(list); - } -} - -F128Node *wapp_f128_list_get(const F128List *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - F128Node *output = NULL; - F128Node *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_f128_list_push_front(F128List *list, F128Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - F128List node_list = f128_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - F128Node *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_f128_list_push_back(F128List *list, F128Node *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - F128List node_list = f128_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - F128Node *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_f128_list_insert(F128List *list, F128Node *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_f128_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_f128_list_push_back(list, node); - return; - } - - F128Node *dst_node = wapp_f128_list_get(list, index); - if (!dst_node) { - return; - } - - F128List node_list = f128_node_to_list(node); - - list->node_count += node_list.node_count; - - F128Node *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -F128Node *wapp_f128_list_pop_front(F128List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - F128Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_F128_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (F128List){0}; - goto RETURN_F128_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_F128_LIST_POP_FRONT: - return output; -} - -F128Node *wapp_f128_list_pop_back(F128List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - F128Node *output = NULL; - - if (list->node_count == 0) { - goto RETURN_F128_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (F128List){0}; - goto RETURN_F128_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_F128_LIST_POP_BACK: - return output; -} - -F128Node *wapp_f128_list_remove(F128List *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - F128Node *output = NULL; - - if (index == 0) { - output = wapp_f128_list_pop_front(list); - goto RETURN_F128_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_f128_list_pop_back(list); - goto RETURN_F128_LIST_REMOVE; - } - - output = wapp_f128_list_get(list, index); - if (!output) { - goto RETURN_F128_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_F128_LIST_REMOVE: - return output; -} - -void wapp_f128_list_empty(F128List *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_f128_list_pop_back(list); - } -} - -IptrNode *wapp_iptr_list_get(const IptrList *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - IptrNode *output = NULL; - IptrNode *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_iptr_list_push_front(IptrList *list, IptrNode *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - IptrList node_list = iptr_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - IptrNode *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_iptr_list_push_back(IptrList *list, IptrNode *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - IptrList node_list = iptr_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - IptrNode *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_iptr_list_insert(IptrList *list, IptrNode *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_iptr_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_iptr_list_push_back(list, node); - return; - } - - IptrNode *dst_node = wapp_iptr_list_get(list, index); - if (!dst_node) { - return; - } - - IptrList node_list = iptr_node_to_list(node); - - list->node_count += node_list.node_count; - - IptrNode *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -IptrNode *wapp_iptr_list_pop_front(IptrList *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - IptrNode *output = NULL; - - if (list->node_count == 0) { - goto RETURN_IPTR_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (IptrList){0}; - goto RETURN_IPTR_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_IPTR_LIST_POP_FRONT: - return output; -} - -IptrNode *wapp_iptr_list_pop_back(IptrList *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - IptrNode *output = NULL; - - if (list->node_count == 0) { - goto RETURN_IPTR_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (IptrList){0}; - goto RETURN_IPTR_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_IPTR_LIST_POP_BACK: - return output; -} - -IptrNode *wapp_iptr_list_remove(IptrList *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - IptrNode *output = NULL; - - if (index == 0) { - output = wapp_iptr_list_pop_front(list); - goto RETURN_IPTR_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_iptr_list_pop_back(list); - goto RETURN_IPTR_LIST_REMOVE; - } - - output = wapp_iptr_list_get(list, index); - if (!output) { - goto RETURN_IPTR_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_IPTR_LIST_REMOVE: - return output; -} - -void wapp_iptr_list_empty(IptrList *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_iptr_list_pop_back(list); - } -} - -UptrNode *wapp_uptr_list_get(const UptrList *list, u64 index) { - wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); - - UptrNode *output = NULL; - UptrNode *current = list->first; - for (u64 i = 1; i <= index; ++i) { - current = current->next; - } - - output = current; - - return output; -} - -void wapp_uptr_list_push_front(UptrList *list, UptrNode *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - UptrList node_list = uptr_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - UptrNode *first = list->first; - if (first) { - first->prev = node_list.last; - } - - list->first = node_list.first; - node_list.last->next = first; -} - -void wapp_uptr_list_push_back(UptrList *list, UptrNode *node) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - UptrList node_list = uptr_node_to_list(node); - - if (list->node_count == 0) { - *list = node_list; - return; - } - - list->node_count += node_list.node_count; - - UptrNode *last = list->last; - if (last) { - last->next = node_list.first; - } - - list->last = node_list.last; - node_list.first->prev = last; -} - -void wapp_uptr_list_insert(UptrList *list, UptrNode *node, u64 index) { - wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); - - if (index == 0) { - wapp_uptr_list_push_front(list, node); - return; - } else if (index == list->node_count) { - wapp_uptr_list_push_back(list, node); - return; - } - - UptrNode *dst_node = wapp_uptr_list_get(list, index); - if (!dst_node) { - return; - } - - UptrList node_list = uptr_node_to_list(node); - - list->node_count += node_list.node_count; - - UptrNode *prev = dst_node->prev; - - dst_node->prev = node_list.last; - prev->next = node_list.first; - - node_list.first->prev = prev; - node_list.last->next = dst_node; -} - -UptrNode *wapp_uptr_list_pop_front(UptrList *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - UptrNode *output = NULL; - - if (list->node_count == 0) { - goto RETURN_UPTR_LIST_POP_FRONT; - } - - output = list->first; - - if (list->node_count == 1) { - *list = (UptrList){0}; - goto RETURN_UPTR_LIST_POP_FRONT; - } - - --(list->node_count); - list->first = output->next; - - output->prev = output->next = NULL; - -RETURN_UPTR_LIST_POP_FRONT: - return output; -} - -UptrNode *wapp_uptr_list_pop_back(UptrList *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - UptrNode *output = NULL; - - if (list->node_count == 0) { - goto RETURN_UPTR_LIST_POP_BACK; - } - - output = list->last; - - if (list->node_count == 1) { - *list = (UptrList){0}; - goto RETURN_UPTR_LIST_POP_BACK; - } - - --(list->node_count); - list->last = output->prev; - - output->prev = output->next = NULL; - -RETURN_UPTR_LIST_POP_BACK: - return output; -} - -UptrNode *wapp_uptr_list_remove(UptrList *list, u64 index) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - UptrNode *output = NULL; - - if (index == 0) { - output = wapp_uptr_list_pop_front(list); - goto RETURN_UPTR_LIST_REMOVE; - } else if (index == list->node_count) { - output = wapp_uptr_list_pop_back(list); - goto RETURN_UPTR_LIST_REMOVE; - } - - output = wapp_uptr_list_get(list, index); - if (!output) { - goto RETURN_UPTR_LIST_REMOVE; - } - - output->prev->next = output->next; - output->next->prev = output->prev; - - --(list->node_count); - - output->prev = output->next = NULL; - -RETURN_UPTR_LIST_REMOVE: - return output; -} - -void wapp_uptr_list_empty(UptrList *list) { - wapp_debug_assert(list != NULL, "`list` should not be NULL"); - - u64 count = list->node_count; - for (u64 i = 0; i < count; ++i) { - wapp_uptr_list_pop_back(list); - } -} - -wapp_intern VoidPList void_ptr_node_to_list(VoidPNode *node) { - VoidPList output = {.first = node, .last = node, .node_count = 1}; +wapp_intern GenericList _node_to_list(GenericNode *node, u64 item_size) { + GenericList output = { + .magic = WAPP_DBL_LIST_MAGIC, + .first = node, + .last = node, + .node_count = 1, + .item_size = item_size, + }; while (output.first->prev != NULL) { output.first = output.first->prev; @@ -3505,307 +244,12 @@ wapp_intern VoidPList void_ptr_node_to_list(VoidPNode *node) { return output; } -wapp_intern Str8List str8_node_to_list(Str8Node *node) { - Str8List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; +wapp_intern void _dbl_list_validate(const GenericList *list, u64 item_size) { + wapp_runtime_assert(list->magic == WAPP_DBL_LIST_MAGIC, "`list` isn't a valid wapp list type"); + wapp_runtime_assert(list->item_size == item_size, "Invalid item provided"); } -wapp_intern B8List b8_node_to_list(B8Node *node) { - B8List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; +wapp_intern void _dbl_list_node_validate(const GenericNode *node, u64 item_size) { + wapp_runtime_assert(node->magic == WAPP_DBL_NODE_MAGIC, "`node` isn't a valid wapp node type"); + wapp_runtime_assert(node->item_size == item_size, "Invalid item provided"); } - -wapp_intern CharList char_node_to_list(CharNode *node) { - CharList output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern C8List c8_node_to_list(C8Node *node) { - C8List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern C16List c16_node_to_list(C16Node *node) { - C16List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern C32List c32_node_to_list(C32Node *node) { - C32List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern I8List i8_node_to_list(I8Node *node) { - I8List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern I16List i16_node_to_list(I16Node *node) { - I16List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern I32List i32_node_to_list(I32Node *node) { - I32List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern I64List i64_node_to_list(I64Node *node) { - I64List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern U8List u8_node_to_list(U8Node *node) { - U8List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern U16List u16_node_to_list(U16Node *node) { - U16List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern U32List u32_node_to_list(U32Node *node) { - U32List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern U64List u64_node_to_list(U64Node *node) { - U64List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern F32List f32_node_to_list(F32Node *node) { - F32List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern F64List f64_node_to_list(F64Node *node) { - F64List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern F128List f128_node_to_list(F128Node *node) { - F128List output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern IptrList iptr_node_to_list(IptrNode *node) { - IptrList output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - -wapp_intern UptrList uptr_node_to_list(UptrNode *node) { - UptrList output = {.first = node, .last = node, .node_count = 1}; - - while (output.first->prev != NULL) { - output.first = output.first->prev; - ++(output.node_count); - } - - while (output.last->next != NULL) { - output.last = output.last->next; - ++(output.node_count); - } - - return output; -} - diff --git a/src/base/dbl_list/dbl_list.h b/src/base/dbl_list/dbl_list.h index f93fec1..0a4814b 100644 --- a/src/base/dbl_list/dbl_list.h +++ b/src/base/dbl_list/dbl_list.h @@ -1,10 +1,7 @@ -/** - * THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN. - */ - #ifndef DBL_LIST_H #define DBL_LIST_H +#include "../mem/allocator/mem_allocator.h" #include "../../common/aliases/aliases.h" #include "../../common/platform/platform.h" @@ -12,506 +9,97 @@ BEGIN_C_LINKAGE #endif // !WAPP_PLATFORM_CPP +#define WAPP_DBL_LIST_MAGIC (u64)0x57415f444c5354 +#define WAPP_DBL_NODE_MAGIC (u64)0x57415f444e44 + +#define WAPP_DEF_DBL_LIST_TYPE(T, NODE_NAME, LIST_NAME) \ + typedef struct NODE_NAME NODE_NAME; \ + struct NODE_NAME { \ + u64 magic; \ + T *item; \ + NODE_NAME *prev; \ + NODE_NAME *next; \ + u64 item_size; \ + }; \ + \ + typedef struct { \ + u64 magic; \ + NODE_NAME *first; \ + NODE_NAME *last; \ + u64 node_count; \ + u64 item_size; \ + } LIST_NAME + #ifdef WAPP_PLATFORM_CPP -#define wapp_void_ptr_list_node(ITEM_PTR) VoidPNode{ITEM_PTR, nullptr, nullptr} -#define wapp_str8_list_node(ITEM_PTR) Str8Node{ITEM_PTR, nullptr, nullptr} -#define wapp_b8_list_node(ITEM_PTR) B8Node{ITEM_PTR, nullptr, nullptr} -#define wapp_char_list_node(ITEM_PTR) CharNode{ITEM_PTR, nullptr, nullptr} -#define wapp_c8_list_node(ITEM_PTR) C8Node{ITEM_PTR, nullptr, nullptr} -#define wapp_c16_list_node(ITEM_PTR) C16Node{ITEM_PTR, nullptr, nullptr} -#define wapp_c32_list_node(ITEM_PTR) C32Node{ITEM_PTR, nullptr, nullptr} -#define wapp_i8_list_node(ITEM_PTR) I8Node{ITEM_PTR, nullptr, nullptr} -#define wapp_i16_list_node(ITEM_PTR) I16Node{ITEM_PTR, nullptr, nullptr} -#define wapp_i32_list_node(ITEM_PTR) I32Node{ITEM_PTR, nullptr, nullptr} -#define wapp_i64_list_node(ITEM_PTR) I64Node{ITEM_PTR, nullptr, nullptr} -#define wapp_u8_list_node(ITEM_PTR) U8Node{ITEM_PTR, nullptr, nullptr} -#define wapp_u16_list_node(ITEM_PTR) U16Node{ITEM_PTR, nullptr, nullptr} -#define wapp_u32_list_node(ITEM_PTR) U32Node{ITEM_PTR, nullptr, nullptr} -#define wapp_u64_list_node(ITEM_PTR) U64Node{ITEM_PTR, nullptr, nullptr} -#define wapp_f32_list_node(ITEM_PTR) F32Node{ITEM_PTR, nullptr, nullptr} -#define wapp_f64_list_node(ITEM_PTR) F64Node{ITEM_PTR, nullptr, nullptr} -#define wapp_f128_list_node(ITEM_PTR) F128Node{ITEM_PTR, nullptr, nullptr} -#define wapp_iptr_list_node(ITEM_PTR) IptrNode{ITEM_PTR, nullptr, nullptr} -#define wapp_uptr_list_node(ITEM_PTR) UptrNode{ITEM_PTR, nullptr, nullptr} +#define wapp_dbl_list(ELEM_TYPE, LIST_TYPE) \ + LIST_TYPE{WAPP_DBL_LIST_MAGIC, nullptr, nullptr, 0, sizeof(ELEM_TYPE)} +#define wapp_dbl_list_node(ELEM_TYPE, NODE_TYPE, ELEM_PTR) \ + NODE_TYPE{WAPP_DBL_NODE_MAGIC, ELEM_PTR, nullptr, nullptr, sizeof(ELEM_TYPE)} #else -#define wapp_void_ptr_list_node(ITEM_PTR) ((VoidPNode){.item = ITEM_PTR}) -#define wapp_str8_list_node(ITEM_PTR) ((Str8Node){.item = ITEM_PTR}) -#define wapp_b8_list_node(ITEM_PTR) ((B8Node){.item = ITEM_PTR}) -#define wapp_char_list_node(ITEM_PTR) ((CharNode){.item = ITEM_PTR}) -#define wapp_c8_list_node(ITEM_PTR) ((C8Node){.item = ITEM_PTR}) -#define wapp_c16_list_node(ITEM_PTR) ((C16Node){.item = ITEM_PTR}) -#define wapp_c32_list_node(ITEM_PTR) ((C32Node){.item = ITEM_PTR}) -#define wapp_i8_list_node(ITEM_PTR) ((I8Node){.item = ITEM_PTR}) -#define wapp_i16_list_node(ITEM_PTR) ((I16Node){.item = ITEM_PTR}) -#define wapp_i32_list_node(ITEM_PTR) ((I32Node){.item = ITEM_PTR}) -#define wapp_i64_list_node(ITEM_PTR) ((I64Node){.item = ITEM_PTR}) -#define wapp_u8_list_node(ITEM_PTR) ((U8Node){.item = ITEM_PTR}) -#define wapp_u16_list_node(ITEM_PTR) ((U16Node){.item = ITEM_PTR}) -#define wapp_u32_list_node(ITEM_PTR) ((U32Node){.item = ITEM_PTR}) -#define wapp_u64_list_node(ITEM_PTR) ((U64Node){.item = ITEM_PTR}) -#define wapp_f32_list_node(ITEM_PTR) ((F32Node){.item = ITEM_PTR}) -#define wapp_f64_list_node(ITEM_PTR) ((F64Node){.item = ITEM_PTR}) -#define wapp_f128_list_node(ITEM_PTR) ((F128Node){.item = ITEM_PTR}) -#define wapp_iptr_list_node(ITEM_PTR) ((IptrNode){.item = ITEM_PTR}) -#define wapp_uptr_list_node(ITEM_PTR) ((UptrNode){.item = ITEM_PTR}) +#define wapp_dbl_list(ELEM_TYPE, LIST_TYPE) ( \ + (LIST_TYPE){.magic = WAPP_DBL_LIST_MAGIC, .item_size = sizeof(ELEM_TYPE)} \ +) +#define wapp_dbl_list_node(ELEM_TYPE, NODE_TYPE, ELEM_PTR) ( \ + (NODE_TYPE){.magic = WAPP_DBL_NODE_MAGIC, .item = ELEM_PTR, .item_size = sizeof(ELEM_TYPE)} \ +) #endif // !WAPP_PLATFORM_CPP +#define wapp_dbl_list_alloc(ELEM_TYPE, LIST_TYPE, ALLOCATOR) \ + (LIST_TYPE *)_dbl_list_alloc(ALLOCATOR, sizeof(ELEM_TYPE)) +#define wapp_dbl_list_node_alloc(ELEM_TYPE, NODE_TYPE, ALLOCATOR) \ + (NODE_TYPE *)_dbl_list_node_alloc(ALLOCATOR, sizeof(ELEM_TYPE)) +#define wapp_dbl_list_get(ELEM_TYPE, NODE_TYPE, LIST_PTR, ELEM_INDEX) \ + (NODE_TYPE *)_dbl_list_get((GenericList *)LIST_PTR, ELEM_INDEX, sizeof(ELEM_TYPE)) +#define wapp_dbl_list_push_front(ELEM_TYPE, LIST_PTR, NODE_PTR) \ + _dbl_list_push_front((GenericList *)LIST_PTR, (GenericNode *)NODE_PTR, sizeof(ELEM_TYPE)) +#define wapp_dbl_list_push_back(ELEM_TYPE, LIST_PTR, NODE_PTR) \ + _dbl_list_push_back((GenericList *)LIST_PTR, (GenericNode *)NODE_PTR, sizeof(ELEM_TYPE)) +#define wapp_dbl_list_insert(ELEM_TYPE, LIST_PTR, NODE_PTR, ELEM_INDEX) \ + _dbl_list_insert((GenericList *)LIST_PTR, (GenericNode *)NODE_PTR, ELEM_INDEX, sizeof(ELEM_TYPE)) +#define wapp_dbl_list_pop_front(ELEM_TYPE, NODE_TYPE, LIST_PTR) \ + (NODE_TYPE *)_dbl_list_pop_front((GenericList *)LIST_PTR, sizeof(ELEM_TYPE)) +#define wapp_dbl_list_pop_back(ELEM_TYPE, NODE_TYPE, LIST_PTR) \ + (NODE_TYPE *)_dbl_list_pop_back((GenericList *)LIST_PTR, sizeof(ELEM_TYPE)) +#define wapp_dbl_list_remove(ELEM_TYPE, NODE_TYPE, LIST_PTR, ELEM_INDEX) \ + (NODE_TYPE *)_dbl_list_remove((GenericList *)LIST_PTR, ELEM_INDEX, sizeof(ELEM_TYPE)) +#define wapp_dbl_list_empty(ELEM_TYPE, LIST_PTR) \ + _dbl_list_empty((GenericList *)LIST_PTR, sizeof(ELEM_TYPE)) + +WAPP_DEF_DBL_LIST_TYPE(void, GenericNode, GenericList); + +GenericList *_dbl_list_alloc(const Allocator *allocator, u64 item_size); +GenericNode *_dbl_list_node_alloc(const Allocator *allocator, u64 item_size); +GenericNode *_dbl_list_get(const GenericList *list, u64 index, u64 item_size); +void _dbl_list_push_front(GenericList *list, GenericNode *node, u64 item_size); +void _dbl_list_push_back(GenericList *list, GenericNode *node, u64 item_size); +void _dbl_list_insert(GenericList *list, GenericNode *node, u64 index, u64 item_size); +GenericNode *_dbl_list_pop_front(GenericList *list, u64 item_size); +GenericNode *_dbl_list_pop_back(GenericList *list, u64 item_size); +GenericNode *_dbl_list_remove(GenericList *list, u64 index, u64 item_size); +void _dbl_list_empty(GenericList *list, u64 item_size); + +// Base list types typedef struct str8 Str8; -typedef struct GenericNode GenericNode; -struct GenericNode { - void *item; - GenericNode *prev; - GenericNode *next; -}; - -typedef struct GenericList GenericList; -struct GenericList { - GenericNode *first; - GenericNode *last; - u64 node_count; -}; - -typedef struct VoidPNode VoidPNode; -struct VoidPNode { - void * *item; - VoidPNode *prev; - VoidPNode *next; -}; - -typedef struct VoidPList VoidPList; -struct VoidPList { - VoidPNode *first; - VoidPNode *last; - u64 node_count; -}; - -typedef struct Str8Node Str8Node; -struct Str8Node { - Str8 *item; - Str8Node *prev; - Str8Node *next; -}; - -typedef struct Str8List Str8List; -struct Str8List { - Str8Node *first; - Str8Node *last; - u64 node_count; -}; - -typedef struct B8Node B8Node; -struct B8Node { - b8 *item; - B8Node *prev; - B8Node *next; -}; - -typedef struct B8List B8List; -struct B8List { - B8Node *first; - B8Node *last; - u64 node_count; -}; - -typedef struct CharNode CharNode; -struct CharNode { - char *item; - CharNode *prev; - CharNode *next; -}; - -typedef struct CharList CharList; -struct CharList { - CharNode *first; - CharNode *last; - u64 node_count; -}; - -typedef struct C8Node C8Node; -struct C8Node { - c8 *item; - C8Node *prev; - C8Node *next; -}; - -typedef struct C8List C8List; -struct C8List { - C8Node *first; - C8Node *last; - u64 node_count; -}; - -typedef struct C16Node C16Node; -struct C16Node { - c16 *item; - C16Node *prev; - C16Node *next; -}; - -typedef struct C16List C16List; -struct C16List { - C16Node *first; - C16Node *last; - u64 node_count; -}; - -typedef struct C32Node C32Node; -struct C32Node { - c32 *item; - C32Node *prev; - C32Node *next; -}; - -typedef struct C32List C32List; -struct C32List { - C32Node *first; - C32Node *last; - u64 node_count; -}; - -typedef struct I8Node I8Node; -struct I8Node { - i8 *item; - I8Node *prev; - I8Node *next; -}; - -typedef struct I8List I8List; -struct I8List { - I8Node *first; - I8Node *last; - u64 node_count; -}; - -typedef struct I16Node I16Node; -struct I16Node { - i16 *item; - I16Node *prev; - I16Node *next; -}; - -typedef struct I16List I16List; -struct I16List { - I16Node *first; - I16Node *last; - u64 node_count; -}; - -typedef struct I32Node I32Node; -struct I32Node { - i32 *item; - I32Node *prev; - I32Node *next; -}; - -typedef struct I32List I32List; -struct I32List { - I32Node *first; - I32Node *last; - u64 node_count; -}; - -typedef struct I64Node I64Node; -struct I64Node { - i64 *item; - I64Node *prev; - I64Node *next; -}; - -typedef struct I64List I64List; -struct I64List { - I64Node *first; - I64Node *last; - u64 node_count; -}; - -typedef struct U8Node U8Node; -struct U8Node { - u8 *item; - U8Node *prev; - U8Node *next; -}; - -typedef struct U8List U8List; -struct U8List { - U8Node *first; - U8Node *last; - u64 node_count; -}; - -typedef struct U16Node U16Node; -struct U16Node { - u16 *item; - U16Node *prev; - U16Node *next; -}; - -typedef struct U16List U16List; -struct U16List { - U16Node *first; - U16Node *last; - u64 node_count; -}; - -typedef struct U32Node U32Node; -struct U32Node { - u32 *item; - U32Node *prev; - U32Node *next; -}; - -typedef struct U32List U32List; -struct U32List { - U32Node *first; - U32Node *last; - u64 node_count; -}; - -typedef struct U64Node U64Node; -struct U64Node { - u64 *item; - U64Node *prev; - U64Node *next; -}; - -typedef struct U64List U64List; -struct U64List { - U64Node *first; - U64Node *last; - u64 node_count; -}; - -typedef struct F32Node F32Node; -struct F32Node { - f32 *item; - F32Node *prev; - F32Node *next; -}; - -typedef struct F32List F32List; -struct F32List { - F32Node *first; - F32Node *last; - u64 node_count; -}; - -typedef struct F64Node F64Node; -struct F64Node { - f64 *item; - F64Node *prev; - F64Node *next; -}; - -typedef struct F64List F64List; -struct F64List { - F64Node *first; - F64Node *last; - u64 node_count; -}; - -typedef struct F128Node F128Node; -struct F128Node { - f128 *item; - F128Node *prev; - F128Node *next; -}; - -typedef struct F128List F128List; -struct F128List { - F128Node *first; - F128Node *last; - u64 node_count; -}; - -typedef struct IptrNode IptrNode; -struct IptrNode { - iptr *item; - IptrNode *prev; - IptrNode *next; -}; - -typedef struct IptrList IptrList; -struct IptrList { - IptrNode *first; - IptrNode *last; - u64 node_count; -}; - -typedef struct UptrNode UptrNode; -struct UptrNode { - uptr *item; - UptrNode *prev; - UptrNode *next; -}; - -typedef struct UptrList UptrList; -struct UptrList { - UptrNode *first; - UptrNode *last; - u64 node_count; -}; - -VoidPNode *wapp_void_ptr_list_get(const VoidPList *list, u64 index); -void wapp_void_ptr_list_push_front(VoidPList *list, VoidPNode *node); -void wapp_void_ptr_list_push_back(VoidPList *list, VoidPNode *node); -void wapp_void_ptr_list_insert(VoidPList *list, VoidPNode *node, u64 index); -VoidPNode *wapp_void_ptr_list_pop_front(VoidPList *list); -VoidPNode *wapp_void_ptr_list_pop_back(VoidPList *list); -VoidPNode *wapp_void_ptr_list_remove(VoidPList *list, u64 index); -void wapp_void_ptr_list_empty(VoidPList *list); -Str8Node *wapp_str8_list_get(const Str8List *list, u64 index); -void wapp_str8_list_push_front(Str8List *list, Str8Node *node); -void wapp_str8_list_push_back(Str8List *list, Str8Node *node); -void wapp_str8_list_insert(Str8List *list, Str8Node *node, u64 index); -Str8Node *wapp_str8_list_pop_front(Str8List *list); -Str8Node *wapp_str8_list_pop_back(Str8List *list); -Str8Node *wapp_str8_list_remove(Str8List *list, u64 index); -void wapp_str8_list_empty(Str8List *list); -B8Node *wapp_b8_list_get(const B8List *list, u64 index); -void wapp_b8_list_push_front(B8List *list, B8Node *node); -void wapp_b8_list_push_back(B8List *list, B8Node *node); -void wapp_b8_list_insert(B8List *list, B8Node *node, u64 index); -B8Node *wapp_b8_list_pop_front(B8List *list); -B8Node *wapp_b8_list_pop_back(B8List *list); -B8Node *wapp_b8_list_remove(B8List *list, u64 index); -void wapp_b8_list_empty(B8List *list); -CharNode *wapp_char_list_get(const CharList *list, u64 index); -void wapp_char_list_push_front(CharList *list, CharNode *node); -void wapp_char_list_push_back(CharList *list, CharNode *node); -void wapp_char_list_insert(CharList *list, CharNode *node, u64 index); -CharNode *wapp_char_list_pop_front(CharList *list); -CharNode *wapp_char_list_pop_back(CharList *list); -CharNode *wapp_char_list_remove(CharList *list, u64 index); -void wapp_char_list_empty(CharList *list); -C8Node *wapp_c8_list_get(const C8List *list, u64 index); -void wapp_c8_list_push_front(C8List *list, C8Node *node); -void wapp_c8_list_push_back(C8List *list, C8Node *node); -void wapp_c8_list_insert(C8List *list, C8Node *node, u64 index); -C8Node *wapp_c8_list_pop_front(C8List *list); -C8Node *wapp_c8_list_pop_back(C8List *list); -C8Node *wapp_c8_list_remove(C8List *list, u64 index); -void wapp_c8_list_empty(C8List *list); -C16Node *wapp_c16_list_get(const C16List *list, u64 index); -void wapp_c16_list_push_front(C16List *list, C16Node *node); -void wapp_c16_list_push_back(C16List *list, C16Node *node); -void wapp_c16_list_insert(C16List *list, C16Node *node, u64 index); -C16Node *wapp_c16_list_pop_front(C16List *list); -C16Node *wapp_c16_list_pop_back(C16List *list); -C16Node *wapp_c16_list_remove(C16List *list, u64 index); -void wapp_c16_list_empty(C16List *list); -C32Node *wapp_c32_list_get(const C32List *list, u64 index); -void wapp_c32_list_push_front(C32List *list, C32Node *node); -void wapp_c32_list_push_back(C32List *list, C32Node *node); -void wapp_c32_list_insert(C32List *list, C32Node *node, u64 index); -C32Node *wapp_c32_list_pop_front(C32List *list); -C32Node *wapp_c32_list_pop_back(C32List *list); -C32Node *wapp_c32_list_remove(C32List *list, u64 index); -void wapp_c32_list_empty(C32List *list); -I8Node *wapp_i8_list_get(const I8List *list, u64 index); -void wapp_i8_list_push_front(I8List *list, I8Node *node); -void wapp_i8_list_push_back(I8List *list, I8Node *node); -void wapp_i8_list_insert(I8List *list, I8Node *node, u64 index); -I8Node *wapp_i8_list_pop_front(I8List *list); -I8Node *wapp_i8_list_pop_back(I8List *list); -I8Node *wapp_i8_list_remove(I8List *list, u64 index); -void wapp_i8_list_empty(I8List *list); -I16Node *wapp_i16_list_get(const I16List *list, u64 index); -void wapp_i16_list_push_front(I16List *list, I16Node *node); -void wapp_i16_list_push_back(I16List *list, I16Node *node); -void wapp_i16_list_insert(I16List *list, I16Node *node, u64 index); -I16Node *wapp_i16_list_pop_front(I16List *list); -I16Node *wapp_i16_list_pop_back(I16List *list); -I16Node *wapp_i16_list_remove(I16List *list, u64 index); -void wapp_i16_list_empty(I16List *list); -I32Node *wapp_i32_list_get(const I32List *list, u64 index); -void wapp_i32_list_push_front(I32List *list, I32Node *node); -void wapp_i32_list_push_back(I32List *list, I32Node *node); -void wapp_i32_list_insert(I32List *list, I32Node *node, u64 index); -I32Node *wapp_i32_list_pop_front(I32List *list); -I32Node *wapp_i32_list_pop_back(I32List *list); -I32Node *wapp_i32_list_remove(I32List *list, u64 index); -void wapp_i32_list_empty(I32List *list); -I64Node *wapp_i64_list_get(const I64List *list, u64 index); -void wapp_i64_list_push_front(I64List *list, I64Node *node); -void wapp_i64_list_push_back(I64List *list, I64Node *node); -void wapp_i64_list_insert(I64List *list, I64Node *node, u64 index); -I64Node *wapp_i64_list_pop_front(I64List *list); -I64Node *wapp_i64_list_pop_back(I64List *list); -I64Node *wapp_i64_list_remove(I64List *list, u64 index); -void wapp_i64_list_empty(I64List *list); -U8Node *wapp_u8_list_get(const U8List *list, u64 index); -void wapp_u8_list_push_front(U8List *list, U8Node *node); -void wapp_u8_list_push_back(U8List *list, U8Node *node); -void wapp_u8_list_insert(U8List *list, U8Node *node, u64 index); -U8Node *wapp_u8_list_pop_front(U8List *list); -U8Node *wapp_u8_list_pop_back(U8List *list); -U8Node *wapp_u8_list_remove(U8List *list, u64 index); -void wapp_u8_list_empty(U8List *list); -U16Node *wapp_u16_list_get(const U16List *list, u64 index); -void wapp_u16_list_push_front(U16List *list, U16Node *node); -void wapp_u16_list_push_back(U16List *list, U16Node *node); -void wapp_u16_list_insert(U16List *list, U16Node *node, u64 index); -U16Node *wapp_u16_list_pop_front(U16List *list); -U16Node *wapp_u16_list_pop_back(U16List *list); -U16Node *wapp_u16_list_remove(U16List *list, u64 index); -void wapp_u16_list_empty(U16List *list); -U32Node *wapp_u32_list_get(const U32List *list, u64 index); -void wapp_u32_list_push_front(U32List *list, U32Node *node); -void wapp_u32_list_push_back(U32List *list, U32Node *node); -void wapp_u32_list_insert(U32List *list, U32Node *node, u64 index); -U32Node *wapp_u32_list_pop_front(U32List *list); -U32Node *wapp_u32_list_pop_back(U32List *list); -U32Node *wapp_u32_list_remove(U32List *list, u64 index); -void wapp_u32_list_empty(U32List *list); -U64Node *wapp_u64_list_get(const U64List *list, u64 index); -void wapp_u64_list_push_front(U64List *list, U64Node *node); -void wapp_u64_list_push_back(U64List *list, U64Node *node); -void wapp_u64_list_insert(U64List *list, U64Node *node, u64 index); -U64Node *wapp_u64_list_pop_front(U64List *list); -U64Node *wapp_u64_list_pop_back(U64List *list); -U64Node *wapp_u64_list_remove(U64List *list, u64 index); -void wapp_u64_list_empty(U64List *list); -F32Node *wapp_f32_list_get(const F32List *list, u64 index); -void wapp_f32_list_push_front(F32List *list, F32Node *node); -void wapp_f32_list_push_back(F32List *list, F32Node *node); -void wapp_f32_list_insert(F32List *list, F32Node *node, u64 index); -F32Node *wapp_f32_list_pop_front(F32List *list); -F32Node *wapp_f32_list_pop_back(F32List *list); -F32Node *wapp_f32_list_remove(F32List *list, u64 index); -void wapp_f32_list_empty(F32List *list); -F64Node *wapp_f64_list_get(const F64List *list, u64 index); -void wapp_f64_list_push_front(F64List *list, F64Node *node); -void wapp_f64_list_push_back(F64List *list, F64Node *node); -void wapp_f64_list_insert(F64List *list, F64Node *node, u64 index); -F64Node *wapp_f64_list_pop_front(F64List *list); -F64Node *wapp_f64_list_pop_back(F64List *list); -F64Node *wapp_f64_list_remove(F64List *list, u64 index); -void wapp_f64_list_empty(F64List *list); -F128Node *wapp_f128_list_get(const F128List *list, u64 index); -void wapp_f128_list_push_front(F128List *list, F128Node *node); -void wapp_f128_list_push_back(F128List *list, F128Node *node); -void wapp_f128_list_insert(F128List *list, F128Node *node, u64 index); -F128Node *wapp_f128_list_pop_front(F128List *list); -F128Node *wapp_f128_list_pop_back(F128List *list); -F128Node *wapp_f128_list_remove(F128List *list, u64 index); -void wapp_f128_list_empty(F128List *list); -IptrNode *wapp_iptr_list_get(const IptrList *list, u64 index); -void wapp_iptr_list_push_front(IptrList *list, IptrNode *node); -void wapp_iptr_list_push_back(IptrList *list, IptrNode *node); -void wapp_iptr_list_insert(IptrList *list, IptrNode *node, u64 index); -IptrNode *wapp_iptr_list_pop_front(IptrList *list); -IptrNode *wapp_iptr_list_pop_back(IptrList *list); -IptrNode *wapp_iptr_list_remove(IptrList *list, u64 index); -void wapp_iptr_list_empty(IptrList *list); -UptrNode *wapp_uptr_list_get(const UptrList *list, u64 index); -void wapp_uptr_list_push_front(UptrList *list, UptrNode *node); -void wapp_uptr_list_push_back(UptrList *list, UptrNode *node); -void wapp_uptr_list_insert(UptrList *list, UptrNode *node, u64 index); -UptrNode *wapp_uptr_list_pop_front(UptrList *list); -UptrNode *wapp_uptr_list_pop_back(UptrList *list); -UptrNode *wapp_uptr_list_remove(UptrList *list, u64 index); -void wapp_uptr_list_empty(UptrList *list); +WAPP_DEF_DBL_LIST_TYPE(void *, VoidPtrNode, VoidPtrList); +WAPP_DEF_DBL_LIST_TYPE(c8 , C8Node , C8List); +WAPP_DEF_DBL_LIST_TYPE(c16 , C16Node , C16List); +WAPP_DEF_DBL_LIST_TYPE(c32 , C32Node , C32List); +WAPP_DEF_DBL_LIST_TYPE(u8 , U8Node , U8List); +WAPP_DEF_DBL_LIST_TYPE(u16 , U16Node , U16List); +WAPP_DEF_DBL_LIST_TYPE(u32 , U32Node , U32List); +WAPP_DEF_DBL_LIST_TYPE(u64 , U64Node , U64List); +WAPP_DEF_DBL_LIST_TYPE(b8 , B8Node , B8List); +WAPP_DEF_DBL_LIST_TYPE(i8 , I8Node , I8List); +WAPP_DEF_DBL_LIST_TYPE(i16 , I16Node , I16List); +WAPP_DEF_DBL_LIST_TYPE(i32 , I32Node , I32List); +WAPP_DEF_DBL_LIST_TYPE(i64 , I64Node , I64List); +WAPP_DEF_DBL_LIST_TYPE(f32 , F32Node , F32List); +WAPP_DEF_DBL_LIST_TYPE(f64 , F64Node , F64List); +WAPP_DEF_DBL_LIST_TYPE(f128 , F128Node , F128List); +WAPP_DEF_DBL_LIST_TYPE(uptr , UptrNode , UptrList); +WAPP_DEF_DBL_LIST_TYPE(iptr , IptrNode , IptrList); +WAPP_DEF_DBL_LIST_TYPE(Str8 , Str8Node , Str8List); #ifdef WAPP_PLATFORM_CPP END_C_LINKAGE diff --git a/src/base/strings/str8/str8.c b/src/base/strings/str8/str8.c index 7fb97e6..25c6deb 100644 --- a/src/base/strings/str8/str8.c +++ b/src/base/strings/str8/str8.c @@ -333,14 +333,14 @@ i64 wapp_str8_rfind(Str8RO *str, Str8RO substr) { Str8List *wapp_str8_split_with_max(const Allocator *allocator, Str8RO *str, Str8RO *delimiter, i64 max_splits) { wapp_debug_assert(allocator != NULL && str != NULL && delimiter != NULL, "`allocator`, `str` and `delimiter` should not be NULL"); - Str8List *output = wapp_mem_allocator_alloc(allocator, sizeof(Str8List)); + Str8List *output = wapp_dbl_list_alloc(Str8, Str8List, allocator); if (delimiter->size > str->size) { Str8 *full = wapp_str8_alloc_str8(allocator, str); - Str8Node *node = wapp_mem_allocator_alloc(allocator, sizeof(Str8Node)); + Str8Node *node = wapp_dbl_list_node_alloc(Str8, Str8Node, allocator); if (node) { node->item = full; - wapp_str8_list_push_back(output, node); + wapp_dbl_list_push_back(Str8, output, node); } goto RETURN_STR8_SPLIT; @@ -358,10 +358,10 @@ Str8List *wapp_str8_split_with_max(const Allocator *allocator, Str8RO *str, Str8 } before_str = wapp_str8_alloc_substr(allocator, str, start, start + end); - Str8Node *node = wapp_mem_allocator_alloc(allocator, sizeof(Str8Node)); + Str8Node *node = wapp_dbl_list_node_alloc(Str8, Str8Node, allocator); if (node && before_str) { node->item = before_str; - wapp_str8_list_push_back(output, node); + wapp_dbl_list_push_back(Str8, output, node); } wapp_mem_allocator_free(allocator, (void **)&rest, sizeof(Str8)); @@ -373,10 +373,10 @@ Str8List *wapp_str8_split_with_max(const Allocator *allocator, Str8RO *str, Str8 // Ensure the last part of the string after the delimiter is added to the list rest = wapp_str8_alloc_substr(allocator, str, start, str->size); - Str8Node *node = wapp_mem_allocator_alloc(allocator, sizeof(Str8Node)); + Str8Node *node = wapp_dbl_list_node_alloc(Str8, Str8Node, allocator); if (node && rest) { node->item = rest; - wapp_str8_list_push_back(output, node); + wapp_dbl_list_push_back(Str8, output, node); } RETURN_STR8_SPLIT: @@ -386,14 +386,14 @@ RETURN_STR8_SPLIT: Str8List *wapp_str8_rsplit_with_max(const Allocator *allocator, Str8RO *str, Str8RO *delimiter, i64 max_splits) { wapp_debug_assert(allocator != NULL && str != NULL && delimiter != NULL, "`allocator`, `str` and `delimiter` should not be NULL"); - Str8List *output = wapp_mem_allocator_alloc(allocator, sizeof(Str8List)); + Str8List *output = wapp_dbl_list_alloc(Str8, Str8List, allocator); if (delimiter->size > str->size) { Str8 *full = wapp_str8_alloc_str8(allocator, str); - Str8Node *node = wapp_mem_allocator_alloc(allocator, sizeof(Str8Node)); + Str8Node *node = wapp_dbl_list_node_alloc(Str8, Str8Node, allocator); if (node && full) { node->item = full; - wapp_str8_list_push_back(output, node); + wapp_dbl_list_push_back(Str8, output, node); } goto RETURN_STR8_SPLIT; @@ -410,10 +410,10 @@ Str8List *wapp_str8_rsplit_with_max(const Allocator *allocator, Str8RO *str, Str } after_str = wapp_str8_alloc_substr(allocator, rest, end + delimiter->size, str->size); - Str8Node *node = wapp_mem_allocator_alloc(allocator, sizeof(Str8Node)); + Str8Node *node = wapp_dbl_list_node_alloc(Str8, Str8Node, allocator); if (node) { node->item = after_str; - wapp_str8_list_push_front(output, node); + wapp_dbl_list_push_front(Str8, output, node); } wapp_mem_allocator_free(allocator, (void **)&rest, sizeof(Str8)); @@ -423,10 +423,10 @@ Str8List *wapp_str8_rsplit_with_max(const Allocator *allocator, Str8RO *str, Str } rest = wapp_str8_alloc_substr(allocator, str, 0, rest->size); - Str8Node *node = wapp_mem_allocator_alloc(allocator, sizeof(Str8Node)); + Str8Node *node = wapp_dbl_list_node_alloc(Str8, Str8Node, allocator); if (node && rest) { node->item = rest; - wapp_str8_list_push_front(output, node); + wapp_dbl_list_push_front(Str8, output, node); } RETURN_STR8_SPLIT: @@ -445,7 +445,7 @@ Str8 *wapp_str8_join(const Allocator *allocator, const Str8List *list, Str8RO *d u64 node_index = 0; b8 running = node_index < list->node_count; while (running) { - node = wapp_str8_list_get(list, node_index); + node = wapp_dbl_list_get(Str8, Str8Node, list, node_index); if (!node) { break; } @@ -478,7 +478,7 @@ u64 wapp_str8_list_total_size(const Str8List *list) { u64 output = 0; b8 running = node_index < list->node_count; while (running) { - node = wapp_str8_list_get(list, node_index); + node = wapp_dbl_list_get(Str8, Str8Node, list, node_index); if (!node) { break; } diff --git a/src/base/strings/str8/str8.h b/src/base/strings/str8/str8.h index 22243b0..52f84ca 100644 --- a/src/base/strings/str8/str8.h +++ b/src/base/strings/str8/str8.h @@ -120,17 +120,17 @@ Str8 *wapp_str8_join(const Allocator *allocator, const Str8List *list, Str8R * Str8 list utilities */ #ifdef WAPP_PLATFORM_CPP -#define wapp_str8_node_from_cstr(STRING) wapp_str8_list_node([&]() { \ - wapp_persist Str8 str = wapp_str8_lit(STRING); \ - return &str; \ +#define wapp_str8_node_from_cstr(STRING) wapp_dbl_list_node(Str8, Str8Node, [&]() { \ + wapp_persist Str8 str = wapp_str8_lit(STRING); \ + return &str; \ }()) -#define wapp_str8_node_from_str8(STRING) wapp_str8_list_node([&]() { \ - wapp_persist Str8 str = STRING; \ - return &str; \ +#define wapp_str8_node_from_str8(STRING) wapp_dbl_list_node(Str8, Str8Node, [&]() { \ + wapp_persist Str8 str = STRING; \ + return &str; \ }()) #else -#define wapp_str8_node_from_cstr(STRING) wapp_str8_list_node(&wapp_str8_lit(STRING)) -#define wapp_str8_node_from_str8(STRING) wapp_str8_list_node(&(STRING)) +#define wapp_str8_node_from_cstr(STRING) wapp_dbl_list_node(Str8, Str8Node, &wapp_str8_lit(STRING)) +#define wapp_str8_node_from_str8(STRING) wapp_dbl_list_node(Str8, Str8Node, &(STRING)) #endif // !WAPP_PLATFORM_CPP u64 wapp_str8_list_total_size(const Str8List *list); diff --git a/src/os/cpath/cpath.c b/src/os/cpath/cpath.c index c99c2ce..0ff737b 100644 --- a/src/os/cpath/cpath.c +++ b/src/os/cpath/cpath.c @@ -29,7 +29,7 @@ u32 wapp_cpath_join_path(Str8 *dst, const Str8List *parts) { } // Handle first node - const Str8Node *first_node = wapp_str8_list_get(parts, 0); + const Str8Node *first_node = wapp_dbl_list_get(Str8, Str8Node, parts, 0); wapp_str8_copy_str8_capped(dst, first_node->item); // NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of @@ -106,7 +106,7 @@ Str8 *dirup(const Allocator *allocator, Str8RO *path, u64 levels) { wapp_str8_push_back(output, absolute ? WAPP_PATH_SEP : '.'); } else { for (u64 i = 0; i < levels; ++i) { - wapp_str8_list_pop_back(parts); + wapp_dbl_list_pop_back(Str8, Str8Node, parts); } u64 alignment = sizeof(void *) * 2;