/** * THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN */ #include "./dbl_list.h" #include "../../common/assert/assert.h" #include "../../common/aliases/aliases.h" #include "../../common/aliases/aliases.h" #include "../../common/platform/platform.h" #include #include internal Str8List str8_node_to_list(Str8Node *node); internal VoidPList void_ptr_node_to_list(VoidPNode *node); internal B32List b32_node_to_list(B32Node *node); internal CharList char_node_to_list(CharNode *node); internal C8List c8_node_to_list(C8Node *node); internal C16List c16_node_to_list(C16Node *node); internal C32List c32_node_to_list(C32Node *node); internal I8List i8_node_to_list(I8Node *node); internal I16List i16_node_to_list(I16Node *node); internal I32List i32_node_to_list(I32Node *node); internal I64List i64_node_to_list(I64Node *node); internal U8List u8_node_to_list(U8Node *node); internal U16List u16_node_to_list(U16Node *node); internal U32List u32_node_to_list(U32Node *node); internal U64List u64_node_to_list(U64Node *node); internal F32List f32_node_to_list(F32Node *node); internal F64List f64_node_to_list(F64Node *node); internal F128List f128_node_to_list(F128Node *node); internal IptrList iptr_node_to_list(IptrNode *node); internal UptrList uptr_node_to_list(UptrNode *node); 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); } } VoidPNode *wapp_void_ptr_list_get(const VoidPList *list, u64 index) { wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); VoidPNode *output = NULL; VoidPNode *current = list->first; for (u64 i = 1; i <= index; ++i) { current = current->next; } output = current; return output; } void wapp_void_ptr_list_push_front(VoidPList *list, VoidPNode *node) { wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); VoidPList node_list = void_ptr_node_to_list(node); if (list->node_count == 0) { *list = node_list; return; } list->node_count += node_list.node_count; VoidPNode *first = list->first; if (first) { first->prev = node_list.last; } list->first = node_list.first; node_list.last->next = first; } void wapp_void_ptr_list_push_back(VoidPList *list, VoidPNode *node) { wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); VoidPList node_list = void_ptr_node_to_list(node); if (list->node_count == 0) { *list = node_list; return; } list->node_count += node_list.node_count; VoidPNode *last = list->last; if (last) { last->next = node_list.first; } list->last = node_list.last; node_list.first->prev = last; } void wapp_void_ptr_list_insert(VoidPList *list, VoidPNode *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_void_ptr_list_push_front(list, node); return; } else if (index == list->node_count) { wapp_void_ptr_list_push_back(list, node); return; } VoidPNode *dst_node = wapp_void_ptr_list_get(list, index); if (!dst_node) { return; } VoidPList node_list = void_ptr_node_to_list(node); list->node_count += node_list.node_count; VoidPNode *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; } VoidPNode *wapp_void_ptr_list_pop_front(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_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); } } B32Node *wapp_b32_list_get(const B32List *list, u64 index) { wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); B32Node *output = NULL; B32Node *current = list->first; for (u64 i = 1; i <= index; ++i) { current = current->next; } output = current; return output; } void wapp_b32_list_push_front(B32List *list, B32Node *node) { wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); B32List node_list = b32_node_to_list(node); if (list->node_count == 0) { *list = node_list; return; } list->node_count += node_list.node_count; B32Node *first = list->first; if (first) { first->prev = node_list.last; } list->first = node_list.first; node_list.last->next = first; } void wapp_b32_list_push_back(B32List *list, B32Node *node) { wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); B32List node_list = b32_node_to_list(node); if (list->node_count == 0) { *list = node_list; return; } list->node_count += node_list.node_count; B32Node *last = list->last; if (last) { last->next = node_list.first; } list->last = node_list.last; node_list.first->prev = last; } void wapp_b32_list_insert(B32List *list, B32Node *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_b32_list_push_front(list, node); return; } else if (index == list->node_count) { wapp_b32_list_push_back(list, node); return; } B32Node *dst_node = wapp_b32_list_get(list, index); if (!dst_node) { return; } B32List node_list = b32_node_to_list(node); list->node_count += node_list.node_count; B32Node *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; } B32Node *wapp_b32_list_pop_front(B32List *list) { wapp_debug_assert(list != NULL, "`list` should not be NULL"); B32Node *output = NULL; if (list->node_count == 0) { goto RETURN_B32_LIST_POP_FRONT; } output = list->first; if (list->node_count == 1) { *list = (B32List){0}; goto RETURN_B32_LIST_POP_FRONT; } --(list->node_count); list->first = output->next; output->prev = output->next = NULL; RETURN_B32_LIST_POP_FRONT: return output; } B32Node *wapp_b32_list_pop_back(B32List *list) { wapp_debug_assert(list != NULL, "`list` should not be NULL"); B32Node *output = NULL; if (list->node_count == 0) { goto RETURN_B32_LIST_POP_BACK; } output = list->last; if (list->node_count == 1) { *list = (B32List){0}; goto RETURN_B32_LIST_POP_BACK; } --(list->node_count); list->last = output->prev; output->prev = output->next = NULL; RETURN_B32_LIST_POP_BACK: return output; } B32Node *wapp_b32_list_remove(B32List *list, u64 index) { wapp_debug_assert(list != NULL, "`list` should not be NULL"); B32Node *output = NULL; if (index == 0) { output = wapp_b32_list_pop_front(list); goto RETURN_B32_LIST_REMOVE; } else if (index == list->node_count) { output = wapp_b32_list_pop_back(list); goto RETURN_B32_LIST_REMOVE; } output = wapp_b32_list_get(list, index); if (!output) { goto RETURN_B32_LIST_REMOVE; } output->prev->next = output->next; output->next->prev = output->prev; --(list->node_count); output->prev = output->next = NULL; RETURN_B32_LIST_REMOVE: return output; } void wapp_b32_list_empty(B32List *list) { wapp_debug_assert(list != NULL, "`list` should not be NULL"); u64 count = list->node_count; for (u64 i = 0; i < count; ++i) { wapp_b32_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; if (list->node_count == 0) { goto RETURN_I32_LIST_POP_FRONT; } output = list->first; if (list->node_count == 1) { *list = (I32List){0}; goto RETURN_I32_LIST_POP_FRONT; } --(list->node_count); list->first = output->next; output->prev = output->next = NULL; RETURN_I32_LIST_POP_FRONT: return output; } I32Node *wapp_i32_list_pop_back(I32List *list) { wapp_debug_assert(list != NULL, "`list` should not be NULL"); I32Node *output = NULL; if (list->node_count == 0) { goto RETURN_I32_LIST_POP_BACK; } output = list->last; if (list->node_count == 1) { *list = (I32List){0}; goto RETURN_I32_LIST_POP_BACK; } --(list->node_count); list->last = output->prev; output->prev = output->next = NULL; RETURN_I32_LIST_POP_BACK: return output; } I32Node *wapp_i32_list_remove(I32List *list, u64 index) { wapp_debug_assert(list != NULL, "`list` should not be NULL"); I32Node *output = NULL; if (index == 0) { output = wapp_i32_list_pop_front(list); goto RETURN_I32_LIST_REMOVE; } else if (index == list->node_count) { output = wapp_i32_list_pop_back(list); goto RETURN_I32_LIST_REMOVE; } output = wapp_i32_list_get(list, index); if (!output) { goto RETURN_I32_LIST_REMOVE; } output->prev->next = output->next; output->next->prev = output->prev; --(list->node_count); output->prev = output->next = NULL; RETURN_I32_LIST_REMOVE: return output; } void wapp_i32_list_empty(I32List *list) { wapp_debug_assert(list != NULL, "`list` should not be NULL"); u64 count = list->node_count; for (u64 i = 0; i < count; ++i) { wapp_i32_list_pop_back(list); } } 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); } } internal 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; } internal VoidPList void_ptr_node_to_list(VoidPNode *node) { VoidPList 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; } internal B32List b32_node_to_list(B32Node *node) { B32List 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; } internal 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; } internal 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; } internal 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; } internal 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; } internal 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; } internal 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; } internal 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; } internal 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; } internal 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; } internal 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; } internal 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; } internal 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; } internal 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; } internal 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; } internal 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; } internal 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; } internal 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; }