utlist.h File Reference
#include <assert.h>
Go to the source code of this file.
Macros | |
#define | UTLIST_VERSION 2.0.1 |
#define | LDECLTYPE(x) __typeof(x) |
#define | IF_NO_DECLTYPE(x) |
#define | _SV(elt, list) |
#define | _NEXT(elt, list, next) ((elt)->next) |
#define | _NEXTASGN(elt, list, to, next) ((elt)->next)=(to) |
#define | _PREVASGN(elt, list, to, prev) ((elt)->prev)=(to) |
#define | _RS(list) |
#define | _CASTASGN(a, b) (a)=(b) |
#define | LL_SORT(list, cmp) LL_SORT2(list, cmp, next) |
#define | LL_SORT2(list, cmp, next) |
#define | DL_SORT(list, cmp) DL_SORT2(list, cmp, prev, next) |
#define | DL_SORT2(list, cmp, prev, next) |
#define | CDL_SORT(list, cmp) CDL_SORT2(list, cmp, prev, next) |
#define | CDL_SORT2(list, cmp, prev, next) |
#define | LL_PREPEND(head, add) LL_PREPEND2(head,add,next) |
#define | LL_PREPEND2(head, add, next) |
#define | LL_CONCAT(head1, head2) LL_CONCAT2(head1,head2,next) |
#define | LL_CONCAT2(head1, head2, next) |
#define | LL_APPEND(head, add) LL_APPEND2(head,add,next) |
#define | LL_APPEND2(head, add, next) |
#define | LL_DELETE(head, del) LL_DELETE2(head,del,next) |
#define | LL_DELETE2(head, del, next) |
#define | LL_COUNT(head, el, counter) LL_COUNT2(head,el,counter,next) \ |
#define | LL_COUNT2(head, el, counter, next) |
#define | LL_FOREACH(head, el) LL_FOREACH2(head,el,next) |
#define | LL_FOREACH2(head, el, next) for ((el) = (head); el; (el) = (el)->next) |
#define | LL_FOREACH_SAFE(head, el, tmp) LL_FOREACH_SAFE2(head,el,tmp,next) |
#define | LL_FOREACH_SAFE2(head, el, tmp, next) for ((el) = (head); (el) && ((tmp) = (el)->next, 1); (el) = (tmp)) |
#define | LL_SEARCH_SCALAR(head, out, field, val) LL_SEARCH_SCALAR2(head,out,field,val,next) |
#define | LL_SEARCH_SCALAR2(head, out, field, val, next) |
#define | LL_SEARCH(head, out, elt, cmp) LL_SEARCH2(head,out,elt,cmp,next) |
#define | LL_SEARCH2(head, out, elt, cmp, next) |
#define | LL_REPLACE_ELEM2(head, el, add, next) |
#define | LL_REPLACE_ELEM(head, el, add) LL_REPLACE_ELEM2(head, el, add, next) |
#define | LL_PREPEND_ELEM2(head, el, add, next) |
#define | LL_PREPEND_ELEM(head, el, add) LL_PREPEND_ELEM2(head, el, add, next) |
#define | LL_APPEND_ELEM2(head, el, add, next) |
#define | LL_APPEND_ELEM(head, el, add) LL_APPEND_ELEM2(head, el, add, next) |
#define | DL_PREPEND(head, add) DL_PREPEND2(head,add,prev,next) |
#define | DL_PREPEND2(head, add, prev, next) |
#define | DL_APPEND(head, add) DL_APPEND2(head,add,prev,next) |
#define | DL_APPEND2(head, add, prev, next) |
#define | DL_CONCAT(head1, head2) DL_CONCAT2(head1,head2,prev,next) |
#define | DL_CONCAT2(head1, head2, prev, next) |
#define | DL_DELETE(head, del) DL_DELETE2(head,del,prev,next) |
#define | DL_DELETE2(head, del, prev, next) |
#define | DL_COUNT(head, el, counter) DL_COUNT2(head,el,counter,next) \ |
#define | DL_COUNT2(head, el, counter, next) |
#define | DL_FOREACH(head, el) DL_FOREACH2(head,el,next) |
#define | DL_FOREACH2(head, el, next) for ((el) = (head); el; (el) = (el)->next) |
#define | DL_FOREACH_SAFE(head, el, tmp) DL_FOREACH_SAFE2(head,el,tmp,next) |
#define | DL_FOREACH_SAFE2(head, el, tmp, next) for ((el) = (head); (el) && ((tmp) = (el)->next, 1); (el) = (tmp)) |
#define | DL_SEARCH_SCALAR LL_SEARCH_SCALAR |
#define | DL_SEARCH LL_SEARCH |
#define | DL_SEARCH_SCALAR2 LL_SEARCH_SCALAR2 |
#define | DL_SEARCH2 LL_SEARCH2 |
#define | DL_REPLACE_ELEM2(head, el, add, prev, next) |
#define | DL_REPLACE_ELEM(head, el, add) DL_REPLACE_ELEM2(head, el, add, prev, next) |
#define | DL_PREPEND_ELEM2(head, el, add, prev, next) |
#define | DL_PREPEND_ELEM(head, el, add) DL_PREPEND_ELEM2(head, el, add, prev, next) |
#define | DL_APPEND_ELEM2(head, el, add, prev, next) |
#define | DL_APPEND_ELEM(head, el, add) DL_APPEND_ELEM2(head, el, add, prev, next) |
#define | CDL_APPEND(head, add) CDL_APPEND2(head,add,prev,next) |
#define | CDL_APPEND2(head, add, prev, next) |
#define | CDL_PREPEND(head, add) CDL_PREPEND2(head,add,prev,next) |
#define | CDL_PREPEND2(head, add, prev, next) |
#define | CDL_DELETE(head, del) CDL_DELETE2(head,del,prev,next) |
#define | CDL_DELETE2(head, del, prev, next) |
#define | CDL_COUNT(head, el, counter) CDL_COUNT2(head,el,counter,next) \ |
#define | CDL_COUNT2(head, el, counter, next) |
#define | CDL_FOREACH(head, el) CDL_FOREACH2(head,el,next) |
#define | CDL_FOREACH2(head, el, next) for ((el)=(head);el;(el)=(((el)->next==(head)) ? NULL : (el)->next)) |
#define | CDL_FOREACH_SAFE(head, el, tmp1, tmp2) CDL_FOREACH_SAFE2(head,el,tmp1,tmp2,prev,next) |
#define | CDL_FOREACH_SAFE2(head, el, tmp1, tmp2, prev, next) |
#define | CDL_SEARCH_SCALAR(head, out, field, val) CDL_SEARCH_SCALAR2(head,out,field,val,next) |
#define | CDL_SEARCH_SCALAR2(head, out, field, val, next) |
#define | CDL_SEARCH(head, out, elt, cmp) CDL_SEARCH2(head,out,elt,cmp,next) |
#define | CDL_SEARCH2(head, out, elt, cmp, next) |
#define | CDL_REPLACE_ELEM2(head, el, add, prev, next) |
#define | CDL_REPLACE_ELEM(head, el, add) CDL_REPLACE_ELEM2(head, el, add, prev, next) |
#define | CDL_PREPEND_ELEM2(head, el, add, prev, next) |
#define | CDL_PREPEND_ELEM(head, el, add) CDL_PREPEND_ELEM2(head, el, add, prev, next) |
#define | CDL_APPEND_ELEM2(head, el, add, prev, next) |
#define | CDL_APPEND_ELEM(head, el, add) CDL_APPEND_ELEM2(head, el, add, prev, next) |
Macro Definition Documentation
#define _CASTASGN | ( | a, | |
b | |||
) | (a)=(b) |
#define _NEXT | ( | elt, | |
list, | |||
next | |||
) | ((elt)->next) |
#define _NEXTASGN | ( | elt, | |
list, | |||
to, | |||
next | |||
) | ((elt)->next)=(to) |
#define _PREVASGN | ( | elt, | |
list, | |||
to, | |||
prev | |||
) | ((elt)->prev)=(to) |
#define _RS | ( | list | ) |
#define _SV | ( | elt, | |
list | |||
) |
#define CDL_APPEND | ( | head, | |
add | |||
) | CDL_APPEND2(head,add,prev,next) |
#define CDL_APPEND2 | ( | head, | |
add, | |||
prev, | |||
next | |||
) |
Value:
do { \
if (head) { \
(add)->prev = (head)->prev; \
(add)->next = (head); \
(head)->prev = (add); \
(add)->prev->next = (add); \
} else { \
(add)->prev = (add); \
(add)->next = (add); \
(head) = (add); \
} \
} while (0)
#define CDL_APPEND_ELEM | ( | head, | |
el, | |||
add | |||
) | CDL_APPEND_ELEM2(head, el, add, prev, next) |
#define CDL_APPEND_ELEM2 | ( | head, | |
el, | |||
add, | |||
prev, | |||
next | |||
) |
Value:
do { \
if (el) { \
assert((head) != NULL); \
assert((add) != NULL); \
(add)->next = (el)->next; \
(add)->prev = (el); \
(el)->next = (add); \
(add)->next->prev = (add); \
} else { \
CDL_PREPEND2(head, add, prev, next); \
} \
} while (0)
#define CDL_COUNT | ( | head, | |
el, | |||
counter | |||
) | CDL_COUNT2(head,el,counter,next) \ |
#define CDL_COUNT2 | ( | head, | |
el, | |||
counter, | |||
next | |||
) |
Value:
#define CDL_DELETE | ( | head, | |
del | |||
) | CDL_DELETE2(head,del,prev,next) |
#define CDL_DELETE2 | ( | head, | |
del, | |||
prev, | |||
next | |||
) |
Value:
do { \
if (((head)==(del)) && ((head)->next == (head))) { \
(head) = NULL; \
} else { \
(del)->next->prev = (del)->prev; \
(del)->prev->next = (del)->next; \
if ((del) == (head)) (head)=(del)->next; \
} \
} while (0)
#define CDL_FOREACH | ( | head, | |
el | |||
) | CDL_FOREACH2(head,el,next) |
#define CDL_FOREACH2 | ( | head, | |
el, | |||
next | |||
) | for ((el)=(head);el;(el)=(((el)->next==(head)) ? NULL : (el)->next)) |
#define CDL_FOREACH_SAFE | ( | head, | |
el, | |||
tmp1, | |||
tmp2 | |||
) | CDL_FOREACH_SAFE2(head,el,tmp1,tmp2,prev,next) |
#define CDL_FOREACH_SAFE2 | ( | head, | |
el, | |||
tmp1, | |||
tmp2, | |||
prev, | |||
next | |||
) |
Value:
for ((el) = (head), (tmp1) = (head) ? (head)->prev : NULL; \
(el) && ((tmp2) = (el)->next, 1); \
(el) = ((el) == (tmp1) ? NULL : (tmp2)))
#define CDL_PREPEND | ( | head, | |
add | |||
) | CDL_PREPEND2(head,add,prev,next) |
#define CDL_PREPEND2 | ( | head, | |
add, | |||
prev, | |||
next | |||
) |
Value:
do { \
if (head) { \
(add)->prev = (head)->prev; \
(add)->next = (head); \
(head)->prev = (add); \
(add)->prev->next = (add); \
} else { \
(add)->prev = (add); \
(add)->next = (add); \
} \
(head) = (add); \
} while (0)
#define CDL_PREPEND_ELEM | ( | head, | |
el, | |||
add | |||
) | CDL_PREPEND_ELEM2(head, el, add, prev, next) |
#define CDL_PREPEND_ELEM2 | ( | head, | |
el, | |||
add, | |||
prev, | |||
next | |||
) |
Value:
do { \
if (el) { \
assert((head) != NULL); \
assert((add) != NULL); \
(add)->next = (el); \
(add)->prev = (el)->prev; \
(el)->prev = (add); \
(add)->prev->next = (add); \
if ((head) == (el)) { \
(head) = (add); \
} \
} else { \
CDL_APPEND2(head, add, prev, next); \
} \
} while (0)
#define CDL_REPLACE_ELEM | ( | head, | |
el, | |||
add | |||
) | CDL_REPLACE_ELEM2(head, el, add, prev, next) |
#define CDL_REPLACE_ELEM2 | ( | head, | |
el, | |||
add, | |||
prev, | |||
next | |||
) |
Value:
do { \
assert((head) != NULL); \
assert((el) != NULL); \
assert((add) != NULL); \
if ((el)->next == (el)) { \
(add)->next = (add); \
(add)->prev = (add); \
(head) = (add); \
} else { \
(add)->next = (el)->next; \
(add)->prev = (el)->prev; \
(add)->next->prev = (add); \
(add)->prev->next = (add); \
if ((head) == (el)) { \
(head) = (add); \
} \
} \
} while (0)
#define CDL_SEARCH | ( | head, | |
out, | |||
elt, | |||
cmp | |||
) | CDL_SEARCH2(head,out,elt,cmp,next) |
#define CDL_SEARCH2 | ( | head, | |
out, | |||
elt, | |||
cmp, | |||
next | |||
) |
Value:
#define CDL_SEARCH_SCALAR | ( | head, | |
out, | |||
field, | |||
val | |||
) | CDL_SEARCH_SCALAR2(head,out,field,val,next) |
#define CDL_SEARCH_SCALAR2 | ( | head, | |
out, | |||
field, | |||
val, | |||
next | |||
) |
Value:
#define CDL_SORT | ( | list, | |
cmp | |||
) | CDL_SORT2(list, cmp, prev, next) |
#define CDL_SORT2 | ( | list, | |
cmp, | |||
prev, | |||
next | |||
) |
#define DL_APPEND | ( | head, | |
add | |||
) | DL_APPEND2(head,add,prev,next) |
#define DL_APPEND2 | ( | head, | |
add, | |||
prev, | |||
next | |||
) |
Value:
do { \
if (head) { \
(add)->prev = (head)->prev; \
(head)->prev->next = (add); \
(head)->prev = (add); \
(add)->next = NULL; \
} else { \
(head)=(add); \
(head)->prev = (head); \
(head)->next = NULL; \
} \
} while (0)
#define DL_APPEND_ELEM | ( | head, | |
el, | |||
add | |||
) | DL_APPEND_ELEM2(head, el, add, prev, next) |
#define DL_APPEND_ELEM2 | ( | head, | |
el, | |||
add, | |||
prev, | |||
next | |||
) |
Value:
do { \
if (el) { \
assert((head) != NULL); \
assert((add) != NULL); \
(add)->next = (el)->next; \
(add)->prev = (el); \
(el)->next = (add); \
if ((add)->next) { \
(add)->next->prev = (add); \
} else { \
(head)->prev = (add); \
} \
} else { \
DL_PREPEND2(head, add, prev, next); \
} \
} while (0) \
#define DL_CONCAT | ( | head1, | |
head2 | |||
) | DL_CONCAT2(head1,head2,prev,next) |
#define DL_CONCAT2 | ( | head1, | |
head2, | |||
prev, | |||
next | |||
) |
#define DL_COUNT | ( | head, | |
el, | |||
counter | |||
) | DL_COUNT2(head,el,counter,next) \ |
#define DL_COUNT2 | ( | head, | |
el, | |||
counter, | |||
next | |||
) |
Value:
#define DL_DELETE | ( | head, | |
del | |||
) | DL_DELETE2(head,del,prev,next) |
#define DL_DELETE2 | ( | head, | |
del, | |||
prev, | |||
next | |||
) |
Value:
do { \
assert((del)->prev != NULL); \
if ((del)->prev == (del)) { \
(head)=NULL; \
} else if ((del)==(head)) { \
(del)->next->prev = (del)->prev; \
(head) = (del)->next; \
} else { \
(del)->prev->next = (del)->next; \
if ((del)->next) { \
(del)->next->prev = (del)->prev; \
} else { \
(head)->prev = (del)->prev; \
} \
} \
} while (0)
#define DL_FOREACH | ( | head, | |
el | |||
) | DL_FOREACH2(head,el,next) |
#define DL_FOREACH2 | ( | head, | |
el, | |||
next | |||
) | for ((el) = (head); el; (el) = (el)->next) |
#define DL_FOREACH_SAFE | ( | head, | |
el, | |||
tmp | |||
) | DL_FOREACH_SAFE2(head,el,tmp,next) |
#define DL_FOREACH_SAFE2 | ( | head, | |
el, | |||
tmp, | |||
next | |||
) | for ((el) = (head); (el) && ((tmp) = (el)->next, 1); (el) = (tmp)) |
#define DL_PREPEND | ( | head, | |
add | |||
) | DL_PREPEND2(head,add,prev,next) |
#define DL_PREPEND2 | ( | head, | |
add, | |||
prev, | |||
next | |||
) |
Value:
do { \
(add)->next = (head); \
if (head) { \
(add)->prev = (head)->prev; \
(head)->prev = (add); \
} else { \
(add)->prev = (add); \
} \
(head) = (add); \
} while (0)
#define DL_PREPEND_ELEM | ( | head, | |
el, | |||
add | |||
) | DL_PREPEND_ELEM2(head, el, add, prev, next) |
#define DL_PREPEND_ELEM2 | ( | head, | |
el, | |||
add, | |||
prev, | |||
next | |||
) |
Value:
do { \
if (el) { \
assert((head) != NULL); \
assert((add) != NULL); \
(add)->next = (el); \
(add)->prev = (el)->prev; \
(el)->prev = (add); \
if ((head) == (el)) { \
(head) = (add); \
} else { \
(add)->prev->next = (add); \
} \
} else { \
DL_APPEND2(head, add, prev, next); \
} \
} while (0) \
#define DL_REPLACE_ELEM | ( | head, | |
el, | |||
add | |||
) | DL_REPLACE_ELEM2(head, el, add, prev, next) |
#define DL_REPLACE_ELEM2 | ( | head, | |
el, | |||
add, | |||
prev, | |||
next | |||
) |
Value:
do { \
assert((head) != NULL); \
assert((el) != NULL); \
assert((add) != NULL); \
if ((head) == (el)) { \
(head) = (add); \
(add)->next = (el)->next; \
if ((el)->next == NULL) { \
(add)->prev = (add); \
} else { \
(add)->prev = (el)->prev; \
(add)->next->prev = (add); \
} \
} else { \
(add)->next = (el)->next; \
(add)->prev = (el)->prev; \
(add)->prev->next = (add); \
if ((el)->next == NULL) { \
(head)->prev = (add); \
} else { \
(add)->next->prev = (add); \
} \
} \
} while (0)
#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 | |||
) | DL_SORT2(list, cmp, prev, next) |
#define DL_SORT2 | ( | list, | |
cmp, | |||
prev, | |||
next | |||
) |
#define IF_NO_DECLTYPE | ( | x | ) |
#define LDECLTYPE | ( | x | ) | __typeof(x) |
#define LL_APPEND | ( | head, | |
add | |||
) | LL_APPEND2(head,add,next) |
#define LL_APPEND2 | ( | head, | |
add, | |||
next | |||
) |
#define LL_APPEND_ELEM | ( | head, | |
el, | |||
add | |||
) | LL_APPEND_ELEM2(head, el, add, next) |
#define LL_APPEND_ELEM2 | ( | head, | |
el, | |||
add, | |||
next | |||
) |
Value:
do { \
if (el) { \
assert((head) != NULL); \
assert((add) != NULL); \
(add)->next = (el)->next; \
(el)->next = (add); \
} else { \
LL_PREPEND2(head, add, next); \
} \
} while (0) \
#define LL_CONCAT | ( | head1, | |
head2 | |||
) | LL_CONCAT2(head1,head2,next) |
#define LL_CONCAT2 | ( | head1, | |
head2, | |||
next | |||
) |
#define LL_COUNT | ( | head, | |
el, | |||
counter | |||
) | LL_COUNT2(head,el,counter,next) \ |
#define LL_COUNT2 | ( | head, | |
el, | |||
counter, | |||
next | |||
) |
Value:
#define LL_DELETE | ( | head, | |
del | |||
) | LL_DELETE2(head,del,next) |
#define LL_DELETE2 | ( | head, | |
del, | |||
next | |||
) |
Value:
#define LL_FOREACH | ( | head, | |
el | |||
) | LL_FOREACH2(head,el,next) |
#define LL_FOREACH2 | ( | head, | |
el, | |||
next | |||
) | for ((el) = (head); el; (el) = (el)->next) |
#define LL_FOREACH_SAFE | ( | head, | |
el, | |||
tmp | |||
) | LL_FOREACH_SAFE2(head,el,tmp,next) |
#define LL_FOREACH_SAFE2 | ( | head, | |
el, | |||
tmp, | |||
next | |||
) | for ((el) = (head); (el) && ((tmp) = (el)->next, 1); (el) = (tmp)) |
#define LL_PREPEND | ( | head, | |
add | |||
) | LL_PREPEND2(head,add,next) |
#define LL_PREPEND2 | ( | head, | |
add, | |||
next | |||
) |
Value:
do { \
(add)->next = (head); \
(head) = (add); \
} while (0)
#define LL_PREPEND_ELEM | ( | head, | |
el, | |||
add | |||
) | LL_PREPEND_ELEM2(head, el, add, next) |
#define LL_PREPEND_ELEM2 | ( | head, | |
el, | |||
add, | |||
next | |||
) |
Value:
do { \
if (el) { \
LDECLTYPE(head) _tmp; \
assert((head) != NULL); \
assert((add) != NULL); \
(add)->next = (el); \
if ((head) == (el)) { \
(head) = (add); \
} else { \
_tmp = (head); \
while (_tmp->next && (_tmp->next != (el))) { \
_tmp = _tmp->next; \
} \
if (_tmp->next) { \
_tmp->next = (add); \
} \
} \
} else { \
LL_APPEND2(head, add, next); \
} \
} while (0) \
#define LL_REPLACE_ELEM | ( | head, | |
el, | |||
add | |||
) | LL_REPLACE_ELEM2(head, el, add, next) |
#define LL_REPLACE_ELEM2 | ( | head, | |
el, | |||
add, | |||
next | |||
) |
Value:
do { \
LDECLTYPE(head) _tmp; \
assert((head) != NULL); \
assert((el) != NULL); \
assert((add) != NULL); \
(add)->next = (el)->next; \
if ((head) == (el)) { \
(head) = (add); \
} else { \
_tmp = (head); \
while (_tmp->next && (_tmp->next != (el))) { \
_tmp = _tmp->next; \
} \
if (_tmp->next) { \
_tmp->next = (add); \
} \
} \
} while (0)
#define LL_SEARCH | ( | head, | |
out, | |||
elt, | |||
cmp | |||
) | LL_SEARCH2(head,out,elt,cmp,next) |
#define LL_SEARCH2 | ( | head, | |
out, | |||
elt, | |||
cmp, | |||
next | |||
) |
Value:
#define LL_SEARCH_SCALAR | ( | head, | |
out, | |||
field, | |||
val | |||
) | LL_SEARCH_SCALAR2(head,out,field,val,next) |
#define LL_SEARCH_SCALAR2 | ( | head, | |
out, | |||
field, | |||
val, | |||
next | |||
) |
Value:
#define LL_SORT | ( | list, | |
cmp | |||
) | LL_SORT2(list, cmp, next) |
#define LL_SORT2 | ( | list, | |
cmp, | |||
next | |||
) |
#define UTLIST_VERSION 2.0.1 |