Macros for basic linked list operations. More...
Macros for basic linked list operations.
For in-depth documentation see http://troydhanson.github.io/uthash/utlist.html
Definition in file utlist.h.
Go to the source code of this file.
Macros | |
#define | UTLIST_VERSION 1.9.9 |
Version number. | |
Compiler dependent defines | |
These macros use decltype or the earlier __typeof GNU extension. As decltype is only available in newer compilers (VS2010 or gcc 4.3+ when compiling c++ code), this code uses whatever method is needed or, for VS2008 where neither is available, uses casting workarounds. For VS2008 we use some workarounds to get around the lack of decltype, namely, we always reassign our tmp variable to the list head if we need to dereference its prev/next pointers, and save/restore the real head. | |
#define | LDECLTYPE(x) |
#define | _SV(elt, list) |
#define | _NEXT(elt, list, next) |
#define | _NEXTASGN(elt, list, to, next) |
#define | _PREVASGN(elt, list, to, prev) |
#define | _RS(list) |
#define | _CASTASGN(a, b) |
Mergesort based sort macros | |
The sort macro is an adaptation of Simon Tatham's O(n log(n)) mergesort Unwieldy variable names used here to avoid shadowing passed-in variables. | |
#define | LL_SORT(list, cmp) |
#define | LL_SORT2(list, cmp, next) |
#define | DL_SORT(list, cmp) |
#define | DL_SORT2(list, cmp, prev, next) |
#define | CDL_SORT(list, cmp) |
#define | CDL_SORT2(list, cmp, prev, next) |
Singly linked list macros (non-circular) | |
#define | LL_PREPEND(head, add) |
LL prepend element 'add' to list. | |
#define | LL_PREPEND2(head, add, next) |
LL prepend to list with alternative next ptr name 'next'. | |
#define | LL_CONCAT(head1, head2) |
LL concat to append second list to first. | |
#define | LL_CONCAT2(head1, head2, next) |
LL concat with alternative next ptr name 'next'. | |
#define | LL_APPEND(head, add) |
LL append to append element 'add' to list. | |
#define | LL_APPEND2(head, add, next) |
LL append with alternative next ptr name 'next'. | |
#define | LL_DELETE(head, del) |
LL delete element 'del' from list. | |
#define | LL_DELETE2(head, del, next) |
LL delete with alternative next ptr name 'name'. | |
#define | LL_APPEND_VS2008(head, add) |
#define | LL_APPEND2_VS2008(head, add, next) |
#define | LL_DELETE_VS2008(head, del) |
#define | LL_DELETE2_VS2008(head, del, next) |
#define | LL_COUNT(head, el, counter) |
LL count list elements using 'counter'. | |
#define | LL_COUNT2(head, el, counter, next) |
LL count with alternative next ptr name 'next'. | |
#define | LL_FOREACH(head, el) |
LL list iteration. | |
#define | LL_FOREACH2(head, el, next) |
LL list iteration with alternative next ptr name 'next'. | |
#define | LL_FOREACH_SAFE(head, el, tmp) |
LL safe list iteration Use if list elements might be deleted while iterating. | |
#define | LL_FOREACH_SAFE2(head, el, tmp, next) |
LL safe list iteration with alternative ptr names. | |
#define | LL_SEARCH_SCALAR(head, out, field, val) |
LL scalar search for element with value 'val' for member 'field'. | |
#define | LL_SEARCH_SCALAR2(head, out, field, val, next) |
LL scalar search with alternative next ptr name 'next'. | |
#define | LL_SEARCH(head, out, elt, cmp) |
LL search element 'elt' in list using function 'cmp'. | |
#define | LL_SEARCH2(head, out, elt, cmp, next) |
LL search with alternative next ptr name 'next'. | |
#define | LL_REPLACE_ELEM(head, el, add) |
LL replace element 'el' with element 'add' in list. | |
#define | LL_PREPEND_ELEM(head, el, add) |
LL prepend new element 'add' to element 'el' in list. | |
Doubly linked list macros (non-circular) | |
#define | DL_PREPEND(head, add) |
DL prepend element 'add' to list. | |
#define | DL_PREPEND2(head, add, prev, next) |
DL prepend to list with alternative ptr names. | |
#define | DL_APPEND(head, add) |
DL append to append element 'add' to list. | |
#define | DL_APPEND2(head, add, prev, next) |
DL append with alternative next ptr name 'next'. | |
#define | DL_CONCAT(head1, head2) |
DL concat to append second list to first. | |
#define | DL_CONCAT2(head1, head2, prev, next) |
DL concat with alternative next ptr name 'next'. | |
#define | DL_DELETE(head, del) |
DL delete element 'del' from list. | |
#define | DL_DELETE2(head, del, prev, next) |
DL delete with alternative ptr names. | |
#define | DL_COUNT(head, el, counter) |
DL count list elements using 'counter'. | |
#define | DL_COUNT2(head, el, counter, next) |
DL count with alternative next ptr name 'next'. | |
#define | DL_FOREACH(head, el) |
DL list iteration. | |
#define | DL_FOREACH2(head, el, next) |
DL list iteration with alternative next ptr name 'next'. | |
#define | DL_FOREACH_SAFE(head, el, tmp) |
DL safe list iteration Use if list elements might be deleted while iterating. | |
#define | DL_FOREACH_SAFE2(head, el, tmp, next) |
DL safe list iteration with alternative ptr names. | |
#define | DL_SEARCH_SCALAR LL_SEARCH_SCALAR |
DL scalar search for element with value 'val' for member 'field' Identical to singly-linked counterpart. | |
#define | DL_SEARCH_SCALAR2 LL_SEARCH_SCALAR2 |
DL scalar search with alternative next ptr name 'next' Identical to singly-linked counterpart. | |
#define | DL_SEARCH LL_SEARCH |
DL search element 'elt' in list using function 'cmp' Identical to singly-linked counterpart. | |
#define | DL_SEARCH2 LL_SEARCH2 |
DL search with alternative next ptr name 'next' Identical to singly-linked counterpart. | |
#define | DL_REPLACE_ELEM(head, el, add) |
DL replace element 'el' with element 'add' in list. | |
#define | DL_PREPEND_ELEM(head, el, add) |
DL prepend new element 'add' to element 'el' in list. | |
Circular doubly linked list macros | |
#define | CDL_PREPEND(head, add) |
CDL prepend element 'add' to list. | |
#define | CDL_PREPEND2(head, add, prev, next) |
CDL prepend to list with alternative ptr names. | |
#define | CDL_DELETE(head, del) |
CDL delete element 'del' from list. | |
#define | CDL_DELETE2(head, del, prev, next) |
CDL delete with alternative ptr names. | |
#define | CDL_COUNT(head, el, counter) |
CDL count list elements using 'counter'. | |
#define | CDL_COUNT2(head, el, counter, next) |
CDL count with alternative next ptr name 'next'. | |
#define | CDL_FOREACH(head, el) |
CDL list iteration. | |
#define | CDL_FOREACH2(head, el, next) |
CDL list iteration with alternative next ptr name 'next'. | |
#define | CDL_FOREACH_SAFE(head, el, tmp1, tmp2) |
CDL safe list iteration Use if list elements might be deleted while iterating. | |
#define | CDL_FOREACH_SAFE2(head, el, tmp1, tmp2, prev, next) |
CDL safe list iteration with alternative ptr names. | |
#define | CDL_SEARCH_SCALAR(head, out, field, val) |
CDL scalar search for element with value 'val' for member 'field'. | |
#define | CDL_SEARCH_SCALAR2(head, out, field, val, next) |
CDL scalar search with alternative next ptr name 'next'. | |
#define | CDL_SEARCH(head, out, elt, cmp) |
CDL search element 'elt' in list using function 'cmp'. | |
#define | CDL_SEARCH2(head, out, elt, cmp, next) |
CDL search with alternative next ptr name 'next'. | |
#define | CDL_REPLACE_ELEM(head, el, add) |
CDL replace element 'el' with element 'add' in list. | |
#define | CDL_PREPEND_ELEM(head, el, add) |
CDL prepend new element 'add' to element 'el' in list. | |