FS2_Open
Open source remastering of the Freespace 2 engine
linklist.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) Volition, Inc. 1999. All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell
5  * or otherwise commercially exploit the source or things you created based on the
6  * source.
7  *
8 */
9 
10 
11 
12 #ifndef _LINKLIST_H
13 #define _LINKLIST_H
14 
15 // Initializes a list of zero elements
16 #define list_init( head ) \
17 do { \
18  (head)->next = (head); \
19  (head)->prev = (head); \
20 } while (0)
21 
22 // Inserts element onto the front of the list
23 #define list_insert( head, elem ) \
24 do { \
25  (elem)->next = (head)->next; \
26  (head)->next->prev = (elem); \
27  (head)->next = (elem); \
28  (elem)->prev = (head); \
29 } while (0)
30 
31 // Inserts new_elem before elem
32 #define list_insert_before(elem, new_elem) \
33 do { \
34  (elem)->prev->next = (new_elem); \
35  (new_elem)->prev = (elem)->prev; \
36  (elem)->prev = (new_elem); \
37  (new_elem)->next = (elem); \
38 } while (0)
39 
40 // Appends an element on to the tail of the list
41 #define list_append( head, elem ) \
42 do { \
43  (elem)->prev = (head)->prev; \
44  (elem)->next = (head); \
45  (head)->prev->next = (elem); \
46  (head)->prev = (elem); \
47 } while (0)
48 
49 // Adds list b onto the end of list a
50 #define list_merge( a, b ) \
51 do { \
52  (a)->prev->next = (b)->next; \
53  (b)->next->prev = (a)->prev; \
54  (a)->prev = (b)->prev; \
55  (b)->prev->next = (a); \
56 } while (0)
57 
58 // Removes an element from the list
59 #define list_remove( head, elem ) \
60 do { \
61  (elem)->prev->next = (elem)->next; \
62  (elem)->next->prev = (elem)->prev; \
63  (elem)->next = NULL; \
64  (elem)->prev = NULL; \
65 } while(0)
66 
67 // Moves elem to be after head
68 #define list_move_append(head, elem) \
69 do { \
70  (elem)->prev->next = (elem)->next; \
71  (elem)->next->prev = (elem)->prev; \
72  (elem)->prev = (head)->prev; \
73  (elem)->next = (head); \
74  (head)->prev->next = (elem); \
75  (head)->prev = (elem); \
76 } while (0)
77 
78 #define GET_FIRST(head) ((head)->next)
79 #define GET_LAST(head) ((head)->prev)
80 #define GET_NEXT(elem) ((elem)->next)
81 #define GET_PREV(elem) ((elem)->prev)
82 #define END_OF_LIST(head) (head)
83 #define NOT_EMPTY(head) ((head)->next != (head))
84 #define EMPTY(head) ((head)->next == (head))
85 
86 #endif