2 * $Logfile: /Freespace2/code/GlobalIncs/LinkList.h $
7 * Macros to handle doubly linked lists
10 * Revision 1.1 2002/05/03 03:28:12 root
14 * 2 10/07/98 10:52a Dave
17 * 1 10/07/98 10:48a Dave
19 * 5 7/01/97 11:53a Lawrance
20 * add list_insert_before()
22 * 4 4/15/97 1:27p Lawrance
23 * added a GET_PREV() macro
25 * 3 2/17/97 5:18p John
26 * Added a bunch of RCS headers to a bunch of old files that don't have
35 // Initializes a list of zero elements
36 #define list_init( head ) \
38 (head)->next = (head); \
39 (head)->prev = (head); \
42 // Inserts element onto the front of the list
43 #define list_insert( head, elem ) \
45 (elem)->next = (head)->next; \
46 (head)->next->prev = (elem); \
47 (head)->next = (elem); \
48 (elem)->prev = (head); \
51 // Inserts new_elem before elem
52 #define list_insert_before(elem, new_elem) \
54 (elem)->prev->next = (new_elem); \
55 (new_elem)->prev = (elem)->prev; \
56 (elem)->prev = (new_elem); \
57 (new_elem)->next = (elem); \
60 // Appends an element on to the tail of the list
61 #define list_append( head, elem ) \
63 (elem)->prev = (head)->prev; \
64 (elem)->next = (head); \
65 (head)->prev->next = (elem); \
66 (head)->prev = (elem); \
69 // Adds list b onto the end of list a
70 #define list_merge( a, b ) \
72 (a)->prev->next = (b)->next; \
73 (b)->next->prev = (a)->prev; \
74 (a)->prev = (b)->prev; \
75 (b)->prev->next = (a); \
78 // Removes an element from listit's in
79 #define list_remove( head, elem ) \
81 (elem)->prev->next = (elem)->next; \
82 (elem)->next->prev = (elem)->prev; \
83 (elem)->next = NULL; \
84 (elem)->prev = NULL; \
87 #define GET_FIRST(head) ((head)->next)
88 #define GET_LAST(head) ((head)->prev)
89 #define GET_NEXT(elem) ((elem)->next)
90 #define GET_PREV(elem) ((elem)->prev)
91 #define END_OF_LIST(head) (head)
92 #define NOT_EMPTY(head) ((head)->next != (head))
93 #define EMPTY(head) ((head)->next == (head))