#ifndef CORE_LINKED_LIST_H #define CORE_LINKED_LIST_H #include "core/Types.h" struct CoreLinkedListNode { struct CoreLinkedListNode* next; struct CoreLinkedListNode* previous; }; typedef struct CoreLinkedListNode CoreLinkedListNode; typedef struct { CoreLinkedListNode* first; CoreLinkedListNode* last; size_t length; } CoreLinkedList; #define CORE_LINKED_LIST ((CoreLinkedList){nullptr, nullptr, 0}) void coreDestroyLinkedList(CoreLinkedList* l); CoreLinkedListNode* coreLinkedListAddPointer(CoreLinkedList* l, const void* data, size_t n); #define coreLinkedListAdd(l, type, ...) \ coreLinkedListAddPointer(l, &(type){__VA_ARGS__}, sizeof(type)) #define coreLinkedListGetPointer(node, type) ((type*)(node + 1)) #define coreLinkedListGet(node, type) (*coreLinkedListGetPointer(node, type)) void coreClearLinkedList(CoreLinkedList* l); void coreLinkedListRemove(CoreLinkedList* l, CoreLinkedListNode* n); void coreLinkedListRemoveFirst(CoreLinkedList* l); void coreLinkedListRemoveLast(CoreLinkedList* l); size_t coreToStringLinkedList(CoreLinkedList* l, char* buffer, size_t n, CoreToString c); void coreSwapLinkedList(CoreLinkedList* a, CoreLinkedList* b); #endif