]> icculus.org git repositories - taylor/freespace2.git/blob - include/linklist.h
Initial revision
[taylor/freespace2.git] / include / linklist.h
1 /*
2  * $Logfile: /Freespace2/code/GlobalIncs/LinkList.h $
3  * $Revision$
4  * $Date$
5  * $Author$
6  *
7  * Macros to handle doubly linked lists
8  *
9  * $Log$
10  * Revision 1.1  2002/05/03 03:28:12  root
11  * Initial revision
12  *
13  * 
14  * 2     10/07/98 10:52a Dave
15  * Initial checkin.
16  * 
17  * 1     10/07/98 10:48a Dave
18  * 
19  * 5     7/01/97 11:53a Lawrance
20  * add list_insert_before()
21  * 
22  * 4     4/15/97 1:27p Lawrance
23  * added a GET_PREV() macro
24  * 
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
27  * them.
28  *
29  * $NoKeywords: $
30  */
31
32 #ifndef _LINKLIST_H
33 #define _LINKLIST_H
34
35 // Initializes a list of zero elements
36 #define list_init( head )                                       \
37 do {                                                                                            \
38         (head)->next = (head);                                  \
39         (head)->prev = (head);                                  \
40 } while (0)
41
42 // Inserts element onto the front of the list
43 #define list_insert( head, elem )               \
44 do {                                                                                            \
45         (elem)->next = (head)->next;                    \
46         (head)->next->prev = (elem);                    \
47         (head)->next = (elem);                                  \
48         (elem)->prev = (head);                                  \
49 } while (0)
50
51 // Inserts new_elem before elem
52 #define list_insert_before(elem, new_elem)              \
53 do {                                                                                                                    \
54         (elem)->prev->next      = (new_elem);                           \
55         (new_elem)->prev                = (elem)->prev;                 \
56         (elem)->prev                    = (new_elem);                           \
57         (new_elem)->next                = (elem);                                       \
58 } while (0)     
59
60 // Appends an element on to the tail of the list
61 #define list_append( head, elem )               \
62 do      {                                                                                               \
63         (elem)->prev = (head)->prev;                    \
64         (elem)->next = (head);                                  \
65         (head)->prev->next = (elem);                    \
66         (head)->prev = (elem);                                  \
67 } while (0)
68
69 // Adds list b onto the end of list a
70 #define list_merge( a, b )                                      \
71 do {                                                                                            \
72         (a)->prev->next = (b)->next;                    \
73         (b)->next->prev = (a)->prev;                    \
74         (a)->prev = (b)->prev;                                  \
75         (b)->prev->next = (a);                                  \
76 } while (0)
77
78 // Removes an element from listit's in
79 #define list_remove( head, elem )               \
80 do {                                                                                            \
81         (elem)->prev->next = (elem)->next;      \
82         (elem)->next->prev = (elem)->prev;      \
83         (elem)->next = NULL;                                            \
84         (elem)->prev = NULL;                                            \
85 } while(0)
86
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))
94
95 #endif
96