#ifndef LIST_H
#define LIST_H 1
#define CDBL_LIST_ADD_REAR(first, newp) \
do { \
__typeof (newp) _newp = (newp); \
assert (_newp->next == NULL); \
assert (_newp->previous == NULL); \
if (unlikely ((first) == NULL)) \
(first) = _newp->next = _newp->previous = _newp; \
else \
{ \
_newp->next = (first); \
_newp->previous = (first)->previous; \
_newp->previous->next = _newp->next->previous = _newp; \
} \
} while (0)
#define CDBL_LIST_DEL(first, elem) \
do { \
__typeof (elem) _elem = (elem); \
\
assert (first != NULL && _elem != NULL \
&& (first != elem \
|| ({ __typeof (elem) _runp = first->next; \
while (_runp != first) \
if (_runp == _elem) \
break; \
else \
_runp = _runp->next; \
_runp == _elem; }))); \
if (unlikely (_elem->next == _elem)) \
first = NULL; \
else \
{ \
_elem->next->previous = _elem->previous; \
_elem->previous->next = _elem->next; \
if (unlikely (first == _elem)) \
first = _elem->next; \
} \
assert ((_elem->next = _elem->previous = NULL, 1)); \
} while (0)
#define SNGL_LIST_PUSH(first, newp) \
do { \
__typeof (newp) _newp = (newp); \
assert (_newp->next == NULL); \
_newp->next = first; \
first = _newp; \
} while (0)
#define CSNGL_LIST_ADD_REAR(first, newp) \
do { \
__typeof (newp) _newp = (newp); \
assert (_newp->next == NULL); \
if (unlikely ((first) == NULL)) \
(first) = _newp->next = _newp; \
else \
{ \
_newp->next = (first)->next; \
(first) = (first)->next = _newp; \
} \
} while (0)
#endif