Basic linked list operation definitions More...
Basic linked list operation definitions
Files | |
file | utlist.h |
Macros for basic linked list operations. | |
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. | |
#define _NEXTASGN | ( | elt, | |
list, | |||
to, | |||
next ) |
#define _PREVASGN | ( | elt, | |
list, | |||
to, | |||
prev ) |
#define CDL_COUNT | ( | head, | |
el, | |||
counter ) |
CDL count list elements using 'counter'.
#define CDL_COUNT2 | ( | head, | |
el, | |||
counter, | |||
next ) |
#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_FOREACH | ( | head, | |
el ) |
CDL list iteration.
#define CDL_FOREACH2 | ( | head, | |
el, | |||
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 ) |
#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_PREPEND_ELEM | ( | head, | |
el, | |||
add ) |
CDL prepend new element 'add' to element 'el' in list.
#define CDL_REPLACE_ELEM | ( | head, | |
el, | |||
add ) |
CDL replace element 'el' with element 'add' in list.
#define CDL_SEARCH | ( | head, | |
out, | |||
elt, | |||
cmp ) |
CDL search element 'elt' in list using function 'cmp'.
#define CDL_SEARCH2 | ( | head, | |
out, | |||
elt, | |||
cmp, | |||
next ) |
#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 ) |
#define CDL_SORT | ( | list, | |
cmp ) |
#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_COUNT | ( | head, | |
el, | |||
counter ) |
DL count list elements using 'counter'.
#define DL_COUNT2 | ( | head, | |
el, | |||
counter, | |||
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_FOREACH | ( | head, | |
el ) |
DL list iteration.
#define DL_FOREACH2 | ( | head, | |
el, | |||
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 ) |
#define DL_PREPEND | ( | head, | |
add ) |
DL prepend element 'add' to list.
#define DL_PREPEND2 | ( | head, | |
add, | |||
prev, | |||
next ) |
#define DL_PREPEND_ELEM | ( | head, | |
el, | |||
add ) |
DL prepend new element 'add' to element 'el' in list.
#define DL_REPLACE_ELEM | ( | head, | |
el, | |||
add ) |
DL replace element 'el' with element 'add' in list.
#define DL_SEARCH LL_SEARCH |
#define DL_SEARCH2 LL_SEARCH2 |
#define DL_SEARCH_SCALAR LL_SEARCH_SCALAR |
#define DL_SEARCH_SCALAR2 LL_SEARCH_SCALAR2 |
#define DL_SORT | ( | list, | |
cmp ) |
#define LL_APPEND | ( | head, | |
add ) |
LL append to append element 'add' to list.
#define LL_APPEND2 | ( | head, | |
add, | |||
next ) |
#define LL_APPEND2_VS2008 | ( | head, | |
add, | |||
next ) |
#define LL_APPEND_VS2008 | ( | head, | |
add ) |
#define LL_CONCAT | ( | head1, | |
head2 ) |
LL concat to append second list to first.
#define LL_CONCAT2 | ( | head1, | |
head2, | |||
next ) |
#define LL_COUNT | ( | head, | |
el, | |||
counter ) |
LL count list elements using 'counter'.
#define LL_COUNT2 | ( | head, | |
el, | |||
counter, | |||
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_DELETE2_VS2008 | ( | head, | |
del, | |||
next ) |
#define LL_DELETE_VS2008 | ( | head, | |
del ) |
#define LL_FOREACH | ( | head, | |
el ) |
LL list iteration.
#define LL_FOREACH2 | ( | head, | |
el, | |||
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 ) |
#define LL_PREPEND | ( | head, | |
add ) |
LL prepend element 'add' to list.
#define LL_PREPEND2 | ( | head, | |
add, | |||
next ) |
#define LL_PREPEND_ELEM | ( | head, | |
el, | |||
add ) |
LL prepend new element 'add' to element 'el' in list.
#define LL_REPLACE_ELEM | ( | head, | |
el, | |||
add ) |
LL replace element 'el' with element 'add' in list.
#define LL_SEARCH | ( | head, | |
out, | |||
elt, | |||
cmp ) |
LL search element 'elt' in list using function 'cmp'.
#define LL_SEARCH2 | ( | head, | |
out, | |||
elt, | |||
cmp, | |||
next ) |
#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 ) |
#define LL_SORT | ( | list, | |
cmp ) |