#ifndef __LIST_H
#define __LIST_H

#include "types.h" // container_of


/****************************************************************
 * hlist - Double linked lists with a single pointer list head
 ****************************************************************/

struct hlist_node {
    struct hlist_node *next, **pprev;
};

struct hlist_head {
    struct hlist_node *first;
};

static inline int
hlist_empty(const struct hlist_head *h)
{
    return !h->first;
}

static inline void
hlist_del(struct hlist_node *n)
{
    struct hlist_node *next = n->next;
    struct hlist_node **pprev = n->pprev;
    *pprev = next;
    if (next)
        next->pprev = pprev;
}

static inline void
hlist_add(struct hlist_node *n, struct hlist_node **pprev)
{
    struct hlist_node *next = *pprev;
    n->pprev = pprev;
    n->next = next;
    if (next)
        next->pprev = &n->next;
    *pprev = n;
}

static inline void
hlist_add_head(struct hlist_node *n, struct hlist_head *h)
{
    hlist_add(n, &h->first);
}

static inline void
hlist_add_before(struct hlist_node *n, struct hlist_node *next)
{
    hlist_add(n, next->pprev);
}

static inline void
hlist_add_after(struct hlist_node *n, struct hlist_node *prev)
{
    hlist_add(n, &prev->next);
}

static inline void
hlist_replace(struct hlist_node *old, struct hlist_node *new)
{
    new->next = old->next;
    if (new->next)
        new->next->pprev = &new->next;
    new->pprev = old->pprev;
    *new->pprev = new;
}

#define hlist_for_each_entry(pos, head, member)                         \
    for (pos = container_of((head)->first, typeof(*pos), member)        \
         ; pos != container_of(NULL, typeof(*pos), member)              \
         ; pos = container_of(pos->member.next, typeof(*pos), member))

#define hlist_for_each_entry_safe(pos, n, head, member)                 \
    for (pos = container_of((head)->first, typeof(*pos), member)        \
         ; pos != container_of(NULL, typeof(*pos), member)              \
             && ({ n = pos->member.next; 1; })                          \
         ; pos = container_of(n, typeof(*pos), member))

#define hlist_for_each_entry_pprev(pos, pprev, head, member)            \
    for (pprev = &(head)->first                                         \
         ; *pprev && ({ pos=container_of(*pprev, typeof(*pos), member); 1; }) \
         ; pprev = &(*pprev)->next)


#endif // list.h
