root/src/add-ons/kernel/generic/scsi_periph/dl_list.h
/*
** Copyright 2002/03, Thomas Kurschel. All rights reserved.
** Distributed under the terms of the MIT License.
*/

/*
        Macros for double linked lists
*/

#ifndef _DL_LIST_H
#define _DL_LIST_H

#define REMOVE_DL_LIST( item, head, prefix ) \
        do { \
                if( item->prefix##prev ) \
                        item->prefix##prev->prefix##next = item->prefix##next; \
                else \
                        head = item->prefix##next; \
\
                if( item->prefix##next ) \
                        item->prefix##next->prefix##prev = item->prefix##prev; \
        } while( 0 )
                
#define ADD_DL_LIST_HEAD( item, head, prefix ) \
        do { \
                item->prefix##next = head; \
                item->prefix##prev = NULL; \
\
                if( (head) ) \
                        (head)->prefix##prev = item; \
\
                (head) = item; \
        } while( 0 )

#define REMOVE_CDL_LIST( item, head, prefix ) \
        do { \
                item->prefix##next->prefix##prev = item->prefix##prev; \
                item->prefix##prev->prefix##next = item->prefix##next; \
 \
                if( item == (head) ) { \
                        if( item->prefix##next != item ) \
                                (head) = item->prefix##next; \
                        else \
                                (head) = NULL; \
                } \
        } while( 0 )

#define ADD_CDL_LIST_TAIL( item, type, head, prefix ) \
        do { \
                type *old_head = head; \
 \
                if( old_head ) { \
                        type *first, *last; \
 \
                        first = old_head; \
                        last = first->prefix##prev; \
 \
                        item->prefix##next = first; \
                        item->prefix##prev = last; \
                        first->prefix##prev = item; \
                        last->prefix##next = item; \
                } else { \
                        head = item; \
                        item->prefix##next = item->prefix##prev = item; \
                } \
        } while( 0 )

#define ADD_CDL_LIST_HEAD( item, type, head, prefix ) \
        do { \
                type *old_head = head; \
 \
                head = item; \
                if( old_head ) { \
                        type *first, *last; \
 \
                        first = old_head; \
                        last = first->prefix##prev; \
 \
                        item->prefix##next = first; \
                        item->prefix##prev = last; \
                        first->prefix##prev = item; \
                        last->prefix##next = item; \
                } else { \
                        item->prefix##next = item->prefix##prev = item; \
                } \
        } while( 0 )

#endif