Veritable Lasagna
An Allocator & Data Structure Library for C.
Loading...
Searching...
No Matches
vl_linked_list.h
Go to the documentation of this file.
1#ifndef VL_LIST_H
2#define VL_LIST_H
3
4#include "vl_fixed_pool.h"
5#include "vl_compare.h"
6#include "vl_memory.h"
7
8#define VL_LIST_ITER_INVALID VL_FIXEDPOOL_INVALID_IDX
9
16#define VL_LIST_FOREACH(list, trackVar) for(vl_list_iter trackVar = (list)->head; (trackVar) != VL_LIST_ITER_INVALID; (trackVar) = vlListNext(list, trackVar))
17
24#define VL_LIST_FOREACH_REVERSE(list, trackVar) for(vl_list_iter trackVar = (list)->tail; (trackVar) != VL_LIST_ITER_INVALID; (trackVar) = vlListPrev(list, trackVar))
25
30
53
64void vlListInit(vl_linked_list* list, vl_memsize_t elementSize);
65
66#ifndef vlListFree
67
77#define vlListFree(listPtr) vlFixedPoolFree(&((listPtr)->nodePool))
78
79#endif
80
88
99
110vl_list_iter vlListPushFront(vl_linked_list* list, const void* elem);
111
121
132vl_list_iter vlListPushBack(vl_linked_list* list, const void* elem);
133
142void vlListPopBack(vl_linked_list* list);
143
155vl_list_iter vlListInsertAfter(vl_linked_list* list, vl_list_iter target, const void* elem);
156
168vl_list_iter vlListInsertBefore(vl_linked_list* list, vl_list_iter target, const void* elem);
169
170#ifndef vlListSize
177#define vlListSize(listPtr) (vl_dsidx_t)((listPtr)->length)
178#endif
179
180#ifndef vlListReserve
187#define vlListReserve(listPtr, n) vlFixedPoolReserve(&((listPtr)->nodePool))
188#endif
189
190#ifndef vlListClear
200#define vlListClear(listPtr) (((listPtr)->head = (listPtr)->tail = VL_LIST_ITER_INVALID));\
201 vlFixedPoolClear(&((listPtr)->nodePool))
202#endif
203
220
241
256
269vl_list_iter vlListFind(vl_linked_list* src, const void* element);
270
281
292
303
313
314#endif //VL_LIST_H
vl_int_t(* vl_compare_function)(const void *dataA, const void *dataB)
Definition vl_compare.h:18
VL_FIXEDPOOL_INDEX_T vl_fixedpool_idx
Definition vl_fixed_pool.h:45
A non-trivial pool allocator, useful for avoiding many smaller heap allocations.
Definition vl_fixed_pool.h:87
void vlListPopBack(vl_linked_list *list)
Removes whatever element is at the end of the list.
Definition vl_linked_list.c:105
vl_list_iter vlListInsertAfter(vl_linked_list *list, vl_list_iter target, const void *elem)
Inserts an element immediately after the specified target.
Definition vl_linked_list.c:125
void vlListInit(vl_linked_list *list, vl_memsize_t elementSize)
Initializes the specified list instance.
Definition vl_linked_list.c:16
void vlListDelete(vl_linked_list *list)
Deletes the specified list instance.
Definition vl_linked_list.c:29
vl_linked_list * vlListNew(vl_memsize_t elementSize)
Allocates on the heap, initializes, and returns a list instance.
Definition vl_linked_list.c:23
vl_list_iter vlListFind(vl_linked_list *src, const void *element)
Performs an iterative search on the specified list.
Definition vl_linked_list.c:384
void vlListSort(vl_linked_list *src, vl_compare_function cmp)
Sorts the specified list in-place using the given comparator.
Definition vl_linked_list.c:350
vl_list_iter vlListInsertBefore(vl_linked_list *list, vl_list_iter target, const void *elem)
Inserts an element immediately before the specified target.
Definition vl_linked_list.c:147
vl_fixedpool nodePool
Definition vl_linked_list.h:47
int vlListCopy(vl_linked_list *src, vl_list_iter begin, vl_list_iter end, vl_linked_list *dest, vl_list_iter after)
Copies a range of elements from one list to another.
Definition vl_linked_list.c:182
vl_linked_list * vlListClone(const vl_linked_list *src, vl_linked_list *dest)
Clones the specified list to another.
Definition vl_linked_list.c:169
vl_list_iter tail
Definition vl_linked_list.h:50
vl_memsize_t elementSize
Definition vl_linked_list.h:48
vl_list_iter vlListNext(vl_linked_list *list, vl_list_iter iter)
Returns next adjacent iterator, or VL_LIST_ITER_INVALID if no such element exists.
Definition vl_linked_list.c:412
vl_fixedpool_idx vl_list_iter
List iterator type. Represents a location within a vl_linked_list.
Definition vl_linked_list.h:29
vl_list_iter vlListPushBack(vl_linked_list *list, const void *elem)
Adds a new element to the end of the list.
Definition vl_linked_list.c:80
void vlListPopFront(vl_linked_list *list)
Removes whatever element is at the front of the list.
Definition vl_linked_list.c:60
vl_list_iter vlListPrev(vl_linked_list *list, vl_list_iter iter)
Returns the previous adjacent iterator, or VL_LIST_ITER_INVALID if no such element exists.
Definition vl_linked_list.c:417
vl_dsidx_t length
Definition vl_linked_list.h:51
vl_list_iter head
Definition vl_linked_list.h:49
vl_transient * vlListSample(vl_linked_list *list, vl_list_iter iter)
Returns a pointer to the element data for the specified iterator.
Definition vl_linked_list.c:422
void vlListRemove(vl_linked_list *list, vl_list_iter iter)
Removes the specified element from the list.
Definition vl_linked_list.c:391
vl_list_iter vlListPushFront(vl_linked_list *list, const void *elem)
Adds a new element to the front of the list.
Definition vl_linked_list.c:34
A doubly-linked list.
Definition vl_linked_list.h:46
VL_MEMORY_SIZE_T vl_memsize_t
Definition vl_memory.h:18
VL_MEMORY_T vl_transient
Definition vl_memory.h:85
VL_STRUCTURE_INDEX_T vl_dsidx_t
Index type for data structures.
Definition vl_numtypes.h:13