/* jcircle.h : Jon's Circular List */ /* * PUBLIC DOMAIN - NO COPYRIGHT CLAIMED - Jonathan Mayo - January 2005 * * $Id: jcircle.h 252 2005-06-17 06:07:19Z orange $ * $Date: 2005-06-16 23:07:19 -0700 (Thu, 16 Jun 2005) $ */ #ifndef JCIRCLE_H #define JCIRCLE_H /******************************************************************************/ /* Circular List */ /******************************************************************************/ /* A set of circular linked list macros for general use * * designed to use with the following style of structure: * * struct entry { * struct entry *next; * struct entry **prev; * unsigned long long value; * ... * }; * * struct entry *pq_head; * */ /* remove an entry from a priority queue. * entry is a pointer to the entry to add * next is a member name. pointer to next entry * prev is a member name. pointer to last next pointer */ #define JCIRCLE_DELETE(entry, next, prev) do { \ *(entry)->prev=(entry)->next; \ if((entry)->next) (entry)->next->prev=(entry)->prev; \ (entry)->next=0; \ (entry)->prev=&((entry)->next); \ } while(0) /* insert/add an entry to a priority queue. * head is the start of the queue * entry is a pointer to the entry to add * next is a member name. pointer to next entry * prev is a member name. pointer to last next pointer * value is a member name. numeric value of some kind (int,float,etc) */ #define JCIRCLE_ADD(type, head, entry, next, prev, value) do { \ type **curr; \ JCIRCLE_DELETE(entry,next,prev); \ for(curr=&(head) ; *curr ; curr=&(*curr)->next) { \ if( (entry)->value < (*curr)->value ) { \ (*curr)->prev=&(entry)->next; \ break; \ } \ } \ (entry)->next=*curr; \ (entry)->prev=curr; \ *curr=(entry); \ } while(0) /* list all entries in a priority queue * head is the start of the queue * next is a member name. pointer to next entry * prev is a member name. pointer to last next pointer * value is a member name. (unsigned long long) */ #define JCIRCLE_LIST(type, head, next, prev, valuestr, value) do { \ type **curr; \ for(curr=&(head) ; *curr ; curr=&(*curr)->next) { \ printf("%p name=%s value=" valuestr " next=%p prev=%p (%p)\n",(void*)(*curr), (*curr)->name, (*curr)->value, (void*)((*curr)->next), (void*)((*curr)->prev), (void*)(*(*curr)->prev)); \ } \ } while(0) /******************************************************************************/ #endif /* JCIRCLE_H */