/*
 * Copyright (c) 1991, 1993
 *  The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. ***REMOVED*** - see
 *    ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *  @(#)queue.h 8.3 (Berkeley) 12/13/93
 */

#ifndef _QUEUE_H_
#define _QUEUE_H_

/*
 * This file defines three types of data structures: lists, tail queues,
 * and circular queues.
 *
 * A list is headed by a single forward pointer (or an array of forward
 * pointers for a hash table header). The elements are doubly linked
 * so that an arbitrary element can be removed without a need to
 * traverse the list. New elements can be added to the list after
 * an existing element or at the head of the list. A list may only be
 * traversed in the forward direction.
 *
 * A tail queue is headed by a pair of pointers, one to the head of the
 * list and the other to the tail of the list. The elements are doubly
 * linked so that an arbitrary element can be removed without a need to
 * traverse the list. New elements can be added to the list after
 * an existing element, at the head of the list, or at the end of the
 * list. A tail queue may only be traversed in the forward direction.
 *
 * A circle queue is headed by a pair of pointers, one to the head of the
 * list and the other to the tail of the list. The elements are doubly
 * linked so that an arbitrary element can be removed without a need to
 * traverse the list. New elements can be added to the list before or after
 * an existing element, at the head of the list, or at the end of the list.
 * A circle queue may be traversed in either direction, but has a more
 * complex end of list detection.
 *
 * For details on the use of these macros, see the queue(3) manual page.
 */

/*
 * List definitions.
 */
#define LIST_HEAD(name, type)                      \
    struct name {                                  \
        struct type *lh_first; /* first element */ \
    }

#define LIST_ENTRY(type)                                              \
    struct {                                                          \
        struct type *le_next;  /* next element */                     \
        struct type **le_prev; /* address of previous next element */ \
    }

/*
 * List functions.
 */
#define LIST_INIT(head)          \
    {                            \
        (head)->lh_first = NULL; \
    }

#define LIST_INSERT_AFTER(listelm, elm, field)                         \
    {                                                                  \
        if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \
            (listelm)->field.le_next->field.le_prev =                  \
                &(elm)->field.le_next;                                 \
        (listelm)->field.le_next = (elm);                              \
        (elm)->field.le_prev = &(listelm)->field.le_next;              \
    }

#define LIST_INSERT_HEAD(head, elm, field)                           \
    {                                                                \
        if (((elm)->field.le_next = (head)->lh_first) != NULL)       \
            (head)->lh_first->field.le_prev = &(elm)->field.le_next; \
        (head)->lh_first = (elm);                                    \
        (elm)->field.le_prev = &(head)->lh_first;                    \
    }

#define LIST_REMOVE(elm, field)                       \
    {                                                 \
        if ((elm)->field.le_next != NULL)             \
            (elm)->field.le_next->field.le_prev =     \
                (elm)->field.le_prev;                 \
        *(elm)->field.le_prev = (elm)->field.le_next; \
    }

/*
 * Tail queue definitions.
 */
#define TAILQ_HEAD(name, type)                                  \
    struct name {                                               \
        struct type *tqh_first; /* first element */             \
        struct type **tqh_last; /* addr of last next element */ \
    }

#define TAILQ_ENTRY(type)                                              \
    struct {                                                           \
        struct type *tqe_next;  /* next element */                     \
        struct type **tqe_prev; /* address of previous next element */ \
    }

/*
 * Tail queue functions.
 */
#define TAILQ_INIT(head)                       \
    {                                          \
        (head)->tqh_first = NULL;              \
        (head)->tqh_last = &(head)->tqh_first; \
    }

#define TAILQ_INSERT_HEAD(head, elm, field)                      \
    {                                                            \
        if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \
            (elm)->field.tqe_next->field.tqe_prev =              \
                &(elm)->field.tqe_next;                          \
        else                                                     \
            (head)->tqh_last = &(elm)->field.tqe_next;           \
        (head)->tqh_first = (elm);                               \
        (elm)->field.tqe_prev = &(head)->tqh_first;              \
    }

#define TAILQ_INSERT_TAIL(head, elm, field)        \
    {                                              \
        (elm)->field.tqe_next = NULL;              \
        (elm)->field.tqe_prev = (head)->tqh_last;  \
        *(head)->tqh_last = (elm);                 \
        (head)->tqh_last = &(elm)->field.tqe_next; \
    }

#define TAILQ_INSERT_AFTER(head, listelm, elm, field)                    \
    {                                                                    \
        if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL) \
            (elm)->field.tqe_next->field.tqe_prev =                      \
                &(elm)->field.tqe_next;                                  \
        else                                                             \
            (head)->tqh_last = &(elm)->field.tqe_next;                   \
        (listelm)->field.tqe_next = (elm);                               \
        (elm)->field.tqe_prev = &(listelm)->field.tqe_next;              \
    }

#define TAILQ_REMOVE(head, elm, field)                  \
    {                                                   \
        if (((elm)->field.tqe_next) != NULL)            \
            (elm)->field.tqe_next->field.tqe_prev =     \
                (elm)->field.tqe_prev;                  \
        else                                            \
            (head)->tqh_last = (elm)->field.tqe_prev;   \
        *(elm)->field.tqe_prev = (elm)->field.tqe_next; \
    }

/*
 * Circular queue definitions.
 */
#define CIRCLEQ_HEAD(name, type)                    \
    struct name {                                   \
        struct type *cqh_first; /* first element */ \
        struct type *cqh_last;  /* last element */  \
    }

#define CIRCLEQ_ENTRY(type)                           \
    struct {                                          \
        struct type *cqe_next; /* next element */     \
        struct type *cqe_prev; /* previous element */ \
    }

/*
 * Circular queue functions.
 */
#define CIRCLEQ_INIT(head)                  \
    {                                       \
        (head)->cqh_first = (void *)(head); \
        (head)->cqh_last = (void *)(head);  \
    }

#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field)        \
    {                                                          \
        (elm)->field.cqe_next = (listelm)->field.cqe_next;     \
        (elm)->field.cqe_prev = (listelm);                     \
        if ((listelm)->field.cqe_next == (void *)(head))       \
            (head)->cqh_last = (elm);                          \
        else                                                   \
            (listelm)->field.cqe_next->field.cqe_prev = (elm); \
        (listelm)->field.cqe_next = (elm);                     \
    }

#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field)       \
    {                                                          \
        (elm)->field.cqe_next = (listelm);                     \
        (elm)->field.cqe_prev = (listelm)->field.cqe_prev;     \
        if ((listelm)->field.cqe_prev == (void *)(head))       \
            (head)->cqh_first = (elm);                         \
        else                                                   \
            (listelm)->field.cqe_prev->field.cqe_next = (elm); \
        (listelm)->field.cqe_prev = (elm);                     \
    }

#define CIRCLEQ_INSERT_HEAD(head, elm, field)          \
    {                                                  \
        (elm)->field.cqe_next = (head)->cqh_first;     \
        (elm)->field.cqe_prev = (void *)(head);        \
        if ((head)->cqh_last == (void *)(head))        \
            (head)->cqh_last = (elm);                  \
        else                                           \
            (head)->cqh_first->field.cqe_prev = (elm); \
        (head)->cqh_first = (elm);                     \
    }

#define CIRCLEQ_INSERT_TAIL(head, elm, field)         \
    {                                                 \
        (elm)->field.cqe_next = (void *)(head);       \
        (elm)->field.cqe_prev = (head)->cqh_last;     \
        if ((head)->cqh_first == (void *)(head))      \
            (head)->cqh_first = (elm);                \
        else                                          \
            (head)->cqh_last->field.cqe_next = (elm); \
        (head)->cqh_last = (elm);                     \
    }

#define CIRCLEQ_REMOVE(head, elm, field)               \
    {                                                  \
        if ((elm)->field.cqe_next == (void *)(head))   \
            (head)->cqh_last = (elm)->field.cqe_prev;  \
        else                                           \
            (elm)->field.cqe_next->field.cqe_prev =    \
                (elm)->field.cqe_prev;                 \
        if ((elm)->field.cqe_prev == (void *)(head))   \
            (head)->cqh_first = (elm)->field.cqe_next; \
        else                                           \
            (elm)->field.cqe_prev->field.cqe_next =    \
                (elm)->field.cqe_next;                 \
    }
#endif /* !_QUEUE_H_ */
