/*************************************************************************** * * Copyright 2001,2013 by Sean Conner. * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at your * option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . * * Comments, questions and criticisms can be sent to: sean@conman.org * *************************************************************************/ #ifndef I_B1911DD8_9CF1_554A_869D_531256015997 #define I_B1911DD8_9CF1_554A_869D_531256015997 #include #include #include /*********************************************************************/ typedef struct node { struct node *ln_Succ; struct node *ln_Pred; } Node; typedef struct list { struct node *lh_Head; struct node *lh_Tail; struct node *lh_TailPred; } List; /***********************************************************************/ extern void ListInit (List *const); extern Node *ListRemHead (List *const); extern Node *ListRemTail (List *const); extern void NodeInsert (Node *const restrict,Node *const restrict); extern void NodeRemove (Node *const); /************************************************************************/ static inline void NodeAsList(Node *const n) { assert(n != NULL); n->ln_Succ = n->ln_Pred = n; } /*----------------------------------------------------------------------*/ static inline bool NodeListEmpty(Node *const n) { assert(n != NULL); assert(n->ln_Succ != NULL); assert(n->ln_Pred != NULL); return n->ln_Succ == n; } /*----------------------------------------------------------------------*/ static inline bool NodeValid(Node const *const pn) { assert(pn != NULL); return ((pn->ln_Succ != NULL) && (pn->ln_Pred != NULL)); } /*----------------------------------------------------------------------*/ static inline Node *NodeNext(Node const *const n) { assert(n != NULL); assert(NodeValid(n)); return n->ln_Succ; } /*-----------------------------------------------------------------------*/ static inline Node *NodePrev(Node const *const n) { assert(n != NULL); assert(NodeValid(n)); return n->ln_Pred; } /*-----------------------------------------------------------------------*/ static inline void ListAddHead(List *const pl,Node *const pn) { assert(pl != NULL); assert(pn != NULL); NodeInsert((Node *)&pl->lh_Head,pn); } /*-----------------------------------------------------------------------*/ static inline void ListAddTail(List *const pl,Node *const pn) { assert(pl != NULL); assert(pn != NULL); NodeInsert(pl->lh_TailPred,pn); } /*-----------------------------------------------------------------------*/ static inline Node *ListGetHead(List const *const pl) { assert(pl != NULL); assert(pl->lh_Head != NULL); return(pl->lh_Head); } /*------------------------------------------------------------------------*/ static inline Node *ListGetTail(List const *const pl) { assert(pl != NULL); assert(pl->lh_TailPred != NULL); return(pl->lh_TailPred); } /*------------------------------------------------------------------------*/ static inline bool ListEmpty(List const *const pl) { assert(pl != NULL); return(pl->lh_Head == (Node *)&pl->lh_Tail); } /*-----------------------------------------------------------------------*/ #endif .