- #ifndef IZ_LIST_H
- #define IZ_LIST_H
-
- #include "../../common/IZ_common.h"
- #include "../../stdinc/IZ_stdlib.h"
-
- struct IZ_List;
-
- /**
- * A node in a linked list.
- */
- typedef struct IZ_ListNode {
- /**
- * The list that the node belongs to.
- */
- struct IZ_List* list;
- /**
- * The previous node in the list.
- */
- struct IZ_ListNode* previous;
- /**
- * The value of the node.
- */
- void* value;
- /**
- * The next node in the list.
- */
- struct IZ_ListNode* next;
- } IZ_ListNode;
-
- /**
- * A doubly-linked list.
- */
- typedef struct IZ_List {
- /**
- * The first node in the list.
- */
- IZ_ListNode* root;
- /**
- * The number of nodes in the list.
- */
- u64 length;
- /**
- * The iterator for traversing the list.
- */
- IZ_ListNode** iterator;
- } IZ_List;
-
- typedef bool IZ_ListFindPredicate(IZ_ListNode**, u64, IZ_List*);
-
- #ifdef IZ_DEBUG
- void IZ_ListPrintNodeValues(IZ_List*);
- #endif
-
- /**
- * Initializes a list.
- */
- void IZ_ListInitialize(IZ_List*);
-
- /**
- * Performs cleanup on a list.
- */
- void IZ_ListTeardown(IZ_List*);
-
- /**
- * Appends a node to the end of the list.
- * @return Pointer to the newly created node.
- */
- void IZ_ListAppendNode(IZ_List*, void*, IZ_ListNode**);
-
- /**
- * Deletes the first node in the list that matches the filter.
- */
- void IZ_ListDeleteNode(IZ_ListNode*);
-
- /**
- * Finds the first node in the list that matches the filter.
- * @return Pointer to the node that matches the filter.
- * @see IZ_ListFindPredicate
- * @see IZ_ListFindAllNodes
- */
- void IZ_ListFindFirstNode(IZ_List*, IZ_ListFindPredicate, IZ_ListNode**);
-
- /**
- * Finds all nodes in the list that match the filter.
- * @return New list containing nodes that match the filter.
- * @see IZ_ListFindPredicate
- * @see IZ_ListFindFirstNode
- */
- void IZ_ListFindAllNodes(IZ_List*, IZ_ListFindPredicate, IZ_List*);
-
- /**
- * Inserts a node at the specified index.
- * @return Pointer to the newly created node.
- */
- void IZ_ListInsertNodeAtIndex(IZ_List*, void*, u64, IZ_ListNode**);
-
- #endif
|