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
14#ifndef VL_LIST_H
15#define VL_LIST_H
16
17#include "vl_compare.h"
18#include "vl_pool.h"
19
20#define VL_LIST_ITER_INVALID VL_POOL_INVALID_IDX
21
28#define VL_LIST_FOREACH(list, trackVar) \
29 for (vl_list_iter trackVar = (list)->head; (trackVar) != VL_LIST_ITER_INVALID; \
30 (trackVar) = vlListNext(list, trackVar))
31
38#define VL_LIST_FOREACH_REVERSE(list, trackVar) \
39 for (vl_list_iter trackVar = (list)->tail; (trackVar) != VL_LIST_ITER_INVALID; \
40 (trackVar) = vlListPrev(list, trackVar))
41
46
78
101VL_API void vlListInit(vl_linked_list* list, vl_uint16_t elementSize);
102
103#ifndef vlListFree
104
114#define vlListFree(listPtr) vlPoolFree(&((listPtr)->nodePool))
115
116#endif
117
135VL_API vl_linked_list* vlListNew(vl_uint16_t elementSize);
136
156VL_API void vlListDelete(vl_linked_list* list);
157
180VL_API vl_list_iter vlListPushFront(vl_linked_list* list, const void* elem);
181
200VL_API void vlListPopFront(vl_linked_list* list);
201
222VL_API vl_list_iter vlListPushBack(vl_linked_list* list, const void* elem);
223
242VL_API void vlListPopBack(vl_linked_list* list);
243
265VL_API vl_list_iter vlListInsertAfter(vl_linked_list* list, vl_list_iter target, const void* elem);
266
289VL_API vl_list_iter vlListInsertBefore(vl_linked_list* list, vl_list_iter target, const void* elem);
290
291#ifndef vlListSize
298#define vlListSize(listPtr) (vl_dsidx_t)((listPtr)->length)
299#endif
300
301#ifndef vlListReserve
308#define vlListReserve(listPtr, n) vlFixedPoolReserve(&((listPtr)->nodePool))
309#endif
310
311#ifndef vlListClear
322#define vlListClear(listPtr) \
323 (((listPtr)->head = (listPtr)->tail = VL_LIST_ITER_INVALID)); \
324 vlFixedPoolClear(&((listPtr)->nodePool))
325#endif
326
356
391VL_API int vlListCopy(vl_linked_list* src, vl_list_iter begin, vl_list_iter end, vl_linked_list* dest,
392 vl_list_iter after);
393
417VL_API void vlListSort(vl_linked_list* src, vl_compare_function cmp);
418
440VL_API vl_list_iter vlListFind(vl_linked_list* src, const void* element);
441
462VL_API void vlListRemove(vl_linked_list* list, vl_list_iter iter);
463
485
507
526VL_API void* vlListSample(vl_linked_list* list, vl_list_iter iter);
527
528#endif // VL_LIST_H
VL_API 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:38
vl_pool nodePool
Definition vl_linked_list.h:72
VL_API 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:463
vl_pool_idx vl_list_iter
List iterator type. Represents a location within a vl_linked_list.
Definition vl_linked_list.h:45
VL_API vl_list_iter vlListFind(vl_linked_list *src, const void *element)
Performs an iterative search on the specified list.
Definition vl_linked_list.c:427
VL_API vl_linked_list * vlListNew(vl_uint16_t elementSize)
Allocates on the heap, initializes, and returns a new list instance.
Definition vl_linked_list.c:25
VL_API 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:387
VL_API 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:197
VL_API void vlListPopFront(vl_linked_list *list)
Removes whatever element is at the front of the list.
Definition vl_linked_list.c:66
vl_list_iter tail
Definition vl_linked_list.h:75
vl_uint16_t elementSize
Definition vl_linked_list.h:73
VL_API 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:469
VL_API void vlListDelete(vl_linked_list *list)
Deletes the specified list instance and its internal pool.
Definition vl_linked_list.c:32
VL_API 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:88
VL_API void * 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:475
VL_API void vlListRemove(vl_linked_list *list, vl_list_iter iter)
Removes the specified element from the list.
Definition vl_linked_list.c:435
VL_API void vlListPopBack(vl_linked_list *list)
Removes whatever element is at the end of the list.
Definition vl_linked_list.c:115
VL_API vl_linked_list * vlListClone(const vl_linked_list *src, vl_linked_list *dest)
Clones the specified list to another.
Definition vl_linked_list.c:183
VL_API void vlListInit(vl_linked_list *list, vl_uint16_t elementSize)
Initializes the specified list instance.
Definition vl_linked_list.c:17
vl_dsidx_t length
Definition vl_linked_list.h:76
vl_list_iter head
Definition vl_linked_list.h:74
VL_API 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:160
VL_API 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:137
A doubly-linked list with pool-based memory management.
Definition vl_linked_list.h:71
VL_STRUCTURE_INDEX_T vl_dsidx_t
Index type for data structures.
Definition vl_numtypes.h:75
VL_POOL_INDEX_T vl_pool_idx
Definition vl_pool.h:53
Fixed-size memory pool with stable indices and geometric growth.
Definition vl_pool.h:141